首页 > 其他分享 >HEVC官方代码学习_1

HEVC官方代码学习_1

时间:2023-06-25 17:13:45浏览次数:41  
标签:编码器 HEVC 字节 代码 官方 SODB cpp RBSP 定义

HM是HEVC(H.265)的开源实现,可以从网上直接下载。

下载网址:https://hevc.hhi.fraunhofer.de/svn/svn_HEVCSoftware/tags/

文件整体调用流程图

 

各类文件功能

AccessUnit.h 定义了存取单元(或者访问单元),实质是一个类型为NALUnitEBSP的list

扩展

比特流的不同数据类型

SODB:数据比特串,即编码后的最原始的数据;

RBSP:原始字节序列载荷,即在SODB的后面添加了trailing bits,即一个bit 1和若干个bit 0,以便字节对齐;

EBSP:扩展字节序列载荷,即在RBSP的基础上添加了仿校验字节0x03.

SODB是编码收的原始数据,经过封装后为RBSP,RBSP是NAL单元的数据部分的封装格式。在NAL内部为了防止与起始码竞争,从而引入填充字节0x03,这样便形成了EBSP。

RBSP形成过程

如果SODB的内容是空的,那么RBSP的内容也是空的;

否则,RBSP的第一个字节取自SODB的第1到第8个比特,RBSP字节内部按照从左到右从高到低的顺序排列。以此类推,RBSP中的每个字节都直接取自SODP的相应比特。RBSP的最后一个字节包含SODB的最后几个比特,以及trailing bits。其中,trailing bits的第一个比特为1,其余的比特为0,保证字节对齐。最后,在结尾添加0x0000,即CABAC ZERO WORD,从而形成RBSP。

EBSP形成过程

NALU数据+起始码就形成了AnnexB格式,起始码包括两种,0x00000001和0x000001。为了不让NALU的主体与起始码之间产生竞争,在对RBSP进行扫描时,如果遇到连续的两个0x00字节,则在该两个字节后面添加一个0x03字节。在解码的时候将该0x03字节去掉,也成为脱壳操作。

通过该种方式形成EBSP,这需要将近两倍的整帧图像码流大小。为了减少存储器需求,在每个macroblock结束后,即检查该macroblock的SODB的起始码竞争问题,并保留SODB的最后两个字节的零字节个数,以便与下一个macroblock的SODB的开始字节形成连续的起始码竞争检测。对一帧图像的最后一个macroblock,先添加结尾停止bit,再检查起始码竞争。
注:起始码包括两种情况,即4字节和3字节。在SPS、PPS和Access Unit的第一个NALU使用4字节起始码,其余情况均使用3字节起始码。

NAL.h 定义了NALUnit(NAL单元)和NALUnitEBSP(EBSP类型的NAL单元)

AnnexBwrite.h 实现了把存取单元写入外部数据队列的功能

CommonDef.h 定义各种宏

ContextModel.h/ContextModel.cpp 定义了熵编码需要的上下文模型

ContextModel3DBuffer.h/ContextModel3DBuffer.cpp 定义了熵编码上下文模型需要的3维缓存区

ContextTables.h 定义各种上下文所需的表格,例如二进制化、熵编码等等

encmain.cpp 编码器的主函数

libmd5.h/libmd5.cpp/MD5.h md5算法的实现

NALwrite.h/NALwrite.cpp 定义了输出的NAL单元(OutputNALUnit)、实现把NAL单元写到外部输出流中(std::ostream)

program_options_lite.h/program_options_lite.cpp 编码器的选项配置

SEI.h/SEI.cpp 图像增强信息方面

SEIwrite.h/SEIwrite.cpp 写SEI信息到比特流中

SyntaxElementWriter.h/SyntaxElementWriter.cpp 语法元素写入器

TAppEncCfg.h/TAppEncCfg.cpp 编码器应用程序配置类

TAppEncTop.h/TAppEncTop.cpp 继承自TAppEncCfg,编码器应用程序顶层类(或者说编码器的主类)

TComBitCounter.h/TComBitCounter.cpp 比特计数器

TComBitStream.h/TComBitStream.cpp 比特流

TComCABACTables.h/TComCABACTables.cpp定义了CABAC所需要的各种表格

TComDataCU.h/TComDataCU.cpp CU 编码单元的定义

TComInterpolationFilter.h/TComInterpolationFilter.cpp 插值过滤器

TComList.h 公用的列表的定义,继承自std的list

TComLoopFilter.h/TComLoopFilter.cpp 环路滤波器的实现

TComMotionInfo.h/TComMotionInfo.cpp 运动信息的实现

TComMv.h mv运动向量的定义

TComPattern.h/TComPattern.cpp 公共的模式类,定义了YUV三个颜色分量的方位方法和相邻像素的访问方法

TcomPic.h/TcomPic.cpp 是图片类,它包含TComPicSym(图像符号类)和TComPicYuv(yuv数据类:包括原始数据,预测数据、残差数据)

TComPicSym.h/TComPicSym.cpp 定义了图像符号类,定义了从图像到片和cu的访问方式

TComPicYuv.h/TComPicYuv.cpp 图像的yuv数据类:包括原始数据,预测数据、残差数据

TComPicYuvMD5.cpp 图像的yuv的md5的实现

TComPrediction.h/TComPrediction.cpp 预测的实现(帧内预测/帧间预测)

TComRdCost.h/TComRdCost.cpp 率失真代价

TComRdCostWeightPrediction.h/TComRdCostWeightPrediction.cpp 带率失真权重的预测

TComRom.h/TComRom.cpp 全局的变量和函数

TComSampleAdaptiveOffset.h/TComSampleAdaptiveOffset.cpp SAO的定义和实现

TComSlice.h/TComSlice.cpp 片的定义和实现

TComTrQuant.h/TComTrQuant.cpp 变换和量化的实现

TComWeightPrediction.h/TComWeightPrediction.cpp 带权重的预测

TComYuv.h/TComYuv.cpp TComPicYuv和TComYuv的区别,TComYuv可以看作是一个方便操作YUV的类,主要用于预测阶段,从TComPicYuv产生而来,TComYuv的作用较小

TEncAnalyze.h/TEncAnalyze.cpp 编码器分析类(性能分析类)

TEncBinCoder.h 二进制编码器的定义(定义了二进制化和熵编码的一些类)

TEncBinCoderCABAC.h/TEncBinCoderCABAC.cpp CABAC二进制编码器

TEncBinCoderCABACCounter.h/TEncBinCoderCABACCounter.cpp CABAC比特计数器

TEncCavlc.h/TEncCavlc.cpp CAVLC熵编码器

TEncCfg.h 编码器的基础配置类

TEncCu.h/TEncCu.cpp CU编码器

TEncEntropy.h/TEncEntropy.cpp 熵编码器

TEncGOP.h/TEncGOP.cpp 图像组编码器

TEncPic.h/TEncPic.cpp 图像编码器

TEncPreanalyzer.h/TEncPreanalyzer.cpp 预测分析器编码器 

TEncRateCtrl.h/TEncRateCtrl.cpp 速率控制器(帧速率、比特速率等等)

TEncSampleAdaptiveOffset.h/TEncSampleAdaptiveOffset.cpp SAO编码器

TEncSbac.h/TEncSbac.cpp SBAC编码器(SBAC是CABAC的改进,是并行的CABAC算法)

TEncSearch.h/TEncSearch.cpp 运动搜索的实现

TEncSlice.h/TEncSlice.cpp 片编码器

TEncTop.h/TEncTop.cpp 公共的编码器类(与编码器应用类不一样,编码器应用类是一个包装的接口类)

TvideoIOYuv.h/TvideoIOYuv.cpp YUV的I/O类,是用来读取yuv文件的类,读取出来之后把数据放到TComPicYuv中

TypeDef.h 基础类型的定义

WeightPredAnalysis.h/WeightPredAnalysis.cpp 带权预测分析

TCom和TEnc的区别在于,TEnc一般是管理器或者编码器,而TCom则是数据存储类或者算法实现类,例如TEncCu是CU编码器类,而TComDataCU则是CU的数据类(或者说CU数据的操作类,因为实际的数据仍然存放在TComPicYuv中)

标签:编码器,HEVC,字节,代码,官方,SODB,cpp,RBSP,定义
From: https://www.cnblogs.com/giaogiaogiao/p/17502336.html

相关文章

  • 修改博客园代码块高亮主题
    博客园(默认编辑器设置为Markdowm)是使用heightlight.js进行代码块高亮的。因此可以通过下载heightlight.js官网的主题css修改博客园中的代码块高亮颜色。修改方法:进入heightlight.js官网,点击demo页面预览,查看主题效果在下载页面选择需要的语言并下载打开下载......
  • 刷新20项代码任务SOTA,Salesforce提出新型基础LLM系列编码器-解码器Code T5+
    前言 大型语言模型(LLMs)最近在代码层面的一系列下游任务中表现十分出彩。通过对大量基于代码的数据(如GitHub公共数据)进行预训练,LLM可以学习丰富的上下文表征,这些表征可以迁移到各种与代码相关的下游任务。但是,许多现有的模型只能在一部分任务中表现良好,这可能是架构和......
  • 低代码开发平台魔笔发布评测令
    阿里云低代码开发平台魔笔是一款面向全端(Web、H5、全平台小程序、App)场景,模型驱动的低代码开发平台,具有集成开放、一云多端、多云部署等优势,助力客户在数字化转型进程中真正实现降本增效。即日起至7月31日,参与活动就有机会赢取罗技G512游戏机械键盘、G502机械鼠标、小米背包、开......
  • Linux使用HTTP代码示例
    以下是使用Linux命令行发送HTTP请求的示例:1.使用curl命令发送GET请求:```curl ExampleDomain```2.使用curl命令发送POST请求:```curl-XPOST-d"param1=value1&param2=value2" ExampleDomain```3.使用wget命令发送GET请求:```wget ExampleDomain```4.使用wget命令发送POST......
  • 低代码开发平台魔笔发布评测令!
    阿里云低代码开发平台魔笔是一款面向全端(Web、H5、全平台小程序、App)场景,模型驱动的低代码开发平台,具有集成开放、一云多端、多云部署等优势,助力客户在数字化转型进程中真正实现降本增效。即日起至7月31日,参与活动就有机会赢取罗技G512游戏机械键盘、G502机械鼠标、小米背包、开发......
  • 实际案例分析 - 根据应用程序日志的记录,反查出哪一行 ABAP 代码产生的这条日志试读版
    本文的写作动机来自笔者知识星球一个朋友的提问:调用bapi创建主数据的时候报错,没有未物料组分配特性参数文件,这个是什么原因?实际查看,特性文件已经生成了这个朋友提供的是应用程序日志(即ApplicationLog)里的截图。关于应用程序日志的详细用法,笔者之前的文章已经做过介绍。74.学会......
  • pytest + yaml 框架 -41.postman 和 python代码也能录制成用例
    前言python代码和postman写的接口也能通过录制功能自动生成yaml格式用例了。python代码运行后自动录制环境准备参考前面一篇https://www.cnblogs.com/yoyoketang/p/17495374.html在项目本地新建一个recorde.py,名称随便定义frompytest_yaml_yoyo.mitm_httpimportRecode......
  • 蔚来手撕代码题:三个线程循环打印ABC
    问题如下:https://www.nowcoder.com/discuss/493178141461041152思路分析三个线程交替打印ABC的实现方法有很多,我个人比较倾向于使用JUC下的CyclicBarrier(循环栅栏,也叫循环屏障)来实现,因为循环栅栏天生就是用来实现一轮一轮多线程任务的,它的核心实现思路如下图所示:Cycl......
  • 百度Amis+React低代码实践
    背景在项目中有集成低代码平台的想法,经过多方对比最后选择了amis,主要是需要通过amis进行页面配置,导出json供移动端和PC端进行渲染,所以接下来讲一下近两周研究amis的新的以及一些简单经验,供大家参考.什么是amisamis是一个低代码前端框架,它使用JSON配置来生成......
  • 零代码量化投资:用ChatGPT下载沪深300成分股历史数据
    很多量化策略都会以沪深300成分股作为股票池。因此,沪深300成分股历史数据会经常用到。在ChatGPT输入如下提示语,就可以下载沪深300成分股历史数据:沪深300成分股:query_hs300_stocks()方法说明:通过API接口获取沪深300成分股信息,更新频率:每周一更新。返回类型:pandas的DataFrame类型。使......