HEVC中的位元速率控制(RC)

2021-06-18 09:29:38 字數 2883 閱讀 6536

題記:

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 )

#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() )

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

else if ( framelevel == 0 ) // intra case, but use the model

m_pcratectrl->getrcpic()->settargetbits( bits );

}listlistpreviouspicture = 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

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() )

else

else

#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 位元速率控制

位元速率控制通常分為三個level,分別為gop級 frame級 lcu級,其中frame級分為三種方案,分別為等bit位元速率分配 固定比例位元速率分配 自適應比例的位元速率分配,其中固定比例分配方案是李斌博士提出,自適應比例分配是其師弟在其基礎上提出的,本文給出了李斌博士提出的方案。gop級位元...

HEVC位元速率控制資料整理

本篇部落格主要記錄專案過程中參考過 寫得比較好的部落格。hevc專案 可以跟著嶽麓吹雪大神的hevc 學習專欄去學,遇到不清楚或者需要重點了解的再去搜其他的資料。專欄第一篇部落格鏈結 專案內容是要在hevc上修改,使得每幀影象有兩種qp。首先定位到是在slice層或者ctu層或cu上進行qp修改。通...

DVSDK位元速率控制的理解

1.動態引數和靜態引數 建立編碼器的時候,有params和dynparams兩種引數,顧名思義,venc根據params建立,執行過程中又可以對dynparams改變配置 venc1 handle venc1 create engine handle hengine,char codecname,v...