x264参考帧实验讨论

在上一节的理论学习后,对参考帧的流程有了认识,本节是关于参考帧的实验,主要是考察帧的编码顺序和被参考帧的关系,将程序的参数进行如下设置:
--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 的顺序。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值