目录

函数调用关系图

普通内部函数

解析函数(Parser)

熵解码函数(Entropy Decoding)

解码函数(Decode)

环路滤波函数(Loop Filter)


本文记录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

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

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

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

  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. CAMB输出保留小数位数问题
  2. jpa 根据主键生成策略获取id_JPA主键生成策略
  3. ruby 线程id_Ruby中的线程
  4. sqlserver如何从周一计算周_纯零基础,花10周时间,完全搞定Python,有没有可能?...
  5. MathType与Origin是怎么兼容的
  6. android 实现自定义卫星菜单
  7. php ftp 下载大文件,文件在用php(ftp)下载后损坏[重复]
  8. javaEE之--------统计站点在线人数,安全登录等(观察者设计模式)
  9. 《程序设计技术》第三章例程
  10. ubuntu server安装的一些坑
  11. 计算机表格函数最大值操作,使用MAX最大值函数计算excel表格中学生成绩的最大值...
  12. tailscale自建derper服务器中转,使用自定义端口
  13. 计算机网络.期末复习
  14. 软件工程结课论文 敏捷开发在软件工程中的应用 大学编程作业(TUST 天津科技大学 2022年)
  15. Python教程(十)--if 实例运用(棒子老虎鸡游戏)
  16. 有哪些微信小程序值得推荐?
  17. 在Word中设置页面B5的问题
  18. 免费分享:5本安卓开发经典书籍,Android 7编程入门经典(第4版),Android底层驱动分析和移植,底层驱动分析和移植
  19. oracle监控pga,监控PGA最大空间、分配
  20. 【python黑帽子】——(一)搭建扫描器入门介绍

热门文章

  1. outlook打开总是要输入密码,怎么办?
  2. 讯飞智能语音鼠标G50:AI语音、转写翻译、记录截图一键搞定!
  3. linux屏幕伽马值设置,设置计算机显示屏的亮度和对比度伽玛值
  4. 机械电气自动化常用知识手册
  5. dota自走棋设置上海服务器位置,Dota2自走棋怎么设置国服 让你轻松进入国服
  6. 飞机打扭来扭去的靶子
  7. 河南在郑州开启5G网络全城试用
  8. 鸿蒙系统手机2020,2020年正式到来,国产手机系统最有希望的华为鸿蒙咋没消息了?...
  9. Windows 11强势来袭,一文带你了解全部更新内容
  10. 故障电弧检测技术现状及难点