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

文章目录

  • 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_cListPicInt ppsID=-1; // 使用默认PPSidif (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:// pictureInt                     m_iPOCLast;                     ///< time index (POC)Int                     m_iNumPicRcvd;                  ///< number of received picturesUInt                    m_uiNumAllPicCoded;             ///< number of coded picturesTComList<TComPic*>      m_cListPic;                     ///< dynamic list of pictures// encoder searchTEncSearch              m_cSearch;                      ///< 编码搜索类//TEncEntropy*            m_pcEntropyCoder;                     ///< 熵编码TEncCavlc*              m_pcCavlcCoder;                       ///< 变长编码// coding toolTComTrQuant             m_cTrQuant;                     ///< 转换和量化类TComLoopFilter          m_cLoopFilter;                  ///< 去方块滤波TEncSampleAdaptiveOffset m_cEncSAO;                     ///< SAOTEncEntropy             m_cEntropyCoder;                ///< 熵编码TEncCavlc               m_cCavlcCoder;                  ///< 变长编码TEncSbac                m_cSbacCoder;                   ///< 并行的CABAC编码TEncBinCABAC            m_cBinCoderCABAC;               ///< CABAC// processing unitTEncGOP                 m_cGOPEncoder;                  ///< GOP encoderTEncSlice               m_cSliceEncoder;                ///< slice encoderTEncCu                  m_cCuEncoder;                   ///< CU encoder// SPS、PPSParameterSetMap<TComSPS> m_spsMap;                      ///< SPS. This is the base value. This is copied to TComPicSymParameterSetMap<TComPPS> m_ppsMap;                      ///< PPS. This is the base value. This is copied to TComPicSym// RD cost computation码率失真计算TComRdCost              m_cRdCost;                      ///< RD cost computation classTEncSbac***             m_pppcRDSbacCoder;              ///< temporal storage for RD computationTEncSbac                m_cRDGoOnSbacCoder;             ///< going on SBAC model for RD stage
#if FAST_BIT_ESTTEncBinCABACCounter***  m_pppcBinCoderCABAC;            ///< 用于RD计算的临时CABAC状态存储TEncBinCABACCounter     m_cRDGoOnBinCoderCABAC;         ///< going on bin coder CABAC for RD stage
#elseTEncBinCABAC***         m_pppcBinCoderCABAC;            ///< temporal CABAC state storage for RD computationTEncBinCABAC            m_cRDGoOnBinCoderCABAC;         ///< going on bin coder CABAC for RD stage
#endif// quality controlTEncPreanalyzer         m_cPreanalyzer;                 ///< image characteristics analyzer for TM5-step3-like adaptive QPTEncRateCtrl            m_cRateCtrl;                    ///< Rate control classprotected: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 optionsVoid  xInitSPS          (TComSPS &sps);                 ///< initialize SPS from encoder optionsVoid  xInitPPS          (TComPPS &pps, const TComSPS &sps); ///< initialize PPS from encoder optionsVoid  xInitScalingLists (TComSPS &sps, TComPPS &pps);   ///< initialize scaling listsVoid  xInitHrdParameters(TComSPS &sps);                 ///< initialize HRD parametersVoid  xInitPPSforTiles  (TComPPS &pps);Void  xInitRPS          (TComSPS &sps, Bool isFieldCoding);           ///< initialize PPS from encoder optionspublic: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和SPSconst 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_MEMORYpcEPic->create( sps, pps, pps.getMaxCuDQPDepth()+1);
#elsepcEPic->create( sps, pps, pps.getMaxCuDQPDepth()+1, false);
#endifrpcPic = pcEPic;}else{rpcPic = new TComPic;
#if REDUCED_ENCODER_MEMORYrpcPic->create( sps, pps, true, false );
#elserpcPic->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.hqwc.cn/news/540021.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#,数值计算,矩阵相乘的斯特拉森(Strassen’s Matrix Multiplication)分治算法与源代码

Volker Strassen 1 矩阵乘法 矩阵乘法是机器学习中最基本的运算之一,对其进行优化是多种优化的关键。通常,将两个大小为N X N的矩阵相乘需要N^3次运算。从那以后,我们在更好、更聪明的矩阵乘法算法方面取得了长足的进步。沃尔克斯特拉森于1969年首次发表了他的算法。这是第…

初识微信小程序之swiper和swiper-item的基本使用

在我还没接触到微信小程序之前&#xff0c;通常使用轮播要么手写或使用swiper插件去实现&#xff0c;当我接触到微信小程序之后&#xff0c;我看到了微信小程序的强大之处&#xff0c;让我为大家介绍一下吧&#xff01; swiper与swiper-item一起使用可以做轮播图 基本使用&…

【北京大学】徐高《金融经济学二十五讲》

一、经济的任务 经济的任务之一是确保有效地分配稀缺资源&#xff0c;这是经济学中的一个核心问题。资源是有限的&#xff0c;而需求是无限的&#xff0c;因此经济系统需要通过合理的机制来分配资源以满足社会的需求。以下是关于经济分配资源的几个方面&#xff1a; 1. 资源配…

ChatGPT-Next-Web SSRF漏洞+XSS漏洞复现(CVE-2023-49785)

0x01 产品简介 ChatGPT-Next-Web 是一种基于 OpenAI 的 GPT-3.5 、GPT-4.0语言模型的产品。它是设计用于 Web 环境中的聊天机器人,旨在为用户提供自然语言交互和智能对话的能力。 0x02 漏洞概述 2024年3月,互联网上披露CVE-2023-49785 ChatGPT-Next-Web SSRF/XSS 漏洞,未经…

【小黑嵌入式系统第十九课】结课总结(三)——操作系统部分(RTOSμC/OS-Ⅲ程序设计基础(任务函数时间临界区通信))

上一课&#xff1a; 【小黑嵌入式系统第十八课】结课总结&#xff08;二&#xff09;——软件部分&#xff08;系统架构&调试&测试&运行&系统软件设计&#xff09; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0…

前端基础篇-深入了解用 HTML 与 CSS 实现标题排版

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 HTML 与 CSS 概述 2.0 HTML - 标题排版 2.1 图片标签 2.2 标题标签 2.3 水平标签 2.4 实现标题排版 3.0 HTML - 标题样式(style 样式) 3.1 CSS 的引入方式 3.2…

案例分析篇06:数据库设计相关28个考点(17~22)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

安装linux_centos7虚拟机_开启网络_ssh_防火墙

文章目录 安装linux_centos7虚拟机_开启网络_ssh_防火墙安装centos7虚拟机1. 进入VMware --> 点击文件 --> 新建虚拟机2. 选择典型 --> 选择下一步3. 选择--> 稍后安装操作系统4. 选择--> Linux --> CentOS 7 64位5. 在虚拟机名称输入(虚拟机名) --> 选择…

el-dialog弹框遮罩层问题

先看一下出现的bug&#xff0c;点击按钮出现弹框的时候&#xff0c;遮罩层出现在弹框上层&#xff0c;不知道是那个同事写的全局样式影响的&#xff0c;这个时候我们需要在el-dialog标签上添加一个属性就行 :modal-append-to-body“false” 下图是出现的问题&#xff0c;遮罩层…

雷卯推荐电磁兼容保护器件-TSS半导体放电管

一、TSS的简介 半导体放电管, 简称TSS。TSS 是根据可控硅原理采用离子注入技术生产的一种新型保护器件&#xff0c;具有精确导通、快速响应&#xff08;响应时间ns级&#xff09;、浪涌吸收能力较强、双向对称、可靠性高等特点。 由于其浪涌通流能力较同尺寸的TVS管强&#xf…

rk36566 uboot - dm 模型数据结构与常见接口

文章目录 一、数据结构1、udevice2、driver3、uclass4、uclass\_driver5、 总结6、device\_probe 二、常用接口1、udevice 创建接口1) device_bind_with_driver_data2) device_bind3) device_bind_by_name 2、uclass 操作函数1) uclass_get2) uclass_get_name3) uclass_find_de…

普发Pfeiffer TPG256A MaxiGauge 真空计控制器接口通讯针脚等详情见图目录

普发Pfeiffer TPG256A MaxiGauge 真空计控制器接口通讯针脚等详情见图目录