作了這么久的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幀。
等有空放上具體代碼及詳解。