x264 亮度信號8x8幀內預測模式


1 該模式的8個預測方向與4x4幀內預測模式一樣。

2 該模式只有High profile及更高的Profile的才有可能使用,Baseline、Main Profile、Preset為ultrafast時不支持,命令行參數為--8x8dct與--no-8x8dct控制是否使用,x264內部參數結構x264_param_t的成員b_transform_8x8的值控制是否使用。

  1 x264_param_default函數中將b_transform_8x8設為1,即默認為使用亮度信號8x8幀內預測模式。

  2 Baseline profile時不使用,x264_param_apply_profile中部分代碼如下:  

    if( p == PROFILE_BASELINE )
    {
        param->analyse.b_transform_8x8 = 0;
        param->b_cabac = 0;
        param->i_cqm_preset = X264_CQM_FLAT;
        param->psz_cqm_file = NULL;
        param->i_bframe = 0;
        param->analyse.i_weighted_pred = X264_WEIGHTP_NONE;
        if( param->b_interlaced )
        {
            x264_log( NULL, X264_LOG_ERROR, "baseline profile doesn't support interlacing\n" );
            return -1;
        }
        if( param->b_fake_interlaced )
        {
            x264_log( NULL, X264_LOG_ERROR, "baseline profile doesn't support fake interlacing\n" );
            return -1;
        }
    }

 

  3 Main profile時不使用,x264_param_apply_profile中部分代碼如下:

  

    else if( p == PROFILE_MAIN )
    {
        param->analyse.b_transform_8x8 = 0;
        param->i_cqm_preset = X264_CQM_FLAT;
        param->psz_cqm_file = NULL;
    }

 

  4 preset為ultrafast時不使用,代碼如下:    

    if( !strcasecmp( preset, "ultrafast" ) )
    {
        param->i_frame_reference = 1;
        param->i_scenecut_threshold = 0;
        param->b_deblocking_filter = 0;
        param->b_cabac = 0;
        param->i_bframe = 0;
        param->analyse.intra = 0;
        param->analyse.inter = 0;
        param->analyse.b_transform_8x8 = 0;
        param->analyse.i_me_method = X264_ME_DIA;
        param->analyse.i_subpel_refine = 0;
        param->rc.i_aq_mode = 0;
        param->analyse.b_mixed_references = 0;
        param->analyse.i_trellis = 0;
        param->i_bframe_adaptive = X264_B_ADAPT_NONE;
        param->rc.b_mb_tree = 0;
        param->analyse.i_weighted_pred = X264_WEIGHTP_NONE;
        param->analyse.b_weighted_bipred = 0;
        param->rc.i_lookahead = 0;
    }

 

3 在x264_validate_parameters函數中如果b_transform_8x8為0,從宏塊分析標志變量取消8x8模式標志位,代碼如下:

    if( !h->param.analyse.b_transform_8x8 )
    {
        h->param.analyse.inter &= ~X264_ANALYSE_I8x8;
        h->param.analyse.intra &= ~X264_ANALYSE_I8x8;
    }

4 在x264_mb_analyse_intra函數中,只有宏塊分析標志變量的8x8模式標志置位,才會執行8x8模式相關邏輯,代碼如下:

  

    /* 8x8 prediction selection */
    if( flags & X264_ANALYSE_I8x8 )
    {
        ALIGNED_ARRAY_32( pixel, edge,[36] );
        x264_pixel_cmp_t sa8d = (h->pixf.mbcmp[0] == h->pixf.satd[0]) ? h->pixf.sa8d[PIXEL_8x8] : h->pixf.mbcmp[PIXEL_8x8];
        int i_satd_thresh = a->i_mbrd ? COST_MAX : X264_MIN( i_satd_inter, a->i_satd_i16x16 );

//***************************

 

5 x264參數設置函數調用順序

  1 x264_param_default

  2 x264_param_apply_preset

  3 x264_param_apply_tune

  4 用戶通過直接操作x264_param_t設置用戶參數

  5 x264_param_apply_fastfirstpass

      6 x264_param_apply_profile

      7 x264_encoder_open中調用x264_validate_parameters,並且該函數修正部分參數。

 由於 x264_param_default是第一個調用的函數,所以由其設定b_transform_8x8的默認值為1,在其后調用x264_param_apply_profile時如果為profile為Main或Baseline時會修改為0,這樣就不會使用幀內亮度8x8模式了。另外在兩趟編碼時的頭一趟為慢速模式或preset為placebo之外的情況下都會將該變量的值置為1,在High及之后的profile時也可 以通過命令行參數--8x8dct與--no-8x8dct或內部結構參數控制是否置位該變量。

6 總結

   亮度信號8x8幀內預測模式在High profile之后的profile才有可能使用,Baseline、Main、Extend(x264新版不再支持該profile)不使用,

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM