IDR(Instantaneous Decoding Refresh)--即時解碼刷新。
? ? ? I和IDR幀都是使用幀內預測的。它們都是同一個東西而已,在編碼和解碼中為了方便,要首個I幀和其他I幀區別開,所以才把第一個首個I幀叫IDR,這樣就方便控制編碼和解碼流程。IDR幀的作用是立刻刷新,使錯誤不致傳播,從IDR幀開始,重新算一個新的序列開始編碼。而I幀不具有隨機訪問的能力,這個功能是由IDR承擔。IDR會導致DPB(DecodedPictureBuffer參考幀列表——這是關鍵所在)清空,而I不會。IDR圖像一定是I圖像,但I圖像不一定是IDR圖像。一個序列中可以有很多的I圖像,I圖像之后的圖像可以引用I圖像之前的圖像做運動參考。 ?? ? ? ?對于IDR幀來說,在IDR幀之后的所有幀都不能引用任何IDR幀之前的幀的內容,與此相反,對于普通的I-幀來說,位于其之后的B-和P-幀可以引用位于普通I-幀之前的I-幀。從隨機存取的視頻流中,播放器永遠可以從一個IDR幀播放,因為在它之后沒有任何幀引用之前的幀。但是,不能在一個沒有IDR幀的視頻中從任意點開始播放,因為后面的幀總是會引用前面的幀。
?
普通I幀與IDR(Instantaneous Decoding Refresh,瞬時解碼刷新)幀為均采用幀內預測技術的視頻幀,同屬于I幀。
?
區別是:采用IDR幀編碼,會導致DPB(Decoded Picture Buffer,直譯為解碼圖像緩沖區,即指參考幀列表)完成一次清空處理,而普通I幀不會。
?
那么,這樣帶來的直接結果是怎樣的呢?
即,當前IDR幀后面的幀不會將當前IDR幀之前已經編碼的幀作為參考幀;而當前普通I幀之后的幀有可能將當前I幀之前的幀作為參考幀。
?
那么,這樣帶來的直接效果是怎樣的呢?
即,播放視頻的時候,可以直接從IDR幀開始播放,因為IDR幀之前的幀與當前IDR幀和之后的幀再也沒有直接地關聯;而普通I幀則不行。
?
可以看到,一般來講,一段視頻的第0幀(也即首幀)是I幀,那么它算不算是IDR幀呢?答:算。
?
所以,IDR幀一定是I幀,反之不成立。
在H.264標準參考軟件(JM)下,通過IDRIntraEnable來設置是否支持IDR幀。
?
在H.264編碼中為了提高編碼效率,采用了與傳統MPEG-2編碼不同的幀預測方式,在H.264編碼中的B、P幀與MPEG-2中的B、P幀具有不同的幀間預測特性,H.264中的B、P幀能以多個視頻幀做為參考幀,以獲取更高的壓縮比,正是這些新的特性進一步提高了H.264編碼的壓縮效率。為此,也在H.264編碼中引入了一個關鍵幀的概念即IDR幀。
IDR幀是一個GOP(Group of Pictures)中的首個I幀,即從IDR幀開始,重新開始一個新的序列編碼,它的作用是使解碼器立即刷新,從而使預測錯誤不致傳播,并提供隨機訪問的能力。一個GOP中可以有很多的I幀,但只能有一個IDR幀。IDR幀一定是I幀,但I幀不一定是IDR幀。對IDR幀的編碼處理與I幀的處理相同:(1)進行幀內預測,決定所采用的幀內預測模式。(2)像素值減去預測值,得到殘差。(3)對殘差進行變換和量化。(4)變長編碼和算術編碼。(5)重構圖像并濾波,得到的圖像作為其它幀的參考幀。
H.264與MPEG-2編碼的不同是,相對普通的I幀,位于其之后的B幀和P幀可以引用位于其之前的圖像幀最為參考,而對于IDR幀來說,在IDR幀之后的所有幀都不能引用其之前的幀的內容。由此可以看出,從隨機存取的視頻流中,播放器永遠可以從一個IDR幀播放,因為在它之后沒有任何幀引用之前的幀。但是,不能在一個沒有IDR幀的視頻中從任意點開始播放,因為后面的幀總是會引用前面的幀進行幀間預測。
IDR就是這樣一種特殊的I幀,它確保后面的任何幀一定不參考其前面的幀,可以放心地作為關鍵幀,而將快編后的重新編碼計算量限定在編輯點前后2個GOP之內。
通過IDR幀的原理,我們可以看出,如果一個視頻流的GOP的第一幀不是IDR幀而是普通I幀,會因為H.264采用了多幀預測,有可能I幀后的P、B會參考I幀前的幀,這樣在編輯時如果以任意幀為編輯點,則隨后的幀都應重新進行預測編碼,這無疑會增加設備的運算量,降低編輯效率。
一幅圖像根據概念來分可以分為兩種:IDR圖像和非IDR圖像。一幅圖像是否是IDR圖像是由組成該圖像的NALU值決定的,如果組成該圖像的NALU如“圖1”語法結構中nal_unit_type值為5,則該圖像為IDR幀,否則為非IDR幀。由此我們可以得出這樣的結論:
(1)nal_unit_type值為5的NALU只會出現在IDR幀中,而IDR幀中的所有NALU都是nal_unit_type 值為5的NALU;
(2)我們以組成一幅圖像的幀的類型來區分該圖像是否是IDR圖像是不對的。一個圖像序列中的所有幀都是I幀并不代表這個圖像就是IDR圖像。因為I幀也可以從屬于nal_unit_type值為1的NALU。
可見,在編碼器設置中進行參數設定,適時指定IDR幀十分重要。
?
?
?H.264中普通I幀和IDR幀究竟有什么區別?(不要與MPEG2中的I幀搞混淆了)?
分類: 視頻相關研究
2012-11-16 16:12 1780人閱讀 評論(0) 收藏 舉報
? ? ? ?糾結概念的人不少,這是個好事,但有時用實驗的方法自己親自分析一下會更好. 一次刻骨銘心的體驗勝過千百次的說教, 閑話少扯,進入正題.
? ? ? ?在MPEG2中,有個重要的概念叫GOP(group of pictures),假設編碼的幀類型為:IBBPBBPBBPBBIBBPBBPBBPBBI..., 那么這個IBBPBBPBBPBB就叫一個GOP. 由于誤差會積累,但MPEG2中的I幀可以阻斷誤差的積累,也就是說,在MPEG中I幀后面的幀永遠不會參考I幀前面的幀,也就是說,一個GOP中的幀永遠不會參考前一個GOP中的幀.(另外說句題外話:B幀可以參考下一個GOP的I幀,但在MPEG2中,B幀不會作為參考幀,所以B幀不會導致誤差積累)
?
? ? ? ?在H.264中就不同了.很多人說,在H.264中沒有I幀這個概念了,當然這也是有道理的,標準中的確沒有這么叫,但是,為了方便,也可以延續I幀這個概念,那么H.264中什么叫I幀呢?
? ? ? ?定義:H.264中的I幀是指幀中的宏塊都是采用幀內預測方式,在H.264中有兩種I幀: 普通I幀和IDR幀(特殊I幀).
? ? ? ?在H.264中,是IDR幀阻斷了誤差的積累, IDR幀后面的幀都不能參考該IDR幀前面的幀. 在H.264中,普通的I幀并沒有阻斷誤差的積累,那就是說普通I幀后面的幀就可以參考該I幀之前的幀么?事實正是如此. 下面用H.264visa加以分析驗證.
再次總結:在H.264中,I幀分為普通I幀和IDR幀(特殊I幀); 在H.264中,是IDR幀阻斷了誤差的積累, IDR幀后面的幀都不能參考該IDR幀前面的幀, 普通的I幀并沒有阻斷誤差的積累,普通I幀后面的幀可以參考該I幀之前的幀. 在MPEG2中,I幀阻斷了誤差的積累,I幀后面的幀不可以參考該I幀之前的幀. 從這個意義上說,H.264中的IDR幀頗有MPEG2中I幀的味道.
?
?
I幀和IDR幀的區別
分類:H.264
2006-08-15 14:34
閱讀(761)評論(0)
? ? 看代碼看得頭昏腦脹,有時會上網搜索一些自己比較困擾的問題,覺得大家好強啊。其實,任何成功的人都是一步步走到今天的,小貝也是每日苦練才踢出著名香蕉球的啊。可是,我常想我會有這樣的一天嗎?……好奇妙的感覺,懷著80%的擔心和20%的欣喜。算了,不要胡思亂想了。
? ? 看一個問題:
I幀和IDR幀的區別:
? ? IDR幀屬于I幀。解碼器收到IDR frame 時,將所有的參考幀隊列丟棄(用x264_reference_reset函數實現——在encoder.c文件中)。這點是所有I幀共有的特性,但是收到IDR幀時,解碼器另外需要做的工作就是:把所有的PPS和SPS參數進行更新。由此可見,在編碼器端,每發一個IDR,就相應地發一個 PPS&SPS_nal_unit
? ? 這是網上搜索到的一個答案,有一定參考價值吧。
先說明:所有的IDR幀都是I幀,但是并不是所有I幀都是IDR幀。就是說,IDR幀是I幀的子集。(我們程序中設定的是每250幀出現一個IDR幀)
我們用的程序是這樣的:
? ? /* ------------------- Setup frame context ----------------------------- */
? ? /* 5: Init data dependant of frame type */
? ? if( h->fenc->i_type == X264_TYPE_IDR )
? ? {
? ? ? ? /* reset ref pictures */
? ? ? ? x264_reference_reset( h );
? ? ? ? i_nal_type ? ?= NAL_SLICE_IDR;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGHEST;
? ? ? ? i_slice_type = SLICE_TYPE_I;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_I )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* Not completely true but for now it is (as all I/P are kept as ref)*/
? ? ? ? i_slice_type = SLICE_TYPE_I;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_P )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* Not completely true but for now it is (as all I/P are kept as ref)*/
? ? ? ? i_slice_type = SLICE_TYPE_P;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_BREF )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* maybe add MMCO to forget it? -> low */
? ? ? ? i_slice_type = SLICE_TYPE_B;
? ? }
? ? else ? ?/* B frame */
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_DISPOSABLE;
? ? ? ? i_slice_type = SLICE_TYPE_B;
}
? ? x264_reference_reset函數的定義如下:(其實,因為這個代碼是通用的,所以應該是參考幀隊列。但是,我們只用一個參考幀,“隊列”并沒有意義。)
static inline void x264_reference_reset( x264_t *h )
{
? ? int i;
? ? /* reset ref pictures */
? ? for( i = 1; i < h->frames.i_max_dpb; i++ )
? ? {
? ? ? ? h->frames.reference[i]->i_poc = -1;
? ? }
? ? h->frames.reference[0]->i_poc = 0;
}
? ? 看來,好像是遇到IDR幀時才會將所有的參考幀隊列丟棄(x264_reference_reset( h );)。其實,我們的程序默認只用一個參考幀,這個問題就不是十分有意義了。
? ? 多參考幀情況下。
? ? 舉個例子:有如下幀序列:IPPPPIPPPP……(我們程序沒有B幀,所以幀序列簡單些,但道理是一樣的)。按照3個參考幀編碼。
? ? 因為“按照3個參考幀編碼”,所以參考幀隊列長度為3。
? ? 遇到綠色的I時,并不清空參考幀隊列,把這個I幀加入參考幀隊列(當然I編碼時不用參考幀。)。再檢測到紅色的P幀時,用到的就是PPI三幀做參考了。
? ? 不怕自己羅嗦(好記性不如爛筆頭),再強調一個:一個參考幀,就是參考當前幀的前面的那幀(因為沒涉及到B幀,所以“前面的那幀”既是播放順序的,也是編碼順序的)。多個參考幀是一個道理。(我以前一直誤解為從前面的幾幀中找到最合適的一個參考幀)
? ? 最后,“但是收到IDR幀時,解碼器另外需要做的工作就是:把所有的PPS和SPS參數進行更新。由此可見,在編碼器端,每發一個IDR,就相應地發一個 PPS&SPS_nal_unit”應該是對的吧。先這樣認為:)
偶然機會,查到:IDR-instantaneous decoding refresh (IDR)picture; ? ? ? ?A coded picture in which all slices are I or SI slices that causes the decoding process to mark all reference pictures as "unused for reference" immediately after decoding the IDR picture. After the decoding of an IDR picture all following coded pictures in decoding order can be decoded without inter prediction from any picture decoded prior to the IDR picture. The first picture of each coded video sequence is an IDR picture. ? ? ?“也就是說,IDR的出現其實是相當于向解碼器發出了一個清理reference buffer的信號吧,上面說前于這一幀的所有已編碼幀不能為inter做參考幀了。” ?
還有:“因為264采用了多幀預測,就有可能在display order下I幀后的P會參考I幀前的幀,這樣在random access時如果只找I幀,隨后的幀的參考幀可能unavailable,IDR就是這樣一種特殊的I幀,把它定義為確保后面的P一定不參考其前面的幀,可以放心地random access。 ”
? ? ? I和IDR幀都是使用幀內預測的。它們都是同一個東西而已,在編碼和解碼中為了方便,要首個I幀和其他I幀區別開,所以才把第一個首個I幀叫IDR,這樣就方便控制編碼和解碼流程。IDR幀的作用是立刻刷新,使錯誤不致傳播,從IDR幀開始,重新算一個新的序列開始編碼。而I幀不具有隨機訪問的能力,這個功能是由IDR承擔。IDR會導致DPB(DecodedPictureBuffer參考幀列表——這是關鍵所在)清空,而I不會。IDR圖像一定是I圖像,但I圖像不一定是IDR圖像。一個序列中可以有很多的I圖像,I圖像之后的圖像可以引用I圖像之前的圖像做運動參考。 ?? ? ? ?對于IDR幀來說,在IDR幀之后的所有幀都不能引用任何IDR幀之前的幀的內容,與此相反,對于普通的I-幀來說,位于其之后的B-和P-幀可以引用位于普通I-幀之前的I-幀。從隨機存取的視頻流中,播放器永遠可以從一個IDR幀播放,因為在它之后沒有任何幀引用之前的幀。但是,不能在一個沒有IDR幀的視頻中從任意點開始播放,因為后面的幀總是會引用前面的幀。
?
普通I幀與IDR(Instantaneous Decoding Refresh,瞬時解碼刷新)幀為均采用幀內預測技術的視頻幀,同屬于I幀。
?
區別是:采用IDR幀編碼,會導致DPB(Decoded Picture Buffer,直譯為解碼圖像緩沖區,即指參考幀列表)完成一次清空處理,而普通I幀不會。
?
那么,這樣帶來的直接結果是怎樣的呢?
即,當前IDR幀后面的幀不會將當前IDR幀之前已經編碼的幀作為參考幀;而當前普通I幀之后的幀有可能將當前I幀之前的幀作為參考幀。
?
那么,這樣帶來的直接效果是怎樣的呢?
即,播放視頻的時候,可以直接從IDR幀開始播放,因為IDR幀之前的幀與當前IDR幀和之后的幀再也沒有直接地關聯;而普通I幀則不行。
?
可以看到,一般來講,一段視頻的第0幀(也即首幀)是I幀,那么它算不算是IDR幀呢?答:算。
?
所以,IDR幀一定是I幀,反之不成立。
在H.264標準參考軟件(JM)下,通過IDRIntraEnable來設置是否支持IDR幀。
?
在H.264編碼中為了提高編碼效率,采用了與傳統MPEG-2編碼不同的幀預測方式,在H.264編碼中的B、P幀與MPEG-2中的B、P幀具有不同的幀間預測特性,H.264中的B、P幀能以多個視頻幀做為參考幀,以獲取更高的壓縮比,正是這些新的特性進一步提高了H.264編碼的壓縮效率。為此,也在H.264編碼中引入了一個關鍵幀的概念即IDR幀。
IDR幀是一個GOP(Group of Pictures)中的首個I幀,即從IDR幀開始,重新開始一個新的序列編碼,它的作用是使解碼器立即刷新,從而使預測錯誤不致傳播,并提供隨機訪問的能力。一個GOP中可以有很多的I幀,但只能有一個IDR幀。IDR幀一定是I幀,但I幀不一定是IDR幀。對IDR幀的編碼處理與I幀的處理相同:(1)進行幀內預測,決定所采用的幀內預測模式。(2)像素值減去預測值,得到殘差。(3)對殘差進行變換和量化。(4)變長編碼和算術編碼。(5)重構圖像并濾波,得到的圖像作為其它幀的參考幀。
H.264與MPEG-2編碼的不同是,相對普通的I幀,位于其之后的B幀和P幀可以引用位于其之前的圖像幀最為參考,而對于IDR幀來說,在IDR幀之后的所有幀都不能引用其之前的幀的內容。由此可以看出,從隨機存取的視頻流中,播放器永遠可以從一個IDR幀播放,因為在它之后沒有任何幀引用之前的幀。但是,不能在一個沒有IDR幀的視頻中從任意點開始播放,因為后面的幀總是會引用前面的幀進行幀間預測。
IDR就是這樣一種特殊的I幀,它確保后面的任何幀一定不參考其前面的幀,可以放心地作為關鍵幀,而將快編后的重新編碼計算量限定在編輯點前后2個GOP之內。
通過IDR幀的原理,我們可以看出,如果一個視頻流的GOP的第一幀不是IDR幀而是普通I幀,會因為H.264采用了多幀預測,有可能I幀后的P、B會參考I幀前的幀,這樣在編輯時如果以任意幀為編輯點,則隨后的幀都應重新進行預測編碼,這無疑會增加設備的運算量,降低編輯效率。
一幅圖像根據概念來分可以分為兩種:IDR圖像和非IDR圖像。一幅圖像是否是IDR圖像是由組成該圖像的NALU值決定的,如果組成該圖像的NALU如“圖1”語法結構中nal_unit_type值為5,則該圖像為IDR幀,否則為非IDR幀。由此我們可以得出這樣的結論:
(1)nal_unit_type值為5的NALU只會出現在IDR幀中,而IDR幀中的所有NALU都是nal_unit_type 值為5的NALU;
(2)我們以組成一幅圖像的幀的類型來區分該圖像是否是IDR圖像是不對的。一個圖像序列中的所有幀都是I幀并不代表這個圖像就是IDR圖像。因為I幀也可以從屬于nal_unit_type值為1的NALU。
可見,在編碼器設置中進行參數設定,適時指定IDR幀十分重要。
?
?
?H.264中普通I幀和IDR幀究竟有什么區別?(不要與MPEG2中的I幀搞混淆了)?
分類: 視頻相關研究
2012-11-16 16:12 1780人閱讀 評論(0) 收藏 舉報
? ? ? ?糾結概念的人不少,這是個好事,但有時用實驗的方法自己親自分析一下會更好. 一次刻骨銘心的體驗勝過千百次的說教, 閑話少扯,進入正題.
? ? ? ?在MPEG2中,有個重要的概念叫GOP(group of pictures),假設編碼的幀類型為:IBBPBBPBBPBBIBBPBBPBBPBBI..., 那么這個IBBPBBPBBPBB就叫一個GOP. 由于誤差會積累,但MPEG2中的I幀可以阻斷誤差的積累,也就是說,在MPEG中I幀后面的幀永遠不會參考I幀前面的幀,也就是說,一個GOP中的幀永遠不會參考前一個GOP中的幀.(另外說句題外話:B幀可以參考下一個GOP的I幀,但在MPEG2中,B幀不會作為參考幀,所以B幀不會導致誤差積累)
?
? ? ? ?在H.264中就不同了.很多人說,在H.264中沒有I幀這個概念了,當然這也是有道理的,標準中的確沒有這么叫,但是,為了方便,也可以延續I幀這個概念,那么H.264中什么叫I幀呢?
? ? ? ?定義:H.264中的I幀是指幀中的宏塊都是采用幀內預測方式,在H.264中有兩種I幀: 普通I幀和IDR幀(特殊I幀).
? ? ? ?在H.264中,是IDR幀阻斷了誤差的積累, IDR幀后面的幀都不能參考該IDR幀前面的幀. 在H.264中,普通的I幀并沒有阻斷誤差的積累,那就是說普通I幀后面的幀就可以參考該I幀之前的幀么?事實正是如此. 下面用H.264visa加以分析驗證.
再次總結:在H.264中,I幀分為普通I幀和IDR幀(特殊I幀); 在H.264中,是IDR幀阻斷了誤差的積累, IDR幀后面的幀都不能參考該IDR幀前面的幀, 普通的I幀并沒有阻斷誤差的積累,普通I幀后面的幀可以參考該I幀之前的幀. 在MPEG2中,I幀阻斷了誤差的積累,I幀后面的幀不可以參考該I幀之前的幀. 從這個意義上說,H.264中的IDR幀頗有MPEG2中I幀的味道.
?
?
I幀和IDR幀的區別
分類:H.264
2006-08-15 14:34
閱讀(761)評論(0)
? ? 看代碼看得頭昏腦脹,有時會上網搜索一些自己比較困擾的問題,覺得大家好強啊。其實,任何成功的人都是一步步走到今天的,小貝也是每日苦練才踢出著名香蕉球的啊。可是,我常想我會有這樣的一天嗎?……好奇妙的感覺,懷著80%的擔心和20%的欣喜。算了,不要胡思亂想了。
? ? 看一個問題:
I幀和IDR幀的區別:
? ? IDR幀屬于I幀。解碼器收到IDR frame 時,將所有的參考幀隊列丟棄(用x264_reference_reset函數實現——在encoder.c文件中)。這點是所有I幀共有的特性,但是收到IDR幀時,解碼器另外需要做的工作就是:把所有的PPS和SPS參數進行更新。由此可見,在編碼器端,每發一個IDR,就相應地發一個 PPS&SPS_nal_unit
? ? 這是網上搜索到的一個答案,有一定參考價值吧。
先說明:所有的IDR幀都是I幀,但是并不是所有I幀都是IDR幀。就是說,IDR幀是I幀的子集。(我們程序中設定的是每250幀出現一個IDR幀)
我們用的程序是這樣的:
? ? /* ------------------- Setup frame context ----------------------------- */
? ? /* 5: Init data dependant of frame type */
? ? if( h->fenc->i_type == X264_TYPE_IDR )
? ? {
? ? ? ? /* reset ref pictures */
? ? ? ? x264_reference_reset( h );
? ? ? ? i_nal_type ? ?= NAL_SLICE_IDR;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGHEST;
? ? ? ? i_slice_type = SLICE_TYPE_I;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_I )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* Not completely true but for now it is (as all I/P are kept as ref)*/
? ? ? ? i_slice_type = SLICE_TYPE_I;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_P )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* Not completely true but for now it is (as all I/P are kept as ref)*/
? ? ? ? i_slice_type = SLICE_TYPE_P;
? ? }
? ? else if( h->fenc->i_type == X264_TYPE_BREF )
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_HIGH; /* maybe add MMCO to forget it? -> low */
? ? ? ? i_slice_type = SLICE_TYPE_B;
? ? }
? ? else ? ?/* B frame */
? ? {
? ? ? ? i_nal_type ? ?= NAL_SLICE;
? ? ? ? i_nal_ref_idc = NAL_PRIORITY_DISPOSABLE;
? ? ? ? i_slice_type = SLICE_TYPE_B;
}
? ? x264_reference_reset函數的定義如下:(其實,因為這個代碼是通用的,所以應該是參考幀隊列。但是,我們只用一個參考幀,“隊列”并沒有意義。)
static inline void x264_reference_reset( x264_t *h )
{
? ? int i;
? ? /* reset ref pictures */
? ? for( i = 1; i < h->frames.i_max_dpb; i++ )
? ? {
? ? ? ? h->frames.reference[i]->i_poc = -1;
? ? }
? ? h->frames.reference[0]->i_poc = 0;
}
? ? 看來,好像是遇到IDR幀時才會將所有的參考幀隊列丟棄(x264_reference_reset( h );)。其實,我們的程序默認只用一個參考幀,這個問題就不是十分有意義了。
? ? 多參考幀情況下。
? ? 舉個例子:有如下幀序列:IPPPPIPPPP……(我們程序沒有B幀,所以幀序列簡單些,但道理是一樣的)。按照3個參考幀編碼。
? ? 因為“按照3個參考幀編碼”,所以參考幀隊列長度為3。
? ? 遇到綠色的I時,并不清空參考幀隊列,把這個I幀加入參考幀隊列(當然I編碼時不用參考幀。)。再檢測到紅色的P幀時,用到的就是PPI三幀做參考了。
? ? 不怕自己羅嗦(好記性不如爛筆頭),再強調一個:一個參考幀,就是參考當前幀的前面的那幀(因為沒涉及到B幀,所以“前面的那幀”既是播放順序的,也是編碼順序的)。多個參考幀是一個道理。(我以前一直誤解為從前面的幾幀中找到最合適的一個參考幀)
? ? 最后,“但是收到IDR幀時,解碼器另外需要做的工作就是:把所有的PPS和SPS參數進行更新。由此可見,在編碼器端,每發一個IDR,就相應地發一個 PPS&SPS_nal_unit”應該是對的吧。先這樣認為:)
偶然機會,查到:IDR-instantaneous decoding refresh (IDR)picture; ? ? ? ?A coded picture in which all slices are I or SI slices that causes the decoding process to mark all reference pictures as "unused for reference" immediately after decoding the IDR picture. After the decoding of an IDR picture all following coded pictures in decoding order can be decoded without inter prediction from any picture decoded prior to the IDR picture. The first picture of each coded video sequence is an IDR picture. ? ? ?“也就是說,IDR的出現其實是相當于向解碼器發出了一個清理reference buffer的信號吧,上面說前于這一幀的所有已編碼幀不能為inter做參考幀了。” ?
還有:“因為264采用了多幀預測,就有可能在display order下I幀后的P會參考I幀前的幀,這樣在random access時如果只找I幀,隨后的幀的參考幀可能unavailable,IDR就是這樣一種特殊的I幀,把它定義為確保后面的P一定不參考其前面的幀,可以放心地random access。 ”