J'écris du code pour décompresser un flux H.264 natif de l'annexe B, et je suis en train d'analyser le flux, de créer une CMVideoFormatDescription à partir des NALU SPS/PPS, et d'envelopper le autres NALUs que j'extrais du flux dans CMSampleBuffers.Propriété CMBlockBuffer dans CMSampleBuffer
Je souffre d'un blocage mental sur la façon de gérer la mémoire CMBlockBuffer et CMSampleBuffer pour le décodeur. Je crois que mon problème est plus un manque de compréhension approfondie de la façon dont les FC traitent la mémoire que toute autre chose, alors ma question est vraiment plus à ce sujet, mais j'espère que le contexte est utile.
Si je crée un CMBlockBuffer comme ceci:
CMBlockBufferRef blockBuffer;
OSStatus status = CMBlockBufferCreateWithMemoryBlock(NULL,
memoryBlock,
blockBufferLength,
kCFAllocatorNull,
NULL,
0,
blockBufferLength,
kCMBlockBufferAlwaysCopyDataFlag | kCMBlockBufferAssureMemoryNowFlag,
&blockBuffer);
et l'ajouter à un CMSampleBuffer comme ceci:
CMSampleBufferRef sampleBuffer;
status = CMSampleBufferCreate(kCFAllocatorDefault,
blockBuffer,
true,
NULL,
NULL,
formatDescription,
1,
0,
NULL,
1,
&sampleSize,
&sampleBuffer);
Comment dois-je gérer la mémoire tampon de bloc? Est-ce que le SampleBuffer conserve la mémoire du tampon de bloc, ou dois-je faire quelque chose pour m'assurer qu'il n'est pas libéré?
En ce qui concerne le processus de décodage asynchrone, y a-t-il un moyen judicieux de savoir quand le décodeur est fait avec le CMSampleBuffer pour que je puisse en disposer? Mon intuition me dit que le CMSampleBuffer conserverait le CMBlockBuffer, et que le VTDecodeSession conserverait le CMSampleBuffer jusqu'à ce qu'il ait terminé le décodage, mais c'est un territoire non documenté dans lequel je suis en train d'errer pour trouver une direction. Les résultats que j'obtiens impliquent que mon intuition pourrait être fausse, donc j'ai besoin d'exclure la gestion de la mémoire comme problème pour garder ma santé mentale ...
Merci, ceci est utile. Donc, si j'utilise malloc pour allouer le CMBlockBuffer, quelle serait la bonne valeur d'allocateur? –
Une note supplémentaire, je l'ai fait fonctionner, mais j'ai découvert qu'une autre structure de données transmise à VTDecompressionSessionCreate, la CMVideoFormatDescription, ne semble pas être copiée par la session, et je devais m'assurer que je tenais sur ce bloc aussi bien avoir un accident. Le plantage de ces conditions apparaît dans l'assembly de la routine CFEqual, et si vous regardez un niveau, vous voyez qu'il essayait de lire la CMVideoFormatDescription à ce moment-là. –
La documentation de kCFAllocatorMalloc indique qu'il utilise malloc, realloc et free. Si je devais suivre cette route, cependant, j'utiliserais probablement le même allocateur allouer la mémoire directement plutôt que de supposer que mon appel à malloc() correspondait à l'appel de l'allocateur à free(). Semble plus sûr et plus explicite/plus facile à comprendre, même si la documentation prétend qu'ils sont identiques. – DSaracino