出于研究目的,我试图在解码过程中在运动补偿之前修改每个P帧和B帧的H.264运动矢量(MV).我正在为此目的使用FFmpeg.修改的示例是用其原始空间邻居替换每个MV,然后使用结果MV进行运动补偿,而不是原始MV.请指点我.
到目前为止,我已经能够在文件/libavcodec/h264_cavlc.c中对MV进行简单的修改.在函数ff_h264_decode_mb_cavlc()中,修改mx和my变量,例如,通过增加它们的值来修改解码期间使用的MV.
例如,如下所示,mx和my值增加50,从而延长了解码器中使用的MV.
mx += get_se_golomb(&s->gb)+50;
my += get_se_golomb(&s->gb)+50;
Run Code Online (Sandbox Code Playgroud)
但是,在这方面,我不知道如何访问mx的邻居和我的第一段中提到的空间均值分析.我相信这样做的关键在于操纵数组mv_cache.
我执行的另一个实验是在文件libavcodec/error_resilience.c中.基于guess_mv()函数,我创建了一个新函数mean_mv(),它在第一个if语句中的ff_er_frame_end()中执行.如果其中一个条件是零错误计数(s-> error_count == 0),则第一个if语句退出函数ff_er_frame_end().但是,我决定在此时插入我的mean_mv()函数,以便在错误计数为零时始终执行.这个实验有点产生了我想要的结果,因为我可以开始在视频的顶部看到瑕疵,但它们仅限于右上角.我猜我的插入功能没有完成,以满足播放截止日期等.
下面是修改后的if语句.唯一的补充是我的函数mean_mv(s).
if(!s->error_recognition || s->error_count==0 || s->avctx->lowres ||
s->avctx->hwaccel ||
s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU ||
s->picture_structure != PICT_FRAME || // we dont support ER of field pictures yet, though it should not crash if enabled
s->error_count==3*s->mb_width*(s->avctx->skip_top + s->avctx->skip_bottom)) …Run Code Online (Sandbox Code Playgroud)