【发布时间】:2012-07-21 09:45:48
【问题描述】:
我使用 opengl es 在 iPad 上显示 bgr24 数据,我是 opengl es 的新手,所以在显示视频部分我使用来自 RosyWriter 的代码一个 APPLE 示例。它可以工作,但 CVOpenGLESTextureCacheCreateTextureFromImage 函数花费超过 30 毫秒,而在 RosyWriter 它的成本可以忽略不计。 我所做的是首先将 BGR24 转换为 BGRA 像素格式,然后使用 CVPixelBufferCreateWithBytes 函数创建一个 CVPixelBufferRef,然后通过 CVOpenGLESTextureCacheCreateTextureFromImage 获取一个 CVOpenGLESTextureRef。我的代码如下,
- (void)transformBGRToBGRA:(const UInt8 *)pict width:(int)width height:(int)height
{
rgb.data = (void *)pict;
vImage_Error error = vImageConvert_RGB888toARGB8888(&rgb,NULL,0,&argb,NO,kvImageNoFlags);
if (error != kvImageNoError) {
NSLog(@"vImageConvert_RGB888toARGB8888 error");
}
const uint8_t permuteMap[4] = {1,2,3,0};
error = vImagePermuteChannels_ARGB8888(&argb,&bgra,permuteMap,kvImageNoFlags);
if (error != kvImageNoError) {
NSLog(@"vImagePermuteChannels_ARGB8888 error");
}
free((void *)pict);
}
变换后会生成CVPixelBufferRef,代码如下,
[self transformBGRToBGRA:pict width:width height:height];
CVPixelBufferRef pixelBuffer;
CVReturn err = CVPixelBufferCreateWithBytes(NULL,
width,
height,
kCVPixelFormatType_32BGRA,
(void*)bgraData,
bytesByRow,
NULL,
0,
NULL,
&pixelBuffer);
if(!pixelBuffer || err)
{
NSLog(@"CVPixelBufferCreateWithBytes failed (error: %d)", err);
return;
}
CVOpenGLESTextureRef texture = NULL;
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
videoTextureCache,
pixelBuffer,
NULL,
GL_TEXTURE_2D,
GL_RGBA,
width,
height,
GL_BGRA,
GL_UNSIGNED_BYTE,
0,
&texture);
if (!texture || err) {
NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);
CVPixelBufferRelease(pixelBuffer);
return;
}
其他代码几乎与 RosyWriter 示例类似,包括着色器。所以我想知道为什么, 如何解决这个问题。
【问题讨论】:
-
您要上传的图片尺寸是多少?你确定你没有在这 30 毫秒内测量你的
-transformBGRToBGRA:方法的时间吗? -
是的,我确定。是1024 * 768,transformBGRToBGRA的时间:我测的是10ms。
-
好的,所以您测量的 30 毫秒是从
CVPixelBufferCreateWithBytes()调用之前到CVOpenGLESTextureCacheCreateTextureFromImage()调用之后的右侧?这似乎非常高,因为我已经看到 iPad 2 上传 1080p 帧(像素多 2.6 倍)比 30 毫秒快得多。如果您只对这些数据使用glTexImage2D(),您的时间是多少? -
真的很高,实际上30ms只需要调用CVOpenGLESTextureCacheCreateTextureFromImage(),函数CVPixelBufferCreateWithBytes()什么都不用。我只是用 glTexImage2D() 重写代码,大约花费 5ms,所以我认为这也更高,我花了一天多的时间寻找原因,并尝试解决此问题,但没有答案。
-
看来我找到了答案,你能给我一些建议吗?