x264list操作代码研究

/* 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中没有元素需要交换位置为止
}

(转载请注明出处。)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值