步驟 3B。 實作 GetMediaType 方法
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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 方法。
相關主題