【发布时间】:2011-07-18 09:31:12
【问题描述】:
我正在使用 ffmpeg 库解码视频并将解码的帧存储在数组中。现在我想用 OpenGL 在屏幕上绘制这些帧。我用谷歌搜索,发现苹果提供使用 GL_APPLE_ycbcr_422 格式进行有效绘图。所以我将 ffmpeg 中的解码帧切换为 PIX_FMT_YUYV422 格式(打包的 YUV 4:2:2、16bpp、Y0 Cb Y1 Cr),这似乎相当于 OpenGL 中的 GL_APPLE_ycbcr_422。现在我正在尝试使用此代码在表面上绘制框架:
GLsizei width = 2, height = 2;
uint8_t data[8] = {128,200,123,10,5,13,54,180};
GLuint texture_name;
glEnable(GL_TEXTURE_RECTANGLE_ARB);
assert(glGetError() == GL_NO_ERROR);
glGenTextures (1,&texture_name);
assert(glGetError() == GL_NO_ERROR);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_name);
assert(glGetError() == GL_NO_ERROR);
glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_ARB, width * height * 2, (void*)data);
assert(glGetError() == GL_NO_ERROR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE , GL_STORAGE_SHARED_APPLE);
assert(glGetError() == GL_NO_ERROR);
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
assert(glGetError() == GL_NO_ERROR);
// not sure about code above
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
assert(glGetError() == GL_NO_ERROR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
assert(glGetError() == GL_NO_ERROR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
assert(glGetError() == GL_NO_ERROR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
assert(glGetError() == GL_NO_ERROR);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
assert(glGetError() == GL_NO_ERROR);
// end
glViewport(0, 0, width,height);
assert(glGetError() == GL_NO_ERROR);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
assert(glGetError() == GL_NO_ERROR);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, width, height, 0,
GL_YCBCR_422_APPLE,GL_UNSIGNED_SHORT_8_8_APPLE,
(void*)data);
assert(glGetError() == GL_NO_ERROR);
glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
GL_YCBCR_422_APPLE,GL_UNSIGNED_SHORT_8_8_APPLE,
(void*)data);
assert(glGetError() == GL_NO_ERROR);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glScalef(1.0f, -1.0f, 1.0f);
glOrtho(0, width, 0, height, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBegin(GL_QUADS);
glVertex3f(0, 0, -1.0f);
glVertex3f(width, 0, -1.0f);
glVertex3f(width, height, -1.0f);
glVertex3f(0, height, -1.0f);
glEnd();
但我没有看到正确的帧。相反,我看到我的显示器损坏的图片。所以我明白我对 OpenGL 的使用是不正确的,也许我不了解一些基本的东西。
请帮助纠正和理解我的错误。如果我应该使用 RTFM,请给我一个对我有帮助的链接,因为我没有找到任何有用的信息。
【问题讨论】:
-
您可以发布您的
glTexImage2D电话吗?为纹理分配存储空间的那个。 -
感谢您的回复!如果我理解,我不需要调用 glTexImage2D 因为这个函数只是从一种 pxl 格式转换为另一种格式。但如果你问它,那么我可能理解错了。实际上,我之前使用过 glTexImage2D 调用,参数如下: glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA8, width, height, 0, GL_YCBCR_422_APPLE,GL_UNSIGNED_SHORT_8_8_APPLE, vp->bitmap)
-
你似乎是对的,我之前需要使用 glTexImage2D 调用。现在我正在使用它,但没有任何改变
-
更新您的帖子以包含您的新代码。
-
这可能是因为您使用的是大小合适的内部格式。尝试简单的
GL_RGBA而不是GL_RGBA8。