本篇博客主要记录X264
中关于参考帧管理。
X264
中的帧可以大致分为以下几类:参考帧(ference frame)、当前编码帧(current frame)、未使用帧(unused frame)等。对帧的管理操作
的基本操作由两种:从队列中获取帧(x264_frame_pop
)、向队列中添加帧(x264_frame_push_unused
)。
关于帧队列的管理是通过数组来的,下面先介绍最基本的帧队列的一些基本操作。
首先将frame
帧插入到list
队列中,实现代码如下:
x264_frame_push
1
2
3
4
5
6
| void x264_frame_push(x264_frame_t **list, x264_frame_t *frame)
{
int i = 0;
while(list[i]) i++;
list[i] = frame;
}
|
从list
队列中获取frame
帧,实现代码如下:
x264_frame_pop
1
2
3
4
5
6
7
8
9
10
| 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;
}
|
当编码帧类型为IDR
帧时,需要重置整个参考帧队列,X264
中重置参考队列是通过x264_reference_reset
函数完成,实现过程即为将reference
队列
所有的参考帧设置为unused
队列中的unused
帧;实现代码如下:
x264_reference_reset
1
2
3
4
5
6
7
| static inline void x264_reference_reset( x264_t *h )
{
while( h->frames.reference[0] )
x264_frame_push_unused( h, x264_frame_pop( h->frames.reference ) );
h->fdec->i_poc =
h->fenc->i_poc = 0;
}
|