转自雷神雷霄骅:https://blog.csdn.net/leixiaohua1020/article/details/49912013

=====================================================

H.264/H.265 官方源代码分析文章:

H.264官方软件JM源代码简单分析-编码器lencod

H.264官方软件JM源代码简单分析-解码器ldecod

HEVC官方软件HM源代码简单分析-编码器TAppEncoder

HEVC官方软件HM源代码简单分析-解码器TAppDecoder

=====================================================

本文记录HEVC官方参考软件HM的源代码结构。HM相比于JM来说,采用了面向对象的编程方法,因而结构相对更加清晰。HM包含了视频解码器TAppDecoder和视频编码器TAppEncoder。本文记录视频解码器TAppDecoder的结构。

函数调用关系图

HM中的HEVC视频解码器TAppDecoder的函数调用关系图如下所示。

单击查看更清晰的大图

下面解释一下图中关键标记的含义。

函数背景色

函数在图中以方框的形式表现出来。不同的背景色标志了该函数不同的作用:
白色背景的函数:普通内部函数。
粉红色背景函数:解析函数(Parser)。这些函数用于解析SPS、PPS等信息。
紫色背景的函数:熵解码函数(Entropy Decoding)。这些函数读取码流数据并且进行CABAC熵解码。
绿色背景的函数:解码函数(Decode)。这些函数通过帧内预测、帧间预测、DCT反变换等方法解码CU压缩数据。

黄色背景的函数:环路滤波函数(Loop Filter)。这些函数对解码后的数据进行滤波,去除方块效应和振铃效应。

箭头线
箭头线标志了函数的调用关系:
黑色箭头线:不加区别的调用关系。
粉红色箭头线:解析函数(Parser)之间的调用关系。
紫色箭头线:熵解码函数(Entropy Decoding)之间的调用关系。
绿色箭头线:解码函数(Decode)之间的调用关系。
黄色箭头线:环路滤波函数(Loop Filter)之间的调用关系。

函数所在的文件

每个函数标识了它所在的文件路径。

下文记录结构图中的几个关键部分。

普通内部函数

普通内部函数指的是TAppDecoder中还没有进行分类的函数。例如:
解码器的main()函数中调用的TAppDecTop类相关的create()、parseCfg()、decode()、destroy()等方法。
解码器最主要的解码函数:TDecTop中的decode()、xDecodeSlice();TDecGop中的decompressSlice();TDecSlice中的decompressSlice()等。

解析函数(Parser)

解析函数(Parser)用于解析HEVC码流中的一些信息(例如SPS、PPS等)。在TDecTop的decode()中都调用这些解析函数完成了解析。下面举几个解析函数的例子。

xDecodeVPS():解析VPS;
xDecodeSPS():解析SPS;
xDecodePPS():解析PPS;

熵解码函数(Entropy Decoding)

熵解码函数(Entropy Decoding)读取码流数据并且进行CABAC熵解码。熵解码工作是在TDecCu的decodeCtu ()函数中完成的。其中递归调用了xDecodeCU()完成了具体的熵解码工作。

解码函数(Decode)

解码函数(Decode)通过帧内预测、帧间预测等方法解码CU压缩数据。解码工作是在TDecCu的decompressCtu()函数中完成的。其中递归调用了xDecompressCU()完成了具体的解码工作。
xDecompressCU()调用xReconIntraQT()完成帧内预测CU的解码;xReconInter()完成帧间预测CU的解码。
xReconIntraQT()调用xIntraRecQT(),而xIntraRecQT()调用xIntraRecBlk()。xIntraRecBlk()调用了TComPrediction类的predIntraAng()完成了帧内预测的工作;调用了TComTrQuant类的invTransformNxN()完成了残差数据DCT反变换的工作。
xReconInter()调用TComPrediction的motionCompensation()完成了运动补偿的工作;调用xDecodeInterTexture()完成了残差数据的DCT反变换工作。motionCompensation()调用了xPredInterUni()完成了单向预测的运动补偿;而调用xPredInterBi()完成了双向预测的运动补偿。其中xPredInterUni()调用xPredInterBlk()完成一个分量块的运动补偿,而xPredInterBlk()调用了TComInterpolationFilter类的filterHor()和filterVer()完成了亚像素的插值工作。
xDecodeInterTexture()调用TComTrQuant类的invRecurTransformNxN(),而invRecurTransformNxN()调用了invTransformNxN()。invTransformNxN()调用xDeQuant()完成了反量化的工作,调用了xIT()完成了DCT反变换的工作。xIT()调用了xITrMxN()完成MxN维的DCT反变换,而xITrMxN()根据DCT矩阵维度的不同,分别调用了partialButterflyInverse4()、partialButterflyInverse8()、partialButterflyInverse16()、partialButterflyInverse32()几种蝶形算法。

环路滤波函数(Loop Filter)

环路滤波函数(Loop Filter)对解码后的数据进行滤波,去除方块效应和振铃效应。去块效应滤波是在TDecTop 的executeLoopFilters()中完成的。executeLoopFilters()调用了TDecGop 的filterPicture()。filterPicture()调用了TComLoopFilter类的loopFilterPic()完成了去块效应滤波器的工作;调用TComSampleAdaptiveOffset类的SAOProcess()完成了去除振铃效应的SAO滤波器的工作。

雷霄骅
leixiaohua1020@126.com
http://blog.csdn.net/leixiaohua1020

(转霄神)HM解码流程图相关推荐

  1. 花木兰荣耀典藏皮肤特效一览 花木兰九霄神辉值得入手吗

    王者荣耀新赛季,正式开启,而在此次也更新了许多新皮,其中就有花木兰的荣耀典藏皮肤"九霄神辉",那么,这款皮肤的特效如何呢?下面花木兰荣耀典藏皮肤特效吧. 花木兰荣耀典藏皮肤特效一览 ...

  2. HM解码(一) :提取一个NALU信息

    留下一些注释: Void TAppDecTop::decode(){while (!!bitstreamFile){streampos location = bitstreamFile.tellg() ...

  3. H.264编解码标准的核心技术(提供相关流程图)

    最近在学习H.264编解码知识,上网搜了不少资料看,发现大多数中文资料中都缺少相应的图片,例如编解码流程图.编码模板等,这对加深理解是很有帮助 的.木有办法,只好回去潜心阅读<H.264_MPE ...

  4. excel smart流程图增加_大神们原来是这样画出流程图的,怪不得画的又快又好看!...

    原标题:大神们原来是这样画出流程图的,怪不得画的又快又好看! 现在不少的小伙伴不管是在学习上还是在工作中,总会需要制作各种流程图.组织结构图等等这些能让人抓狂的东西,不仅费时间,而且画出来还丑到不能见 ...

  5. huffman编码的程序流程图_F28379D之CLB解码多摩川编码器2——LIB版例程讲解(原创)...

    我在第一篇文章中已经跟大家介绍过379解码多摩川编码器的一些入手小知识,链接如下TMS320F28379D之CLB解码多摩川编码器1--入手小知识(原创) 请大家一定要看入手小知识,再来看例程分析. ...

  6. 三、使用HM进行简单的视频隐写demo

    三.使用HM进行简单的视频隐写 前言 一.实验环境 二.实验思路 三.实验过程 3.1 提取原始载体 3.2 使用LSB隐写算法进行隐写 3.3 放回含密载体 3.4 提取含密载体 3.5 使用LSB ...

  7. 使用FFMPEG——4.2.2版本实现提取视频编码解码文件,ffmpeg基础学习。

    FFMPEG基础学习 视频解码,并且输出到文件. 我通过雷霄骅的博客学习FFMPEG,在学习过程中发现"雷神"的代码由于版本的问题,很多代码已经无法在FFMPEG--4.2.2版本 ...

  8. ffmpeg源码分析与应用示例(一)——H.264解码与QP提取

    本文包含以下内容 1.H.264解码流程详述与对应ffmpeg源码解析 2.针对一个应用实例介绍通过修改ffmpeg源码解决问题的方案 具有较强的综合性. 先介绍一下在第二部分中将要解决的实际问题:自 ...

  9. FFmpeg5入门教程15:mp3音频解码为pcm

    本系列的之前文章介绍了视频的编解码相关,接下来介绍音频的编解码,本文将mp3音频文件解码为pcm. 使用的mp3音频文件为从网易云音乐上下载的排骨教主的牵丝戏,文件大小为9.6MB. 先看一下文件信息 ...

最新文章

  1. 数据库查询构建控件集Active Query Builder 控件
  2. iOS开发③UIView
  3. 网站SEO优化中导入链接有哪些作用?
  4. 在Java 7里如何对文件进行操作
  5. 中国首个工业云平台发布 徐工阿里华为联合打造
  6. vs--bookmark用法
  7. 王道操作系统考研笔记——2.3.2 进程互斥的软件实现方法
  8. ToB产品设计:用户权限系统解析
  9. swift中变量的几种类型
  10. 使用多线程进行网图下载
  11. 接口幂等性常见的解决方案
  12. libgdx之瓦片地图(TiledMap)
  13. 3des base64 java_java和c++中的DES\3DES\Base64
  14. c语言三重积分程序求法,D9_3三重积分[同济大学高等数学]..docx
  15. 锦标赛选择法(遗传算法)
  16. 自己的一些车机app 界面
  17. 怎样防止恶意刷短信验证?
  18. 科研日志——使用opencv提取视频中的人脸
  19. 谷歌云端硬盘快速下载方法_如何在Google云端硬盘中禁用“快速访问”快捷方式...
  20. 自定义View之垂直翻页公告

热门文章

  1. Hackergame 2020
  2. APP马甲包优化技巧制作流程(二)
  3. java制作音乐播放器教程_教你轻松制作java音乐播放器
  4. ArcGIS数据管理
  5. Linux系统一键安装可视化桌面环境支持浏览器及RDP访问
  6. 五大抉择影响女人一生幸福
  7. 转:管理的能力不能代替领导力
  8. NSSCTF---PNGPDF
  9. (二)python学习笔记之列表入门
  10. Pycharm安装与设置