Je souhaite obtenir les pixels de l'image de l'appareil photo. J'utilise CoreFoundation et OpenGL et je peux rendre l'image mais je veux faire d'autres choses (dans d'autres endroits/threads) donc j'ai besoin de les copier.Copie de pixels depuis l'entrée de la caméra
C'est ce que j'ai essayé: (partie de la méthode AVCaptureVideoDataOutputSampleBufferDelegate)
CVImageBufferRef tmpPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(tmpPixelBuffer, 0);
//APPROACH A
CFRetain(tmpPixelBuffer);
if(pixelBuffer!= 0) CFRelease(pixelBuffer);
pixelBuffer = tmpPixelBuffer;
//create and bind textureHandle
if(m_textureHandle==0) m_textureHandle = [self _createVideoTextureUsingWidth:videoDimensions.width Height:videoDimensions.width];
glBindTexture(GL_TEXTURE_2D, m_textureHandle);
unsigned char *linebase = (unsigned char *)CVPixelBufferGetBaseAddress(tmpPixelBuffer);
//APPROACH B
unsigned size = videoDimensions.width*videoDimensions.height*4;//since its BGRA
unsigned char *imageData = malloc(size);
memcpy(linebase, imageData, size);
free(imageData);
//map the texture
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, videoDimensions.width, videoDimensions.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, linebase);
CVPixelBufferUnlockBaseAddress(tmpPixelBuffer, 0);
Dans l'approche AI ont essayé de conserver le tampon de trou que je peux copier les pixels plus tard en cas de besoin, mais je reçois toujours un NULL pointeur (je ne sais pas pourquoi)
Dans l'approche BI, essayez de copier les pixels à chaque fois, mais j'ai ensuite opengl renderer montrera une image noire. Je ne sais pas pourquoi, je ne suis pas en train de modifier le tampon original, n'est-ce pas?
Merci à l'avance;)
Ignacio
Vous avez raison mais même si je malloc la mémoire avant la main et la libère dans la méthode dealloc je reçois toujours un écran noir. Je me suis rendu compte que si je mettais l'approche B après glTexSubImage2D cela rendrait le cadre, mais je me demande pourquoi? Je ne gère pas les données d'origine. Je le copie. – nacho4d
Votre appel à memcpy ci-dessus écrase réellement le contenu du buffer de pixels avec votre nouvelle mémoire allouée. La signature est void * memcpy (destination void *, const void * source, taille_t num); –