我正在修改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。输出指针只是一个。
即:CCD_ 1是我需要为其指向CCD_ 2的输出指针。我该怎么做?
我尝试过的一种方法是,创建一个新的缓冲区,其大小等于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:解释任何编解码器函数指针的参数,并假设我需要将*data指向我的YUV数据指针,而转储内容将由FFMPEG处理。请提供重新评级的建议。
你做错了什么。您无法解释为什么需要将平面映射到单个指针。你想通过这样做来实现什么,因为没有理由需要这样做。您是否尝试从平面格式转换为非平面格式(如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;
...
}