x265-1.7版本-encoder/slicetype.h注释
来源:互联网 发布:网络销售贵金属好做吗 编辑:程序博客网 时间:2024/04/30 07:17
注:问号以及未注释部分 会在x265-1.8版本内更新
/***************************************************************************** * Copyright (C) 2013 x265 project * * Authors: Steve Borho <steve@borho.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. * * This program is also available under a commercial proprietary license. * For more information, contact us at license @ x265.com. *****************************************************************************/#ifndef X265_SLICETYPE_H#define X265_SLICETYPE_H#include "common.h"#include "slice.h"#include "motion.h"#include "piclist.h"#include "threadpool.h"namespace x265 {// private namespacestruct Lowres;class Frame;class Lookahead;#define LOWRES_COST_MASK ((1 << 14) - 1)#define LOWRES_COST_SHIFT 14/* Thread local data for lookahead tasks */struct LookaheadTLD //只在Lookahead中应用 用于多线程数据存储{ MotionEstimate me; //在estimateCUCost 用于运动矢量搜索的 ReferencePlanes weightedRef;//标记参考帧信息,指示wbuffer[4] pixel* wbuffer[4]; //这里需要申请4个buffer,存放加权的参考帧信息,这里申请的空间大小同lowres类的buf,因为将要通过4 hpel下采样得到4份1/2亮度 int widthInCU; //Lowres 1/2 采样视频帧一行有多少个8x8块 int heightInCU; //Lowres 1/2 采样视频帧一列有多少个8x8块 int ncu; //等于(widthInCU - 2) * (heightInCU - 2) int paddedLines;//buf行数#if DETAILED_CU_STATS //统计信息 int64_t batchElapsedTime; int64_t coopSliceElapsedTime; uint64_t countBatches; uint64_t countCoopSlices;#endif /** 函数功能 :初始化LookaheadTLD 初始化搜索算法、创建待搜索块的缓存 * \返回值 :null */ LookaheadTLD() { me.setQP(X265_LOOKAHEAD_QP); //建立当前qp下的MVD占用的cost:λ*bits = 2^(qp/6-2) * s_bitsizes[i] me.init(X265_HEX_SEARCH, 1, X265_CSP_I400);//初始化搜索算法、创建待搜索块的缓存 for (int i = 0; i < 4; i++) wbuffer[i] = NULL; widthInCU = heightInCU = ncu = paddedLines = 0;#if DETAILED_CU_STATS batchElapsedTime = 0; coopSliceElapsedTime = 0; countBatches = 0; countCoopSlices = 0;#endif } /** 函数功能: 初始化宽高信息 /* 调用范围: 只在Lookahead::create()函数中被调用 * \参数 w : lowres 8x8宽度中个数 * \参数 h : lowres 8x8高度中个数 * \参数 n : 等于(m_8x8Width - 2) * (m_8x8Height - 2) * \返回值 :null */ void init(int w, int h, int n) { widthInCU = w; heightInCU = h; ncu = n; } ~LookaheadTLD() { X265_FREE(wbuffer[0]); } /** 函数功能: 初始化m_lowres中的qpCuTreeOffset等信息,获取整帧的像素和和AC能量。 /* 调用范围: 只在PreLookaheadGroup::processTasks函数中被调用 * \参数 curFrame : 当前帧(含有原始帧数据) * \参数 param : 编码器配置的参数 /* Find the total AC energy of each block in all planes */ void calcAdaptiveQuantFrame(Frame *curFrame, x265_param* param); /** 函数功能 : 计算当前1/2下采样帧的intra SATD值以及最优intra模式 /* 调用范围 : 只在PreLookaheadGroup::processTasks函数中被调用 * \参数 fenc : 当前帧(经过1/2下采样后的数据) * 返回值 : null **/ void lowresIntraEstimate(Lowres& fenc); /** 函数功能 : 判断当前两帧是否进行加权 ,结果存储在weightedRef.isWeighted /* 调用范围 : 只在CostEstimateGroup::estimateFrameCost函数中被调用 * \参数 fenc :当前帧 * \参数 ref :前向帧 * \返回 :NULL */ void weightsAnalyse(Lowres& fenc, Lowres& ref);protected: /** 函数功能: acEnergyVar将元素和和平方和累加到当前帧中的m_lowres 返回当前块YUV的Σ(x^2) - (Σx * Σx)/n。 /* 调用范围: 只在LookaheadTLD::calcAdaptiveQuantFrame函数中被调用 * \参数 curFrame : 当前帧(含有原始帧数据) * \参数 blockX : 当前16x16的左偏移量(单位像素) * \参数 blockY : 当前16x16的下偏移量(单位像素) * \参数 csp : 数据格式,1 为420格式 /* Find the total AC energy of each block in all planes */ uint32_t acEnergyCu(Frame* curFrame, uint32_t blockX, uint32_t blockY, int csp); /** 函数功能 :计算两帧(wp.bPresentFlag 为 ref是否加权)之间的SATD值 /* 调用范围 :只在LookaheadTLD::weightsAnalyse函数中被调用 * \参数 fenc :当前帧 * \参数 ref :前向帧 * \返回 :两帧(wp.bPresentFlag 为 ref是否加权)之间的SATD值 */ uint32_t weightCostLuma(Lowres& fenc, Lowres& ref, WeightParam& wp); /** 函数功能 :申请存储空间并初始化weightedRef /* 调用范围 :只在LookaheadTLD::weightsAnalyse函数中被调用 * \参数 fenc :当前帧 * \返回 :内存申请成功为true 失败为false */ bool allocWeightedRef(Lowres& fenc);};class Lookahead : public JobProvider //用于帧类型决策以及framecost计算 只在Encoder类中应用{public: PicList m_inputQueue; //存储所有输入原始帧(指针)(帧类型未决策) 按照帧序号排序,next指的就是下一相邻帧号的帧 在addpicture中pushback 在slicetypeDecide()中pop input pictures in order received PicList m_outputQueue; //存储所有帧类型已经决策的帧 (序号按照编码序号排序),next指的就是下一个要编码的帧 在slicetypeDecide()中pushback 在getDecidedPicture()中pop pictures to be encoded, in encode order Lock m_inputLock; //处理多线程的锁 acquire();和release()控制当前临街资源 Lock m_outputLock; //处理多线程的锁 acquire();和release()控制当前临街资源 /* pre-lookahead */ int m_fullQueueSize; //等于m_param->lookaheadDepth值(当其读完全部视频帧时,将其设置为1) bool m_isActive; //表示当前lookachead是否触发,初始化为true,在stopjobs中置为false bool m_sliceTypeBusy; //表示当前是否在进行帧类型决策(保证系统中只有一个线程在进行帧类型决策) ,初始为false 在Lookahead::findJob前后更新,运行前为true,运行后置为false bool m_bAdaptiveQuant; //标记是否应用自适应量化 bool m_outputSignalRequired;//与event m_outputSignal;配套使用,初始化为false true表示需要完成sliceDecide,在Lookahead::findJob中完成sliceDecide置为false并触发m_outputSignal,说明完成sliceDecide //在Lookahead::getDecidedPicture()函数中会进行检测并阻塞 bool m_bBatchMotionSearch; //如果应用bFrameAdaptive = 2并且内核数大于4 ,则为true 功能:用于判断是否执行 计算等间隔framecost并发执行 bool m_bBatchFrameCosts; //如果应用bFrameAdaptive = 2并且内核数大于12 ,则为true 功能:用于多线程计算frame cost 内核数大于12个才持续使用多线程计算 Event m_outputSignal; //当需要编码帧的帧类型决策完毕触发,未完成则等待 LookaheadTLD* m_tld; //空间大小为内核数+1 numTLD = 1 + (m_pool ? m_pool->m_numWorkers : 0); 例如当前为4核,则申请空间大小为5(0,1,2,3分别表示具体某个核,4表示当前线程) x265_param* m_param; //配置参数 Lowres* m_lastNonB; //记录最近的非B帧位置 int* m_scratch; // temp buffer for cutree propagate 用于临时存放传播cost 存储空间大小:1/2 采样视频帧一行8x8块个数 int m_histogram[X265_BFRAME_MAX + 1];//统计信息,用于统计GOP中B或者b帧数个数 int m_lastKeyframe; //标记当前前一个关键帧位置,初始化为-maxKeyframe, 保证第一帧是关键帧 int m_8x8Width; //lowres 8x8宽度中个数 int m_8x8Height; //lowres 8x8高度中个数 int m_8x8Blocks; //等于(m_8x8Width - 2) * (m_8x8Height - 2) int m_numCoopSlices; //每帧有几条slice 默认1 int m_numRowsPerSlice;//每行中有几行8x8块 默认m_8x8Height bool m_filled;//当前buf是否已满,初始为false 当(curFrame.m_poc >= m_param->lookaheadDepth + 2 + m_param->bframes)时为true 当已经读完所有原始帧的时候为true, 一旦满了将一直是满的状态 /** 函数功能 : 初始化信息 /* 调用范围 : 只在主线程Encoder::create()中应用 * \参数 param : 配置参数 * \参数 pool : NAMA模式下的线程池 * \返回 : null * */ Lookahead(x265_param *param, ThreadPool *pool);#if DETAILED_CU_STATS //统计信息 int64_t m_slicetypeDecideElapsedTime; int64_t m_preLookaheadElapsedTime; uint64_t m_countSlicetypeDecide; uint64_t m_countPreLookahead; void getWorkerStats(int64_t& batchElapsedTime, uint64_t& batchCount, int64_t& coopSliceElapsedTime, uint64_t& coopSliceCount);#endif /** 函数功能 : 申请空间 /* 调用范围 : 只在主线程Encoder::create()中应用 * \返回 : 成为为true 失败为fasle * */ bool create(); /** 函数功能 : 释放内存 /* 调用范围 : 只在主线程Encoder::destroy()中应用 * \返回 : null* */ void destroy(); /** 函数功能 : 关闭帧类型决策任务,如果有任务在执行,则等待完毕,再停止任务 /* 调用范围 : 只在主线程Encoder::stopJobs()中应用 * \返回 : null* */ void stopJobs(); /** 函数功能 : 向输入列表中添加原始帧准备帧类型决策,在buffer满时,触发帧类型决策 /* 调用范围 : 只在主线程Encoder中应用 * \参数 curFrame : 传入的原始帧 * \参数 sliceType : 1pass 中为AUTO 2pass中为具体的帧类型 * \返回 : null * */ void addPicture(Frame&, int sliceType); /** 函数功能 : 当前已经读取原始帧完毕,往后不用再继续读取,告知lookahead已满 /* 调用范围 : 只在主线程Encoder::encode中应用 * \返回 : null * */ void flush(); /** 函数功能 : 只在主线程Encoder中应用,获取已经得到帧类型的原始帧 /* 调用范围 : 只在Encoder::encode函数中被调用 * \返回 : 返回当前帧类型决策完毕的待编码帧 * */ Frame* getDecidedPicture(); /** 函数功能 : 获取当前帧每个CTU行对应下采样帧的每个8x8的块cost的累计值 /* 调用范围 : 只在Encoder::encode函数中被调用 * \参数 curFrame : 传入的原始帧 * \返回 : null * */ void getEstimatedPictureCost(Frame *pic);protected: /** 函数功能 : 触发帧类型决策(在threadMain()主动发起,在getDecidedPicture()被动发起,因为当前发现帧类型不可用,被动发起) /* 调用范围 : 只在WorkerThread::threadMain()(在addPicture中触发执行)和Lookahead::getDecidedPicture()函数中被调用 * \返回 : null * */ void findJob(int workerThreadID); /** 函数功能 : 获取帧类型并计算frame-cost /* 调用范围 : 只在Lookahead::findJob函数中被调用 * \返回 : null * */ void slicetypeDecide(); /** 函数功能 : 获取当前GOP的帧类型,获取可参考帧的qpCuTreeOffset值 /* 调用范围 : 只在sliceTypeDecide函数中被调用 (一般只在1pass中进入) * \参数 frames : 当前搜索的frames列表 * \参数 bKeyframe : 是否是IDR帧检测 * \返回 : null * */ void slicetypeAnalyse(Lowres **frames, bool bKeyframe); /** 函数功能 : 判断当前是否场景切换(是否需要将p1帧类型设置为I帧) /* 调用范围 : 只在Lookahead::slicetypeAnalyse函数中被调用 * \参数 frames : 当前搜索的frames列表 * \参数 p0 : 前一帧 注:p0 p1 相邻 * \参数 p1 : 后一帧 * \参数 bRealScenecut : 当前是否是真正的场景切换判断,而不是预分析 * \参数 numFrames : 列表中原始帧个数 * \参数 maxSearch : lookachead最大的搜索帧数 * \返回 : 返回当前是否场景切换(是否需要将其帧类型设置为I帧) * */ /* called by slicetypeAnalyse() to make slice decisions */ bool scenecut(Lowres **frames, int p0, int p1, bool bRealScenecut, int numFrames, int maxSearch); /** 函数功能 : 判断当前是否场景切换(是否需要将其帧类型设置为I帧) /* 调用范围 : 只在Lookahead::scenecut函数中被调用 * \参数 frames : 当前搜索的frames列表 * \参数 p0 : 当前帧 注:p0 p1 不相邻 p1是p0后面某一帧 * \参数 p1 : 后一帧 * \参数 bRealScenecut : 当前是否是真正的场景切换判断,而不是预分析 * \返回 : 返回当前是否场景切换(是否需要将其帧类型设置为I帧) * */ bool scenecutInternal(Lowres **frames, int p0, int p1, bool bRealScenecut); /** 函数功能 : 计算当前搜索长度下的最优帧类型路径 /* 调用范围 : 只在Lookahead::slicetypeAnalyse函数中被调用 * \参数 frames : 当前搜索的frames列表 * \参数 length : 当前搜索frame列表的长度 (1~length) * \参数 *best_paths : 存储最优帧类型路径 * \返回 : null * */ void slicetypePath(Lowres **frames, int length, char(*best_paths)[X265_LOOKAHEAD_MAX + 1]); /** 函数功能 : 计算当前PB帧设置的frame cost 累加值 /* 调用范围 : 只在Lookahead::slicetypePath函数中被调用 * \参数 frames : 当前搜索的frames列表 * \参数 path : 当前frame列表的帧类型:如BPBBBPxxxx(x:暂未制定类型 第一个x前一定是P) * \参数 threshold : 当前最优的framecost * \返回 : 返回当前PB帧设置的frame cost 累加值 * */ int64_t slicetypePathCost(Lowres **frames, char *path, int64_t threshold); /** 函数功能 : 如果当前帧号b是B帧直接返回其framecost:costEstAq (qpAqOffset加权)否则,重新计算framecost 经过qpCuTreeOffset加权后的数据 /* 调用范围 : 只在Lookahead::vbvLookahead函数中被调用 * \参数 frames : 当前搜索的frames列表 * \参数 p0 : 前向帧 * \参数 p1 : 后向帧 * \参数 b : 当前帧号 * \返回 : 返回重新计算的framecost* */ int64_t vbvFrameCost(Lowres **frames, int p0, int p1, int b); /** 函数功能 : 重新计算framecost经过qpCuTreeOffset加权后的数据并吧相应信息存储到第一个GOP中,并将相应的B帧设置为参考B帧 /* 调用范围 : 只在slicetypeAnalyse函数中被调用 * \参数 frames : 当前搜索的frames列表 * \参数 numframes : frames列表帧数 * \参数 keyframe : 是否是IDR帧检测 * \返回 : null * */ void vbvLookahead(Lowres **frames, int numFrames, int keyframes); /* called by slicetypeAnalyse() to effect cuTree adjustments to adaptive * quant offsets */ /** 函数功能 : 计算可参考帧的qpCuTreeOffset值 /* 调用范围 : 只在slicetypeAnalyse函数中被调用 * \参数 frames : 当前搜索的frames列表 * \参数 numframes : frames列表帧数 * \参数 bIntra : 是否是IDR帧检测 * \返回 : null * */ void cuTree(Lowres **frames, int numframes, bool bintra); /** 函数功能 : 计算当前编码帧每个8x8块对应参考块的传播cost、如果当前编码帧是可被参考帧计算其qpCuTreeOffset值 /* 调用范围 : 只在Lookahead::cuTree函数中被调用 * \参数 frames : 当前搜索的frames列表 * \参数 averageDuration : 平均每帧的播放时长 单位秒 * \参数 p0 : 前向帧 * \参数 p1 : 后向帧 * \参数 b : 当前帧号 * \参数 referenced : 当前计算的b号帧是否是可被参考的 * \返回 : null * */ void estimateCUPropagate(Lowres **frames, double average_duration, int p0, int p1, int b, int referenced); /** 函数功能 : 计算参考帧qpCuTreeOffset值 /* 调用范围 : 只在Lookahead::cuTree和Lookahead::estimateCUPropagate函数中被调用 * \参数 frames : 当前搜索的frames列表 * \参数 averageDuration : 平均每帧的播放时长 单位秒 * \参数 ref0Distance : 如果是双向参考则为0,如果当前为单向参考则为当前帧号-前向参考帧号 * \返回 : null * */ void cuTreeFinish(Lowres *frame, double averageDuration, int ref0Distance); /** 函数功能 : 如果当前是B帧直接返回其framecost:costEstAq (qpAqOffset加权)否则,重新计算framecost 经过qpCuTreeOffset加权后的数据 /* 调用范围 : 只在Lookahead::getEstimatedPictureCost和Lookahead::vbvFrameCost函数中被调用 * \参数 frames : 当前搜索的frames列表 * \参数 p0 : 前向帧 * \参数 p1 : 后向帧 * \参数 b : 当前帧号 * \返回 : 返回重新计算的framecost* */ /* called by getEstimatedPictureCost() to finalize cuTree costs */ int64_t frameCostRecalculate(Lowres **frames, int p0, int p1, int b);};class PreLookaheadGroup : public BondedTaskGroup //只在void Lookahead::slicetypeDecide()中被应用{public: Frame* m_preframes[X265_LOOKAHEAD_MAX]; //存储当前没有初始化的帧 Lookahead& m_lookahead; //当前的lookachead PreLookaheadGroup(Lookahead& l) : m_lookahead(l) {} /** 函数功能 : 初始化lowres并进行下采样、扩边、计算pCuTreeOffset等信息,获取整帧的像素和和AC能量、计算当前1/2下采样帧的intra SATD值以及最优intra模式、并行处理 /* 调用范围 : 只在WorkerThread::threadMain()和sliceTypeDecide函数中被调用 * \参数 workerThreadID : 当前运行的内核号 * \返回 : null * */ void processTasks(int workerThreadID);protected: PreLookaheadGroup& operator=(const PreLookaheadGroup&);};class CostEstimateGroup : public BondedTaskGroup //多线程计算帧间的framecost{public: Lookahead& m_lookahead; //指向当前调用它的Lookahead Lowres** m_frames; //一个frame指针列表 1/2 下采样视频 bool m_batchMode; //是否进行并发计算framecost 在add函数中置为true CostEstimateGroup(Lookahead& l, Lowres** f) : m_lookahead(l), m_frames(f), m_batchMode(false) {} //初始化 /* Cooperative cost estimate using multiple slices of downscaled frame */ struct Coop { int p0, b, p1; //p0 前向帧 p1 后向帧 b当前帧 (前向帧、后向帧并不是单指前一帧后一帧),如(p0,b,p1)= (5,6,7),(p0,b,p1)= (8,10,11) bool bDoSearch[2]; //分别表示P0是否需要搜索,p1是否需要搜索 } m_coop; //lookachead 多slice时应用 enum { MAX_COOP_SLICES = 32 }; //lookachead中多slice配置中的最大slice个数 struct Slice { int costEst; //存储相应slice之间的(SATD+mvcost+4)的累加和 int costEstAq; //存储相应slice之间的(SATD+mvcost+4)加权的累加和 int intraMbs; //存储相应slice之间的intra块最优个数 } m_slice[MAX_COOP_SLICES];//存储lookachead 中一帧所有slice /** 函数功能 :单线程计算当前帧与前后参考帧之间的最优frame cost /* 调用范围 :只在slicetypeDecide()、vbvFrameCost、slicetypeAnalyse、scenecutInternal、slicetypePathCost和cuTree函数中被调用 * \参数 p0 :前向帧 * \参数 p1 :后向帧 * \参数 b :当前帧号 * \参数 bIntraPenalty :会加上intra带来的编码代价;其中在slicetypeAnalyse会传入ture(也可能为false)并且bFrameAdaptive == X265_B_ADAPT_FAST,其它为false * \返回 :当前帧与前后参考帧之间的最优frame cost* */ int64_t singleCost(int p0, int p1, int b, bool intraPenalty = false); /* Batch cost estimates, using one worker thread per estimateFrameCost() call */ enum { MAX_BATCH_SIZE = 512 };//最大并发的个数 计算frmecost struct Estimate { int p0, b, p1; //p0 前向帧 p1 后向帧 b当前帧 (前向帧、后向帧并不是单指前一帧后一帧),如(p0,b,p1)= (5,6,7),(p0,b,p1)= (8,10,11) } m_estimates[MAX_BATCH_SIZE]; //用于多线程并行处理,里面存储当前需要处理的帧号以及它的参考帧号 /** 函数功能 : 添加任务,为后面并发执行做准备 /* 调用范围 : 只在Lookahead::slicetypeAnalyse函数中被调用 * \参数 p0 : 前向帧 * \参数 p1 : 后向帧 * \参数 b : 当前帧号 * \返回 : null * */ void add(int p0, int p1, int b); /** 函数功能 : 触发并发执行并一直等到所有任务执行完毕:计算每帧与其对应参考帧之间的帧间cost /* 调用范围 : 只在Lookahead::slicetypeAnalyse和CostEstimateGroup::add函数中被调用 * \返回 : null * */ void finishBatch();protected: static const int s_merange = 16; /** 函数功能 : 功能分两个只能执行其中一个:1. 获取取每个8x8块的帧间cost(SATD + mvcost + 4) 并 获取当前b帧在p0、p1参考帧下的最优帧cost inter(SATD+mvcost+4)*10/(13 +b)或者 intra (SATD+5+4) 2. Lookachead 多slice并行,执行其中一条slice的每个8x8块的帧间cost(SATD + mvcost + 4) /* 调用范围 : 只在CostEstimateGroup::finishBatch()和CostEstimateGroup::estimateFrameCost函数中被调用 (分别执行1,2功能) * \返回 : null * */ void processTasks(int workerThreadID); /** 函数功能 :获取取每个8x8块的帧间cost(SATD + mvcost + 4) 并 获取当前b帧在p0、p1参考帧下的最优帧cost inter(SATD+mvcost+4)*10/(13 +b)或者 intra (SATD+5+4) /* 调用范围 :只在CostEstimateGroup::singleCost和CostEstimateGroup::processTasks函数中被调用 * \参数 tld :当前线程的tld * \参数 p0 :前向帧 * \参数 p1 :后向帧 * \参数 b :当前帧号 * \参数 bIntraPenalty :会加上intra带来的编码代价;在CostEstimateGroup::processTasks中为false 在调用CostEstimateGroup::singleCost中的slicetypeAnalyse会传入ture(也可能为false) 并且bFrameAdaptive == X265_B_ADAPT_FAST * \返回 :当前b帧在p0、p1参考帧下的最优帧cost inter(SATD+mvcost+4)*10/(13 +b)或者 intra (SATD+5+4) * */ int64_t estimateFrameCost(LookaheadTLD& tld, int p0, int p1, int b, bool intraPenalty); /** 函数功能 :获取每个8x8块的帧间cost(SATD + mvcost + 4) /* 调用范围 :只在 CostEstimateGroup::processTasks和CostEstimateGroup::estimateFrameCost函数中被调用 (一般只在CostEstimateGroup::estimateFrameCost) * \参数 tld :当前线程先的tld * \参数 cuX :当前帧的8x8 X坐标 * \参数 cuY :当前帧的8x8 Y坐标 * \参数 p0 :前向帧 * \参数 p1 :后向帧 * \参数 b :当前帧号 * \参数 bDoSearch :分别表示p0\p1需不需要search * \参数 lastRow :是否是最后一行 * \参数 slice :在CostEstimateGroup::processTasks为相应slice 在CostEstimateGroup::estimateFrameCost为-1 * \返回 :null * */ void estimateCUCost(LookaheadTLD& tld, int cux, int cuy, int p0, int p1, int b, bool bDoSearch[2], bool lastRow, int slice); CostEstimateGroup& operator=(const CostEstimateGroup&); //运算符重载};}#endif // ifndef X265_SLICETYPE_H
1 0
- x265-1.7版本-encoder/slicetype.h注释
- x265-1.8版本-encoder/slicetype.h注释
- x265-1.7版本-encoder/slicetype.cpp注释
- x265-1.8版本-encoder/slicetype.cpp注释
- x265-1.7版本-encoder/encoder.h注释
- x265-1.7版本-encoder/bitcost.h注释
- x265-1.7版本-encoder/dpb.h注释
- x265-1.7版本-encoder/frameencoder.h注释
- x265-1.7版本-encoder/motion.h注释
- x265-1.8版本-encoder/bitcost.h注释
- x265-1.8版本-encoder/dpb.h注释
- x265-1.8版本-encoder/frameencoder.h注释
- x265-1.8版本-encoder/motion.h注释
- x265-1.8版本-encoder/ratecontrol.h注释
- x265-1.7版本-encoder/encoder.cpp注释
- x265-1.7版本-encoder/bitcost.cpp注释
- x265-1.7版本-encoder/dpb.cpp注释
- x265-1.7版本-encoder/frameencoder.cpp注释
- Hive学习笔记(三) 创建数据库与表
- uva 10739 String to Palindrome
- ScrollView 中TextField键盘隐藏
- 0001-WordBeanSimple 类如何建立
- KEIL mdk LIB 使用总结
- x265-1.7版本-encoder/slicetype.h注释
- 大数据 深度学习
- Cookie 和 Session机制详解
- Android学习历程13-Android 数据存储
- C++后台实践:古老的CGI与Web开发
- 图片质量压缩 与 图片格式 JPEG PNG
- UI_手势
- 服务器下虚拟机ping 本机
- Android 几个学习用到的网址