步驟 3A。 實作 CheckInputType 方法
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、IMFMediaEngine和媒體基金會中的音訊/視訊擷取 取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
教學指南 撰寫轉換篩選第 3A 步驟。
當上游篩選向轉換篩選提出媒體類型時,會呼叫 CTransformFilter::CheckInputType 方法。 這個方法會採用 CMediaType 物件的指標,這是 AM_MEDIA_TYPE 結構的精簡包裝函式。 在此方法中,您應該檢查 AM_MEDIA_TYPE 結構的每個相關欄位,包括格式區塊中的欄位。 您可以使用 CMediaType 中定義的存取子方法,或直接參考結構成員。 如果有任何欄位無效,則傳回VFW_E_TYPE_NOT_ACCEPTED。 如果整個媒體類型有效,請傳回S_OK。
例如,在 RLE 編碼器篩選中,輸入類型必須是 8 位或 4 位未壓縮的 RGB 視訊。 沒有理由支援其他輸入格式,例如16位或24位 RGB,因為篩選條件必須將它們轉換成較低的位深度,而 DirectShow 已針對該用途提供 色彩空間轉換器 篩選。 下列範例假設編碼器支援 8 位視訊,但不支援 4 位視訊:
HRESULT CRleFilter::CheckInputType(const CMediaType *mtIn)
{
if ((mtIn->majortype != MEDIATYPE_Video) ||
(mtIn->subtype != MEDIASUBTYPE_RGB8) ||
(mtIn->formattype != FORMAT_VideoInfo) ||
(mtIn->cbFormat < sizeof(VIDEOINFOHEADER)))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
VIDEOINFOHEADER *pVih =
reinterpret_cast<VIDEOINFOHEADER*>(mtIn->pbFormat);
if ((pVih->bmiHeader.biBitCount != 8) ||
(pVih->bmiHeader.biCompression != BI_RGB))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Check the palette table.
if (pVih->bmiHeader.biClrUsed > PALETTE_ENTRIES(pVih))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
DWORD cbPalette = pVih->bmiHeader.biClrUsed * sizeof(RGBQUAD);
if (mtIn->cbFormat < sizeof(VIDEOINFOHEADER) + cbPalette)
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Everything is good.
return S_OK;
}
在此範例中,方法會先檢查主要類型和子類型。 然後它會檢查格式類型,以確定格式區塊是 VIDEOINFOHEADER 結構。 篩選器也可以支援 VIDEOINFOHEADER2,但在此情況下,不會有真正的好處。 VIDEOINFOHEADER2 結構新增了對交錯和非方形像素的支援,這在8位視訊中不太可能相關。
如果格式類型正確,此範例會檢查 biBitCount 和 biCompress ion VIDEOINFOHEADER 結構的成員,以確認格式為 8 位未壓縮 RGB。 如以下範例所示,您必須強制
pbFormat
根據格式類型,指向正確結構的指標。 在轉換指標之前,請務必檢查格式類型 GUID (formattype)和格式區塊的大小(cbFormat)。
此範例也會驗證調色盤項目數目與位深度的相容性,而且格式區塊夠大,足以保存調色盤項目。 如果所有這些資訊都正確,此方法會傳回S_OK。
相關主題