static inline int x264_reference_update( x264_t *h )
{
if( !h->fdec->b_kept_as_ref )
{
// 如果h->fdec 不作为参考帧
if( h->i_thread_frames > 1 )
{
// 如果 i_thread_frames 大于 1
// 将h->fdec加入到h->frames.unused[h->fdec->b_fdec]队列
x264_frame_push_unused( h, h->fdec );
// 从h->frames.unused[1]队列中获得一个新的空闲帧
h->fdec = x264_frame_pop_unused( h, 1 );
if( !h->fdec )
return -1;
}
return 0;
}
/* apply mmco from previous frame. */
// 清理参考队列,将队列中i_poc == h.sh.mmco[i].i_poc
// 的参考帧放入到h->frames.unused[b_fdec]队列中
for( int i = 0; i < h->sh.i_mmco_command_count; i++ )
for( int j = 0; h->frames.reference[j]; j++ )
if( h->frames.reference[j]->i_poc == h->sh.mmco[i].i_poc )
x264_frame_push_unused( h, x264_frame_shift( &h->frames.reference[j] ) );
/* move frame in the buffer */
// 将重构帧放入参考帧队列中
x264_frame_push( h->frames.reference, h->fdec );
// 如果参考帧队列达到了上限,
// 将参考帧队列中的首帧加入h->frames.unused[b_fdec]中
if( h->frames.reference[h->sps->i_num_ref_frames] )
x264_frame_push_unused( h, x264_frame_shift( h->frames.reference ) );
// 从h->frames.unused[1]队列中获得一个新的重构帧对象
h->fdec = x264_frame_pop_unused( h, 1 );
if( !h->fdec )
return -1;
return 0;
}
void x264_frame_push_unused( x264_t *h, x264_frame_t *frame )
{
assert( frame->i_reference_count > 0 );
// 将帧的引用计数减1
frame->i_reference_count--;
// 如果帧的引用数为0,
// 将帧加入到h->frames.unused[frame->b_fdec]队列
if( frame->i_reference_count == 0 )
x264_frame_push( h->frames.unused[frame->b_fdec], frame );
}