1

我想在 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 关联的底层缓冲区?谢谢!

4

1 回答 1

2

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

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

从 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

在状态 OMX_StateIdle:

  1. 解码器知道本机缓冲区、buffer_header 和 egl_image 之间的对应关系。
  2. 渲染器知道buffer_header和egl_image之间的对应关系。

在 OMX_StateExecuting 状态下:

  1. 解码器将帧写入本机缓冲区,并调用OMX_EmptyThisBuffer(buffer_header)隧道端口
  2. 渲染调用glEGLImageTargetTexture2DOES(egl_image)以绘制帧。

从 OMX_StateIdle 到 OMX_StateLoaded 的转换:

  1. OMX_FreeBuffer(buffer_header)隧道端口上的解码器调用
  2. 渲染空闲buffer_header
  3. 解码器调用eglDestroyImageKHR(egl_image)
  4. 解码器删除 native_buffer

对不起我的英语不好

于 2014-02-20T13:18:46.160 回答