Я пишу код для распаковки потокового потока H.264 нативного приложения B, и я просматриваю процесс разбора потока, создавая CMVideoFormatDescription из SALPS/PPS NALU и обертывая другие NALUs, которые я извлекаю из потока в CMSampleBuffers.Владение CMBlockBuffer в CMSampleBuffer
Я страдаю от умственного блока, как обращаться с памятью 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, каково будет правильное значение распределителя? –
Еще одно замечание: я получил это для работы, но я обнаружил, что другая структура данных, переданная VTDecompressionSessionCreate, CMVideoFormatDescription, кажется, не копируется сеансом, и мне нужно было убедиться, что я тоже держался на этом блоке, или я получить сбой. Авария для этих условий появляется в сборке в процедуре CFEqual, и если вы посмотрите на один уровень вверх, вы увидите, что в это время пытались прочитать CMVideoFormatDescription. –
Документация для kCFAllocatorMalloc говорит, что она использует malloc, realloc и бесплатно. Если бы я шел по этому маршруту, я бы, вероятно, использовал тот же распределитель, который выделил бы память напрямую, а не предполагал, что мой вызов malloc() соответствует вызову распределителя free(). Кажется более безопасным и более ясным/понятным, хотя документация утверждает, что они одинаковы. – DSaracino