x264参考帧实验讨论:

2009-10-31 21:48
在上一节的理论学习后,对参考帧的流程有了认识,本节是关于参考帧的实验,主要是考察帧的编码顺序和被参考帧的关系,将程序的参数进行如下设置:
--ref 2 --frames 10 --qp 26 -o F:\.....\test.264 F:\.....\foreman.yuv 176x144
也就是我要参考的帧数是2帧,编码的帧数是10帧,
从上文的流程可以看出,主要是进入 x264_encoder_encode函数里面,
在函数中的默认设置:
h->param.i_threads=1;
h->frames.i_delay=3;
在开始是h->frames.i_input=1,
if( h->frames.i_input <= h->frames.i_delay + 1 - h->param.i_threads )

{
/* Nothing yet to encode, waiting for filling of buffers */

pic_out->i_type = X264_TYPE_AUTO;

return 0;
}

则此时不会进行编码,在h->frames.i_input累加到4的时候,才开始真正的编码。

开始编码的第一帧是IDR,h->fenc->i_type == X264_TYPE_IDR,此时将
清空参考队列,将IDR的参考等级设为NAL_PRIORITY_HIGHEST,
此时h->fdec->i_poc =h->fenc->i_poc = 2 * (h->fenc->i_frame - h->frames.i_last_idr)=0;
h->fdec->i_frame = h->fenc->i_frame=0;
在完成对帧类型的设置和参考帧的级别设置后,x264_reference_build_list,此时进行参考列表的初始化,由于此时只有一IDR帧,不需要进行参考,此时关于参考帧的部分主要是进行参考帧列表的清空和标记IDR的参考等级;此时主要是对SPS,PPS,SEI,IDR这四个NALU类型的比特流的编写(i_nal=4),在IDR编码完成后文件大小为5495bit,其中4979bit为IDR帧编码后大小。
      此时再次循环进行下一帧的编码,进入编码的P帧,同样进行参考等级的设定:
NAL_PRIORITY_HIGH,
h->fdec->i_poc =h->fenc->i_poc=2*3=6;
h->fdec->i_frame = h->fenc->i_frame=3;
在前面有IDR作为参考,则进入:x264_reference_build_list
此时P帧只有向前参考,则此时 h->i_ref0=1; h->i_ref1 = 0
同时将IDR存储在h->fref0[0]中,此时并不需要重按POC大小排序;
后面帧的编码流程类似....

编码帧类别

参考的等级

POC

h->fdec/fenc

->i_frame

h->i_ref0

(数量)

h->i_ref1

(数量)

h->i_ref0

中参考帧

h->i_ref1

中参考帧

I

High

0

0

0

0

0

0

P1

High

6

3

1

0

I

0

B

Disposable

2

1

1

1

I

P

B

Disposable

4

2

1

1

I

P

P2

High

10

5

2

0

(I,P)->(P,I)

0

B

Disposable

8

4

2

1

(I,P)->(P,I)

P

P3

High

16

8

2

0

P2,P1

0

B

Disposable

12

6

2

1

P2,P1

P3

B

Disposable

14

7

2

1

P2,P1

P3

P4

High

18

9

2

0

P3,P2

0


此时B帧是不作为参考的,图像播放顺序就是 h->fdec/fenc ->i_frame 的顺序。




码流分析如下图:
: x264参考帧实验讨论:_第1张图片


这还是只是关于参考帧很粗糙的实验展示,下一个主题: 运动估计,将会继续涉及参考帧,到时候在补充!

你可能感兴趣的:(x264参考帧实验讨论:)