Apple Developer Connection
高度な検索
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1457
Compression Sessions - Multipass encoding and the pass mode flags

Q:マルチパスエンコーディングを実行するときに、圧縮パスモードフラグはICMCompressionSessionBeginPassでどのように使うのでしょうか?

A:QuickTime 7では、ImageCompression.hで次の5つのICMCompressionPassModeFlagsを定義しています。

  • kICMCompressionPassMode_OutputEncodedFrames - エンコーディングパスの間に設定され、これが設定されていると、コンプレッサはエンコードしたフレームを出力します。このフラグは、kICMCompressionPassMode_NotReadyToOutputEncodedFramesフラグがクリアされた後で初めて設定できます。

  • kICMCompressionPassMode_NoSourceFrames - コンプレッサがパスに対してこのフラグを設定している場合、クライアントはソースフレームバッファを提供せず、NULLピクセルバッファをICMCompressionSessionEncodeFrameに渡すことになります。

  • kICMCompressionPassMode_WriteToMultiPassStorage - 解析パスの間に設定され、これが設定されていると、コンプレッサはエンコードしたフレームを出力せず、フレームごとにコンプレッサの個別情報をマルチパスストレージに記録します。

  • kICMCompressionPassMode_ReadFromMultiPassStorage - 複数回の解析パスとエンコーディングパスの間に設定され、これが設定されていると、コンプレッサはその個別情報を参照し、使用することでエンコーディングを向上させます。

  • kICMCompressionPassMode_NotReadyToOutputEncodedFrames - コンプレッサは、次のパスではエンコードしたフレームを出力できない場合にこのフラグを設定します。このフラグがクリアされた後、クライアントはICMCompressionSessionBeginPassの呼び出し時にkICMCompressionPassMode_OutputEncodedFramesフラグを設定して圧縮処理を短縮できます。

マルチパスエンコーディングが可能なときには(テクニカルQ&A QA1450「Compression Sessions - Enabling muti-pass encoding」参照)、ICMCompressionSessionEncodeFrameの呼び出しはICMCompressionSessionBeginPassICMCompressionSessionEndPassで囲まれている必要があります。

マルチパスエンコーディングのセッション中は、マルチパス対応のコンプレッサは、各パスで実行する操作の種類に関して、一定の裁量を持っています。クライアントは、実際にはパスの詳細は知らされず、パスの回数を事前に伝えられることもありません。

パスモードフラグを使用することにより、当該パスにおけるコンプレッサの状態をやり取りし、クライアントはICMCompressionSessionBeginPassの呼び出し時にこの状態を変更できます。たとえば、コンプレッサがkICMCompressionPassMode_NotReadyToOutputEncodedFramesフラグをクリアした後、クライアントはkICMCompressionPassMode_OutputEncodedFramesフラグを設定することにより、5回のエクスポート操作のうちのパス3の「早期世代のプレビュー」を書き出す、といったことができます。これにより、すべてのパスが終了する前に、コンプレッサに強制的にフレームを出力させ、圧縮操作を短縮できます。

表1に、仮のエンコーディングセッションを例に、パスとそれに対応するパスモードフラグを示します。クライアント側で変更なしでパスモードフラグを通すことにした場合は、結果はリストされている通りとなります。または、クライアント側でパス3に対してkICMCompressionPassMode_OutputEncodedFramesフラグを設定し、そのパスの後で中止したり、結果をプレビューしてからよりよい結果を求めて以降のパスを続行するといったこともできます。

表 1. 仮のエンコーディングセッション中のパスモードフラグ

パスパスモードフラグ
1kICMCompressionPassMode_WriteToMultiPassStorage | kICMCompressionPassMode_NotReadyToOutputEncodedFrames
2kICMCompressionPassMode_ReadFromMultiPassStorage | kICMCompressionPassMode_WriteToMultiPassStorage I kICMCompressionPassMode_NotReadyToOutputEncodedFrames
3kICMCompressionPassMode_ReadFromMultiPassStorage I kICMCompressionPassMode_WriteToMultiPassStorage
4kICMCompressionPassMode_NoSourceFrames I kICMCompressionPassMode_ReadFromMultiPassStorage I kICMCompressionPassMode_OutputEncodedFrames

警告:パスモードフラグが表1に示した通りに正確に設定されると想定しないでください。結果は異なる場合があります。たとえば、どのパスもkICMCompressionPassMode_NoSourceFramesパスになることが考えられ、kICMCompressionPassMode_NotReadyToOutputEncodedFramesフラグがクリアされる前にもっと多くのパスがあることも考えられます。

API

パスモードフラグは次の3つのAPIで使用されます。

Boolean ICMCompressionSessionSupportsMultiPassEncoding(ICMCompressionSessionRef session,
                                                       UInt32 multiPassStyleFlags,
                                                       ICMCompressionPassModeFlags *firstPassModeFlagsOut)
説明:

クライアントはマルチパス圧縮操作の開始前にこれを呼び出して、圧縮セッションがマルチパスエンコーディングをサポートして
いるかどうか問い合わせる必要があります。サポートしていれば、この呼び出しはfirstPassModeFlagsOutパラメータに
パスモードフラグの初期状態を返します。

パラメータ:

multiPassStyleFlags - 予約されており、0に設定されます

firstPassModeFlagsOut (読み取り) - そのセッションの最初のパスに対して推奨されるモードフラグを受け取る変数のポインタ。
クライアントはこれらのフラグを変更できますが、kICMCompressionPassMode_NoSourceFramesは設定できません。この情報が
不要な場合はNULLを渡します。
OSStatus ICMCompressionSessionBeginPass(ICMCompressionSessionRef session,
                                        ICMCompressionPassModeFlags passModeFlags,
                                        UInt32 flags)

説明:

クライアントはこれを呼び出して、特定の圧縮パスを開始することを知らせます。クライアントは、
コンプレッサがこのパスでどのように動作するべきかを、パラメータpassModeFlagsにパスモードフラグ
を渡すことで示します。

パラメータ:

passModeFlags (書き込み可能) - コンプレッサがこのパスでどのように動作するべきかを示すフラグ。

flags - 予約されています。0に設定されています。
OSStatus ICMCompressionSessionProcessBetweenPasses(ICMCompressionSessionRef session,
                                                   UInt32 flags,
                                                   Boolean *interpassProcessingDoneOut,
                                                   ICMCompressionPassModeFlags *requestedNextPassModeFlagsOut)

説明:

クライアントはICMCompressionSessionEndPassの呼出し後にこれを呼び出して、パスとパスの間にコンプレッサに処理を実行
させることができます。ただし、kICMCompressionPassMode_OutputEncodedFramesが設定されていない場合に限られます。

パラメータ:

session - 圧縮セッションの参照。この参照は、ICMCompressionSessionCreateによって返されます。

flags - 予約されています。0に設定されています。

interpassProcessingDoneOut  - Booleanへのポインタ。この関数を再度呼び出す必要がある場合はFALSEに設定され、
再度呼び出す必要がない場合はTRUEに設定されます。

requestedNextPassModeFlagsOut (読み取り) - 変数のポインタであり、次のパスに対してコンプレッサが
推奨するモードフラグに設定されます。kICMCompressionPassMode_OutputEncodedFramesは、次のパスを最終パスにすることを
コンプレッサが推奨している場合に限り、設定されます。

コンプレッサは、これらのフラグを通じてパスの回数を制御し、状態をやり取りするため、クライアントはフラグを変更する必要がありません。たとえば、コンプレッサはクライアントからのピクセルバッファを必要としない場合はkICMCompressionPassMode_NoSourceFramesを設定します。または次のパスでエンコードされたフレームを出力する場合は、kICMCompressionPassMode_OutputEncodedFramesを設定します。

リスト1: 擬似コード - 使用中のパスモードフラグ

ICMCompressionPassModeFlags passModeFlags = 0;
Boolean multipassYES = false;
Boolean done = false;

...

// passModeFlagsはそのセッションの最初のパスに対して要求されたモードフラグを受け取ります
multipassYES = ICMCompressionSessionSupportsMultiPassEncoding(session,
                                                              0,
                                                              &passModeFlags);

while(!done) {

    if (multipassYES) { 
        // passModeFlagsはコンプレッサがこのパスでどのように動作すべきかを示します。クライアントは
        // コーデックがkICMCompressionPassMode_NotReadyToOutputEncodedFramesフラグを
        // クリアした後、このパスで必要であれば、パスモードフラグを変更して、
        // kICMCompressionPassMode_OutputEncodedFramesに早期に強制的にフレームを
        // 出力させることができます
        ICMCompressionSessionBeginPass(session, passModeFlags, 0);
    }

    // すべてのフレームを圧縮セッションに送ります
    // ディスプレイタイムスタンプごとのソースフレームとフレームオプションは
    // すべてのパスに渡り同じでなければなりません
    for (frameNumber = 1; frameNumber <= kFrameCount; frameNumber++) {

        if (0 == (passModeFlags & kICMCompressionPassMode_NoSourceFrames)) {
            // ソースフレームをここで提供します - kICMCompressionPassMode_NoSourceFramesは
            // 設定されていません -- 設定されていた場合、
            // ICMCompressionSessionEncodeFrameにソースフレームは提供せず
            // pixelBufferパラメータにNULLを渡します。それ以外の情報はすべて、
            // パス間で一貫して指定されるようにします

            ...
        }

        ICMCompressionSessionEncodeFrame(...)
    }

    ICMCompressionSessionCompleteFrames(...)

    if (multipassYES)  {
        ICMCompressionSessionEndPass(session);

        if (passModeFlags & kICMCompressionPassMode_OutputEncodedFrames) { 
             // コンプレッサがこのパスでエンコードしたフレームを出力したので、ここで終了します
             // 注記:QA1457で説明しているように、早期プレビューを提供するコードをクライアントで追加し、続行することもできます。
             done = true;
        } else {
             Boolean interpassDone = false;

            while(!interpassDone) {
                // passModeFlagsは、次のパスに対してセッションが推奨するモードフラグに
                // 設定されます。kICMCompressionPassMode_OutputEncodedFramesは、
                // コーデックが次のパスを最後にするように推奨している場合に限り設定します
                ICMCompressionSessionProcessBetweenPasses(session,
                                                          0,
                                                          &interpassDone,
                                                          &passModeFlags);
            }
        }
    } else {
        done = true;
    }
}

先頭に戻る

参考資料

QuickTime 7 Update Guide - Video Enhancements

先頭に戻る

ドキュメント改訂履歴

日付メモ
2006-01-18初版

掲載日: 2006-01-18




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.