我想从解码输出中转储YUV
数据。OMXCodec
是MediaBuffer
类型。无法访问 data() 指针。
如果我尝试访问数据,由于下面的检查代码会发生崩溃。
frameworks/av/media/libstagefright/MediaBuffer.cpp:119 CHECK(mGraphicBuffer == NULL) failed.
请让我知道从中提取YUV
数据的解决方案MediaBuffer
。
我想从解码输出中转储YUV
数据。OMXCodec
是MediaBuffer
类型。无法访问 data() 指针。
如果我尝试访问数据,由于下面的检查代码会发生崩溃。
frameworks/av/media/libstagefright/MediaBuffer.cpp:119 CHECK(mGraphicBuffer == NULL) failed.
请让我知道从中提取YUV
数据的解决方案MediaBuffer
。
从MediaBuffer
,我觉得以下应该是功能性的。我还没有尝试过相同的方法,并且已经使用了 rg2 的解决方案,即直接基于gralloc
句柄,但觉得以下也应该是功能性的。
sp<GraphicBuffer> mCurrGraphicBuffer;
void *vaddr;
err = source->read(&buffer, &options); // Where buffer is of MediaBuffer type
mCurrGraphicBuffer = buffer->graphicBuffer();
width = mCurrGraphicBuffer->getWidth();
height = mCurrGraphicBuffer->getWidth();
format = mCurrGraphicBuffer->getFormat();
mCurrGraphicBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, &vaddr);
//Dump the YUV file based on the vaddr, width, height, format
mCurrGraphicBuffer->unlock();
编辑:
为了使上述解决方案起作用,GraphicBuffer
应该使用适当的使用标志来创建或分配实际值,即应该在创建缓冲区时提示 CPU 将访问它。否则,-EINVAL
将根据gralloc
.
在某些平台上,硬件解码器默认不创建用户空间 YUV。你可以试试
OMXCodec::Create(…,
flags | OMXCodec::kClientNeedsFramebuffer);
你用的是什么平台?
1)通常获得输出缓冲区转储的最简单方法是在供应商 OMX IL 中进行(在我工作的每个供应商 impl 中都有现成的函数/宏来执行此操作)
2)如果不是,您应该尝试在 ACodec 中转储缓冲区onFillBufferDone
(您需要区分音频/视频),或者onOutputBufferDrained
,您必须从中mGraphicBuffer
获取原始缓冲区 - 封装取决于平台,例如对于 qc
void const *buf = (void const*)((private_handle_t*)(info->mGraphicBuffer->handle))->base;
假设信息是(在 ACodec::onOutputBufferDrained 中)
BufferInfo *info =
mCodec->findBufferByID(kPortIndexOutput, bufferID, &index);
在 OMXCodec 的情况下,您可以在 OMXCodec::read 的末尾进行相同的操作,返回的 buf 只是保存到文件中,要写入的大小将为 WxHxPixelRatio。