2010-12-11 75 views
1

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

Répondre

0

Dans votre approche B, vous libérez le imageData immédiatement après avoir copié le tampon de pixel en elle. Si vous utilisez le mode débogage, il est possible que le gestionnaire de mémoire efface la mémoire. Dans tous les cas, n'appelez pas free() avant d'avoir complètement terminé les données.

+0

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

+0

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); –