/* 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中没有元素需要交换位置为止
}
(转载请注明出处。)