2012-04-06 19 views
9

tuve extracto de los datos YUV de fotograma de vídeo por separado y las guardó en data[0],data[1],data[2]; El tamaño del cuadro es 640*480; Ahora CreaT la pixelBuffer de la siguiente manera:CVOpenGLESTextureCacheCreateTextureFromImage volver -6683 (kCVReturnPixelBufferNotOpenGLCompatible)

void *pYUV[3] = {data[0], data[1], data[2]}; 
size_t planeWidth = {640, 320, 320}; 
size_t planeHeight = {480, 240, 240}; 
size_t planeBytesPerRow = {640, 320, 320}; 
CVReturn renturn = CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault, 
            640, 
            480, 
            kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, 
            nil, 
            nil, 
            3, 
            pYUV, 
            planeWidth, 
            planeHeight, 
            planeBytesPerRow, 
            nil, 
            nil, nil, &_pixelBuffer); 
CVPixelBufferLockBaseAddress(_pixelBuffer, 0); 
CVPixelBufferRetain(_pixelBuffer); 
    // Periodic texture cache flush every frame 
CVOpenGLESTextureCacheFlush(_textureCache, 0); 

// The Buffer cannot be used with OpenGL as either its size, pixelformat or attributes are not supported by OpenGL 
glActiveTexture(GL_TEXTURE0); 
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, 
                  _textureCache, 
                  _pixelBuffer, 
                  NULL, 
                  GL_TEXTURE_2D, 
                  GL_LUMINANCE, 
                  im.width, 
                  im.height, 
                  GL_LUMINANCE, 
                  GL_UNSIGNED_BYTE, 
                  0, 
                  &_yTexture); 

if (!_yTexture || err) { 
    NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); 
    return; 
} 
glBindTexture(CVOpenGLESTextureGetTarget(_yTexture), CVOpenGLESTextureGetName(_yTexture)); 
CVPixelBufferUnlockBaseAddress(_pixelBuffer, 0); 

Pero el errar es -6638 , la documentación simplemente indica que "el búfer de píxeles no es compatible con OpenGL debido a un tamaño de búfer, formato de píxel o atributo incompatible". lo cual no me ayuda mucho.

¿Cómo puedo arreglarlo?

+0

¿Alguna vez se dio cuenta de esto? Tengo el mismo problema – Hammer

+0

Tengo el mismo error. ¿Cualquier progreso? – polyclick

Respuesta

1

¿Su imagen de origen/marco de video tiene una resolución que es una potencia de 2? Si no, debes cambiar el tamaño antes de crear la textura.

1

de Apple detalla la causa de este problema exacto en Technical Q&A 1781

La cuestión es que el tampón de píxel de origen debe estar respaldada IOSSurface. Especifique un diccionario vacío como el valor en kCVPixelBufferIOSurfacePropertiesKey