HM v.16.22 顺序读源码day1---encmain.cpp

文章目录

  • encmain.cpp
    • 引入的库
    • 执行主体
      • 1. 读取输入的配置文件
      • 2. 编码启动和过程计时
    • 实现细节
      • 1. cTAppEncTop.parseCfg( argc, argv );
      • 2. df::program_options_lite::ParseFailure;
      • 3. EnvVar::printEnvVar();
      • 4. EnvVar::printEnvVarInUse();
      • 5. printMacroSettings();
    • 执行流程

encmain.cpp

encmain.cpp是TAppEncoder的入口主文件,编码器从该文件启动编码。完成的工作为初始化最外层的编码类,导入和测试配置文件的参数,调用编码函数并进行计时。

引入的库

#include <time.h> //用于计算编码用时
#include <iostream> //用于输出调试和错误信息
#include "TAppEncTop.h" //最外层的编码类,集成了大量用于编码的函数和类
#include "Utilities/program_options_lite.h" //公共库中用于检测配置文件中的参数的类
#include "../Lib/TLibCommon/Debug.h" //公共库中用于调试的类

执行主体

int main(int argc, char* argv[])

argc和argv参数在用命令行编译程序时有用。在main( int argc, char* argv[], char ** env ) 中
第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1。
第二个参数,char*型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下:
argv[0]指向程序运行的全路径名
argv[1]指向在DOS命令行中执行程序名后的第一个字符串
argv[2]指向执行程序名后的第二个字符串
argv[3]指向执行程序名后的第三个字符串
argv[argc]为NULL
第三个参数,char** 型的env,为字符串数组。env[]的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值。平时使用到的比较少。

在这里,char** argv表示的是在属性中设置的配置文件的绝对路径:-c XX.cfg

1. 读取输入的配置文件

	TAppEncTop cTAppEncTop;//创建第一层即最外层的编码类
	/*
	打印HM的版本信息,使用了CommonDef.h定义的常量,该文件在../Lib/TLibCommon/Debug.h中引用。省略该部分代码
	*/
	cTAppEncTop.create();//创建编码类,实际是空操作
	//尝试解析配置文件
	try
  {
    if(!cTAppEncTop.parseCfg( argc, argv ))//检测配置参数
    {
      cTAppEncTop.destroy(); //如果cfg文件错误,调用destroy函数,实际也是一个空函数,不做任何操作
#if ENVIRONMENT_VARIABLE_DEBUG_AND_TEST
      EnvVar::printEnvVar();//调试时打印环境变量(自定义EnvVar类的成员)
#endif
      return 1;//结束程序
    }
  }
  catch (df::program_options_lite::ParseFailure &e)//df命名空间在program_options_lite.h中,使用自定义的错误类ParseFailure ,输出异常信息
  {
    std::cerr << "Error parsing option \""<< e.arg <<"\" with argument \""<< e.val <<"\"." << std::endl;
    return 1;//
  }
}
#if PRINT_MACRO_VALUES//默认打印非环境变量控制的宏块值
  printMacroSettings();
#endif

#if ENVIRONMENT_VARIABLE_DEBUG_AND_TEST//默认调试时打印使用的环境变量
  EnvVar::printEnvVarInUse();
#endif

2. 编码启动和过程计时

  Double dResult;
  clock_t lBefore = clock();//开始计时
  cTAppEncTop.encode();// 执行编码函数
  dResult = (Double)(clock()-lBefore) / CLOCKS_PER_SEC;// 计算编码用时
  printf("\n Total Time: %12.3f sec.\n", dResult);
  cTAppEncTop.destroy();  //销毁编码实例

  return 0;//结束  

实现细节

1. cTAppEncTop.parseCfg( argc, argv );

功能:将配置文件的参数设置到类中

//代码有接近1400行,此处简要分析,是继承自基类TAppEncCfg的方法
Bool TAppEncCfg::parseCfg( Int argc, TChar* argv[] ){
	//1.使用SMultiValueInput类或其他容器设置各类参数的默认值范围,例如,
	SMultiValueInput<UInt> cfg_rwpSEIRwpTransformType (0, 7, 0, std::numeric_limits<UChar>::max());
	//2.利用options类保存参数的默认配置,例如,
	po::Options opts;
  	opts.addOptions()
  	(..)(..)(..);//参数列表
  	//参数列表的结构类似于下例,(键值,键,值,说明)
  	("InputFile,i",m_inputFileName, string(""), "Original YUV input file name") 
  	//完成参数默认设置
  	po::setDefaults(opts); 	
	//3.读取并检测配置文件的参数
	po::scanArgv(opts, argc, (const TChar**) argv, err);
	//4.计算和选择各类派生属性,开始逐项配置TAppEncCfg的成员属性,同时检测输出对应参数错误的信息
	//5.检查输入参数的有效性
	xCheckParameter();
 	//打印配置好的参数
  	xPrintParameter();
}

TChar是C++为了消除不同机器的char字节数不同而设置的。
如果字符串是ANSI编码的,TChar等同于char,是单字节的。
如果是字符串是UNICODE编码的,TChar 等同于unsigned short 类型,是双字节,。
比如汉字版和一些扩展权字符都是2个字节表示的, 刚好可以和这个类型对应上

opts.addOptions()返回一个OptionSpecific型对象
OptionSpecific Options::addOptions() { return OptionSpecific(*this); }
而该派生类重载了操作符(),执行基类添加参数的操作,并返回调用者本身,故可连续使用多个(),表示反复调用添加参数

OptionSpecific&
      operator()(const std::string& name, OptionFunc::Func *func, const std::string& desc = "")
      {
        parent.addOption(new OptionFunc(name, parent, func, desc));
        return *this;
      }

添加的参数类别有以下几类:
File, I/O and source parameters、Field coding parameters、Profile and level、Unit definition parameters、todo: remove defaults from MaxCUSize、…

2. df::program_options_lite::ParseFailure;

功能:简单的自定义错误类

//继承自exception类
struct ParseFailure : public std::exception
    {
      ParseFailure(std::string arg0, std::string val0) throw()
      : arg(arg0), val(val0)
      {}
      ~ParseFailure() throw() {};
      std::string arg;
      std::string val;
      const char* what() const throw() { return "Option Parse Failure"; }
    };

3. EnvVar::printEnvVar();

功能:打印设置的环境变量

Void EnvVar::printEnvVar()
{
//  getEnvVarList().unique(sameEnvName);
  if (getEnvVarList().size()!=0)
  {
    std::cout << "--- Environment variables:\n" << std::endl;
    for_each(getEnvVarList().begin(), getEnvVarList().end(), printPair);
  }
  std::cout << std::endl;
}

其中,printPair是打印的格式函数:

static inline Void printPair(const std::pair<std::string, std::string> &p)
{
  if (p.second=="")
  {
    std::cout << "\n" << std::setw(settingNameWidth) << p.first << "\n" << std::endl;
  }
  else
  {
    std::cout << std::setw(settingNameWidth) << p.first << ":   " << p.second << "\n" << std::endl;
  }
}

4. EnvVar::printEnvVarInUse();

功能:打印正在使用的环境变量

Void EnvVar::printEnvVarInUse()
{
  if (getEnvVarInUse().size()!=0)
  {
    std::cout << "RExt Environment variables set as follows: \n" << std::endl;
    for_each(getEnvVarInUse().begin(), getEnvVarInUse().end(), printVal);
  }
  std::cout << std::endl;
}

其中,printVal是打印各项参数的函数:

static inline Void printVal(const EnvVar* env)
{
  std::cout << std::setw(settingNameWidth) << env->getName() << " = " << std::setw(settingValueWidth) << env->getInt() << " (string = " << std::setw(15) << env->getString() << ")" << std::endl;
}

前两个函数借助了自定义的环境变量类EnvVar,默认下都没有打印消息。

5. printMacroSettings();

功能:打印非环境变量所控制的宏块的值,比如默认编码比特深度、解码使用比特数统计、解码质量设置等等。

Void printMacroSettings()
{
  std::cout << "Non-environment-variable-controlled macros set as follows: \n" << std::endl;
  //setting macros
  PRINT_CONSTANT(RExt__DECODER_DEBUG_BIT_STATISTICS,                                settingNameWidth, settingValueWidth);
  PRINT_CONSTANT(RExt__HIGH_BIT_DEPTH_SUPPORT,                                      settingNameWidth, settingValueWidth);
  PRINT_CONSTANT(RExt__HIGH_PRECISION_FORWARD_TRANSFORM,                            settingNameWidth, settingValueWidth);
  PRINT_CONSTANT(O0043_BEST_EFFORT_DECODING,                                        settingNameWidth, settingValueWidth);
  PRINT_CONSTANT(ME_ENABLE_ROUNDING_OF_MVS,                                         settingNameWidth, settingValueWidth);
  
  std::cout << std::endl;
}

其中,PRINT_CONSTANT是打印格式的替换定义,其参数分别是被相关文件定义的常量和静态常量

#define PRINT_CONSTANT(NAME, NAME_WIDTH, VALUE_WIDTH) std::cout << std::setw(NAME_WIDTH) << #NAME << " = " << std::setw(VALUE_WIDTH) << NAME << std::endl;

执行流程

功能执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/455391.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

plt保存PDF矢量文件中嵌入可编辑字体(可illustrator编辑)

背景&#xff1a; 用默认 plt.savefig() 保存图片&#xff0c;图中文字是以瞄点保存&#xff0c;而不是以文字格式。在编辑矢量图中&#xff0c;无法调整文字大小和字体。 方法&#xff1a; import matplotlib.pyplot as plt import numpy as np# ------输出的图片为illustr…

RabbitMQ备份交换机与优先级队列

1. 备份交换机 备份交换机可以理解为 RabbitMQ 中交换机的“备胎”&#xff0c;当我们为某一个交换机声明一个对应的备份交换机时&#xff0c;就是为它创建一个备胎&#xff0c;当交换机接收到一条不可路由消息时&#xff0c;将会把这条消息转发到备份交换机中&#xff0c;由备…

数据仓库的基本概念、基本特征、体系结构

个人看书学习心得及日常复习思考记录&#xff0c;个人随笔。 数据仓库的基本概念、基本特征 数据仓库的定义&#xff1a;数据仓库是一个面向主题的、集成的、不可更新的、随时间不断变化的数据集合&#xff0c;用以更好地支持企业或组织的决策分析处理。 数据仓库中数据的4个…

26-Java访问者模式 ( Visitor Pattern )

Java访问者模式 摘要实现范例 访问者模式&#xff08;Visitor Pattern&#xff09;使用了一个访问者类&#xff0c;它改变了元素类的执行算法&#xff0c;通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变访问者模式中&#xff0c;元素对象已接受访问者对象&a…

Unity2019.2.x 导出apk 安装到安卓Android12+及以上的系统版本 安装出现-108 安装包似乎无效的解决办法

Unity2019.2.x 导出apk 安装到安卓Android12及以上的系统版本 安装出现-108 安装包似乎无效的解决办法 导出AndroidStudio工程后 需要设置 build.gradle文件 // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAINbuildscript {repositor…

python-0007-django模版

介绍 模版是对js&#xff0c;html等资源的封装 新建 在项目路径下新建模版文件夹templates&#xff08;可以为其他名称&#xff09;&#xff0c;要是想细分业务的话&#xff0c;还可以在templates路径下继续建文件夹。如下图&#xff1a; 注册模版 在项目的settings找到T…

超越营销:交易性邮件如何塑造现代沟通

在我们的电子邮件自动化系列文章中&#xff0c;我们继续探讨交易性邮件的重要性。这些邮件对于向收件人传递实时更新和可操作信息至关重要&#xff0c;是企业运营不可或缺的一部分。 运营触点 在现代沟通中&#xff0c;交易性邮件扮演着不可或缺的角色&#xff0c;尤其是在企…

String类及其常用方法

文章目录 1.String类的特性与使用1.1 String类的特性1.2 String对象的创建方式1.3 String 的使用&#xff08;不同的拼接操作&#xff09; 2.String常用方法2.1 String的常用方法一2.2 String常用方法二2.3 String常用方法三 1.String类的特性与使用 1.1 String类的特性 Stri…

使用Barrier共享鼠标键盘,通过macos控制ubuntu系统

之前文章写过如何使用barrrier通过windows系统控制ubuntu系统&#xff0c;该文章将详细介绍如何使用barrier通过macos系统控制ubuntu系统 一、macOS安装barrier macOS版本barrier链接 1、双击点开安装包 2、将安装包里的barrier拷贝到macOS的达达->应用程序中 3、在达达…

Spring启动“--”设置参数没生效

现象 在idea中启动SpringBoot项目时&#xff0c;使用“--”设置的启动参数没有生效&#xff0c;如修改端口号“--server.port8082” 原因 排查发现是因为在使用SpringApplication.run启动项目时&#xff0c;没有将args参数传入run方法。 修复方案 SpringApplication.run参数中…

当matplotlib遇见“赛博朋克”

本次分享一个Python可视化工具cyberpunk,轻松让图表变得“赛博朋克”。 案例1 import matplotlib.pyplot as plt import mplcyberpunkplt.style.use("cyberpunk") #调用cyberpunk styleplt.plot([1, 3, 9, 5, 2, 1, 1], marker=o) plt.plot([4, 5, 5, 7, 9, 8, 6…

Linux系统——Nginx脚本拦截拓展

可能会有些无聊的人对服务器的Nginx服务进行恶意访问网站、API接口&#xff0c;会影响到用户的体验&#xff0c;我们可以做一个简单的脚本对恶意访问的IP做一个有效的拦截&#xff0c;揪出这些IP地址&#xff0c;然后将其进行禁用。 在Nginx的conf目录下新建一个blockip.conf文…

Redis第8讲——Cluster集群模式详解

前面两篇文章介绍了Redis主从和哨兵模式&#xff0c;不难发现&#xff0c;它们都有一些共同的缺点&#xff0c;首先在主从切换的过程中会丢失数据&#xff1b;另一个就是只有一个master&#xff0c;只能单点写&#xff0c;并没有水平扩容能力。而且每个节点都保存了所有的数据&…

sqlite3——数据库——day2

今天学习了sqlite3数据库 sqlite3_open sqlite3_openint sqlite3_open(const char *filename, /* Database filename (UTF-8) */sqlite3 **ppDb /* OUT: SQLite db handle */); 功能:打开数据库文件(创建一个数据库连接) 参数:filename:数据库文件路径 ppDb:操作数…

Python使用lxml解析XML格式化数据

Python使用lxml解析XML格式化数据 1. 效果图2. 源代码参考 方法一&#xff1a;无脑读取文件&#xff0c;遇到有关键词的行再去解析获取值 方法二&#xff1a;利用lxml等库&#xff0c;解析格式化数据&#xff0c;批量获取标签及其值 这篇博客介绍第2种办法&#xff0c;以菜鸟教…

如何实现Git Push之后自动部署到服务器?

在平时个人开发的过程中是不是有这样的烦恼&#xff1a; 项目开发完成&#xff0c;Push之后 登录服务器&#xff0c;手动git pull&#xff0c;然后运行部署命令 这真的很烦诶&#xff01; 那么能不能Git push之后&#xff0c;远端服务器自动 Git pull 然后运行部署命令呢&a…

信息系统项目管理师002:信息系统(1信息化发展—1.1信息与信息化—1.1.2 信息系统)

文章目录 1.1.2 信息系统1.信息系统及其特性2.信息系统生命周期 记忆要点总结 1.1.2 信息系统 信息系统是由相互联系、相互依赖、相互作用的事物或过程组成的具有整体功能和综合行为的统一体。在经济与社会活动中&#xff0c;经常使用“系统”的概念&#xff0c;例如&#xff0…

python的函数与类的定义

目录 1.函数 1.函数的定义 2.输入参数与输出参数的类型 3.输入和输出多个参数 1.普通参数 2.含有任意数量的参数 3.关键字参数 4.普通参数与多个参数的结合 2.类 1.类的定义 2.类的实例化 3.继承 1.函数 1.函数的定义 def 函数名(输入参数): 文档字符串 函数体 …

Ubuntu20下C/C++编程开启TCP KeepAlive

1、在linux下&#xff0c;测试tcp保活&#xff0c;可以使用tcp自带keepalive功能。 2、几个重要参数&#xff1a; tcp_keepalive_time&#xff1a;对端在指定时间内没有数据传输&#xff0c;则向对端发送一个keepalive packet&#xff0c;单位&#xff1a;秒 tcp_keep…

HTML静态网页成品作业(HTML+CSS+JS)——体育足球介绍设计制作(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播&#xff0c;共有3个页面。 二、作品…
最新文章