我想在我的原生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条答案
按热度按时间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)
在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