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

标签 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 的内容复制到新分配的缓冲区,并将指向该缓冲区的指针复制到 I' m 分配给 *data输出指针。

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

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

编辑:我正在尝试做的事情:

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

我的自定义视频解码器或ffmpeg中的任何视频解码器的功能原型(prototype)如下图:
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 处理。请提供相同的建议。

最佳答案

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

更新:

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

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;
...
}

关于pointers - FFMPEG:将 YUV 数据映射到解码函数的输出缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20369203/

相关文章:

C++ 程序已停止工作

c++ - c++对象间指针传递

c - 使用指针进行位操作

objective-c - 带透明度的 iPad 视频

php - 如何在新标签页中以固定尺寸播放视频

FFMPEG 如何将多个视频合并到一个具有淡入淡出效果的文件中并添加音频?

c++ - 如何使用户无法删除动态数组?

ios - 如何减少 iOS 上的视频处理时间?

ffmpeg如何从[['I'帧]计算完整的帧 'P'帧]。它在概念上是正确的吗?

ffmpeg - 在整个视频期间显示的标题