android - 如何从 OMXCodec 解码输出中转储 YUV

标签 android dump yuv stagefright

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

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

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

请告诉我从这个 MediaBuffer 中提取 YUV 数据的解决方案。

最佳答案

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 将根据 documentation in gralloc 返回.

关于android - 如何从 OMXCodec 解码输出中转储 YUV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21717728/

相关文章:

java - 无法执行 android :onClick ERROR 的方法

android - 如何在选项卡项中添加 Textview?我在 setCustomView 中得到 nullPointerException

mysql - 我如何从 mysql 表中转储 blob 字段

c - YUV 422 , YUV 420 , YUV 444

c++ - 将 YUY2 转换为 YV12

android - 自定义 Dialog.show() 上的 BadTokenException

android - 使用 Retrofit 的 HTTP 与 HTTPS 请求

MySql Dump 输出条件注释?执行转储作为查询以恢复数据库

debugging - 在windbg中,什么可能导致消息 "WARNING: Unable to verify timestamp for mydll.dll"?

c - 如何使用 IPP 将 8 位灰度图像转换为 NV12(有限范围)颜色空间