下面分析 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相关推荐

  1. HEVC/H265 HM10.0 分析(三)TAppDecTop.cpp

    在TAppDecTop.cpp  ,最重要的是decode 函数,下面将对其进行分析,是解码上层的一个重要函数. 代码如下,代码后将进行分析. Void TAppDecTop::decode() {I ...

  2. HEVC/H265 HM10.0 分析(二)TComDataCU.cpp

    以下分析TComDataCU.cpp.这个cpp是很重要的,要分几次分析完,这是分析TComDataCU.cpp(一). Void TComDataCU::getPartPosition( UInt ...

  3. HEVC/H265 性能分析

    HEVC/H265 标准中的目标是:H264的码率一般,质量一样,是否达到,数据说话.  下面是视频编解码大师测试数据: HEVC: is it really twice as good as H.2 ...

  4. 【Android 10 源码】healthd 模块 HAL 1.0 分析

    health@1.0:android.hardware.health@1.0 的缩写.指的是 Android 8.0 中发布的运行状况 HIDL 的 1.0 版 HAL. Android 8.x 中的 ...

  5. FFmpeg的HEVC解码器源代码简单分析:解码器主干部分

    ===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...

  6. FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-TU

    ===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...

  7. FFmpeg的HEVC解码器源代码简单分析:解析器(Parser)部分

    ===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...

  8. FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-PU

    ===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...

  9. FFmpeg的HEVC解码器源代码简单分析 解析器(Parser)部分

    ===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...

最新文章

  1. Centos7.4 版本环境下安装Mysql5.7操作记录
  2. PHP7 RC7 Release对比PHP5.6快速排序20000数据性能体验以及新语法尝鲜
  3. 发明复制粘贴的那个人去世了
  4. 【大学课程】线性代数基础知识点
  5. 深度学习编译:MLIR初步
  6. SQL必知必会-过滤数据
  7. 最小的JAVA WEB SERVER源程序 可正常運行
  8. OpenGL 的渲染流水线
  9. DBA_实践指南系列7_Oracle Erp R12监控OAM(案例)
  10. SQL注射技术总结文档
  11. 双随机软件java_随机抽检|双随机一公开 1.0 正式版下载_太平洋下载中心
  12. 统信系统安装京瓷打印机驱动步骤 针对京瓷系列复合机的UOS操作系统用户使用说明
  13. JavaScript:点击按钮打开/关闭网页
  14. 10^5以下素数筛法——素数表法
  15. Android应用优化之冷启动优化
  16. 项目管理知识点-结合Enovia项目管理模块
  17. 2021年12月电子学会图形化三级编程题解析含答案:跳高比赛
  18. 将 Visio 的图片复制到 ppt并能编辑
  19. RemoteViews的使用
  20. ps写php,ps毛笔字体怎么做

热门文章

  1. 【转】云社区 博客 博客详情 二维异形件排版算法介绍(一)
  2. 【转】Windows Server 2012 R2 双网卡绑定
  3. Sharepoint学习笔记—error处理-- The user does not exist or is not unique.
  4. php网站评论模块怎么写,模块内容评论循环
  5. 字节流转化为文件流_字节流转成字符串之后,在通过字符串转成字节流后的文件为什么会不一样?...
  6. centos 删除crontab_centos下crontab的使用
  7. 【Python CheckiO 题解】Say Hi
  8. CCIE-LAB-第五篇-DHCP+DHCP-Realy+DHCP snooping
  9. 【HDU - 5884】Sort(k叉哈夫曼树,优化tricks,两个队列代替优先队列)
  10. 【HDU - 1251 】统计难题(字典树,求拥有公共前缀的字符串数量)