HEVC中的码率控制(RC)
来源:互联网 发布:linux ftp命令用法 编辑:程序博客网 时间:2024/06/10 02:16
题记:
HEVC 标准中所推荐的码率控制模型不像H.264中推荐 《二次率失真模型》, 而采用了 R-lambda 模型。
模型较简单,主要提案涉及三个
JCT-VC K0103
JCT-VC M0257
JCT-VC M0036
在HM中对应的代码如下:
////////////////////////////////////////////////group level GROUP_LEVEL_RC#if RATE_CONTROL_LAMBDA_DOMAIN if ( m_RCEnableRateControl ) { m_cRateCtrl.initRCGOP( m_iNumPicRcvd ); }#endif////////////////////////////////////////////////////////////////////////////////////////////////slice level SLICE_LEVEL_RC#if RATE_CONTROL_LAMBDA_DOMAIN Double lambda = 0.0; Int actualHeadBits = 0; Int actualTotalBits = 0; Int estimatedBits = 0; Int tmpBitsBeforeWriting = 0; if ( m_pcCfg->getUseRateCtrl() ) { Int frameLevel = m_pcRateCtrl->getRCSeq()->getGOPID2Level( iGOPid ); if ( pcPic->getSlice(0)->getSliceType() == I_SLICE ) { frameLevel = 0; } m_pcRateCtrl->initRCPic( frameLevel ); estimatedBits = m_pcRateCtrl->getRCPic()->getTargetBits(); Int sliceQP = m_pcCfg->getInitialQP(); if ( ( pcSlice->getPOC() == 0 && m_pcCfg->getInitialQP() > 0 ) || ( frameLevel == 0 && m_pcCfg->getForceIntraQP() ) ) // QP is specified { Int NumberBFrames = ( m_pcCfg->getGOPSize() - 1 ); Double dLambda_scale = 1.0 - Clip3( 0.0, 0.5, 0.05*(Double)NumberBFrames ); Double dQPFactor = 0.57*dLambda_scale; Int SHIFT_QP = 12; Int bitdepth_luma_qp_scale = 0; Double qp_temp = (Double) sliceQP + bitdepth_luma_qp_scale - SHIFT_QP; lambda = dQPFactor*pow( 2.0, qp_temp/3.0 ); } else if ( frameLevel == 0 ) // intra case, but use the model {#if RATE_CONTROL_INTRA m_pcSliceEncoder->calCostSliceI(pcPic); // calculate the whole frame hardmard cost#endif if ( m_pcCfg->getIntraPeriod() != 1 ) // do not refine allocated bits for all intra case { Int bits = m_pcRateCtrl->getRCSeq()->getLeftAverageBits();#if RATE_CONTROL_INTRA bits = m_pcRateCtrl->getRCPic()->getRefineBitsForIntra( bits );#else bits = m_pcRateCtrl->getRCSeq()->getRefineBitsForIntra( bits );#endif if ( bits < 200 ) { bits = 200; } m_pcRateCtrl->getRCPic()->setTargetBits( bits ); } list<TEncRCPic*> listPreviousPicture = m_pcRateCtrl->getPicList();#if RATE_CONTROL_INTRA m_pcRateCtrl->getRCPic()->getLCUInitTargetBits(); // to set LCU target bits lambda = m_pcRateCtrl->getRCPic()->estimatePicLambda( listPreviousPicture, pcSlice->getSliceType());#else lambda = m_pcRateCtrl->getRCPic()->estimatePicLambda( listPreviousPicture );#endif sliceQP = m_pcRateCtrl->getRCPic()->estimatePicQP( lambda, listPreviousPicture ); } else // normal case { list<TEncRCPic*> listPreviousPicture = m_pcRateCtrl->getPicList();#if RATE_CONTROL_INTRA lambda = m_pcRateCtrl->getRCPic()->estimatePicLambda( listPreviousPicture, pcSlice->getSliceType());#else lambda = m_pcRateCtrl->getRCPic()->estimatePicLambda( listPreviousPicture );#endif sliceQP = m_pcRateCtrl->getRCPic()->estimatePicQP( lambda, listPreviousPicture ); } sliceQP = Clip3( -pcSlice->getSPS()->getQpBDOffsetY(), MAX_QP, sliceQP ); m_pcRateCtrl->getRCPic()->setPicEstQP( sliceQP ); m_pcSliceEncoder->resetQP( pcPic, sliceQP, lambda ); }#endif////////////////////////////////////////////////////////////////////////////////////////////////LCU level CU_LEVEL_RC#if RATE_CONTROL_LAMBDA_DOMAIN Double oldLambda = m_pcRdCost->getLambda(); if ( m_pcCfg->getUseRateCtrl() ) { Int estQP = pcSlice->getSliceQp(); Double estLambda = -1.0; Double bpp = -1.0;#if M0036_RC_IMPROVEMENT if ( ( rpcPic->getSlice( 0 )->getSliceType() == I_SLICE && m_pcCfg->getForceIntraQP() ) || !m_pcCfg->getLCULevelRC() )#else if ( rpcPic->getSlice( 0 )->getSliceType() == I_SLICE || !m_pcCfg->getLCULevelRC() )#endif { estQP = pcSlice->getSliceQp(); } else {#if RATE_CONTROL_INTRA bpp = m_pcRateCtrl->getRCPic()->getLCUTargetBpp(pcSlice->getSliceType()); if ( rpcPic->getSlice( 0 )->getSliceType() == I_SLICE) { estLambda = m_pcRateCtrl->getRCPic()->getLCUEstLambdaAndQP(bpp, pcSlice->getSliceQp(), &estQP); } else { estLambda = m_pcRateCtrl->getRCPic()->getLCUEstLambda( bpp ); estQP = m_pcRateCtrl->getRCPic()->getLCUEstQP ( estLambda, pcSlice->getSliceQp() ); }#else bpp = m_pcRateCtrl->getRCPic()->getLCUTargetBpp(); estLambda = m_pcRateCtrl->getRCPic()->getLCUEstLambda( bpp ); estQP = m_pcRateCtrl->getRCPic()->getLCUEstQP ( estLambda, pcSlice->getSliceQp() );#endif estQP = Clip3( -pcSlice->getSPS()->getQpBDOffsetY(), MAX_QP, estQP ); m_pcRdCost->setLambda(estLambda); //set lambda in RD-cost function#if M0036_RC_IMPROVEMENT#if RDOQ_CHROMA_LAMBDA // set lambda for RDOQ Double weight=m_pcRdCost->getChromaWeight(); m_pcTrQuant->setLambda( estLambda, estLambda / weight );#else m_pcTrQuant->setLambda( estLambda ); //set lambda in TransQuant function#endif#endif } m_pcRateCtrl->setRCQP( estQP );#if ADAPTIVE_QP_SELECTION //mhwang pcCU->getSlice()->setSliceQpBase( estQP );#endif }#endif////////////////////////////////////////////////
- HEVC中的码率控制(RC)
- HEVC码率控制
- HEVC码率控制代码追踪(一)(HEVC code tracing-Rate control)
- HEVC码率控制代码追踪(二)
- HEVC码率控制代码追踪(三)
- HEVC码率控制介绍(R-Lamda)
- HEVC码率控制(二):从compressGOP()到compressSlice()
- HEVC码率控制提案总结
- 3D-HEVC码率控制
- HEVC RC 小结
- HEVC/H.265理论知识(9)——码率控制
- HEVC码率控制(三):picture level的比特分配
- HEVC码率控制(三):picture level的比特分配
- HEVC函数入门(12)——量化参数及码率控制
- HEVC的码率控制的相关提案
- HEVC——码率控制提案总结
- HEVC码率控制: Unified R-Q Model
- HEVC码率控制算法研究与HM相应代码分析(一)——HEVC标准及编码流程介绍
- 将“PDF转换成PPT”与“PPT转PDF”的方法
- 2013 ACM/ICPC Asia Regional Chengdu Online
- 线程初步
- Drive Replacement Procedure via Nexenta NMC
- nodejs--express开发博客系统(三)
- HEVC中的码率控制(RC)
- ExtJs4 MVC 提高加载速度 动态加载Controller
- 常用的排序算法的时间复杂度和空间复杂度
- 2013 ACM/ICPC Asia Regional Hangzhou Online 个人总结
- demo2_简单的报数游戏
- Sample Adaptive Offset 1 (SAO 样例自适应补偿)
- apk漏洞记录1:伪加密+设备管理器不可删+webview漏洞
- Linux下Oracle下监听服务动不动停止Listener.ora :WARNING: Subscription for node down event still pending
- iOS AppDelegate协议方法