x264list操作代码研究

来源:互联网 发布:linux chgrp命令 编辑:程序博客网 时间:2024/05/18 01:41
/* list operators */void x264_frame_push( x264_frame_t **list, x264_frame_t *frame ) //!< 入栈{    int i = 0;    while( list[i] ) i++;//!< 找到栈顶    list[i] = frame; //!< 将元素压入栈}x264_frame_t *x264_frame_pop( x264_frame_t **list ) //!< 出栈{    x264_frame_t *frame;    int i = 0;    assert( list[0] );    while( list[i+1] ) i++; //!< 找到栈顶的前一个位置(栈顶为空)    frame = list[i]; //!< 将元素赋值给返回值    list[i] = NULL; //!< 新栈顶    return frame;}void x264_frame_unshift( x264_frame_t **list, x264_frame_t *frame )//!< 右移{    int i = 0;    while( list[i] ) i++; //!< 找到栈顶    while( i-- )        list[i+1] = list[i]; //!< 右移    list[0] = frame; //!< 第一个位置的元素由输入参数frame赋值}x264_frame_t *x264_frame_shift( x264_frame_t **list ) //!< 左移,返回第一个位置的元素{    x264_frame_t *frame = list[0]; //!< 将第一个位置的元素作为返回值    int i;    for( i = 0; list[i]; i++ )        list[i] = list[i+1]; //!< 左移    assert(frame);    return frame;}void x264_frame_push_unused( x264_t *h, x264_frame_t *frame ){    assert( frame->i_reference_count > 0 );    frame->i_reference_count--; //!< 使用该frame的线程数减1    if( frame->i_reference_count == 0 ) //!< 已经没有线程在使用该frame了,则可以将该frame压入h->frames.unused里了        x264_frame_push( h->frames.unused, frame );    assert( h->frames.unused[ sizeof(h->frames.unused) / sizeof(*h->frames.unused) - 1 ] == NULL );}x264_frame_t *x264_frame_pop_unused( x264_t *h ){    x264_frame_t *frame;    if( h->frames.unused[0] ) //!< 栈非空,则令栈顶的一帧出栈并赋给frame作为函数返回值        frame = x264_frame_pop( h->frames.unused );    else //!< 栈空,则为frame生成新的一帧        frame = x264_frame_new( h );    assert( frame->i_reference_count == 0 );    frame->i_reference_count = 1; //!< 使用该frame的线程数初始化为1    frame->b_intra_calculated = 0;    return frame;}void x264_frame_sort( x264_frame_t **list, int b_dts ) //!< pts: b_dts = 0; dts: b_dts = 1{    int i, b_ok;    do {        b_ok = 1;        for( i = 0; list[i+1]; i++ )        {            int dtype = list[i]->i_type - list[i+1]->i_type;            int dtime = list[i]->i_frame - list[i+1]->i_frame;            int swap = b_dts ? dtype > 0 || ( dtype == 0 && dtime > 0 )                             : dtime > 0;            if( swap )            {                XCHG( x264_frame_t*, list[i], list[i+1] ); //!< list[i] 和 list[i+1] 交换位置                b_ok = 0;            }        }    } while( !b_ok ); //!< 一直测试直到list中没有元素需要交换位置为止}

(转载请注明出处。)
原创粉丝点击