x264源碼分析 -- x264_slicetype_path

// char best_paths[N][N]: (char *)best_paths[n]表示當總幀數=n時的最佳類型決策
static void x264_slicetype_path( x264_t *h, x264_mb_analysis_t *a, x264_frame_t **frames, int length, int max_bframes, char (*best_paths)[X264_LOOKAHEAD_MAX] )
{
    char paths[X264_BFRAME_MAX+2][X264_LOOKAHEAD_MAX] = {{0}};
    int num_paths = X264_MIN(max_bframes+1, length); // 需要決策幀類型的總幀數 (最多不能超過B幀數目的限制)
    int suffix_size, loc, path;
    int best_cost = COST_MAX;
    int best_path_index = 0;
    length = X264_MIN(length,X264_LOOKAHEAD_MAX);    // 整個frames的總幀數

	// 只重新決策best_paths的最後num_paths個路徑. 因爲前面的已經不能再調整了, 已是最優.
    for( suffix_size = 0; suffix_size < num_paths; suffix_size++ )
    {
        memcpy( paths[suffix_size], best_paths[length - (suffix_size + 1)], length - (suffix_size + 1) ); // 每次決策一個幀的類型時, 會重新計算所有可能的最佳路徑
        for( loc = 0; loc < suffix_size; loc++ )
            strcat( paths[suffix_size], "B" ); // 儘量填充B幀直到最多可容忍的值(i_max_bframes)
        strcat( paths[suffix_size], "P" );     // 每種決策最後幀一定是個P幀
    }

    /* Calculate the actual cost of each of the current paths */
    for( path = 0; path < num_paths; path++ )
    {
        int cost = x264_slicetype_path_cost( h, a, frames, paths[path], best_cost );
        if( cost < best_cost )
        {
            best_cost = cost;
            best_path_index = path; // 計算每種決策的SATD_cost. 取最佳的!
        }
    }

    /* Store the best path. */
    memcpy( best_paths[length], paths[best_path_index], length ); // 總幀數爲length時的最佳決策
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章