【问题标题】:FFMPEG: Mapping YUV data to output buffer of decode functionFFMPEG:将 YUV 数据映射到解码函数的输出缓冲区
【发布时间】:2013-12-04 07:09:37
【问题描述】:

我正在修改 FFMPEG 的视频解码器代码。解码后的代码格式为 YUV420。我有 3 个指针,每个指针指向 Y、U 和 V 数据,即:

yPtr-> is a pointer pointing to the Luma
uPtr-> is a pointer pointing to the Chroma Cb
vPtr-> is a pointer pointing to the Chroma Cr

但是,我需要将 YUV 数据映射到的输出指针是 void 类型。并且输出指针只有一个。

即:void *data 是我需要指向我的yPtr, uPtr and vPtr 的输出指针。我该怎么做?

我尝试过的一种方法是,创建一个大小等于 Y、U 和 V 数据总和的新缓冲区,并将 yPtr、uPtr 和 vPtr 的内容复制到新分配的缓冲区,并将指向此的指针我分配给*data输出指针的缓冲区。

但是这种方法不是首选,因为需要执行 memcpy 和其他性能缺陷。

任何人都可以为这个问题提出一个替代方案。这可能与 FFMPEG 没有直接关系,但由于我正在修改 FFMPEG 的 libavcodec 的解码器代码,所以我将其标记在 FFMPEG 中。

编辑:我想要做什么:

实际上我的理解是,如果我让这个指针指向任何解码器的任何解码函数的void *data 指针并将*got_frame_ptr 设置为1,框架将负责将这些数据转储到yuv 文件中。我的理解正确吗?

我的自定义视频解码器或ffmpeg中的任何视频解码器的功能原型如下图:

static int myCustomDec_decode_frame(AVCodecContext *avctx,
            void *data, int *data_size,
            uint8_t *buf, int buf_size) {

我指的是这篇文章FFMPEG: Explain parameters of any codecs function pointers 并假设我需要将 *data 指向我的 YUV 数据指针,而转储的东西将由 ffmpeg 处理。请提供相同的建议。

【问题讨论】:

    标签: pointers video ffmpeg yuv


    【解决方案1】:

    你做错了什么。您没有解释为什么需要将平面映射到单个指针。你想通过这样做来完成什么,因为没有理由需要这样做。您是否尝试从刨床转换为非刨床格式(如 YUYV 或 RGB)?如果是这样,它比 memcpy 更复杂,字节需要交错。你可以用 libswscale 做到这一点。

    更新:

    首先,您的原型是错误的。正确的是。

    static int cook_decode_frame(AVCodecContext *avctx, void *data,
                                 int *got_frame_ptr, AVPacket *avpkt)
    

    这在您链接的问题中得到了回答。 接下来,void *data 指向一个 AVFrame。

    static int decode_frame(AVCodecContext *avctx, void *data,
                            int *got_frame, AVPacket *avpkt)
    {
        ...
        AVFrame *pict      = data;
        ...
    }
    

    还有 vorbiddec.c

    static int vorbis_decode_frame(AVCodecContext *avctx, void *data,
                                   int *got_frame_ptr, AVPacket *avpkt)
    {
        ...
        AVFrame *frame     = data;
        ...
    }
    

    该示例链接了您引用的问题。

    static int cook_decode_frame(AVCodecContext *avctx, void *data,
                                 int *got_frame_ptr, AVPacket *avpkt)
    {
          AVFrame *frame     = data;
    ...
    }
    

    【讨论】:

    • 感谢您的回答。但我这样做的原因是,ffmpeg 框架提供的指针只是一个。需要使这个指针指向我的输出帧数据。而 uotput 帧是 Y、U 和 V 数据的组合。
    • Ffmpeg 从不只是“提供”一个指针。您需要分配一个包含一个的结构。您要填充什么指针? AVPacket.data?您错过了一个步骤,并且没有确切说明您想要完成的任务,您的问题无法回答。
    猜你喜欢
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2018-02-14
    • 2011-08-25
    • 2013-01-13
    相关资源
    最近更新 更多