2010-12-11 13 views
1

カメラから画像のピクセルを取得したいと思います。 CoreFoundationとOpenGLを使用していますが、イメージをレンダリングすることができますが、他の場所(スレッド)で他のものをやりたいのでコピーする必要があります。カメラ入力からピクセルをコピーする

これは私がしようとしたものです:(AVCaptureVideoDataOutputSampleBufferDelegate法の一部)のアプローチAIで

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

は、必要なときに、私は後でピクセルをコピーすることができますので、穴のバッファを保持しようとしましたが、私は常にNULLを取得しますポインタ(理由は分かりません)

アプローチBIでは、毎回ピクセルをコピーしようとしますが、次にOpenGLレンダラーは黒い画像を表示します。なぜ私は元のバッファを変更していないのですか?事前に

おかげで、あなたのアプローチのBで)

イグナシオ

答えて

0

は、あなたがそれにピクセルバッファをコピーした直後に画像データを解放します。デバッグモードで実行している場合は、メモリマネージャがメモリをクリアしている可能性があります。いずれにしても、データが完全に終了するまでfree()を呼び出さないでください。

+0

あなたは正しいですが、手前のメモリをmallocしてdeallocメソッドで解放しても、まだ黒い画面が表示されます。私は、glTexSubImage2Dの後にアプローチBを置くと、フレームをレンダリングすることに気付きましたが、なぜそれが不思議ですか?私は元のデータを扱っていません。私はそれをコピーしています。 – nacho4d

+0

上記のmemcpyを呼び出すと、実際にピクセルバッファの内容が新しく割り当てられたメモリで上書きされます。署名は です。void * memcpy(void * destination、const void * source、size_t num); –

関連する問題