自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

workspace

音视频算法/视频编解码/码率控制

  • 博客(70)
  • 问答 (1)
  • 收藏
  • 关注

原创 x264参数配置

默认参数配置 //帧率25fps param->i_fps_num = 25; param->i_fps_den = 1; /* Encoder parameters * 帧类型决策相关 */ param->i_frame_reference = 3; //参考帧列表3帧 param->i_keyint_...

2020-03-25 15:10:54 693

原创 x264-码控

x264提供三级码控基本单位:帧级,行级,宏块级帧级定位:帧类型决策之后,帧实际编码之前主控函数:x264_ratecontrol_start()关键函数1:rate_estimate_qscale()用于根据当前实际使用的比特开销来确定当前帧的qscale关键函数2:clip_qscale()用于对得到的qscale进行clip,并进行vbv检验辅助函数1:qp2qscale()...

2020-03-14 17:36:48 827

原创 队列流程

x264中有几个队列unused queue :相当于内存池,当需要存储帧时取一个x264_frame_t,编码完成后释放回去lookahead-ifbuff queue:作为unused queue到lookahead-next queue之间的中间缓存,用于多线程并发lookahead-next queue:实际进行帧类型决策的队列lookahead-ofbuff queue:作为l...

2020-03-10 10:42:35 696

原创 JNI

JNI流程在XXX.java中定义native方法作为接口,不需要在java中实现。针对XXX.java生成C/C++头文件XXX.h,该头文件包含了XXX.java中所有的native函数定义。建立C/C++的.dll或.so工程,引用jni.h、jni_md.h、XXX.h。新建XXX.cpp并实现XXX.h中的方法,编译生成动态链接库XXX.dll或XXX.so在XXX.java中使用语句加载XXX.dll或XXX.so后,即可调用native方法。...

2020-12-28 16:56:27 196

原创 ffmpeg-probe探针

探针的作用是试探当前的数据流是否是某一编码格式,一般方法是进行部分预解码,观察是否满足制定编码的格式要求H.264/AVC probe/* 1、找到nalu定位符0x00 0x00 0x01 2、解析nalu头 3、检查borbidden bit 4、判断ref idc是否和nalu type相符 5、预解析nalu 1、若是slice,则判断slice头的pps id是否已经存在

2020-11-22 11:28:14 1895

原创 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 812

原创 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 435 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 495

原创 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 471

原创 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 275

原创 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 285

原创 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 596

原创 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 207

原创 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 192

原创 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

原创 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 298

原创 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 202

原创 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 671

原创 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

原创 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 566

原创 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 407

原创 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 226

原创 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 248

原创 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 215

原创 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 192

原创 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

原创 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 511

原创 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 858

原创 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

原创 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 349

原创 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 464

原创 Analysis::compressCTU()

x265编码器在编码一帧时以行为单位进行WPP编码,一行一个线程,每个线程分别对自己的行中每个CTU进行compressCTU压缩分析/* 压缩分析CTU 过程: 1.为当前CTU加载QP/熵编码上下文 2.是否有编码信息输入来方便快速最优模式分析 ·bCTUInfo,加载depth/content/prevCtuInfoChange ·analysisMultiPassRef...

2020-04-07 15:40:12 843

原创 x264参数配置-tune

x264中tune等级有8个,表示应用的场景。相比preset,tune主要调节环路滤波强度、psy强度、adaptive qp强度等画质相关因素。const char * const x264_tune_names[] = { "film", "animation", "grain", "stillimage", "psnr", "ssim", "fastdecode", "zerol...

2020-03-25 21:27:22 942

原创 x264参数配置-preset

x264中preset等级有10个,表示编码速度的快慢。static const char * const x264_preset_names[] = { "ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo", 0 ...

2020-03-25 15:52:12 2035

原创 码控-macroblock_tree_finish()

/* 将frame的propagate_cost变现为f_qp_offset*/static void macroblock_tree_finish( x264_t *h, x264_frame_t *frame, float average_duration, int ref0_distance )

2020-03-14 17:55:43 206

原创 码控-mbtree_propagate_list()

/* 根据宏块之间的参考信息 将宏块的propagate_amount瓜分到其参考帧中 ref_costs[2] 表示两个参考帧的propagate_amount (*mvs)[2]表示参考向量 propagate_amount表示将要被瓜分宏块的propagate_amount lowres_costs 帧间预测satd bipred_weigtht 帧间预测权重 mb_y...

2020-03-14 17:53:26 249

原创 码控-mbtree_propagate_cost()

/* Estimate the total amount of influence on future quality that could be had if we * were to improve the reference samples used to inter predict any given macroblock. * * 若我们提升宏块的质量,则会对未来的质量照成多大...

2020-03-14 17:43:34 261

原创 码控-macroblock_tree_propagate()

/* 计算帧b的propagate_cost,并瓜分到其参考帧中 average_duration 当前这一组用于mb tree计算的帧的平均帧时间(s) p0,p1,b 前向参考帧、后向参考帧、当前帧 referenced 是否是参考帧 过程: 1.取帧b前向参考帧和后向参考帧的propagate_cost 2.计算参考的距离因子dist_scale_factor...

2020-03-14 17:42:49 319

原创 码控-macroblock_tree()

mbtree_propagate_cost()/* Estimate the total amount of influence on future quality that could be had if we * were to improve the reference samples used to inter predict any given macroblock. * *...

2020-03-13 18:11:51 345

原创 码控-x264_ratecontrol_mb_qp()

/* 得到当前待编码宏块的qp 过程: 1.取之前帧级码控决定的qp 2.计算当前宏块的qp,若使用adaptive qp ·若是参考帧,则 宏块qp = 帧级qp + qp_offset[mb_index] ·若非参考帧,则 宏块qp = 帧级qp + qp_offset_aq[mb_index] 3.clip宏块级qp*/int x264_ratecontro...

2020-03-12 10:35:17 569

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除