以前のエントリで書いたとおり、Ut Video Codec Suite に DMO デコーダを追加しようとしています。
ひとまず DirectShow グラフに追加できるように、DMO エンコーダをコピーしてフォーマットのネゴシエーションだけ書きかえて GraphEdit で読み込ませようとしましたが、ULY2 な AVI ファイルを Render File しても DMO デコーダを使ってくれません(VCM コーデックを AVI Decompressor でラップしたものが使われる)。
デバッガで追ってみると IMediaObject::GetInputSizeInfo を呼んだ後にあきらめているようなので、返す値を変えながらいろいろと試してみましたが解決せず、ほかのメソッドは何か無いかなと思って IMediaObject::GetInputStreamInfo で返すフラグから DMO_INPUT_STREAMF_HOLDS_BUFFERS を外したらグラフに追加できるようになりました。
で、DMO_INPUT_STREAMF_HOLDS_BUFFERS の意味って何なのよ、ということになります。MSDN Library の DMO_INPUT_STREAM_INFO_FLAGS 列挙型の所(日本語/英語)にはには以下のように書いてあります。
- DMO_INPUT_STREAMF_HOLDS_BUFFERS
- DMO が入力データのルックアヘッドを実行する。DMO はこのストリーム用に複数の入力バッファを保持できる。
- DMO_INPUT_STREAMF_HOLDS_BUFFERS
- The DMO performs lookahead on the incoming data, and may hold multiple input buffers for this stream.
でも、ここで言う「ルックアヘッド」とは何か、という説明はどこにもなかったような…? コンピュータ用語としては一般的ではあるのですが。
IMediaObject::ProcessInput の所(日本語/英語)には以下のような記述があります。
DMO がバッファ内のすべてのデータを処理しない場合、その DMO はバッファの参照カウントを保持する。DMO は、データに対してルックアヘッドを実行する必要がある場合を除いて、すべての出力を生成した後、バッファを解放する。DMO がルックアヘッドを実行するかどうかを調べるには、IMediaObject::GetInputStreamInfo メソッドを呼び出す。
If the DMO does not process all the data in the buffer, it keeps a reference count on the buffer. It releases the buffer once it has generated all the output, unless it needs to perform lookahead on the data. (To determine whether a DMO performs lookahead, call the IMediaObject::GetInputStreamInfo method.)
うーん…?
ひとまず、コーデックエンジンの実装としては、エンコーダでもデコーダでも1フレーム受け取って1フレーム吐くようになっていて、つまりルックアヘッドは行いません。将来的にも、未来のフレームを元にエンコードしたりデコードしたりはしない(VCM インターフェースをサポートしようとする限りそのような処理は行えない)予定です。というわけでフラグを外すことにします。
DMO_INPUT_STREAMF_HOLDS_BUFFERS フラグを外すとグラフに参加できるようになる、という点そのものについては釈然としないものが残りますが…
no comment untill now