Я пишу код для распаковки собственного потока H.264 приложения-B и выполняю процесс анализа потока, создания CMVideoFormatDescription из NALU SPS/PPS и упаковки других 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 до завершения декодирования, но это недокументированная территория, по которой я блуждаю, поэтому ищу какое-то направление. Результаты, которые я получаю, подразумевают, что моя интуиция может быть ошибочной, поэтому мне нужно исключить управление памятью как проблему, чтобы сохранить рассудок...