您的位置:首页 > 其它

x264源码分析 -- x264_slicetype_path

2014-11-13 15:56 627 查看
// char best_paths

: (char *)best_paths
表示当总帧数=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时的最佳决策
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: