ネイティブの Annex-B H.264 ストリームを解凍するコードを書いています。ストリームを解析し、SPS/PPS NALU から CMVideoFormatDescription を作成し、ストリームから抽出した他の NALU をラップするプロセスを実行しています。 CMSampleBuffers で。
デコーダーの CMBlockBuffer と CMSampleBuffer メモリを処理する方法について、精神的なブロックに苦しんでいます。私の問題は、何よりもCFがメモリを処理する方法を完全に理解していないことにあると思うので、私の質問はそれに関するものですが、コンテキストが役立つことを願っています.
次のように CMBlockBuffer を作成すると:
CMBlockBufferRef blockBuffer;
OSStatus status = CMBlockBufferCreateWithMemoryBlock(NULL,
memoryBlock,
blockBufferLength,
kCFAllocatorNull,
NULL,
0,
blockBufferLength,
kCMBlockBufferAlwaysCopyDataFlag | kCMBlockBufferAssureMemoryNowFlag,
&blockBuffer);
次のように CMSampleBuffer に追加します。
CMSampleBufferRef sampleBuffer;
status = CMSampleBufferCreate(kCFAllocatorDefault,
blockBuffer,
true,
NULL,
NULL,
formatDescription,
1,
0,
NULL,
1,
&sampleSize,
&sampleBuffer);
ブロックバッファをどのように処理すればよいですか? SampleBuffer はブロック バッファのメモリを保持していますか、それとも割り当てが解除されていないことを確認するために何かをする必要がありますか?
また、非同期デコード プロセスに関連して、デコーダが CMSampleBuffer をいつ処理するかを知る賢明な方法はありますか?
私の直感では、CMSampleBuffer は CMBlockBuffer を保持し、VTDecodeSession はデコードが完了するまで CMSampleBuffer を保持しますが、これは文書化されていない領域であり、私がさまよっているので、方向性を探しています。私が得ている結果は、私の直感が間違っている可能性があることを暗示しているので、正気を保つために問題としてメモリ管理を除外する必要があります...