如何結合H.264標準看JM代碼

來源:互聯網
上載者:User

《如何結合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)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.