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

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

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

  1. 【Codecs系列】HEVC官方软件HM源代码简单分析-解码器TAppDecoder

    目录 函数调用关系图 普通内部函数 解析函数(Parser) 熵解码函数(Entropy Decoding) 解码函数(Decode) 环路滤波函数(Loop Filter) 本文记录HEVC官方参考 ...

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

    ===================================================== H.264/H.265 官方源代码分析文章: H.264官方软件JM源代码简单分析-编码器l ...

  3. H.264官方软件JM源代码简单分析-解码器ldecod(转载)

    转载自 雷霄骅 大神博客 https://blog.csdn.net/leixiaohua1020 ================================================== ...

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

    ===================================================== H.264/H.265 官方源代码分析文章: H.264官方软件JM源代码简单分析-编码器l ...

  5. HEVC参考软件HM源码分析--帧间预测(1)--xCompressCU

    本文首先对HM中帧间预测的基本流程作简要介绍,接着对代码中关键变量的用途作出说明,最后以源代码+注释的形式进行具体分析. 备注:这位大神的博客对楼主帮助很大,解决了我的不少疑惑,最后才能顺利写下这篇博 ...

  6. HEVC参考软件HM源码分析--帧间预测(3)--predInterSearch

    帧间预测基本知识 对帧间预测有所了解的同学应该都知道,帧间预测操作一般都是由两个最基本也是最核心的操作组成:运动估计(ME)和运动补偿(MC). 运动估计:负责找到当前帧和参考帧之间的匹配运动矢量(M ...

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

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

  8. FFmpeg的HEVC解码器源代码简单分析

    这里转载一下雷博的文章,关于ffmpeg中的h.265解码器源码的分析,写的很好,值得一读. 原文地址: https://blog.csdn.net/leixiaohua1020/article/de ...

  9. FFmpeg的HEVC解码器源代码简单分析:概述

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

最新文章

  1. if函数中的android,java - 我需要帮助将IF语句方法更改为Android Studio中的SWITCH情况 - 堆栈内存溢出...
  2. Lucene.Net---1索引的建立
  3. 15.1 集合的迭代器
  4. Spring-AOP @AspectJ进阶之增强织入的顺序
  5. PS菜鸟入门 -- 窗口
  6. 2003服务器被入侵,如果还原Gest用户,删除隐藏用户
  7. Centos7 error: Failed to initialize NSS library
  8. vue :key的说明 看到这文章,解决你的疑问
  9. 每天进步一点点《PCA的简要学习》
  10. java单链表_(java实现)单链表
  11. sas分组计数_SAS读书笔记:SQL
  12. OPENGL中的glViewport
  13. 好的数据分析平台有多重要
  14. lisp 读取样条曲线座标点_MATLAB插值绘制曲线
  15. Mac 本地搭建服务器实现itms-services方式安装ipa(自制证书)
  16. html标题字体文本居中字体颜色,HTML字体标签:如何控制字体大小与颜色
  17. 当你输入网址到网页呈现发生了什么?
  18. 每天一个PS技巧(原理+实践)——制作熊猫人表情包
  19. java如何从地址串中解析提取省市区(完美匹配中国所有地址)
  20. Fiddler 关闭 HTTP protocal violations 弹出框

热门文章

  1. 访韩家炜教授记录(部分)
  2. 小米手机开发者选项打开usb安装需要SIM卡解决办法
  3. Kali linux 学习笔记(七十五)拒绝服务——teardrop 2020.4.15
  4. 原来Vinted注册这么简单!Vinted注册保姆级教程分享
  5. 蓝牙音频芯片,在交通灯提示语音更换的应用解析,WT2605X
  6. ASO和ASA的关系与区别
  7. 【编程语言】Scala下载及安装教程 CentOS 7
  8. 云谦:谈谈前端框架的趋势与实践
  9. 如何使用 K8s 实现跨集群管理,这篇文章告诉你了!赶紧收藏
  10. 最新上海个人养老保险缴费信息查询步骤