1

我想从解码输出中转储YUV数据。OMXCodecMediaBuffer类型。无法访问 data() 指针。

如果我尝试访问数据,由于下面的检查代码会发生崩溃。

frameworks/av/media/libstagefright/MediaBuffer.cpp:119 CHECK(mGraphicBuffer == NULL) failed.

请让我知道从中提取YUV数据的解决方案MediaBuffer

4

3 回答 3

1

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.

于 2014-02-13T10:13:29.440 回答
0

在某些平台上,硬件解码器默认不创建用户空间 YUV。你可以试试

OMXCodec::Create(…,
    flags | OMXCodec::kClientNeedsFramebuffer);
于 2014-02-12T14:54:41.277 回答
0

你用的是什么平台?

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。

于 2014-02-12T13:39:24.390 回答