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)不使用,