X265
JahnLiang
-
LookaheadTLD::calcAdaptiveQuantFrame()
/* aqMode有如下四种mode: X265_AQ_NONE X265_AQ_VARIANCE X265_AQ_AUTO_VARIANCE X265_AQ_AUTO_VARIANCE_BIASED X265_AQ_EDGE 函数根据不同aqMode来计算一个adaptive quantization偏移量qp_adj 用于后期CU的量化值计算 过程: 1.基于aq的最小CU大小来初始化block原创 2020-07-02 10:00:03 · 817 阅读 · 0 评论 -
LookaheadTLD::lowresIntraEstimate()
/* 进行低分辨率intra的satd估计 过程: 1.得到intra惩罚和lowres惩罚 2.得到低分辨率的CUsize,并得到该CUsize的satd计算函数 3.遍历帧的每一行 1.初始化行的satd为0,即rowSatds,rowSatds只累计aq satd 2.遍历行的每一个CU 1.得到CU align后的序号以及像素偏移量 2.加载CU的低分辨率像素到fencIntra中 3.加载CU的低分辨率参考像素top/left到samples中 4.对C原创 2020-06-29 20:45:10 · 438 阅读 · 1 评论 -
CostEstimateGroup::estimateCUCost()
/* 依赖线程tld来执行帧b中的CU(cuX, cuY)以p0为前向参考,p1为后向参考的satd inter_satd = min{intra_satd, inter_satd}过程: 1.分别取低分辨率前向参考帧p0,后向参考帧p1,当前待分析帧b 2.得到帧在长宽上CU的个数widthInCU/heightInCU 3.得到当前CU align后的序号cuXY 4.得到低分辨率的CU尺寸cuSize 5.得到当前CU align后的像素偏移量pelOffset 6.加载运动估计的原创 2020-06-28 20:55:45 · 502 阅读 · 0 评论 -
x265多线程-jobProvider/workerThread
// Frame level job providers. FrameEncoder and Lookahead derive from// this class and implement findJob()class JobProvider{public: ThreadPool* m_pool; // 所在的thread pool sleepbitmap_t m_ownerBitmap; // 当前jobProvider所拥有的线程的位图 int m_jpId原创 2020-06-21 15:51:32 · 477 阅读 · 0 评论 -
x265多线程-BondedTaskGroup
任务组BondedTaskGroup的作用是可以征用若干sleep线程一起执行某一任务/* Any worker thread may enlist the help of idle worker threads from the same * job provider. They must derive from this class and implement the * processTasks() method. To use, an instance must be instantiate原创 2020-06-20 16:37:30 · 279 阅读 · 0 评论 -
x265多线程-线程安全型整型变量
/* This class is intended for use in signaling state changes safely between CPU * cores. One thread should be a writer and multiple threads may be readers. The * mutex's main purpose is to serve as a memory fence to ensure writes made by * the writer th原创 2020-06-19 10:27:31 · 286 阅读 · 0 评论 -
x265多线程-线程/线程池
//< Simplistic portable thread class. Shutdown signalling left to derived class// 对线程的一层对象化包装class Thread{private: ThreadHandle thread;public: Thread(){ thread = 0; } // 销毁线程 virtual ~Thread(){ if (thread)原创 2020-06-17 21:02:09 · 601 阅读 · 0 评论 -
x265多线程-锁
Lock类是对互斥量的一层对象化包装ScopedLock类是模仿C++ lock_guard自定义的区间锁,作用同lock_guard一模一样lock/* 对互斥量的一层包装*/class Lock{public: // 初始化互斥量 Lock() { pthread_mutex_init(&this->handle, NULL); } // 销毁互斥量 ~Lock() { pthread_mu.原创 2020-06-17 20:32:03 · 210 阅读 · 0 评论 -
x265多线程-event
x265中的event类模拟生产者消费者模型生产者生产临界资源,并通过条件变量通知消费者消费者消耗临界资源,若无临界资源则被阻塞等待生产者生产临界资源/* 模拟生产者消费者模型*/class Event{public: // 构造函数,初始化信号量m_counter = 0,初始化互斥量m_mutex和条件变量m_cond Event() { m_counter = 0; if (pthread_mutex_init(&m_mute原创 2020-06-17 20:24:39 · 194 阅读 · 0 评论 -
Deblock::edgeFilterLuma()
/* 进行luma环路滤波 进行滤波开关选择 => 进行滤波强度决策 => 执行环路滤波 过程: 1.获取重建帧像素点reconYUV 2.遍历每个 1.进行滤波开关选择 1.若block strength = 0,则不进行滤波 2.若边界两边的block都是无损压缩,则不进行滤波 3.根据纹理度与阈值来判断 1.计算边界两边block的qp的均值,并进一步根据位深来计算阈值beta 2.计算边界两边block的纹理dp0/dp3原创 2020-06-06 17:46:54 · 291 阅读 · 0 评论 -
Deblock::deblockCU()
/* Deblocking filter process in CU-based (the same function as conventional's) * param Edge the direction of the edge in block boundary (horizonta/vertical), which is added newly 基于CU进行环路滤波: 过程: 1.递归找到每个CU,基于CU进行进行环路滤波 2.确定滤波边界,设置边界强度 1.默认给CU内部原创 2020-06-06 17:44:39 · 299 阅读 · 0 评论 -
Deblock::getBoundaryStrength()
该函数为step2:计算边界强度/* 获取边界强度BS,取值[0,2] 策略: BS = 2: (优先级1)P4x4block和Q4x4block都是Intra类型 BS = 1: (优先级2)P4x4block和Q4x4block存在非零系数,即cbf非零 BS = 0: (优先级3) ·P4x4block和Q4x4block都在P类型,且两者的前向MV在x/y方向上的差值都在1个整像素内 ·P4x4block和Q4x4block存在B类型 ·P4x4block和Q4x.原创 2020-06-04 19:43:33 · 206 阅读 · 0 评论 -
Analysis::compressIntraCU()
/* 对当前CU当前深度的四叉树递归进行帧内预测压缩分析,得到当前CU的最优预测,返回其rdcost 过程: 1.得到当前深度depth,以及当前深度下的modeDepth 2.判断当前CU是否可以split?是否可以不split?若是CU是叶子节点,则不可以split;若CU强行split,则不可以不split 3.判断当前CU是否已经decided,或深度已经decided。 1.若intraRefine等级!=4,且当前CU加载的IPM方向不是ALL_IDX,且bAnalysi原创 2020-05-24 21:00:57 · 673 阅读 · 0 评论 -
Search::checkIntra()
/* 计算CU在partSize下的最优帧内预测,得到其rdcost 过程: 1.设置partSize和predMode 2.计算TUsize的上下限tuDepthRange[2] 3.初始化cost 4.分析当前CU的最优帧内预测模式,并累计当前CU的total_distortion = luma_distortion + chroma_distortion 5.重置bits 6.若旁路trans和quan,则编码TransquantBypassFlag 7.若非Isl原创 2020-05-17 14:05:49 · 352 阅读 · 0 评论 -
Search::estIntraPredQT()
粗粒度码率优化:rdcost = satd(fenc, pred) + lambda * IPM_bits,其中satd在一定程度上表示了频域的能量,弥补了IPM_bits没有计算残差系数等bits开销的不足,该方法计算/时间开销小,因为没有进行变换/量化/反量化/反变换等过程;但是其结果只具有一定代表性,其计算的最优可能并不一定是严格意义上的最优,而只是可能较优。细粒度码率优化:rdcost = sse(fenc, recon) + lambda * all_bits,该方法严格计算了原始帧和重建帧原创 2020-05-16 21:40:55 · 571 阅读 · 0 评论 -
Search::codeIntraLumaQT()
/*通过 对当前PU进行计算残差+变换+量化+反量化+反变换+重建帧 得到严格意义上的distortion(sse)开销 对当前CU进行完整的bits编码,则到严格意义的bits开销 基于distortion和bits来得到rdcost基于来得到当前TU的最优split模式(即TU split tree),及其distortion、bits、rdcost、energy 过程: 1.载入CUdata、depth等信息 2.判断mightNotSplit?mightSplit? 3.原创 2020-05-16 18:00:41 · 408 阅读 · 0 评论 -
CUData::getIntraDirLumaPredictor()
/* Get most probable intra modes 得到mpms,输出到intraDirPred[3]中。 作用同H264/AVC的mpm,只不过H264里面只有一个,而H265里面有三个 过程: 1.分别得到左边PU的帧内预测方向 和 上边PU的帧内预测方向 2.构造mpms ·左边PU帧内预测方向 == 上边PU帧内预测方向 ·它们是angle,则mpm[...原创 2020-05-04 21:28:18 · 229 阅读 · 0 评论 -
Search::checkIntraInInter()
/* Note that this function does not save the best intra prediction, it must * be generated later. It records the best mode in the cu 找到最优帧内预测方向,DC?PNANAR?angle2~34?并记录最优帧内预测方向的sa8d、bits和cost 过程:...原创 2020-05-04 17:16:09 · 249 阅读 · 0 评论 -
Predict::initIntraNeighbors()
/* 得到当前PU的neighbor可用信息 过程: 1.计算tu的像素size、tu以4x4block为单位的size 2.得到相邻leftTop、rightTop、leftBottom的索引 3.检查各个neighbor是否可用,统计neighbor的数据信息 4.存储下neignbor的数据信息*/void Predict::initIntraNeighbors(c...原创 2020-05-04 17:15:09 · 217 阅读 · 0 评论 -
Predict::initAdiPattern()
/* 在进行帧内预测前,对PU的边界参考像素进行平滑滤波 过程: 1.得到tu的size即size*2 2.取reconYUV 3.进行参考像素填充 4.分别取topLeft、topLast、leftLast像素 5.进行平滑滤波 ·若tusize为32x32,且允许强平滑滤波,则使用强平滑滤波 1.计算阈值,并分别取topMiddle和leftMiddle...原创 2020-05-04 15:20:28 · 193 阅读 · 0 评论 -
Analysis::checkBidir2Nx2N()
/* 基于perd2Nx2N的预测信息计算bidir的预测信息 函数前提:必须先进行了pred2Nx2N的计算 过程: 1.若限制了bidir,或之前在计算pred2Nx2N模式中前后向bestME的cost存在MAX,则不进行bidir分析,返回bidir的sa8d和cost为MAX 2.将pred2Nx2N中分析的前后向bestME作为bidir的先后向bestME 3.将...原创 2020-05-02 17:56:57 · 451 阅读 · 0 评论 -
Analysis::checkInter_rd[0_4/5_6]()
Analysis::checkInter_rd0_4()和Analysis::checkInter_rd5_6()函数高度相似,唯一的不同在其确定了CU中每个PU的最优预测后,计算当前CU的rdcost的方式Analysis::checkInter_rd0_4()的计算方式是计算fencYUV和predYUV计算distortion计算interMode的bits = block_mo...原创 2020-05-01 20:08:49 · 513 阅读 · 0 评论 -
Search::predInterSearch()
/* find the best inter prediction for each PU of specified mode 为CU中的每一个PU找到最佳inter pred 过程: 1.遍历每一个PU,以PU为计算单位 1.为运动估计加载PU的YUV,初始化失真函数指针,设置运动估计方法及下采样等级 2.进行merge估计,得到最优merge备选MV及其cost ...原创 2020-05-01 16:59:42 · 863 阅读 · 0 评论 -
Search::encodeResAndCalcRd[Skip/Inter]CU()
/* encode residual and calculate rate-distortion for a CU block. * Note: this function overwrites the RD cost variables of interMode, but leaves the sa8d cost unharmed * 为CU编码残差并计算rdcost。该函数可能重写rdc...原创 2020-04-09 21:27:25 · 342 阅读 · 0 评论 -
Analysis::compressCTU()
x265编码器在编码一帧时以行为单位进行WPP编码,一行一个线程,每个线程分别对自己的行中每个CTU进行compressCTU压缩分析/* 压缩分析CTU 过程: 1.为当前CTU加载QP/熵编码上下文 2.是否有编码信息输入来方便快速最优模式分析 ·bCTUInfo,加载depth/content/prevCtuInfoChange ·analysisMultiPassRef...原创 2020-04-07 15:40:12 · 849 阅读 · 0 评论 -
CUData::getInterMergeCandidates()/getNeighbourMV()
CUData::getInterMergeCandidates()构造当前PU的merge备选集空间merge备选集必要,5选4,B2替补时间merge备选集可选,2选1,C3替补/* Construct list of merging candidates, returns count 构造merge备选集列表,返回备选集个数 备选集方案: 1.空域...原创 2020-04-08 21:24:49 · 354 阅读 · 0 评论 -
Analysis::checkMerge2Nx2N_rd0_4()
/* sets md.bestMode if a valid merge candidate is found, else leaves it NULL 对CU进行merge和skip开销计算,并选择最优。 过程: 1.取当前CU的depth/modeDepth和编码YUV数据 2.得到当前CU的merge备选集 3.遍历每一个备选集,得到最优备选MV 1.对当前...原创 2020-04-08 12:57:34 · 469 阅读 · 0 评论