HM v.16.22 顺序读源码day3---TEncTop.cpp

news2024/9/27 12:07:05

文章目录

  • TEncTop.cpp
    • 引言
    • Void TEncTop::encode
    • 执行流程
    • 实现细节
      • Class TEncTop
      • Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic, Int ppsId )

TEncTop.cpp

引言

TEncTop类是第二层编码类,也是执行实际编码计算工作的最顶层编码类。
Void TEncTop::encode是执行编码的入口函数,它主要实现为GOP压缩之前做一些准备工作,包括创建当前图像缓冲区、设定QP是否自适应、根据码率控制模式来确定是否需要先初始化GOP,然后调用TEncGop::compressGOP来压缩GOP。

Void TEncTop::encode

参数列表:

  1. flush:使编码器部分编码;
  2. pcPicYuvOrg、pcPicYuvTrueOrg:原始YUV图片;
  3. ipCS、snrCSC:色彩空间转换格式;
  4. rcListPicYuvRecOut:重建YUV图片列表;
  5. accessUnitOut:输出访问单元
  6. iNumEncoded:已编码图片数量
if (pcPicYuvOrg != NULL)
  {
    //获取原始YUV图
    TComPic* pcPicCurr = NULL;//存放获取的图片缓存,主要用于更新缓存列表m_cListPic
    Int ppsID=-1; // 使用默认PPSid
    if (getWCGChromaQPControl().isEnabled())//如果启动宽色域色度QP控制
    {
      ppsID=getdQPs()[ m_iPOCLast+1 ];//设置PPSID
    }
    xGetNewPicBuffer( pcPicCurr, ppsID );//根据PPS获取新缓存
    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );//将原始未编码的YUV缓存赋值到pcPicCurr内部成员m_apcPicYuv[PIC_YUV_ORG]和m_apcPicYuv[PIC_YUV_TRUE_ORG]
    pcPicYuvTrueOrg->copyToPic( pcPicCurr->getPicYuvTrueOrg() );
    //是否自适应QP控制,默认不用,用时计算图像特征
    if ( getUseAdaptiveQP() )
    {
      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
    }
  }
  if ((m_iNumPicRcvd == 0) || (!flush && (m_iPOCLast != 0) && (m_iNumPicRcvd != m_iGOPSize) && (m_iGOPSize != 0)))//判断是否开始编码
  {
    iNumEncoded = 0;
    return;
  }
  //是否速率控制,默认不
  if ( m_RCEnableRateControl )
  {
    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
  }
  // 压缩GOP编码
  m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, false, false, ipCSC, snrCSC, getOutputLogControl());
  if ( m_RCEnableRateControl )
  {
    m_cRateCtrl.destroyRCGOP();
  }
  iNumEncoded         = m_iNumPicRcvd;
  m_iNumPicRcvd       = 0;//接收图片数量
  m_uiNumAllPicCoded += iNumEncoded; //增加已编码数量
}

执行流程

在这里插入图片描述

实现细节

Class TEncTop

private:
  // picture
  Int                     m_iPOCLast;                     ///< time index (POC)
  Int                     m_iNumPicRcvd;                  ///< number of received pictures
  UInt                    m_uiNumAllPicCoded;             ///< number of coded pictures
  TComList<TComPic*>      m_cListPic;                     ///< dynamic list of pictures

  // encoder search
  TEncSearch              m_cSearch;                      ///< 编码搜索类
  //TEncEntropy*            m_pcEntropyCoder;                     ///< 熵编码
  TEncCavlc*              m_pcCavlcCoder;                       ///< 变长编码
  // coding tool
  TComTrQuant             m_cTrQuant;                     ///< 转换和量化类
  TComLoopFilter          m_cLoopFilter;                  ///< 去方块滤波
  TEncSampleAdaptiveOffset m_cEncSAO;                     ///< SAO
  TEncEntropy             m_cEntropyCoder;                ///< 熵编码
  TEncCavlc               m_cCavlcCoder;                  ///< 变长编码
  TEncSbac                m_cSbacCoder;                   ///< 并行的CABAC编码
  TEncBinCABAC            m_cBinCoderCABAC;               ///< CABAC
  // processing unit
  TEncGOP                 m_cGOPEncoder;                  ///< GOP encoder
  TEncSlice               m_cSliceEncoder;                ///< slice encoder
  TEncCu                  m_cCuEncoder;                   ///< CU encoder
  // SPS、PPS
  ParameterSetMap<TComSPS> m_spsMap;                      ///< SPS. This is the base value. This is copied to TComPicSym
  ParameterSetMap<TComPPS> m_ppsMap;                      ///< PPS. This is the base value. This is copied to TComPicSym
  // RD cost computation码率失真计算
  TComRdCost              m_cRdCost;                      ///< RD cost computation class
  TEncSbac***             m_pppcRDSbacCoder;              ///< temporal storage for RD computation
  TEncSbac                m_cRDGoOnSbacCoder;             ///< going on SBAC model for RD stage
#if FAST_BIT_EST
  TEncBinCABACCounter***  m_pppcBinCoderCABAC;            ///< 用于RD计算的临时CABAC状态存储
  TEncBinCABACCounter     m_cRDGoOnBinCoderCABAC;         ///< going on bin coder CABAC for RD stage
#else
  TEncBinCABAC***         m_pppcBinCoderCABAC;            ///< temporal CABAC state storage for RD computation
  TEncBinCABAC            m_cRDGoOnBinCoderCABAC;         ///< going on bin coder CABAC for RD stage
#endif
  // quality control
  TEncPreanalyzer         m_cPreanalyzer;                 ///< image characteristics analyzer for TM5-step3-like adaptive QP
  TEncRateCtrl            m_cRateCtrl;                    ///< Rate control class

protected:
  Void  xGetNewPicBuffer  ( TComPic*& rpcPic, Int ppsId ); ///< get picture buffer which will be processed. If ppsId<0, then the ppsMap will be queried for the first match.
  Void  xInitVPS          (TComVPS &vps, const TComSPS &sps); ///< initialize VPS from encoder options
  Void  xInitSPS          (TComSPS &sps);                 ///< initialize SPS from encoder options
  Void  xInitPPS          (TComPPS &pps, const TComSPS &sps); ///< initialize PPS from encoder options
  Void  xInitScalingLists (TComSPS &sps, TComPPS &pps);   ///< initialize scaling lists
  Void  xInitHrdParameters(TComSPS &sps);                 ///< initialize HRD parameters
  Void  xInitPPSforTiles  (TComPPS &pps);
  Void  xInitRPS          (TComSPS &sps, Bool isFieldCoding);           ///< initialize PPS from encoder options

public:
  TEncTop();
  virtual ~TEncTop();
  Void      create          ();
  Void      destroy         ();
  Void      init            (Bool isFieldCoding);
  Void      deletePicBuffer ();
  // 成员访问函数
  TComList<TComPic*>*     getListPic            () { return  &m_cListPic;             }
  TEncSearch*             getPredSearch         () { return  &m_cSearch;              }

  TComTrQuant*            getTrQuant            () { return  &m_cTrQuant;             }
  TComLoopFilter*         getLoopFilter         () { return  &m_cLoopFilter;          }
  TEncSampleAdaptiveOffset* getSAO              () { return  &m_cEncSAO;              }
  TEncGOP*                getGOPEncoder         () { return  &m_cGOPEncoder;          }
  TEncSlice*              getSliceEncoder       () { return  &m_cSliceEncoder;        }
  TEncCu*                 getCuEncoder          () { return  &m_cCuEncoder;           }
  TEncEntropy*            getEntropyCoder       () { return  &m_cEntropyCoder;        }
  TEncCavlc*              getCavlcCoder         () { return  &m_cCavlcCoder;          }
  TEncSbac*               getSbacCoder          () { return  &m_cSbacCoder;           }
  TEncBinCABAC*           getBinCABAC           () { return  &m_cBinCoderCABAC;       }

  TComRdCost*             getRdCost             () { return  &m_cRdCost;              }
  TEncSbac***             getRDSbacCoder        () { return  m_pppcRDSbacCoder;       }
  TEncSbac*               getRDGoOnSbacCoder    () { return  &m_cRDGoOnSbacCoder;     }
  TEncRateCtrl*           getRateCtrl           () { return &m_cRateCtrl;             }
  Void selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid );
  Int getReferencePictureSetIdxForSOP(Int POCCurr, Int GOPid );

  Void                   setParamSetChanged(Int spsId, Int ppsId);
  Bool                   PPSNeedsWriting(Int ppsId);
  Bool                   SPSNeedsWriting(Int spsId);

  //编码函数
  ///编码几个图片直到序列结束
  Void encode( Bool bEos,
               TComPicYuv* pcPicYuvOrg,
               TComPicYuv* pcPicYuvTrueOrg,
               const InputColourSpaceConversion ipCSC, const InputColourSpaceConversion snrCSC, // used for SNR calculations. Picture in original colour space.
               TComList<TComPicYuv*>& rcListPicYuvRecOut,
               std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded );

  /// encode several number of pictures until end-of-sequence场编码
  Void encode( Bool bEos, TComPicYuv* pcPicYuvOrg,
               TComPicYuv* pcPicYuvTrueOrg,
               const InputColourSpaceConversion ipCSC, const InputColourSpaceConversion snrCSC, // used for SNR calculations. Picture in original colour space.
               TComList<TComPicYuv*>& rcListPicYuvRecOut,
               std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded, Bool isTff);
  //输出日志
  TEncAnalyze::OutputLogControl getOutputLogControl() const
  {
    TEncAnalyze::OutputLogControl outputLogCtrl;
    outputLogCtrl.printFrameMSE=m_printFrameMSE;
    outputLogCtrl.printMSEBasedSNR=m_printMSEBasedSequencePSNR;
    outputLogCtrl.printMSSSIM=m_printMSSSIM;
    outputLogCtrl.printSequenceMSE=m_printSequenceMSE;
    outputLogCtrl.printXPSNR=m_bXPSNREnableFlag;
    outputLogCtrl.printHexPerPOCPSNRs=m_printHexPsnr;
    return outputLogCtrl;
  }
  Void printSummary(Bool isField)
  {
    m_cGOPEncoder.printOutSummary (m_uiNumAllPicCoded, isField, getOutputLogControl(), m_spsMap.getFirstPS()->getBitDepths());
  }

Void TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic, Int ppsId )

完成功能:根据ppsid获取缓冲图片;

  rpcPic=0;
  // 此时,可以认为SPS和PPS是激活的——它们被复制到新的TComPic中。
  //1. 根据PSSID取PPS和SPS
  const TComPPS *pPPS=(ppsId<0) ? m_ppsMap.getFirstPS() : m_ppsMap.getPS(ppsId);
  assert (pPPS!=0);
  const TComPPS &pps=*pPPS;
  //根据获得的PSS取SPS参数集
  const TComSPS *pSPS=m_spsMap.getPS(pps.getSPSId());
  assert (pSPS!=0);
  const TComSPS &sps=*pSPS;
  //2. 根据POC重排TEncTop类的动态图像列表m_cListPic内部图片
  TComSlice::sortPicList(m_cListPic);
  //3. 如果缓冲列表的缓存数目已达到需要缓冲的最大数量要求,则使用一个其中缓存图片
  if (m_cListPic.size() >= (UInt)(m_iGOPSize + getMaxDecPicBuffering(MAX_TLAYER-1) + 2) )
  {
    TComList<TComPic*>::iterator iterPic  = m_cListPic.begin();
    Int iSize = Int( m_cListPic.size() );
    for ( Int i = 0; i < iSize; i++ )//寻找有参考Slice的图片复制到rpcPic 
    {
      rpcPic = *iterPic;
      if(rpcPic->getSlice(0)->isReferenced() == false)
      {
        break;
      }
      iterPic++;
    }
    // 如果该图片的PPSID和现有的是相同的,我们将假定它自上次使用以来没有改变并返回旧的
    if (pps.getPPSId() == rpcPic->getPicSym()->getPPS().getPPSId())
    {
#if REDUCED_ENCODER_MEMORY //在需要减少编码内存量时释放它自身的重构数据类成员m_apcPicYuvv[PIC_YUV_REC]
      rpcPic->releaseAllReconstructionData();
      rpcPic->prepareForEncoderSourcePicYuv();
#endif
    }
    // 若ppsid不同则删除列表m_cListPic中对应的条目,重置rpcPic并在后面新建
    else
    {
      delete rpcPic;
      m_cListPic.erase(iterPic);
      rpcPic=0;
    }
  }
  //4. 根据现有的sps和pps创建一个图片,放入缓存列表m_cListPic,就像还没有达到3的最大缓冲状态时一样。
  if (rpcPic==0)
  {
    if ( getUseAdaptiveQP() )
    {
      TEncPic* pcEPic = new TEncPic;
#if REDUCED_ENCODER_MEMORY
      pcEPic->create( sps, pps, pps.getMaxCuDQPDepth()+1);
#else
      pcEPic->create( sps, pps, pps.getMaxCuDQPDepth()+1, false);
#endif
      rpcPic = pcEPic;
    }
    else
    {
      rpcPic = new TComPic;
#if REDUCED_ENCODER_MEMORY
      rpcPic->create( sps, pps, true, false );
#else
      rpcPic->create( sps, pps, false );
#endif
    }
    m_cListPic.pushBack( rpcPic );
  }
  //标记它未重建
  rpcPic->setReconMark (false);
  m_iPOCLast++;
  m_iNumPicRcvd++;
  //设置该图片的POC索引
  rpcPic->getSlice(0)->setPOC( m_iPOCLast );
#if !REDUCED_ENCODER_MEMORY//若要节省内存
  // 设置该图片边界扩展标志为否
  rpcPic->getPicYuvRec()->setBorderExtension(false);
#endif

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Logstash 详细介绍、安装与使用

目录 1. Logstash 概述2. 工作原理3. 安装和配置1. 安装&#xff08;两种方法&#xff09;2. 测试运行3. 配置输入和输出 4. 使用 Grok 过滤器插件解析 Web 日志5. 使用 Geoip 过滤器插件增强数据6. 配置接收 Beats 的输入 1. Logstash 概述 Logstash 是一个具有实时管道功能的…

Rust 深度学习库 Burn

一、概述 Burn 它是一个新的综合动态深度学习框架&#xff0c;使用 Rust 构建的&#xff0c;以极高的灵活性、计算效率和可移植性作为其主要目标。 Rust Burn 是一个以灵活性、高性能和易用性为核心设计原则工具&#xff0c;主打就是灵活性 、高性能 及易用性。 二、Rust B…

C#,图论与图算法,图着色问题(Graph Coloring)的威尔士-鲍威尔(Welch Powell Algorithm)算法与源代码

Welsh, D.J.A. and Powell, M.B. (1967) An Upper Bound for the Chromatic Number of a Graph and Its Application to Timetabling Problems. 《The Computer Journal》, 10, 85-86. 《The Computer Journal》 1 图着色算法概述 1967年&#xff0c;Welsh和Powell算法引入了…

bootstrap企业网站前端模板

介绍 企业网站前端模板 软件架构 前端所用技术html/css/js/jquery 前端框架bootstrap 安装教程 浏览器本地路径访问发布到服务器比如&#xff08;tomcat/nginx等&#xff09;云服务器/虚拟机 网站效果图 网站预览 点击预览 源码地址 https://gitee.com/taisan/company…

最新的yolov9,目标检测使用教程

1.克隆仓库&#xff0c;仓库地址&#xff1a; https://github.com/WongKinYiu/yolov9/tree/main 百度盘地址&#xff1a;https://pan.baidu.com/s/15v7XJIMDFG3XHJXfFs6ZDA 密码&#xff1a;1234 除了这两个模型&#xff0c;另外三个模型有问题...&#xff0c;下载ce模型即可 …

Jmeter+ant,ant安装与配置

1.ant含义 ant&#xff1a;Ant翻译过来是蚂蚁的意思&#xff0c;在我们做接口测试的时候&#xff0c;是可以用来做JMeter接口测试生成测试报告的工具 2.ant下载 下载地址&#xff1a;Apache Ant - Ant Manual Distributions download中选择ant 下载安装最新版zip文件 3.…

微服务分布式基于Springcloud的拍卖管理系统597wx

越来越多的用户利用互联网获得信息&#xff0c;但各种信息鱼龙混杂&#xff0c;信息真假难以辨别。为了方便用户更好的获得信息&#xff0c;因此&#xff0c;设计一种安全高效的拍卖管理系统极为重要。 为设计一个安全便捷&#xff0c;并且使用户更好获取拍卖管理系统&#xff…

Annaconda环境下ChromeDriver配置及爬虫编写

Anaconda环境的chromedriver安装配置_anaconda 配置chromedriver-CSDN博客 Chromedriver驱动( 121.0.6167.85 ) - 知乎 下载好的驱动文件解压&#xff0c;将exe程序复制到Annaconda/Scripts目录以及Chrome/Application目录下 注意要提前pip install selenium包才能运行成功&a…

SpringBoot(自定义转换器+处理Json+内容协商)

文章目录 1.自定义转换器1.代码实例1.save.html2.编写两个bean1.Car.java2.Monster.java 3.WebConfig.java 配置类来自定义转换器4.测试 2.注意事项和细节1.debug查看转换器总数1.打断点2.执行到断点后&#xff0c;选左边的1923.可以看出&#xff0c;加上自定义的转换器一共125…

决策树 | 分裂算法:ID3,C4.5,CART

这里写目录标题 一. ID3算法1. 信息增益2. ID3算法特点 二. C4.5算法1. 信息增益率2. C4.5算法特点 三. CART算法1. Gini系数公式2. CART算法特点3. CART回归树的分裂评价指标 小节 在决策树算法逻辑篇中&#xff0c;我们讲解了决策树的构建方式&#xff0c;下面我们来聊一聊决…

边缘计算全面概述

什么是边缘计算&#xff1f; 边缘计算是一种分布式计算概念&#xff0c;将智能集成到边缘设备&#xff08;边缘节点&#xff09;中&#xff0c;使数据能够在数据采集源附近实时处理和分析。由于边缘计算在网络边缘本地处理数据&#xff0c;而不是在云端或集中式数据中心&#…

脑电信号处理的学习记录

【脑电信号处理与特征提取】https://www.bilibili.com/video/BV1Sg411775g?p6&vd_source77fb52274de00164fa71d28e4ce52cc5 滤波&#xff1a;对特定频率进行有效提取&#xff0c;并对提取部分进行特定的处理&#xff08;增益、衰减、滤除&#xff09;。 低通滤波&#x…

电商场景下 ES 搜索引擎的稳定性治理实践

继上文在完成了第一阶段 ES 搜索引擎的搭建后&#xff0c;已经能够实现对千万级别的商品索引的读写请求的支持。目前&#xff0c;单机房读流量在 500&#xff5e;1000 QPS 之间&#xff0c;写流量在 500 QPS 左右。 但随着业务的发展&#xff0c;问题也逐渐开始暴露&#xff0…

Python Web开发记录 Day9:Django part3 用户管理

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、数据库准备2、用户列表3、新建用户4、编辑用…

Linux之shell变量

华子目录 什么是变量&#xff1f;变量的名称示例 变量的类型变量的定义示例 自定义变量查看变量&#xff08;自定义变量和全局变量&#xff09; 环境变量定义环境变量&#xff08;全局变量&#xff09;法一法二法三env&#xff0c;printenv&#xff0c;export注意 C语言与shell…

计算机网络(001-1)

计算机网络-方老师 总时长 24:45:00 共50个视频&#xff0c;6个模块 此文章包含1.1到1.4的内容 简介 1.1计算机网络的作用 三网融合&#xff08;三网合一&#xff09; 模拟信号就是连续信号 数字信号是离散信号 1.2互联网概述 以前2兆带宽就要98 现在几百兆带宽也就几百块 …

Ajax学习笔记(一):原生AJAX、HTTP协议、AJAX案例准备工作、发送AJAX请求、AJAX 请求状态

目录 一、原生AJAX 1.1AJAX 简介 1.2 XML 简介 1.3 AJAX的特点 二、HTTP协议 三、AJAX案例准备工作 四、发送AJAX请求 1.发送GET请求 2.发送POST请求 3.JSON响应 IE缓存问题&#xff1a; 五、AJAX 请求状态 一、原生AJAX 1.1AJAX 简介 AJAX 全称为 Asynchronous …

Java基础-泛型

泛型 基本概念为什么我们需要泛型泛型类型泛型类简单泛型类多元泛型类 泛型接口泛型方法为什么要使用泛型方法呢?使用方法 泛型的上下限上限下限加点难度的例子例子一例子二例子三 深入理解泛型什么是泛型擦除后保留的原始类型泛型类型擦除原则如何进行擦除的?怎么证明存在类…

腾讯云轻量服务器地域选择教程以及不同地域的区别

腾讯云服务器地域怎么选择&#xff1f;不同地域之间有什么区别&#xff1f;腾讯云哪个地域好&#xff1f;地域选择遵循就近原则&#xff0c;访客距离地域越近网络延迟越低&#xff0c;速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素&#xff0c;地域节点选择…

WPF —— TabControl、StackPanel 控件详解

1 TabControl简介 表示包含多个项的控件&#xff0c;这些项共享屏幕上的同一空间。 TabControl有助于最大程度地减少屏幕空间使用量&#xff0c;同时允许应用程序公开大量数据。 TabControl包含共享同一屏幕空间的多个 TabItem 对象。一次只能看到 TabControl 中的一个 Ta…