《如何結合H.264標準看JM代碼》這個web檔案,大家都應該有了吧。不過,那個web文檔是“H.264樂園”群中聊天的內容,因此看的不是很方便......我在開學來的時候看的時候,做了一些總結,希望與大家分享!不對的地方請指正!
1、一個sps後,有若干個pps嗎?
這主要又編碼器決定,但JM代碼中只有一個
2、標準中第二欄的C是什麼意思?
請看標準7.2--分類(在表中以C標記)表明了片資料被劃分為三類片資料分割的情況。片資料A類分割包含所有的2類文法元素。片資料B類分割包含所有的3類文法元素。片資料C類分割包含所有的4類文法元素。其他類文法元素取值的含義未做規定。對於某些文法元素,使用一個垂直豎線表示其包含兩類文法元素。在這種情況下,該文法元素將使用的分類值將在文本中進一步確定。
3、一個NALU對應一個片嗎?
這種說法不太準確,NALU 包括一個片、SPS、PPS、SEI等等
4、decode_one_frame()包括I、P、B
5、 case NALU_TYPE_SLICE:
case NALU_TYPE_IDR:
case NALU_TYPE_DPA
case NALU_TYPE_DPB:
case NALU_TYPE_DPC
case NALU_TYPE_SEI:
case NALU_TYPE_PPS
case NALU_TYPE_SPS
case NALU_TYPE_AUD:
case NALU_TYPE_EOSEQ:
case NALU_TYPE_EOSTREAM:
case NALU_TYPE_FILL
問題:什麼時候進入哪個,有什麼說明的文章或書嗎?
答 :進入哪個 case 是由從 NALU 頭裡解碼出來的 nalu_type 決定的
6、解碼器中的誤碼隱藏只對丟包有用,丟包之後,包的序號不連續,解碼器一旦檢測到包序號不連續就會將不連續地方的 ei_flag 置 1
7、位元組流格式和RTP格式碼流,具體的不同點有哪些?相關的資料哪裡有?
位元組流格式主要用於檔案儲存體,因此在該格式碼流中 NALU 前面只有一個開始首碼,RTP格式碼流因為需要進行網路傳輸, 因此 NALU 前面還有很多輔助資訊
8、rtp格式就是在位元組流前加包頭嗎?
不是,位元組流=開始首碼+NALU,而 RTP 中沒有 開始首碼
9、RTP中沒有開始首碼,為什麼還是要插03?
防止偽起始碼、、RTP完全可以不用起始碼,或許是為了與位元組流格式統一吧
10、NALU是對RBSP的封裝。而RTP之類的是對NALU的封裝。
11、為什麼要分ABC片?
——分ABC片主要目的是為了對重要程度不同的資料進行不同程度的保護
12、baseline沒有資料分割吧?
baseline只是如何產生RBSP,如何封裝NALU。具體如何傳輸,RTP之類只是一種方式,檔案copy也是一種方式,那一般 baseline最多有多少參考幀?任意個。
13、解碼profile_idc之後解碼器要做什麼工作?比如baseline不支援CABAC那麼後面相應的位entropy_coding_mode_flag是不是就不存在了,如果存在,相抵觸怎麼辦?
當然不會執行 CABAC 的代碼,編碼器如果是編碼 baseline ,那麼碼流中自然就不存在與 CABAC 相關的文法元素,例如 entropy_coding_mode_flag ,解碼器解碼 SPS ,得知碼流是 baseline 後,自然也就不會去調用與 CABAC 相關的解碼程 序,也就不會出錯了。profile_idc 為 baseline ,active_pps->entropy_coding_mode_flag 就不會為 CABAC,,碼流是 否是 baseline 並不是由多少個參考幀決定的
14、JM 進行 CAVLC 編碼時候,對於 level = 8 的情況是採用 escape suffix 處理的,我修改代碼將 level = 8 的情況採用無符號數表示,結果編碼出來的碼流與未修改完全一樣
附:RBSP、SODB、EBSP三者的區別和聯絡!
SODB:最原始的編碼資料,沒有任何附加資料
RBSP:在 SODB 的基礎上加了rbsp_stop_ont_bit(bit 值為 1)並用 0 按位元組補位對齊
EBSP:在 RBSP 的基礎上增加了防止偽起始碼位元組(0X03)
1、1 frame的資料可以分為多個slice.
2、每個slice中的資料,在幀內預測只用到自己slice的資料, 與其他slice 資料沒有依賴關係。
3、NAL 是用來將編碼的資料進行大包的。 比如,每一個slice 資料可以放在NAL 包中。
4、I frame. 是自己獨立編碼,不依賴於其他frame. 資料。
P frame. 依賴 I frame. 資料。
B frame. 依賴 I frame, P frame. 或其他 B frame. 資料。
一個frame是可以分割成多個Slice來編碼的,而一個Slice編碼之後被打包進一個NAL單元,不過NAL單元除了容納Slice編碼的碼流外,還可以容納其他資料,比如序列參數集SPS。
15、NAL、Slice與frame意思及相互關係
NAL指網路提取層,裡面放一些與網路相關的資訊
Slice是片的意思,264中把映像分成一幀(frame)或兩場(field),而幀又可以分成一個或幾個片(Slilce);片由宏塊(MB)組成。宏塊是編碼處理的基本單元。
16、NAL nal_unit_type中的1(非IDR映像的編碼條帶)、2(編碼條帶資料分割塊A)、3(編碼條帶資料分割塊B)、4(編碼條帶資料分割塊C)、5(IDR映像的編碼條帶)種類型與 Slice種的三種編碼模式:I_slice、P_slice、B_slice NAL nal_unit_type 裡的五種類型,代表接下來資料是表示啥資訊的和具體如何分塊。I_slice、P_slice、B_slice 表示I類型的片、P類型的片,B類型的片.其中I_slice為幀內預測模式編碼;P_slice為單向預測性編碼或幀內模式;B_slice 中為雙向預測或幀內模式。
17、還有frame的3種類型:I frame、P frame、 B frame之間有什麼映射關係嗎?
I frame、P frame、 B frame關係同 I_slice、P_slice、B_slice,slice和frame區別在問題1中已經講明白。
18、最後,NAL nal_unit_type中的6(SEI)、7(SPS)、8(PPS)屬於什麼幀呢?
NAL nal_unit_type 為序列參數集(SPS)、映像參數集(PPS)、增強資訊(SEI)不屬於啥幀的概念。表示後面的資料資訊為序列參數集(SPS)、映像參數集(PPS)、增強資訊(SEI)。