天天看点

264 参考帧 list0 list1

作了这么久的h264工作,这部分还一直从未去深入了解过,真是不求甚解啊,那帮老外的代码也写得太全了,该部分至今天才开始研究

首先参考帧这里关注的是两种,p ,b ,前向参考和后向参考

由白皮书中看到,p帧的参考帧都在list0中,该list0可以包含p帧之前的也可以是之后(播放次序),这里的之后并不是说p帧成b帧了,这就是264搞这么复杂的因素吧,

解码编码时,一个帧(暂且不考虑多slice)只能被标示为

a,不是参考帧

b,放在short-term中作参考帧

c,放在long-term中作参考帧

d,  直接输出显示

我在这里就直接翻译白皮书了,一个关键点,P帧只参考list0,B帧则list0,list1皆可

list0中,short-term中图像由自带的picnum(每个图像都有的一个变量),计算出一个值,然后从高到低排列在short-term中,long-term也是如此,但是它次序是从低到高,每次编码解码完一帧,这个次序会随之变动,如果码流中标示变动的话。最后会由于这个因素,长江后浪推前浪,前浪被推出参考序列(因为参考序列中的数目是固定的,比如标准最多是16,编码器可控)。 编码器可任意对list0中参考帧进行变动。

具体解码中,这个参考方式是细化到宏块,甚至4x4的子快,一个宏块头信息中标示着内部参考方式,如果可能,多到16种。通过这个数目从list0中找出参考帧。

需要说明一下白皮书中的例子

list0:,假设参考帧是5个,

正常情况下,编完一帧都是把他放到最近的short-term中,意味着最容易被参考到,如果编码器其需要改动,就会把某一帧放到short-term的后面,就是long-term,这些都是按照longtermpicnum,shortpicnum的大小次序存放。而0,1,2,3,4,则会在每一个宏块甚至子块的解码过程中用到。

IDR帧将上述的次序全部清零,重新开始排序。

继续阅读