【发布时间】: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 处理。请提供相同的建议。
【问题讨论】: