之前已经讨论过如何运行HM的encoder工程,已经可以成功将一个yuv测试序列编码为一个.bin格式的二进制码流。这里我们再看看它的逆过程,即将二进制码流进行解码。
在整个HM的solution中很明显可以看到解码器的工程TAppDecoder,将这个工程设置为启动工程(在工程目录上右单击->set as startup project),设置工程属性,主要是命令行参数(右键—>Propertiea->configuration properties->debuging),如下图。还有就是别忘了把str.bin这个码流文件拷到指定的工作目录中去。
完成以后直接编译运行就OK了,解码完成后的输出文件默认为dec.yuv。命令行输出信息如图。
解码器的入口点函数在TAppDecoder中decmain.cpp这个文件里。由main函数进入后,新建一个顶层解码器对象cTAppDecTop之后并输出一些参考解码器版本等等信息之后,cTAppDecTop调用parseCfg()函数来解析命令行参数(在这里也就是上一步设置的“-b str.bin -o dec.yuv”这一行)。
一开始,这个参数解析函数的内容貌似有些奇怪,后来仔细一看才发现,就如同HM整个solution一样,里面应用了大量的C++面向对象的内容。由于之前一直是主攻C而且研究的也是用C写的JM/RM等代码,刚接触HM的时候感觉还是非常不习惯。单就这个函数来讲,里面用到了多个C++相对于C的扩展内容,主要有命名空间、模板类、泛型程序与标准模板库、流等。
命名空间:
命名空间namespace是标准C++引入的关键字,用于控制标识符(包括符号常量、变量、宏、函数、结构、枚举、类和对象等)的作用域,将这些标识符进行本地化,防止命名冲突。如果没有命名空间,则所有标识符都会处于全局空间中,在大型项目的程序开发中很容易出现命名冲突,包括标识符都处于全局空间以及程序使用两个或者多个第三方库的情况等等。
比如若定义一个命名空间:
namespace myNameSpace
{
int nValue1;
int nValue2;
void GetValues(int &_nValue1, int &_nValue2)
{
_nValue1 = nValue1;
-nValue2 = nValue2;
}
Class NSClass
{
private:
int nValueInNSClass;
public:
int ShowNSClassValue()
{
cout<<nValueInNSClass<<endl;
}
}
}
可以看出,在命名空间内部,标识符可以直接使用,如nValue1,nValueInNSClass等。但是若在namespace定义范围之外使用其成员,则必须使用作用域限定符::。但是如果已经定义了该namespace类型的对象,则利用对象使用成员就不需要作用域限定符了。比如
int _tmain()
{
int a = 1, b = 2, c, d;
myNameSpace::nValue1 = a;
myNameSpace::nValue2 = b;
myNameSpace mNS;
mNS.GetValues(c,d);
}
关于命名空间进一步的讨论可以参考下面的文章:
http://blog.chinaunix.net/uid-26874138-id-3215266.html
http://blog.csdn.net/touzani/article/details/1637776
模板函数和模板类
模板函数是C++中定义的一种函数形式,这种函数不仅仅处理某一种形式的参数,而是可以兼容某一类型的多种参数。通过模板函数,可以实现参数化多态性,即使用同一段程序用于处理多种不同类型对象。与此类似的是类模板是声明的类的一种形式,该类中的数据成员、成员函数的参数和返回值可以处理多种类型数据,是一种比类更高层次的抽象,也成为参数化类。模板类的成员函数必须是模板函数。
泛型程序设计
泛型程序设计的目的,是用标准容器和标准算法,以最通用、最有效、最灵活地实现程序的设计,同时不损失效率。泛型程序设计的一个良好典范是C++所提供的标准模板库STL。因为C++模板为泛型程序设计奠定了基础,是所有版本STL的基石。
I/O流
IO流是C++使用的面向对象的输入输出软件包,是C语言的输入输出函数的一种替代产品。通过“流”这一抽象概念,将数据在产生者同使用者(包括磁盘文件和IO设备等)之间进行联系并管理其流动。
关于更详细的解释,相信大家都有各种C++的教材吧,随便一本应该都能讲清楚,自己去找吧,呵呵。
      在TAppdecoder中使用了TAppCommon中定义的df,以及在df内部定义的命名空间program_options_lite。这两个命名空间中定义的多个类、结构和函数用于处理decoder的参数配置信息。TAppDecCfg::parseCfg()这个函数的实现中,先定义了一个df::program_options_lite类型的命名空间po,并且在po内定义了一个Options对象opts。随后opts调用addOptions()函数,后面跟着一串由括号引起的四元cfg结构。这里这么写的原因是因为,opts.addOptinos()所返回的是一个指向OptionSpecific类型的指针,并且OptionSpecific重载了“()”这个运算符,使其也返回一个指向OptionSpecific类型的指针。这样通过一级一级的括号调用,每次都会调用OptionSpecific的构造函数,再调用其Options成员parent_的addOption函数解析并添加括号中的四元cfg结构。完成后,这些数据都存储在opts中。
      下一个函数po::setDefaults(opts)的目的仅仅是将指定的设置参数数值同制定参数进行赋值而已。后面的几个函数会进行无效参数扫描等操作,大部分这里根本没有执行到,因此暂时忽略之。

【HEVC学习与研究】11.HEVC参考解码器的设置及参数解析过程相关推荐

  1. 【HEVC学习与研究】

      [HEVC学习与研究]1.HEVC概览(1) [HEVC学习与研究]2.HEVC概览(2) [HEVC学习与研究]3.HEVC概览(3) [HEVC学习与研究]4.关于IEEE TCSVT的HEV ...

  2. 新一代深度学习框架研究

    点击上方蓝字关注我们 新一代深度学习框架研究 于璠 华为技术有限公司,广东 深圳 518000    摘要:从人工智能的历史出发,简述深度学习发展历程以及目前的挑战,通过介绍新一代深度学习框架的特点, ...

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

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

  4. [HEVC] HEVC学习(五) —— 帧内预测系列之三

    [HEVC] HEVC学习(五) -- 帧内预测系列之三 今天主要介绍帧内预测一个很重要的函数initAdiPattern,它的主要功能有三个,(1)检测当前PU的相邻样点包括左上.上.右上.左.左下 ...

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

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

  6. 【深度学习】从Pix2Code到CycleGAN:2017年深度学习重大研究进展全解读

    选自Statsbot 作者:Eduard Tyantov 机器之心编译 2017 年只剩不到十天,随着 NIPS 等重要会议的结束,是时候对这一年深度学习领域的重要研究与进展进行总结了.来自机器学习创 ...

  7. 迁移学习前沿研究亟需新鲜血液,深度学习理论不能掉链子

    作者 | Frederico Guth,Teófilo Emidio de Campos 编译 | 夕颜 出品 | AI科技大本营(ID:rgznai100) [导读]人类可以从很少的样本中学习,显示 ...

  8. 使用aws跑深度学习_11. 附录 - 11.4. 使用AWS运行代码 - 《动手学深度学习》 - 书栈网 · BookStack...

    11.4. 使用AWS运行代码 当本地机器的计算资源有限时,可以通过云计算服务获取更强大的计算资源来运行本书中的深度学习代码.本节将介绍如何在AWS(亚马逊的云计算服务)上申请实例并通过Jupyter ...

  9. [论文阅读] (30)李沐老师视频学习——3.研究的艺术·讲好故事和论点

    <娜璋带你读论文>系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢.由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学 ...

最新文章

  1. aspx页面中使用%= %的注意事项
  2. 本人对于netty框架的一些理解,怎么与网站上的websock建立连接
  3. GYM 101908F - Music Festival
  4. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)
  5. 挑战NPC(洛谷-P4258)
  6. [C# 基础知识系列]专题十四:深入理解Lambda表达式
  7. 如何使div的浏览器窗口高度为100%
  8. php留言板回复功能,php简单的留言板与回复功能具体实现_PHP教程
  9. 关于JS跨域访问简述
  10. 【工具-DVWA】DVWA的安装和使用
  11. Anaconda navigator打不开,一直卡在loading application
  12. linux黄颜色文件,了解 Linux 文件的颜色代码
  13. 秦九昭算法(霍尔(Horner)法则)
  14. Visual studio 默认不支持x64下__asm{}内联汇编的解决方案(含资源共享)
  15. TRIZ创新方法——功能搜索导向
  16. 考虑以下c语言代码int,计算机组成习题答案(清华大学出版社)
  17. html div转换为图片
  18. 使用unity做的绩点计算器
  19. 基于deepin-wine的windows软件打包deb安装包教程(本實例安裝qq)
  20. TKO 6-1 DP入门之1058(寻找第n个因数只有2、3、5、7的数字)

热门文章

  1. 差分S参数 转 单端S参数 的推导
  2. m8+android固件,给力!魅族M8刷M9 Android ROM双系统成功!附教程
  3. 小程序免300认证教程,可以用于公众号引流,全程免费认证,系统带认证链接,公众号可直接挂链接。
  4. Mac版OpenGL环境配置
  5. stm32f103c8t6 TIM2定时器1ms中断
  6. Cortex-A53 从裸机开发_开发笔记(64位)
  7. Maven模块间循环依赖的解决方案以及分析
  8. 微信小程序 图片src变量拼接问题
  9. 物联网卡平台的套餐资费
  10. win10添加环境变量后没用_教你Win10系统配置的环境变量未生效的解决方法