2010-12-11 23 views
1

我想從相機中獲取圖像的像素。 我正在使用CoreFoundation和OpenGL,我可以渲染圖像,但我想做一些其他的事情(在其他地方/線程),所以我需要複製它們。從相機輸入複製像素

這是我曾嘗試:(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); 

在方法AI都極力挽留孔緩衝這樣我就可以在需要時以後複製像素,但我總是得到一個空指針(我不知道爲什麼)

在方法BI嘗試每次複製像素,但我然後我opengl呈現器將顯示一個黑色的圖像。我不知道爲什麼,我不修改原始緩衝區?

在此先感謝;)

伊格納西奧

回答

0

在你的方法B,你釋放的imageData你複製像素緩衝區進去之後。如果您在調試模式下運行,內存管理器可能正在清除內存。無論如何,在數據完全處理完畢之前,請勿撥打免費電話()。

+0

你是對的,但即使我手中的malloc的內存和dealloc方法釋放它,我仍然得到一個黑屏。我已經意識到,如果我在glTexSubImage2D之後放置了方法B,它會渲染幀,但我不知道爲什麼?我沒有處理原始數據。我正在複製它。 – nacho4d 2010-12-11 18:07:12

+0

您對上述memcpy的調用實際上會用新分配的內存覆蓋像素緩衝區的內容。簽名是 void * memcpy(void * destination,const void * source,size_t num); – 2010-12-16 17:05:02