【问题标题】:How to dump YUV from OMXCodec decoding output如何从 OMXCodec 解码输出中转储 YUV
【发布时间】:2014-02-12 03:01:45
【问题描述】:

我想转储来自OMXCodec 解码输出的YUV 数据。 这是MediaBuffer 类型。无法访问 data() 指针。

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

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

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

【问题讨论】:

    标签: android dump yuv stagefright


    【解决方案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 将按照 documentation in gralloc 返回。

    【讨论】:

    • 非常感谢。根据您的评论,我可以从 MediaBuffer 中提取 YUV 数据。但是,这种颜色格式是“OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka”。我需要将其转换为 YUV420Planar。能找到转换函数吗?
    • @user2453912.. 请检查我在这个问题中的评论:stackoverflow.com/questions/21797923/…。我想你只是问了同样的问题
    • @user2453912.. 如果它回答了您的问题,您能接受吗?
    【解决方案2】:

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

    OMXCodec::Create(…,
        flags | OMXCodec::kClientNeedsFramebuffer);
    

    【讨论】:

      【解决方案3】:

      你用的是什么平台?

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        • 2015-09-23
        相关资源
        最近更新 更多