FFMPEG:将YUV数据映射到解码函数的输出缓冲区

时间:2013-12-04 07:09:38

标签: pointers video ffmpeg yuv

我正在修改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,并假设我需要将*数据指向我的YUV数据指针,并且转储内容将由ffmpeg处理。请提供相同的建议。

1 个答案:

答案 0 :(得分:2)

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

更新

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

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

您在链接的问题中已经回答了这个问题。 接下来,void *数据指向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;
...
}