glTexImage2D被排除在外,因为它很慢,YUV420P帧是实时视频解码@ 25FPS的结果,而glTexImage2D我们无法保持所需的帧速率.
还有另一种选择:eglCreateImageKHR / glEGLImageTargetTexture2DOES.唯一的问题是这些不能处理任何适合YUV420 / YV12数据的图像格式.
EGLint attribs[] = { EGL_WIDTH,800,EGL_HEIGHT,480,EGL_IMAGE_FORMAT_FSL,EGL_FORMAT_YUV_YV12_FSL,EGL_NONE }; EGLint const req_attribs[] = { EGL_RED_SIZE,5,EGL_GREEN_SIZE,6,EGL_BLUE_SIZE,EGL_ALPHA_SIZE,EGL_SAMPLES,EGL_COLOR_BUFFER_TYPE,EGL_RGB_BUFFER,EGL_SURFACE_TYPE,EGL_WINDOW_BIT,EGL_NONE }; ... display = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(display,NULL,NULL); eglBindAPI(EGL_OPENGL_ES_API); eglChooseConfig(display,req_attribs,config,ARRAY_SIZE(config),&num_configs); ctx = eglCreateContext(display,curr_config,NULL); surface = eglCreateWindowSurface(display,fb_handle,NULL); ... EGLImageKHR yuv_img = eglCreateImageKHR(display,EGL_NO_CONTEXT,EGL_NEW_IMAGE_FSL,attribs); eglQueryImageFSL(display,yuv_img,EGL_CLIENTBUFFER_TYPE_FSL,(EGLint *)&ptr); glGenTextures(1,&texture); glBindTexture(GL_TEXTURE_2D,texture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D,yuv_img);
glEGLImageTargetTexture2DOES(…)失败.如果我将’attribs’中的相应行更改为:
EGL_IMAGE_FORMAT_FSL,EGL_FORMAT_RGB_565_FSL,
然后可以将图像分配给OpenGL ES纹理,但不适合保存8位数据(Y / U / V)或YUV420 / YV12数据.搜索网络(包括飞思卡尔社区论坛)我还没有找到任何解决方案.
如何创建图像:
>快速创造;
>最终可以分配给已经存在的缓冲区(给出物理地址或虚拟地址);
>可以在片段/顶点着色器程序中用于执行YUV – > RGB转换;
约束是为了避免因性能原因而不必要的memcpy(…).
解决方法
http://software.intel.com/en-us/articles/using-opengl-es-to-accelerate-apps-with-legacy-2d-guis
我怀疑你的问题是你没有绑定到正确的纹理目标.它应该是这样的:
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES,hEglImage[iTextureIndex]); glBindTexture(GL_TEXTURE_EXTERNAL_OES,hTexture[iIndex]);
而且eglImageAttributes应该是以下之一:
EGLint eglImageAttributes[] = {EGL_WIDTH,iTextureWidth,iTextureHeight,EGL_NONE}; EGLint eglImageAttributes[] = {EGL_WIDTH,EGL_FORMAT_YUV_NV21_FSL,EGL_FORMAT_YUV_UYVY_FSL,EGL_NONE}; hEglImage[iTextureIndex] = eglCreateImageKHR(eglDisplay,eglImageAttributes); struct EGLImageInfoFSL EglImageInfo; eglQueryImageFSL(eglDisplay,hEglImage[iTextureIndex],(EGLint *)&EglImageInfo);
虽然飞思卡尔i.MX53平台的这一特性使视频的YUV到RGB色彩空间转换速度非常快,但它确实有一些限制:
>它仅支持3种YUV格式.
> eglCreateImageKHR()必须分配缓冲区.没有办法让它使用现有的缓冲区.飞思卡尔证实,NULL指针不能是其他任何东西,这在技术上违反了Khronos规范.
飞思卡尔已经在i.MX6平台上解决了这些问题,尽管架构确实不同.希望这可以帮助.