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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

HEVC/H265 HM10.0 分析(一)NALread.cpp

發布時間:2023/12/18 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HEVC/H265 HM10.0 分析(一)NALread.cpp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下面分析 NALread.cpp 函數和代碼。


void read(InputNALUnit& nalu, vector<uint8_t>& nalUnitBuf) {/* perform anti-emulation prevention */TComInputBitstream *pcBitstream = new TComInputBitstream(NULL);convertPayloadToRBSP(nalUnitBuf, (nalUnitBuf[0] & 64) == 0);nalu.m_Bitstream = new TComInputBitstream(&nalUnitBuf);delete pcBitstream;readNalUnitHeader(nalu); }

nalUnitBuf? 是從文件流中讀出的一個nal 單元,我們知道,H264,HEVC/H265? 都是采用 Annex? B 中? Byte stream NAL unit syntax的要求格式,進行封裝,好處是通過前面
的一兩個字節就能夠適用網絡環境傳輸,通過?convertPayloadToRBSP? 函數的目的就是去除偽起始碼,NAL 包分為 VCL(videocoding layer) 和 非VCL包(sps,vps,pps等頭部信息包)。


enum NalUnitType {NAL_UNIT_CODED_SLICE_TRAIL_N = 0, // 0NAL_UNIT_CODED_SLICE_TRAIL_R, // 1NAL_UNIT_CODED_SLICE_TSA_N, // 2NAL_UNIT_CODED_SLICE_TLA, // 3 // Current name in the spec: TSA_RNAL_UNIT_CODED_SLICE_STSA_N, // 4NAL_UNIT_CODED_SLICE_STSA_R, // 5NAL_UNIT_CODED_SLICE_RADL_N, // 6NAL_UNIT_CODED_SLICE_DLP, // 7 // Current name in the spec: RADL_RNAL_UNIT_CODED_SLICE_RASL_N, // 8NAL_UNIT_CODED_SLICE_TFD, // 9 // Current name in the spec: RASL_RNAL_UNIT_RESERVED_10,NAL_UNIT_RESERVED_11,NAL_UNIT_RESERVED_12,NAL_UNIT_RESERVED_13,NAL_UNIT_RESERVED_14,NAL_UNIT_RESERVED_15,NAL_UNIT_CODED_SLICE_BLA, // 16 // Current name in the spec: BLA_W_LPNAL_UNIT_CODED_SLICE_BLANT, // 17 // Current name in the spec: BLA_W_DLPNAL_UNIT_CODED_SLICE_BLA_N_LP, // 18NAL_UNIT_CODED_SLICE_IDR, // 19 // Current name in the spec: IDR_W_DLPNAL_UNIT_CODED_SLICE_IDR_N_LP, // 20NAL_UNIT_CODED_SLICE_CRA, // 21NAL_UNIT_RESERVED_22,NAL_UNIT_RESERVED_23,NAL_UNIT_RESERVED_24,NAL_UNIT_RESERVED_25,NAL_UNIT_RESERVED_26,NAL_UNIT_RESERVED_27,NAL_UNIT_RESERVED_28,NAL_UNIT_RESERVED_29,NAL_UNIT_RESERVED_30,NAL_UNIT_RESERVED_31,NAL_UNIT_VPS, // 32NAL_UNIT_SPS, // 33NAL_UNIT_PPS, // 34NAL_UNIT_ACCESS_UNIT_DELIMITER, // 35NAL_UNIT_EOS, // 36NAL_UNIT_EOB, // 37NAL_UNIT_FILLER_DATA, // 38NAL_UNIT_SEI, // 39 Prefix SEINAL_UNIT_SEI_SUFFIX, // 40 Suffix SEINAL_UNIT_RESERVED_41,NAL_UNIT_RESERVED_42,NAL_UNIT_RESERVED_43,NAL_UNIT_RESERVED_44,NAL_UNIT_RESERVED_45,NAL_UNIT_RESERVED_46,NAL_UNIT_RESERVED_47,NAL_UNIT_UNSPECIFIED_48,NAL_UNIT_UNSPECIFIED_49,NAL_UNIT_UNSPECIFIED_50,NAL_UNIT_UNSPECIFIED_51,NAL_UNIT_UNSPECIFIED_52,NAL_UNIT_UNSPECIFIED_53,NAL_UNIT_UNSPECIFIED_54,NAL_UNIT_UNSPECIFIED_55,NAL_UNIT_UNSPECIFIED_56,NAL_UNIT_UNSPECIFIED_57,NAL_UNIT_UNSPECIFIED_58,NAL_UNIT_UNSPECIFIED_59,NAL_UNIT_UNSPECIFIED_60,NAL_UNIT_UNSPECIFIED_61,NAL_UNIT_UNSPECIFIED_62,NAL_UNIT_UNSPECIFIED_63,NAL_UNIT_INVALID, };


以下是nal_unit_header的描述,(nalUnitBuf[0]& 64) == 0? 就是? NalUnitType? 從0 到31的, NalUnitType 從32到64的,(nalUnitBuf[0] & 64)== 1, 在語法描述中有

forbidden_zero_bit 為 0,例如:NAL_UNIT_VPS? 是32 , 0(forbidden_zero_bit)? 100000(nal_unit_type),?? 0(nuh_reserved_zero_6bits), 所以NAL_UNIT_VPS的nalUnitBuf[0] 為64,。? 通過 NalUnitType 得知,slice相關的(nalUnitBuf[0] & 64)== 0? , slice不相關的(nalUnitBuf[0] & 64)==? 1.?

在slice中可能就有cabac_zero_word字節,不需要進行解碼的。


nal_unit_header(?) {

Descriptor

???? forbidden_zero_bit

f(1)

???? nal_unit_type

u(6)

???? nuh_reserved_zero_6bits

u(6)

???? nuh_temporal_id_plus1

u(3)

}

?





convertPayloadToRBSP(nalUnitBuf, (nalUnitBuf[0] & 64) == 0);? 函數就是去偽起始碼,readNalUnitHeader 就是判斷nalu的類型信息。

總結

以上是生活随笔為你收集整理的HEVC/H265 HM10.0 分析(一)NALread.cpp的全部內容,希望文章能夠幫你解決所遇到的問題。

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