Ut Video Codec Suite の全バージョンで、DirectShow 環境でエンコードすると、エンコード設定が正しく反映されない問題があることが分かりました。

VCM コーデックを DirectShow 環境で使おうとすると、マイクロソフトの実装の wrapper が使われるのですが、wrapper がコーデックの機能を呼び出す順序の関係で、設定が正しく反映されていないビットストリームが出力されてしまいます。技術的な詳細は夜に記事を書きます。

手元で試した限りでは、以下の設定項目は反映されます。

  • フレーム内予測方式

以下の設定項目はデフォルト設定以外だと壊れた(BITMAPINFOHEADER に書いてある設定と実際にエンコードされる設定が異なる)データが出力される可能性があります。

  • フレーム分割数
  • インターレース設定

VCM インターフェースを使っているソフトウェアの場合は、大抵の場合大丈夫だと思われます。少なくとも AviUtl と VirtualDub では大丈夫のようです。


さて、どう直すべきかですが、さしあたり以下の 3 つの方針が思いつきます。

  1. エンコード設定をユーザグローバルに保持する。(Huffyuv などと同じ挙動)
  2. BITMAPINFOHEADER にはエンコード設定に依存しないデータのみを出力し、依存するデータは各フレームに格納する。
  3. DirectShow 環境用のエンコーダ実装を追加する。

1つ目はコードの修正量は最も少なくて楽そうなのですが、エンコード設定がエンコーダオブジェクトを越えて共有される状態が「正しい」とは思えないので、できれば採用したくありません。MSDN にある ICM_GETSTATE/ICM_SETSTATE メッセージの記述を読んでも、この点についてマイクロソフトがどう考えているのか確証が得られませんでした。

2つ目はスマートではあるのですが、データ構造がかなり変化してしまうため、前後で互換性が損なわれてしまう問題があります。新しい FourCC を定義してそっちの方で修正し、今後はそちらを使ってもらうという手も考えられますが。

3つ目は wrapper の挙動に左右されること自体を回避するものです。今後余計な心配をしなくて良くなる利点がありますが、修正量は最も多くなります。また、DirectShow 環境用のエンコーダを追加しても、引き続き VCM コーデックを wrap したものはコーデック一覧に表示されてしまうため、イマイチ「美しくない」状態になってしまいます。

はてどうしたものか…

Trackback

no comment untill now

Add your comment now