CVOpenGLESTextureCacheCreateTextureFromImage возвращает -6683 (kCVReturnPixelBufferNotOpenGLCompatible)

Я извлек данные Y U V из видеокадра отдельно и сохранил их в data[0],data[1],data[2];Размер кадра 640*480;Теперь я создал pixelBuffer, как показано ниже:

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

Но ошибка -6638, в документации просто указано, что «пиксельный буфер несовместим с OpenGL из-за неподдерживаемого размера буфера, формата пикселя или атрибута». что мне мало помогает.

Как я могу это исправить?


person user1278982    schedule 06.04.2012    source источник
comment
Вы когда-нибудь догадывались об этом? у меня та же проблема   -  person Hammer    schedule 07.07.2012
comment
У меня такая же ошибка. Какой-либо прогресс?   -  person polyclick    schedule 01.10.2012


Ответы (2)


Разрешение вашего исходного изображения/видеокадра равно степени двойки? Если нет, вы должны изменить его размер перед созданием текстуры.

person Edward83    schedule 28.06.2013

Apple подробно описывает причину именно этой проблемы в Технические вопросы и ответы 1781.

Проблема в том, что исходный пиксельный буфер должен поддерживаться IOSSurface. Укажите пустой словарь в качестве значения в kCVPixelBufferIOSurfacePropertiesKey

person Buzzy    schedule 19.08.2014