x264源码分析 -- x264_slicetype_path

来源:互联网 发布:淘宝otc药货到付款 编辑:程序博客网 时间:2024/05/17 01:02

// 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时的最佳决策}


0 0
原创粉丝点击