ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:18.38KB ,
资源ID:12096128      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12096128.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(x264macroblockanalyse模块分析.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

x264macroblockanalyse模块分析.docx

1、x264macroblockanalyse模块分析【原创】x264_macroblock_analyse模块分析 本文对x264_macroblock_analyse()及其子函数的流程进行详尽的分析。希望对大家有所帮助。参考x264_050530版本。1、void x264_macroblock_analyse( x264_t *h ) 首先初始化函数,然后进入一个选择语句if( h-sh.i_type = SLICE_TYPE_I ).else if( h-sh.i_type = SLICE_TYPE_P ).else if( h-sh.i_type = SLICE_TYPE_B )很明显

2、,这是对不同类型的块采用不同的处理步骤,我们就进入SLICE_TYPE_P深入分析一下吧,因为P类型包含有I模式的检测,SLICE_TYPE_B只是SLICE_TYPE_P的简单延伸而已。if( h-param.analyse.b_fast_pskip ) if( h-param.analyse.i_subpel_refine = 3 )analysis.b_try_pskip = 1;else if( h-mb.i_mb_type_left = P_SKIP |h-mb.i_mb_type_top = P_SKIP |h-mb.i_mb_type_topleft = P_SKIP |h-mb

3、.i_mb_type_topright = P_SKIP )b_skip = x264_macroblock_probe_pskip( h );条件进入后首先判断skip模式,如果满足skip模式则判断结束,否则继续下面的判断。x264_mb_analyse_inter_p16x16( h, &analysis ); if( flags & X264_ANALYSE_PSUB16x16 ) if( h-param.analyse.b_mixed_references )x264_mb_analyse_inter_p8x8_mixed_ref( h, &analysis ); elsex264_

4、mb_analyse_inter_p8x8( h, &analysis );分析1616和88模式。模式代价值分别保存在和analysis.l0.me16x16.cost 、analysis.l0.i_cost8x8中。if( ( flags & X264_ANALYSE_PSUB16x16 ) & analysis.l0.i_cost8x8 analysis.l0.me16x16.cost ).如果88代价值小于1616,则进行子宏块分割的判断。for( i = 0; i 4; i+ )x264_mb_analyse_inter_p4x4( h, &analysis, i );if( ana

5、lysis.l0.i_cost4x4i analysis.l0.me8x8i.cost )依次对4个子宏块(88)进行处理,x264_mb_analyse_inter_p4x4()函数实际上是得到4个44块的代价和analysis.l0.i_cost4x4i。如果44模式优于88模式,才进行88块的细分割。细分割代码分析略。if( ( flags & X264_ANALYSE_PSUB16x16 ) & analysis.l0.i_cost8x8 analysis.l0.me16x16.cost + i_thresh16x8 )x264_mb_analyse_inter_p16x8( h, &

6、analysis );.x264_mb_analyse_inter_p8x16( h, &analysis );.紧接着检测168和816模式x264_me_refine_qpel( h, &analysis.l0.me16x16 );.帧间模式选择后,对该模式进行亚象素精细搜索。以进一步减少误差。值得注意的是,在前面每个模式的检测时,也要进行亚象素搜索,见x264_me_search_ref()函数的最后几行。这里的亚象素搜索是在前面基础上再进行精细搜索的。二者亚象素搜索(包括半象素和1/4象素)的次数由subpel_iterationsi4确定,而i由编译参数subme确定,看运行帮助:-

7、m, -subme Subpixel motion estimation quality: 1=fast, 5=best实际上subme就是决定模式选择前后亚象素估计的点数。Subme越大,压缩效率越好,计算量越大。x264_mb_analyse_intra( h, &analysis, i_cost );if( h-mb.b_chroma_me & !analysis.b_mbrd &( analysis.i_sad_i16x16 i_cost| analysis.i_sad_i8x8 i_cost| analysis.i_sad_i4x4 i_cost )x264_mb_analyse_i

8、ntra_chroma( h, &analysis );analysis.i_sad_i16x16 += analysis.i_sad_i8x8chroma;analysis.i_sad_i8x8 += analysis.i_sad_i8x8chroma;analysis.i_sad_i4x4 += analysis.i_sad_i8x8chroma;分析宏块的帧内编码,包括亮度和色度。亮度的1616、88、44代价分别存在analysis.i_sad_i16x16、analysis.i_sad_i8x8、analysis.i_sad_i4x4中,色度代价存在analysis.i_sad_i8

9、x8chroma中。i_intra_type = I_16x16;i_intra_cost = analysis.i_sad_i16x16;if( analysis.i_sad_i8x8 i_intra_cost )i_intra_type = I_8x8;i_intra_cost = analysis.i_sad_i8x8;if( analysis.i_sad_i4x4 i_intra_cost )i_intra_type = I_4x4;i_intra_cost = analysis.i_sad_i4x4;if( i_intra_cost i_cost )i_type = i_intra_

10、type;i_cost = i_intra_cost;比较得到最佳的帧内预测模式。if( i_intra_cost mb.mv_min0, h-mb.mv_max0 );mvp1 = x264_clip3( mvp1, h-mb.mv_min1, h-mb.mv_max1 );h-mc.mc_luma( h-mb.pic.p_fref00, h-mb.pic.i_stride0,h-mb.pic.p_fdec0, FDEC_STRIDE,mvp0, mvp1, 16, 16 );先得到预测矢量MVp,然后对MVp进行饱和处理,再进行相应的运动补偿。h-dctf.sub16x16_dct( dc

11、t4x4, h-mb.pic.p_fenc0, FENC_STRIDE,h-mb.pic.p_fdec0, FDEC_STRIDE );for( i8x8 = 0, i_decimate_mb = 0; i8x8 4; i8x8+ )/* encode one 4x4 block */for( i4x4 = 0; i4x4 = 6 )/* not as P_SKIP */return 0;进行dct变换(注意是44变换,不是88!),然后对每个88块中的44对进行量化,zigzag扫描,得到88块的i_decimate_mb值。如果量化后系数中只有零星的非零系数,且都是1或-1,i_decim

12、ate_mb就比较小。if(i_decimate_mb6),可以将系数全变为0。注意,其他模式下的残差编码也用到了该处理过程。程序后面是对色度进行处理,与亮度类似,不进行讨论。3、static void x264_mb_analyse_inter_p16x16 ( x264_t *h, x264_mb_analysis_t *a )直接看核心吧。for( i_ref = 0; i_ref i_ref0; i_ref+ )循环搜索搜索每个参考帧x264_mb_predict_mv_16x16( h, 0, i_ref, m.mvp );得到MVp,x264_mb_predict_mv_ref16

13、x16( h, 0, i_ref, mvc, &i_mvc );得到邻块的MV、前一帧对应位置的MV,可用来预测搜索起点,加速运动估计。x264_me_search_ref( h, &m, mvc, i_mvc, p_halfpel_thresh );运动估计函数。下面将详细讨论再接着就是一个多参考帧的中止判断,略。4、void x264_me_search_ref( x264_t *h, x264_me_t *m, int (*mvc)2, int i_mvc, int *p_halfpel_thresh )bmx = pmx = x264_clip3( ( m-mvp0 + 2 ) 2,

14、mv_x_min, mv_x_max );bmy = pmy = x264_clip3( ( m-mvp1 + 2 ) 2, mv_y_min, mv_y_max );bcost = COST_MAX;COST_MV( pmx, pmy );bcost -= p_cost_mvx bmx2 + p_cost_mvy bmy2 ;for( i = 0; i 2, mv_x_min, mv_x_max );const int my = x264_clip3( ( mvci1 + 2 ) 2, mv_y_min, mv_y_max );if( mx != bmx | my != bmy )COST_

15、MV( mx, my );COST_MV( 0, 0 );先检测MVp点,再检测其他预测矢量,最后检测原点(0,0)。注意mvp0保留的是1/4精度,所以除以4就变成了整象素精度。然后就是具体的搜索算法。代码不贴,直接解释吧。_case 菱形搜索:用小菱形模板反复搜索。菱形算法还有大模板搜索,这里没用到。case 六边形:先用六边形模板反复搜索,粗匹配。然后用小菱形模板搜索一次,得到最终的整象素运动矢量case UMHexagonS:看我主页中的注释,呵呵,是基于JM9.5的。case 连续消除法(SEA) 全搜索法的快速运算。这里不介绍了。if( h-mb.i_subpel_refine =

16、 2 )int hpel = subpel_iterationsh-mb.i_subpel_refine2;int qpel = subpel_iterationsh-mb.i_subpel_refine3;refine_subpel( h, m, hpel, qpel, p_halfpel_thresh, 0 );亚象素搜索,在x264_macroblock_analyse()函数我已经介绍过了5、void x264_me_refine_qpel( x264_t *h, x264_me_t *m )该函数一开始得到半象素、1/4象素搜索的次数(菱形小模板),分别为hpel、qhpel,然后调

17、用refine_subpel(),去看看!if( hpel_iters )int mx = x264_clip3( m-mvp0, h-mb.mv_min_spel0, h-mb.mv_max_spel0 );int my = x264_clip3( m-mvp1, h-mb.mv_min_spel1, h-mb.mv_max_spel1 );if( mx != bmx | my != bmy )COST_MV_SAD( mx, my, -1 );检测MVp的小数精度。for( i = hpel_iters; i 0; i- )odir = bdir;omx = bmx;omy = bmy;C

18、OST_MV_SAD( omx, omy - 2, 0 );COST_MV_SAD( omx, omy + 2, 1 );COST_MV_SAD( omx - 2, omy, 2 );COST_MV_SAD( omx + 2, omy, 3 );if( bmx = omx & bmy = omy )break;对半象素精度进行hpel_iters次小菱形搜索。后面有1/4象素精度的qpel_iters次小模板搜索,略。6、static uint8_t *get_ref( uint8_t *src4, int i_src_stride, uint8_t *dst, int * i_dst_str

19、ide, int mvx,int mvy, int i_width, int i_height )该函数得到亚象素搜索时参考块的指针。src1、src2分别指向半象素精度块。1/4搜索时需要临时插值,就是pixel_avg()函数的只能功能。值得注意的是变量correction的作用,当作是1/4插值时的偏移量吧。N个人问过我,其实结合1/4象素插值,仔细推导一下就出来了。7、static void x264_mb_analyse_intra( x264_t *h, x264_mb_analysis_t *a, int i_cost_inter )依次检测Intra_16x16、Intra4x4、Intra8x8的最佳模式。值得注意,if(submepixf.mbcmp是求sad值elseh-pixf.mbcmp是求satd值另外,对与Intra4x4、Intra8x8,此时就要进行真正的变换量化、反变换反量化、重建,因为要为后续的块做参考。而且,就算其系数值很小,也不能改变cbp,切记切记。具体分析略。8、static inline void x264_mb_analyse_transform( x264_t *h )就是对残差进行4x4、8x8的satd变换,比较绝对和值,值较小对应的尺寸用于变换的尺寸。欢迎浏览我的blog:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1