懒人李冰

记录我的生活、学习

X264 源码解析之参考帧

本篇博客主要记录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;
}