とにかく QuickTime の技術的メモ

  • AVI ファイルを開いてデコーダにフォーマットが渡されるとき、一般的な情報(幅、高さ、dpi、など)以外は BITMAPINFOHEADER の状態で渡される。特に、BITMAPINFOHEADER の後ろに独自の拡張情報を格納するコーデック(Huffyuv や Ut Video Codec など)は、このことを知った上で情報を取り出す必要がある。
  • これはつまり、コーデックは自分の拡張情報がどうコンテナに格納されるかを知っていなければならない、ということである。コーデックはコンテナを知っていなければならない。(拡張情報が不要なコーデックの場合はこの限りではない)
  • 一方、インポーター(データストリームをコンテナフォーマットにしたがって解釈して映像/音声ストリームに分解するコンポーネント)は、コーデックを知っている必要はない。実際、QuickTime 標準の AVI インポーターで、 ULRG な AVI ファイルを開き、ULRG のデコーダに渡すことができる。コンテナはコーデックを知らなくてもよい。まあ、そりゃそうだ。

Ut Video Codec Suite 的には元々 AVI ファイルだけしか対応するつもりはないので、別にこれでも問題ないんですけどね。

引き続き QuickTime のメモ。

  • QuickTime Player からデコーダを使う場合、CodecDecompressParams::wantedDestinationPixelTypes にデコーダから「k24RGBPixelFormat だけをサポートする」という情報を設定してやると、k32ARGBPixelFormat な PixMap が渡されてくる。お前人の話聞いてないだろ。
  • 「k32ARGBPixelFormat だけをサポートする」という情報を設定してやると、これは正しく k32ARGBPixelFormat な PixMap が渡されてくる。「何もサポートしない」という情報を設定すると無限ループし、NULL を設定してもやはり無限ループする。
  • よくよく調べてみると、Image Codec Reference for QuickTime には、
    wantedDestinationPixelTypes
    Filled in by the codec during the execution of ImageCodecPreDecompress. Contains a handle to a zero-terminated list of non-RGB pixels that the codec can decompress to. Leave set to NIL if the codec does not support non-RGB pixel spaces. The ICM copies this data structure, so it is up to the codec to dispose of it later. Since the predecompress call can be called often, it is suggested that codecs allocate this handle during the Open function and dispose of it during the Close function.

    と書いてある。つまり、RGB な pixel type はここには設定しないのが正しい状態であり、なにも設定しない = RGB のみをサポートする のはずであるが、そうなっていない。他のドキュメントを見ると、RGB な pixel type もここに設定するのが正しいような記述がある。たとえばこれ

  • あと、RGB でない pixel type をサポートしない場合は NIL を設定しろ、と書いてあるが、NIL なんてシンボルは <Carbon/Carbon.h> にも <QuickTime/QuickTime.h> にも存在しない。
  • ともかく、渡された PixMap の pixelFormat はちゃんと確認しないといけない。ここだけは今まで調査した範囲でも信用できる値が入っているようなので。