CVOpenGLESTextureCacheCreateTextureFromImage报告“无法创建IOSurface图像(纹理)”

时间:2012-01-03 08:42:35

标签: ios

任何人都可以解释(或指出相关的FM覆盖)这个功能吗?

iPad 2,iOS 5.0.0,Xcode 4.2,ARC项目。

我的项目从相机中获取输入并将其与各种图像混合,最后在屏幕上呈现所有图像。

只要我没有得到内存警告,它就可以无限期地正常工作,没有内存泄漏。

didReceiveMemoryWarning之后,调用此函数的前5次失败说“无法创建IOSurface图像(纹理)”。之后,屏幕变黑,程序停止响应。我可以按主页键然后终止该应用程序。

我的电话如下:

    err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, 
                                                   _videoTextureCache,
                                                   pixelBuffer,
                                                   NULL,
                                                   GL_TEXTURE_2D,
                                                   GL_RED_EXT,
                                                   _textureWidth,
                                                   _textureHeight,
                                                   GL_RED_EXT,
                                                   GL_UNSIGNED_BYTE,
                                                   0,
                                                   &_lumaTexture);

_videoTextureCache最初是使用以下内容创建的:

    //-- Create CVOpenGLESTextureCacheRef for optimal CVImageBufferRef to GLES texture conversion.
    CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)_context, NULL, &_videoTextureCache);
    if (err) 
    {
        NSLog(@"Error at CVOpenGLESTextureCacheCreate %d", err);
        return;
    }

_videoTextureCache的定义如下:

CVOpenGLESTextureCacheRef _videoTextureCache;    

当我收到内存警告时,是否需要调用某些内容来释放已分配的内存? 我可以nil _videoTextureCache(因此ARC可以清理内存),然后重新创建吗?

到目前为止,我发现的唯一文档是.h中声明函数的注释,这似乎没有帮助。

有人知道其他文件吗?

-Ken

2 个答案:

答案 0 :(得分:3)

当您不再需要CFRelease()CVOpenGLESTextureCacheRef时,您是否正在呼叫CVOpenGLESTextureRef

Apple源代码:

答案 1 :(得分:1)

不想重复旧问题,但我花了好几天时间试图找出同样的问题(虽然在ios 8.4上),并在谷歌搜索时不断遇到这个问题。

我终于发现[至少对我来说] internalFormat需要GL_RGBA。我使用GL_BGRA是愚蠢的,因为它是IOS上使用的内部格式,而我正在将我的视频解码为BGRA而文档说"这是如何解码GL_BGRA"但后来我意识到他们在docs / header评论中使用了GL_RGBA。

像素格式很高兴GL_RGBA或GL_BGRA(只是颜色适当翻转)