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

Technical Q&A QA1450
Compression Sessions - Enabling muti-pass encoding

Q:圧縮セッションを設定するとき、どのようにしたらマルチパスエンコーディングを有効にできますか?

A:圧縮セッションのマルチパスエンコーディングは、次の2つのステップで有効にできます。

  • 一時的なマルチパスストレージの場所を作成する。

  • この参照を、ICM圧縮セッション作成時に使用される、圧縮セッションのオプションオブジェクトへ追加する。

一時的なストレージ場所を指定する

一時的なストレージ場所を作成するにはICMMultiPassStorageCreateWithTemporaryFileを呼び出します。このAPIからは、圧縮セッションの構成オブジェクトへ追加できるICMMultiPassStorageRefが返されます。リスト1を参照してください。

OSStatus ICMMultiPassStorageCreateWithTemporaryFile(
                                        CFAllocatorRef allocator,
                                        CFStringRef fileName,
                                        ICMMultiPassStorageCreationFlags flags,
                                        ICMMultiPassStorageRef *multiPassStorageOut)

説明:

一時ファイルを使ってマルチパスストレージを作成し、ICMMultiPassStorageRefオブジェクトを返します。
呼び出し元が、返されたオブジェクトの所有者となります。

パラメータの説明:

allocator - 作業用のアロケータ。デフォルトのアロケータを使用するにはkCFAllocatorDefaultを渡します。

directoryRef - ファイルディレクトリへの参照。NULLを渡すと、Image Compression Managerでは
               ユーザの一時アイテムフォルダを使用します。

fileName - ストレージ用に使用するファイル名。NULLを渡すと、Image Compression Managerでは
           一意の名前を適用します。このファイルは、
           kICMMultiPassStorage_DoNotDeleteWhenDoneフラグを設定していなければ、
           マルチパスストレージが解放されたときに削除されます。

flags - このプロセスを制御するフラグ。

kICMMultiPassStorage_DoNotDeleteWhenDone - マルチパスストレージが解放されたときに
                                           一時ファイルを削除しません。

multiPassStorageOut - 新しいマルチパスストレージへの参照。

エラーがなれければnoErrを返します。
void ICMMultiPassStorageRelease(ICMMultiPassStorageRef multiPassStorage)

説明:

マルチパスストレージオブジェクトの保持カウントをデクリメントします。保持カウントが0になると
オブジェクトが破棄されます。

パラメータの説明:

multiPassStorage - マルチパスストレージオブジェクトへの参照。NULLを渡した場合、
                   何も起こりません。

圧縮セッションのオプションオブジェクトへ参照を追加する

マルチパスストレージの参照を作成したら、ICMCompressionSessionOptionsSetPropertyを呼び出して圧縮セッションのオプションオブジェクトへ追加します。kICMCompressionSessionOptionsPropertyID_MultiPassStorageキーを使用してICMMultiPassStorageRefを渡します。リスト1を参照してください。

kICMCompressionSessionOptionsPropertyID_MultiPassStorage - マルチパス圧縮用のストレージ。

説明:

マルチパス圧縮を有効にするには、クライアントからマルチパスデータ用のストレージ場所を
提供する必要があります。ICMMultiPassStorageCreateWithTemporaryFileを使用して、ICMに、一時ファイルの中に
マルチパスデータを格納させます。かなりの量のマルチパスデータが格納される可能性があります。
これはムービーファイルの出力量より多くなることもあります。

圧縮セッション用にこのプロパティをNULL以外の値に設定している場合、クライアントでは、
ICMCompressionSessionEncodeFrameの呼び出しのまとまりをはさむように、ICMCompressionSessionBeginPassと
ICMCompressionSessionEndPassを呼び出す必要があります。デフォルトでは、このプロパティはNULLで
マルチパス圧縮は無効です。

圧縮セッションのオプションオブジェクトは、マルチパスストレージオブジェクトが設定されるとそれを維持します。
そのためクライアント側で解放できます。

このプロパティは、読み取り/書き込みが可能です。

リスト1:マルチパス圧縮を有効にする

OSStatus EnableMultiPassWithTemporaryFile(
                    ICMCompressionSessionOptionsRef inCompressionSessionOptions,
                    ICMMultiPassStorageRef *outMultiPassStorage);
{
    FSRef tempDirRef;
    ICMMultiPassStorageRef multiPassStorage = NULL;

    OSStatus status;

    *outMultiPassStorage = NULL;

    // ユーザの一時ディレクトリ
    status = FSFindFolder(kUserDomain, kTemporaryFolderType,
                          kCreateFolder, &tempDirRef);
    if (noErr != status) goto bail;

    // 一意の名前を持つ一時ファイルを使用してストレージを作成する
    status = ICMMultiPassStorageCreateWithTemporaryFile(kCFAllocatorDefault,
                                                        &tempDirRef,
                                                        NULL, 0,
                                                        &multiPassStorage);
    if (noErr != status) goto bail;

    // 圧縮セッションのオプションを設定することでマルチパスを有効にする
    // 注:圧縮セッションのオプションオブジェクトは
    // マルチパスストレージオブジェクトを保持する
    status = ICMCompressionSessionOptionsSetProperty(
                       inCompressionSessionOptions,
                       kQTPropertyClass_ICMCompressionSessionOptions,
                       kICMCompressionSessionOptionsPropertyID_MultiPassStorage,
                       sizeof(ICMMultiPassStorageRef),
                       &multiPassStorage);

bail:
    if (noErr != status) {
        // このAPIは“NULLポインタセーフ”なので単純に呼び出せる
        ICMMultiPassStorageRelease(multiPassStorage);
    } else {
        *outMultiPassStorage = multiPassStorage;
    }

    return status;
}

リスト2:リスト1の典型的な使用法

ICMCompressionSessionRef session = NULL;
ICMCompressionSessionOptionsRef sessionOptions = NULL;
CodecQ compressionQuality = codecNormalQuality;
ICMMultiPassStorageRef multiPassStorage = NULL;
OSStatus status;

...

// 圧縮セッションオプションオブジェクトを作成する
ICMCompressionSessionOptionsCreate(kCFAllocatorDefault, &sessionOptions);

// いくらかの設定
ICMCompressionSessionOptionsSetAllowTemporalCompression(sessionOptions, true);
ICMCompressionSessionOptionsSetAllowFrameReordering(sessionOptions, true);

ICMCompressionSessionOptionsSetProperty(sessionOptions,
                                    kQTPropertyClass_ICMCompressionSessionOptions,
                                    kICMCompressionSessionOptionsPropertyID_Quality,
                                    sizeof(compressionQuality),
                                    &compressionQuality);

// マルチパスエンコーディングを有効にする
status = EnableMultiPassWithTemporaryFile(sessionOptions, &multiPassStorage);
if (noErr != status) goto bail;

// ここでマルチパスストレージを解放するか、持ち続けて後で解放するか
// 選択できる。圧縮セッションオプションオブジェクトがストレージを維持する点に注目。
ICMMultiPassStorageRelease(multiPassStorage);

// 必要に応じてほかの設定を実行する
...

// マルチパスを含む構成オプションを使用して圧縮セッションを作成する
ICMCompressionSessionCreate(kCFAllocatorDefault,
                            width,
                            height,
                            cType,
                            timescale,
                            sessionOptions,  // <- 圧縮セッションの構成オプションオブジェクトを渡す
                            sourcePixelBufferOptions,
                            &encodedFrameOutputRecord,
                            &compressionSessionOut);

...

参考資料:

ドキュメント改訂履歴

日付メモ
2006-01-12初版

掲載日: 2006-01-12




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.