共用方式為


步驟 3A. 實作 CheckInputType 方法

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 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 位視訊中不太可能相關。

如果格式類型正確,此範例會檢查VIDEOINFOHEADER結構的biBitCountbiCompression成員,以確認格式為 8 位未壓縮的 RGB。 如此範例所示,您必須強制轉型

pbFormat

根據格式類型,指向正確 結構的指標。 在轉換指標之前,請一律檢查格式類型 GUID (格式類型) 和格式區塊的大小 (cbFormat) 。

此範例也會確認調色盤專案數目與位深度相容,而且格式區塊夠大,足以保存調色盤專案。 如果此資訊都正確,此方法會傳回S_OK。

下一 步:步驟 3B。實作 GetMediaType 方法

撰寫 DirectShow 篩選