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

Technical Q&A QA1460
Decompression Sessions - Setting codec accuracy and field mode

Q:伸張セッションへの移行時、コーデックの精度およびインターレース解除などのオプションはどのように設定するのですか?

A:従来のDecompression Sequence API群にはこれらのオプションを設定する専用のAPIが2つありました。たとえばコーデックの精度は、シーケンスを作成するときにDecompressSequenceBeginSを呼び出したり、シーケンスが作成された後にSetDSequenceAccuracyを呼び出したりして設定できました。一方、codecDSequenceDeinterlaceFieldsなどのDecompression Sequenceフラグは、SetDSequenceFlagsを呼び出して別に設定する必要がありました。

Decompression Session API群は、プロパティを使用してオプションの取得や設定を行う、より統一的な方法を採用するようになっています(最近のQuickTime API全体にわたって見られる傾向です)。

伸張セッションの作成時に、パラメータのひとつとして伸張セッションのオプションの参照(ICMDecompressionSessionOptionsRef)をICMDecompressionSessionCreateに渡します。この参照はICMDecompressionSessionOptionsCreateから返されます。伸張セッションオプションオブジェクトの個々のプロパティ値はICMDecompressionSessionOptionsSetPropertyを呼び出して設定します。

ImageCompression.hには、専用のフィールド処理を設定するkICMDecompressionSessionOptionsPropertyID_FieldModeなど、伸張セッションのオプション用の列挙子のリスト(kQTPropertyClass_ICMDecompressionSessionOptions)が含まれます。フィールドモードオプションはUInt32値で、typedef ICMFieldModeで表されます。これらのモードは、kICMDecompressionSessionOptionsPropertyID_FieldModeプロパティで使用します。

kICMFieldMode_BothFields - どちらのフィールドも伸張されます。

kICMFieldMode_TopFieldOnly - トップフィールドのみ伸張されます。結果として高さが半分の画像が生成されます。

kICMFieldMode_BottomFieldOnly - ボトムフィールドのみ伸張されます。
                                結果として高さが半分の画像が生成されます。

kICMFieldMode_DeinterlaceFields - どちらのフィールドも伸張されます。その後フィルタリングされることで
                                  インタレースアーチファクトが軽減されます。

ImageCompression.hには伸張精度を指定するCodecQ値のリストも含まれています。これらの値は、kICMDecompressionSessionOptionsPropertyID_Accuracyプロパティで使用します。このプロパティが伸張セッションオプションオブジェクトの中で設定されていない場合のデフォルトのセッション精度の設定はcodecNormalQualityです。

リスト1:伸張セッションのオプション設定

ICMDecompressionSessionOptionsRef sessionOptions = NULL;
CodecQ codecAccuracy = codecHighQuality;
ICMFieldMode fieldMode = kICMFieldMode_DeinterlaceFields;

...

// 伸張セッションオプションオブジェクトを作成する
err = ICMDecompressionSessionOptionsCreate(kCFAllocatorDefault, &sessionOptions);
if (noErr == err) {

    // 精度を設定
    ICMDecompressionSessionOptionsSetProperty(sessionOptions,
                                              kQTPropertyClass_ICMDecompressionSessionOptions,
                                              kICMDecompressionSessionOptionsPropertyID_Accuracy,
                                              sizeof(CodecQ),
                                              &codecAccuracy);
    // フィールドモードを設定
    ICMDecompressionSessionOptionsSetProperty(sessionOptions,
                                              kQTPropertyClass_ICMDecompressionSessionOptions,
                                              kICMDecompressionSessionOptionsPropertyID_FieldMode,
                                              sizeof(ICMFieldMode),
                                              &fieldMode);
}

...

// オプションオブジェクトを渡して伸張セッションを作成
err = ICMDecompressionSessionCreate(kCFAllocatorDefault, ..., sessionOptions, ...);
if (err) goto bail;

...

// セッションでオプションオブジェクトを保持するため、ここで解放できる。
// セッション中にオプションオブジェクトを変更してオプションを変更することもできる。
ICMDecompressionSessionOptionsRelease(sessionOptions);

...

重要:すべてのコーデックがkICMDecompressionSessionOptionsPropertyID_FieldModeの要求に従うとは限りません。また一部のコーデックでは、一定の精度レベルでのみ処理を実行します。インターレースされていないコンテンツではこの要求は無視されます。

参考資料

先頭に戻る

ドキュメント改訂履歴

日付メモ
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.