적응 형 QP
적응 형 QP는 코딩 품질을 향상시키기 위해 각 CU에 대해 QP를 적응 적으로 선택하는 것입니다. 구성 매개 변수 AdaptiveQP는이 기능을 사용할지 여부를 지정합니다. 기본적으로 켜져 있지 않습니다.
("AdaptiveQP,-aq", m_bUseAdaptiveQP,false, "QP adaptation based on a psycho-visual model")
QP 계산 원리는 플랫 블록에는 더 작은 QP를 선택하고 활동이 더 많은 블록에는 더 큰 QP를 선택하는 것 입니다.
CU의 활동은 휘도 성분의 분산으로 계산됩니다. 예를 들어 2Nx2N CU의 경우 먼저 4 개의 NxN 휘도 하위 블록의 분산을 계산 한 다음 분산에서 CU의 활동 actcu를 계산합니다.
활동이 많은 영역에서 더 큰 QP를 사용하고 평평한 영역에서 더 작은 QP를 사용하려면 이미지에서 각 2Nx2N CU의 actcu를 정규화해야합니다. 이미지 f의 모든 2Nx2N CU의 평균 활동이 actf라고 가정하면 정규화 된 norm_actcu는 다음과 같이 계산됩니다.
QPA는 구성 매개 변수 MaxQPAdaptationRange에 의해 지정되며 기본값은 6입니다.
("MaxQPAdaptationRange,-aqr",m_iQPAdaptationRange,6, "QP adaptation range")
CU의 최종 QP는 다음과 같이 계산됩니다.
참고 : 구성 파일의 MaxCuDQPDepth 매개 변수는 Adaptive QP를 사용할 수있는 최소 CU 크기를 지정하며 기본값은 0입니다. 값은 최대 CU 깊이보다 작아야합니다.
다음 코드는 HM에서 Adaptive QP의 계산 프로세스입니다.
/** Compute QP for each CU
* \param pcCU Target CU
* \param uiDepth CU depth
* \returns quantization parameter
*/
Int TEncCu::xComputeQP( TComDataCU* pcCU, UInt uiDepth )
{
Int iBaseQp = pcCU->getSlice()->getSliceQp();
Int iQpOffset = 0;
if ( m_pcEncCfg->getUseAdaptiveQP() )
{
TEncPic* pcEPic = dynamic_cast<TEncPic*>( pcCU->getPic() );
UInt uiAQDepth = min( uiDepth, pcEPic->getMaxAQDepth()-1 );
TEncPicQPAdaptationLayer* pcAQLayer = pcEPic->getAQLayer( uiAQDepth );
UInt uiAQUPosX = pcCU->getCUPelX() / pcAQLayer->getAQPartWidth();
UInt uiAQUPosY = pcCU->getCUPelY() / pcAQLayer->getAQPartHeight();
UInt uiAQUStride = pcAQLayer->getAQPartStride();
TEncQPAdaptationUnit* acAQU = pcAQLayer->getQPAdaptationUnit();
Double dMaxQScale = pow(2.0, m_pcEncCfg->getQPAdaptationRange()/6.0); //!<缩放因子s
Double dAvgAct = pcAQLayer->getAvgActivity(); //!<平均活动性
Double dCUAct = acAQU[uiAQUPosY * uiAQUStride + uiAQUPosX].getActivity();
Double dNormAct = (dMaxQScale*dCUAct + dAvgAct) / (dCUAct + dMaxQScale*dAvgAct); //!<归一化
Double dQpOffset = log(dNormAct) / log(2.0) * 6.0; //!<换底公式
iQpOffset = Int(floor( dQpOffset + 0.49999 ));
}
return Clip3(-pcCU->getSlice()->getSPS()->getQpBDOffset(CHANNEL_TYPE_LUMA), MAX_QP, iBaseQp+iQpOffset );
}
관심이 있으시면 WeChat 공개 계정 비디오 코딩을 따르십시오.