// 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時的最佳決策
}
x264源碼分析 -- x264_slicetype_path
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.