DMO でのデータの処理
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
このセクションでは、DMO を使用してデータストリームを処理する方法について説明します。 このセクションに記載されている手順は、既定の動作です。すべての DNO は、ここで説明するメソッドをサポートする必要があります。 これらのメソッドは、入力と出力に個別のバッファーを使用します。 一部の DNO では、1 つのバッファーを使用したインプレース処理もサポートされています。 インプレース処理の詳細については、「イン プレース処理」を参照してください。
バッファーの割り当て
クライアントは、すべてのバッファー割り当てを担当します。 DMO でメディアの種類を設定した後、各ストリームのバッファー要件について DMO にクエリを実行します。 これらは、メディアの種類によって異なる場合があります。 ストリームごとに、 IMediaObject::GetInputSizeInfo メソッドまたは IMediaObject::GetOutputSizeInfo メソッドを 呼び出します。 これらのメソッドは、次の情報を返します。
- 最小バッファー サイズ (バイト単位)。
- 配置要件 (存在する場合)。 開始アドレスが指定された整数の倍数である場合、バッファーはアラインされます。
- DMO が先読みのために保持するデータの最大量。 この数値は、入力ストリームにのみ適用されます。 一部の種類のデータ (MPEG エンコードなど) の場合、DMO はストリーム内で前を向く必要がある場合があります。 先読み値は、DMO が出力を生成するために必要な入力データの量を示します。
クライアントは、これらの要件に一致するバッファーを割り当てる必要があります。 さらに、DMO には、クライアントが入力データをパッケージする方法に関する要件がある場合があります。 たとえば、DMO では、各バッファーに 1 つのサンプル (またはビデオ フレーム) を正確に含める必要がある場合があります。 これらの要件を確認するには、 IMediaObject::GetInputStreamInfo メソッドを 呼び出します。 IMediaObject::GetOutputStreamInfo メソッドは、出力ストリームに関する同様の情報を返します。
既定のストリーミング モデルでは、クライアントは生バッファー ポインターを DMO に渡しません。 代わりに、 IMediaBuffer インターフェイスを公開する軽量 COM オブジェクトを使用します。 IMediaBuffer インターフェイスは、メモリ ブロックの COM ラッパーとして機能します。 これは COM オブジェクトであるため、参照カウントをサポートしています。これは、使用中にバッファーが解放されないようにするのに役立ちます。
注意
IMediaBuffer インターフェイスは、DirectShow の IMediaSample インターフェイスと同様の関数を提供します。
クライアントは IMediaBuffer オブジェクトを実装する必要があります。 詳細については、「 IMediaBuffer の実装」を参照してください。
データの処理
データを処理するには、次の操作を行います。
- 入力ストリームごとに、バッファーに入力データを入力します。
- IMediaObject::P rocessInput を呼び出して、各バッファーを配信します。
- IMediaObject::P rocessOutput を呼び出してデータを処理します。 このメソッドは、出力ストリームごとに 1 つずつ、バッファーの配列を受け取ります。
- 入力データがなくなったら繰り返します。
ProcessInput メソッドは、一度に 1 つのストリームの入力を受け入れます。 通常、メソッドは直ちにを返し、DMO は IMediaBuffer オブジェクトの参照カウントを保持します。 バッファー内のすべてのデータを処理した後、またはアプリケーションが DMO をフラッシュすると、 オブジェクトが解放されます。 DMO によって解放されるまで、バッファーを再利用しないでください。 入力ストリームがより多くのデータを受け入れられるかどうかを判断するには、 IMediaObject::GetInputStatus メソッドを呼び出します。 ストリームがより多くの入力を受け入れられる場合、このメソッドは DMO_INPUT_STATUSF_ACCEPT_DATA フラグを返します。
ProcessOutput メソッドは、すべての出力ストリームの出力を一度に生成します。 アプリケーションは、出力ストリームごとに 1 つずつ 、DMO_OUTPUT_DATA_BUFFER 構造体の配列を渡します。 配列内の各構造体には、 IMediaBuffer オブジェクトへのポインターがあります。 DMO は、バッファーにできる限り多くの出力データを書き込みます。 また、操作の状態を報告するさまざまなフラグも設定します。 DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE フラグは、DMO が既存の入力からより多くの出力を生成できることを示します。 その場合、クライアントは ProcessOutput を再度呼び出すことができます。 それ以外の場合は、より多くの入力データを 含む ProcessInput を 呼び出す必要があります。 DMO は入力バッファー内のデータを変更しません。出力バッファーにのみ書き込まれます。
すべてのデータを入力ストリームに配信したら、 IMediaObject::D iscontinuity メソッドを呼び出します。 DMO は、残りの出力を処理 (または DMO をフラッシュ) するまで、そのストリームへのそれ以上の入力を受け入れません。
ストリーミング開始後の任意の時点で、DMO は入力を受信するか、出力を生成するか、またはその両方を生成できます。 そのため、 GetInputStatus はDMO_INPUT_STATUSF_ACCEPT_DATAを返すか、 ProcessOutput はDMO_OUTPUT_DATA_BUFFERF_INCOMPLETEを返します。 アプリケーションは、これらのフラグをテストし、それに応じて ProcessInput または ProcessOutput を呼び出すことによって、データフローを維持します。 データ フローを中断するには、 IMediaObject::Flush メソッドを呼び出します。 このメソッドにより、DMO は内部的に保持されているバッファーをすべて破棄します。
関連トピック