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

tv6aics1  于 2022-12-21  发布在  Android
关注(0)|答案(1)|浏览(214)

我想在我的原生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相关的底层缓冲区?

lf5gs5x2

lf5gs5x21#

我认为调用OMX_UseEGLImage只适用于渲染。
例如,考虑两个组件:解码器和渲染器通过隧道通信。解码器输出端口通过隧道连接到渲染器输入端口。解码器输出端口是缓冲供应器。
从OMX_StateLoaded转换到OMX_StateIdle时:
1.解码器创建本机缓冲区:
android::GraphicBuffer * buffer = new android::GraphicBuffer(); android_native_buffer_t * native_buffer = buffer->getNativeBuffer();
1.解码器创建EGLImage:
EGLImageKHR egl_image = eglCreateImageKHR((EGLClientBuffer)native_buffer)
1.隧道端口上的解码器调用:
OMX_UseEGLImage(&buffer_header, egl_image)

  1. Render分配buffer_header并记住egl_image
    在OMX_StateIdle状态下:
    1.解码器知道本地缓冲区、buffer_header和egl_image之间的对应关系。
    1.渲染器知道buffer_header和egl_image之间的对应关系。
    在OMX_StateExecuting状态下:
    1.解码器将帧写入本机缓冲区,并在隧道端口上调用OMX_EmptyThisBuffer(buffer_header)
    1.渲染调用glEGLImageTargetTexture2DOES(egl_image)以绘制帧。
    从OMX_StateIdle转换到OMX_StateLoaded时:
    1.隧道端口上的解码器调用OMX_FreeBuffer(buffer_header)
    1.呈现可用缓冲区标头(_H)
    1.解码器调用eglDestroyImageKHR(egl_image)
    1.解码器删除native_buffer

相关问题