以前のエントリで書いたとおり、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 フラグを外すとグラフに参加できるようになる、という点そのものについては釈然としないものが残りますが…

Trackback

no comment untill now

Add your comment now