如何获取EGLImage的底层缓冲区?

时间:2013-11-05 16:10:09

标签: android opengl-es egl

我想在android上的原生openmax组件中实现OMX_UseEGLImage,但是如何获取与eglImage指定的EGLImage关联的底层缓冲区?

客户端api将创建一个EGLImage并调用OMX_UseEGLImage来通知我的本机openmax组件使用eglimage:

eglImage = eglCreateImageKHR(       m_egl_display,       m_egl_context,       EGL_GL_TEXTURE_2D_KHR,       (EGLClientBuffer)(egl_buffer-> texture_id),       &安培; ATTRIB);

OMX_UseEGLImage(hComponent,ppBufferHdr,nPortIndex,pAppPrivate,eglImage);

问题是我如何使用eglImage?无论如何得到与eglImage相关的底层缓冲区?谢谢!

1 个答案:

答案 0 :(得分:2)

我认为调用OMX_UseEGLImage仅适用于渲染。

例如,考虑两个组件:解码器和使用隧道通信的渲染。解码器输出端口通过隧道连接到Render输入端口。解码器输出端口是缓冲器供应商。

从OMX_StateLoaded到OMX_StateIdle的转换:

  1. 解码器创建本机缓冲区:
    android::GraphicBuffer * buffer = new android::GraphicBuffer();
    android_native_buffer_t * native_buffer = buffer->getNativeBuffer();
  2. 解码器创建EGLImage:
    EGLImageKHR egl_image = eglCreateImageKHR((EGLClientBuffer)native_buffer)
  3. 隧道端口上的解码器调用:
    OMX_UseEGLImage(&buffer_header, egl_image)
  4. Render分配一个buffer_header并记住egl_image
  5. 状态OMX_StateIdle:

    1. 解码器知道本机缓冲区,buffer_header和egl_image之间的对应关系。
    2. 渲染器知道buffer_header和egl_image之间的对应关系。
    3. 状态OMX_StateExecuting:

      1. 解码器在本机缓冲区中写入帧,并在隧道端口上调用OMX_EmptyThisBuffer(buffer_header)
      2. 渲染电话glEGLImageTargetTexture2DOES(egl_image)以绘制框架。
      3. 从OMX_StateIdle转换到OMX_StateLoaded:

        1. 隧道端口
        2. 上的解码器调用OMX_FreeBuffer(buffer_header)
        3. 渲染免费buffer_header
        4. 解码器调用eglDestroyImageKHR(egl_image)
        5. 解码器删除native_buffer
        6. 抱歉我的英文