共用方式為


步驟 3B。 實作 GetMediaType 方法

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

這是 撰寫轉換篩選教學課程的步驟 3B。

注意

衍生自 CTransInPlaceFilter的篩選準則不需要此步驟。

 

CTransformFilter::GetMediaType方法會傳回其中一個篩選的慣用輸出類型,由索引編號參考。 除非篩選的輸入針腳已經連接,否則永遠不會呼叫這個方法。 因此,您可以使用上游連線中的媒體類型來判斷慣用的輸出類型。

編碼器通常會提供單一慣用類型,代表目標格式。 解碼器通常支援一系列輸出格式,並依遞減品質或效率提供它們。 例如,清單可能是 UYVY、Y211、RGB-24、RGB-565、RGB-555 和 RGB-8,依該順序排列。 效果篩選準則可能需要輸出格式與輸入格式之間的完全相符專案。

下列範例會傳回單一輸出類型,其建構方式是修改輸入類型以指定 RLE8 壓縮:

HRESULT CRleFilter::GetMediaType(int iPosition, CMediaType *pMediaType)
{
    ASSERT(m_pInput->IsConnected());
    if (iPosition < 0)
    {
        return E_INVALIDARG;
    }
    if (iPosition == 0)
    {
        HRESULT hr = m_pInput->ConnectionMediaType(pMediaType);
        if (FAILED(hr))
        {
            return hr;
        }
        FOURCCMap fccMap = FCC('MRLE'); 
        pMediaType->subtype = static_cast<GUID>(fccMap);
        pMediaType->SetVariableSize();
        pMediaType->SetTemporalCompression(FALSE);

        ASSERT(pMediaType->formattype == FORMAT_VideoInfo);
        VIDEOINFOHEADER *pVih =
            reinterpret_cast<VIDEOINFOHEADER*>(pMediaType->pbFormat);
        pVih->bmiHeader.biCompression = BI_RLE8;
        pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader); 
        return S_OK;
    }
    // else
    return VFW_S_NO_MORE_ITEMS;
}

在此範例中,方法會呼叫 IPin::ConnectionMediaType ,從輸入針腳取得輸入類型。 然後它會變更一些欄位來指出壓縮格式,如下所示:

  • 它會使用 FOURCCMap 類別,從 FOURCC 程式碼 'MRLE' 建構的新子類型 GUID。
  • 它會呼叫 CMediaType::SetVariableSize 方法,此方法會將 bFixedSizeSamples 旗標設定為 FALSE並將 lSampleSize 成員設定為零,表示變數大小樣本。
  • 它會使用FALSE值呼叫CMediaType::SetTemporalCompression方法,指出每個畫面都是主要畫面格。 (此欄位僅供參考,因此您可以放心地忽略它。)
  • 它會將 biCompression 欄位設定為 BI_RLE8。
  • 它會將 biSizeImage 欄位設定為影像大小。

下一 步:步驟 3C。實作 CheckTransform 方法

撰寫 DirectShow 篩選