作了这么久的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帧将上述的次序全部清零,重新开始排序。
边看标准和代码,别写下这些文字,没有整理,凑合看吧。
B帧的list1,也是按照list0的排列规则存放,然后具体到每个宏块,则可能该宏块同时参考到list0和list1,那就是需要avg的算法了,绝大部分编解码都有该关键词来处理B帧。
等有空放上具体代码及详解。