我正在編寫解壓本地annex-B H.264數據流的代碼,並且我正在通過解析流,從SPS/PPS NALU創建CMVideoFormatDescription幷包裝其他NALUs我從CMSampleBuffers中的流中提取。CMSampleBuffer中的CMBlockBuffer所有權
我忍受着如何處理解碼器的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直到它解碼完成,但這是我沒有記錄的領域,我正在尋找一些方向。結果我暗示我的直覺可能是錯誤的,所以我需要排除內存管理作爲一個問題,以保持我的理智...
謝謝,這很有幫助。所以如果我使用malloc來分配CMBlockBuffer,那麼正確的分配器值是什麼? –
另外一個注意事項是,我確實得到了這個工作,但是我發現交給VTVideoFormatDescription的另一個數據結構看起來並沒有被會話複製,而且我還需要確保我保持在該塊上,否則我得到一個崩潰。 這些條件的崩潰出現在CFEqual例程中的彙編中,如果您向上看一級,則會看到當時正試圖讀取CMVideoFormatDescription。 –
kCFAllocatorMalloc的文檔說它使用malloc,realloc和free。但是,如果我要走這條路線,我可能會使用相同的分配器直接分配內存,而不是假定我對malloc()的調用將分配器的調用與free()匹配。看起來更安全,更明確/更易於理解,儘管文檔聲稱它們是相同的。 – DSaracino