AVStream コーデックのデータ型ネゴシエーションの処理

デバイスが初期化されると、システム提供のデバイス プロキシ (Devproxy) モジュールは、ドライバーによって提供されるフィルター記述子を解析します。 さらに、Devproxy は、ドライバーがサポートするデータ範囲を、対応する MFT (Media Foundation Transform) の入力ピンと出力ピンで公開します。

ストリーミングが開始されると、MF パイプラインとユーザーモード アプリケーションはこれらの範囲を使用して、ドライバーとのデータ型ネゴシエーションを実行します。

次の相互作用は、データ型ネゴシエーション中に発生します。

  1. Devproxy は、ハードウェア コーデック フィルターの各ピン記述子でミニドライバーによって提供されるデータ範囲を取得します。

  2. Devproxy は、ドライバーにデータ交差要求を発行します。

  3. Devproxy は、完全形式の型を MF に公開します。

  4. MF トポロジ ビルダー (DirectShow グラフ ビルダーと同等の MF) は、ストリーミング トポロジを構築します。

  5. MF トポロジ ビルダーは、Devproxy 入力/出力ピンのデータ型を最終処理した後、ミニドライバーの AVStrMiniPinSetDataFormat コールバック関数を呼び出すことによって、ピンのデータ型を設定します。 KS ピンが存在しない場合、Devproxy は KsCreatePin を呼び出します。

データ型ネゴシエーションを正常に有効にするには、ミニドライバーは次の手順に従う必要があります。

  1. ハードウェア コーデック フィルターに含まれる公開ピンごとに、KSPIN_DESCRIPTORDataRanges メンバーでサポートされているデータ範囲の一覧を指定します。 次に例を示します。

    const PKSDATARANGE VideoDecoderInputPinDataRanges[8] = {
        (PKSDATARANGE)&H264DataFormat,
        (PKSDATARANGE)&VC_1DataFormat,
        (PKSDATARANGE)&VC_1DataFormatVIH2,
        (PKSDATARANGE)&WMV9DataFormat,
        (PKSDATARANGE)&WMV9DataFormatVIH2,
        (PKSDATARANGE)&DX50DataFormat,
        (PKSDATARANGE)&DX50DataFormatVIH2,
        (PKSDATARANGE)&MPEG2DataFormat
    };
    

    この場合、指定された範囲は、KS_DATARANGE_MPEG2_VIDEOKS_DATARANGE_VIDEOKS_DATARANGE_VIDEO2 などのラッパー型です。 前に示したコード例では、各範囲が KSDATARANGE に型キャストされます。

    ラッパー構造体の最後のメンバーは、KS_DATARANGE_MPEG2_VIDEO などの形式ブロック構造と呼ばれます。VideoInfoHeader

    連続データ範囲をサポートするドライバーは、フォーマット ブロック構造の最大値を指定する必要があります。 不連続データ範囲をサポートするドライバーは、形式ブロック構造の不連続値を含む配列を指定する必要があります。

    特定の形式をサポートするように要求するドライバーが後でその形式に対する設定形式要求に失敗した場合、パフォーマンスが低下する可能性があります。 サポートを保証する形式のみを一覧表示します。

  2. ドライバーでは、KSSTATE_STOP/KSSTATE_RUN 中に、ピンにメディアの種類を設定できるようにする必要があります。 ここでは、ドライバーがこれを許可しないことを確認する以外の操作は必要ありません。

  3. ドライバーは、KSPIN_DESCRIPTOR_EX で交差ハンドラーを提供する必要があります。各ピンの IntersectHandler

  4. ミニドライバーは、KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT プロパティのハンドラーを提供する必要があります。

  5. 出力メディアの種類が設定されている場合、エンコーダーは、指定された出力メディアの種類に基づいて (ピン記述子を使用して) 可能な入力の種類を報告する必要があります。 出力メディアの種類が設定されていない場合、エンコーダーは入力メディアの種類を報告しないでください。

  6. 入力メディアの種類が設定されている場合、デコーダーは、指定された入力メディアの種類に基づいて、使用可能な出力の種類を報告する必要があります。

  7. 入力メディアの種類が設定されている場合、ビデオ プロセッサは、指定された入力メディアの種類に基づいて、出力の種類を報告する必要があります。

  8. ドライバーは ICodecAPI インターフェイスをサポートする必要があります。 その後、ユーザーモード コンポーネントは、このユーザーモード インターフェイスを使用してコーデック構成情報を取得できます。

  9. エンコーダーのセットアップ時に、最初に ICodecAPI プロパティが設定され、次に出力メディアの種類が設定されます。 この後、エンコーダーは、現在の構成でサポートできる入力の種類のみを提供する必要があります。

  10. ICodecAPI プロパティと Codec API メディアの種類のプロパティは、プロファイルやレベルなど、一部の領域で重複しています。 このような場合、メディアの種類に関連する Codec API プロパティは ICodecAPI プロパティをオーバーライドします。 メディアの種類を設定した後、ミニドライバーは、これらの重複するプロパティの変更を許可しないようにする必要があります。

  11. デコーダーのセットアップ中に、入力の種類が最初に設定されます。 この後、デコーダーは、現在の入力の種類でサポートできる出力の種類のみを提供する必要があります。

  12. エンコーダーへの予想される入力は 4:2:0 で、少なくとも NV12 インターレース/プログレッシブである必要があります。 予期される出力は、MPEG2 PS/TS または H.264 Annex B 形式の圧縮された基本ストリームです。

  13. デコーダーへの予期される入力は基本ストリームです。 想定される出力は、ソース ストリームのスケーリングされていないバージョン (非圧縮 NV12) です。

  14. AVStream ドライバーのピンには、互いに独立した状態が必要です。 つまり、入力ピンは KSSTATE_STOP から KSSTATE_RUN に遷移し、出力ピンは KSSTATE_STOP 状態で再メインできます。

  15. ミニドライバーが可変データ バッファー サイズのプロパティ GET 要求を受け取ると、ミニドライバーは NULL バッファーを、必要なバッファーのサイズのクエリとして解釈する必要があります。 この場合、ドライバーは Irp->IoStatus.Information フィールドに必要な長さを指定し、STATUS_BUFFER_OVERFLOW を返す必要があります。 さらに、ミニドライバーは、リターン コードをエラーではなく警告に設定する必要があります。 たとえば、データ交差ハンドラーを使用して、このガイダンスに従います。