小编qon*_*ami的帖子

在ffmpeg H.264解码器中修改运动矢量

出于研究目的,我试图在解码过程中在运动补偿之前修改每个P帧和B帧的H.264运动矢量(MV).我正在为此目的使用FFmpeg.修改的示例是用其原始空间邻居替换每个MV,然后使用结果MV进行运动补偿,而不是原始MV.请指点我.

到目前为止,我已经能够在文件/libavcodec/h264_cavlc.c中对MV进行简单的修改.在函数ff_h264_decode_mb_cavlc()中,修改mxmy变量,例如,通过增加它们的值来修改解码期间使用的MV.

例如,如下所示,mxmy值增加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)

ffmpeg vector decoder motion h.264

5
推荐指数
1
解决办法
2956
查看次数

标签 统计

decoder ×1

ffmpeg ×1

h.264 ×1

motion ×1

vector ×1