日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

I帧和IDR帧区别

發布時間:2023/12/9 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 I帧和IDR帧区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

From:?http://blog.csdn.net/skygray/article/details/6223358

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 da?ta 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 );?)?。其實,我們的程序默認只用一個參考幀,這個問題就不是十分有意義了。

??? 多參考幀情況下。

??? 舉個例子?:有如下幀序列:?IPPPP?I?P?PPP?……(我們程序沒有?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帧区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。