2012-01-03 68 views
3

任何人都可以解释(或指出相关的FM覆盖)这个功能吗?CVOpenGLESTextureCacheCreateTextureFromImage报告“无法创建IOSurface图像(纹理)”

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

+0

这是相关的? https://开头github上。com/BradLarson/GPUImage/issues/220 – Abhinit 2012-10-10 16:28:57

回答

3

你打电话CFRelease()CVOpenGLESTextureCacheRefCVOpenGLESTextureRef当你不需要他们了?

苹果源代码:

1

不想要恢复一个老问题,但我刚刚花了好几天,试图找出同样的问题(虽然上ios 8.4),并且在使用Google时遇到这个问题。

我终于想通了[至少对我] internalFormat需要是GL_RGBA。我愚蠢地使用GL_BGRA,因为这是在IOS上使用的内部格式,而且我正在将我的视频解码为BGRA,并且文档说“这是如何解码GL_BGRA”,但后来我意识到他们在文档/标题注释中使用了GL_RGBA。

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

+0

感谢您的帮助,您的观察非常有用 – 2017-01-17 12:13:24