【问题标题】:how to get the underlying buffer of EGLImage?如何获取 EGLImage 的底层缓冲区?
【发布时间】:2014-02-21 01:34:38
【问题描述】:

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

【问题讨论】:

  • 这个问题困扰了我好几天,谁能给我一些建议?谢谢!

标签: android opengl-es egl


【解决方案1】:

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

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

在从 OMX_StateLoaded 到 OMX_StateIdle 的转换时:

  1. 解码器创建本机缓冲区:
    android::GraphicBuffer * buffer = new android::GraphicBuffer();<br>android_native_buffer_t * native_buffer = buffer-&gt;getNativeBuffer();
  2. 解码器创建 EGLImage:
    EGLImageKHR egl_image = eglCreateImageKHR((EGLClientBuffer)native_buffer)
  3. 隧道端口上的解码器调用:
    OMX_UseEGLImage(&amp;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

对不起我的英语

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多