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

下面分析 NALread.cpp 函数和代码。


  1. void read(InputNALUnit& nalu, vector<uint8_t>& nalUnitBuf)  
  2. {  
  3.   /* perform anti-emulation prevention */  
  4.   TComInputBitstream *pcBitstream = new TComInputBitstream(NULL);  
  5.   convertPayloadToRBSP(nalUnitBuf, (nalUnitBuf[0] & 64) == 0);  
  6.     
  7.   nalu.m_Bitstream = new TComInputBitstream(&nalUnitBuf);  
  8.   delete pcBitstream;  
  9.   readNalUnitHeader(nalu);  
  10. }  
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等头部信息包)。


  1. enum NalUnitType  
  2. {  
  3.   NAL_UNIT_CODED_SLICE_TRAIL_N = 0,   // 0   
  4.   NAL_UNIT_CODED_SLICE_TRAIL_R,   // 1   
  5.     
  6.   NAL_UNIT_CODED_SLICE_TSA_N,     // 2   
  7.   NAL_UNIT_CODED_SLICE_TLA,       // 3   // Current name in the spec: TSA_R   
  8.     
  9.   NAL_UNIT_CODED_SLICE_STSA_N,    // 4   
  10.   NAL_UNIT_CODED_SLICE_STSA_R,    // 5   
  11.   
  12.   NAL_UNIT_CODED_SLICE_RADL_N,    // 6   
  13.   NAL_UNIT_CODED_SLICE_DLP,       // 7 // Current name in the spec: RADL_R   
  14.     
  15.   NAL_UNIT_CODED_SLICE_RASL_N,    // 8   
  16.   NAL_UNIT_CODED_SLICE_TFD,       // 9 // Current name in the spec: RASL_R   
  17.   
  18.   NAL_UNIT_RESERVED_10,  
  19.   NAL_UNIT_RESERVED_11,  
  20.   NAL_UNIT_RESERVED_12,  
  21.   NAL_UNIT_RESERVED_13,  
  22.   NAL_UNIT_RESERVED_14,  
  23.   NAL_UNIT_RESERVED_15,  
  24.   
  25.   NAL_UNIT_CODED_SLICE_BLA,       // 16   // Current name in the spec: BLA_W_LP   
  26.   NAL_UNIT_CODED_SLICE_BLANT,     // 17   // Current name in the spec: BLA_W_DLP   
  27.   NAL_UNIT_CODED_SLICE_BLA_N_LP,  // 18   
  28.   NAL_UNIT_CODED_SLICE_IDR,       // 19  // Current name in the spec: IDR_W_DLP   
  29.   NAL_UNIT_CODED_SLICE_IDR_N_LP,  // 20   
  30.   NAL_UNIT_CODED_SLICE_CRA,       // 21   
  31.   NAL_UNIT_RESERVED_22,  
  32.   NAL_UNIT_RESERVED_23,  
  33.   
  34.   NAL_UNIT_RESERVED_24,  
  35.   NAL_UNIT_RESERVED_25,  
  36.   NAL_UNIT_RESERVED_26,  
  37.   NAL_UNIT_RESERVED_27,  
  38.   NAL_UNIT_RESERVED_28,  
  39.   NAL_UNIT_RESERVED_29,  
  40.   NAL_UNIT_RESERVED_30,  
  41.   NAL_UNIT_RESERVED_31,  
  42.   
  43.   NAL_UNIT_VPS,                   // 32   
  44.   NAL_UNIT_SPS,                   // 33   
  45.   NAL_UNIT_PPS,                   // 34   
  46.   NAL_UNIT_ACCESS_UNIT_DELIMITER, // 35   
  47.   NAL_UNIT_EOS,                   // 36   
  48.   NAL_UNIT_EOB,                   // 37   
  49.   NAL_UNIT_FILLER_DATA,           // 38   
  50.   NAL_UNIT_SEI,                   // 39 Prefix SEI   
  51.   NAL_UNIT_SEI_SUFFIX,            // 40 Suffix SEI   
  52.   NAL_UNIT_RESERVED_41,  
  53.   NAL_UNIT_RESERVED_42,  
  54.   NAL_UNIT_RESERVED_43,  
  55.   NAL_UNIT_RESERVED_44,  
  56.   NAL_UNIT_RESERVED_45,  
  57.   NAL_UNIT_RESERVED_46,  
  58.   NAL_UNIT_RESERVED_47,  
  59.   NAL_UNIT_UNSPECIFIED_48,  
  60.   NAL_UNIT_UNSPECIFIED_49,  
  61.   NAL_UNIT_UNSPECIFIED_50,  
  62.   NAL_UNIT_UNSPECIFIED_51,  
  63.   NAL_UNIT_UNSPECIFIED_52,  
  64.   NAL_UNIT_UNSPECIFIED_53,  
  65.   NAL_UNIT_UNSPECIFIED_54,  
  66.   NAL_UNIT_UNSPECIFIED_55,  
  67.   NAL_UNIT_UNSPECIFIED_56,  
  68.   NAL_UNIT_UNSPECIFIED_57,  
  69.   NAL_UNIT_UNSPECIFIED_58,  
  70.   NAL_UNIT_UNSPECIFIED_59,  
  71.   NAL_UNIT_UNSPECIFIED_60,  
  72.   NAL_UNIT_UNSPECIFIED_61,  
  73.   NAL_UNIT_UNSPECIFIED_62,  
  74.   NAL_UNIT_UNSPECIFIED_63,  
  75.   NAL_UNIT_INVALID,  
  76. };  
enum NalUnitType
{
  NAL_UNIT_CODED_SLICE_TRAIL_N = 0,   // 0
  NAL_UNIT_CODED_SLICE_TRAIL_R,   // 1
  
  NAL_UNIT_CODED_SLICE_TSA_N,     // 2
  NAL_UNIT_CODED_SLICE_TLA,       // 3   // Current name in the spec: TSA_R
  
  NAL_UNIT_CODED_SLICE_STSA_N,    // 4
  NAL_UNIT_CODED_SLICE_STSA_R,    // 5

  NAL_UNIT_CODED_SLICE_RADL_N,    // 6
  NAL_UNIT_CODED_SLICE_DLP,       // 7 // Current name in the spec: RADL_R
  
  NAL_UNIT_CODED_SLICE_RASL_N,    // 8
  NAL_UNIT_CODED_SLICE_TFD,       // 9 // Current name in the spec: RASL_R

  NAL_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_LP
  NAL_UNIT_CODED_SLICE_BLANT,     // 17   // Current name in the spec: BLA_W_DLP
  NAL_UNIT_CODED_SLICE_BLA_N_LP,  // 18
  NAL_UNIT_CODED_SLICE_IDR,       // 19  // Current name in the spec: IDR_W_DLP
  NAL_UNIT_CODED_SLICE_IDR_N_LP,  // 20
  NAL_UNIT_CODED_SLICE_CRA,       // 21
  NAL_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,                   // 32
  NAL_UNIT_SPS,                   // 33
  NAL_UNIT_PPS,                   // 34
  NAL_UNIT_ACCESS_UNIT_DELIMITER, // 35
  NAL_UNIT_EOS,                   // 36
  NAL_UNIT_EOB,                   // 37
  NAL_UNIT_FILLER_DATA,           // 38
  NAL_UNIT_SEI,                   // 39 Prefix SEI
  NAL_UNIT_SEI_SUFFIX,            // 40 Suffix SEI
  NAL_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的类型信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值