相信會有不少人對如何確定cu最終的劃分有所困惑(包括我在內,剛開始接觸時也不知道該怎麼做),我覺得很大的乙個原因就是cu是遞迴劃分的,這就導致在尋找確定最佳分割位置時比較困難。
其實,解決問題的辦法說難也不難,關鍵在於思路的轉換,既然對於xcompresscu中是如何儲存劃分模式的覺得難以理解,何不跳出這個小圈子尋找新的方法呢?
我們可以從解碼器的角度來考慮,因為最終編碼後的碼流是要經過解碼器解碼的,解碼器事先也是不知道cu到底最終是如何劃分的。因此,可以推斷,編碼器必然會儲存下這個資訊,至少是提示資訊。不妨參考encodecu這個函式的實現,因為它是最終將資訊編碼成碼流的函式。該函式呼叫的是xencodecu來完成實際工作,擷取它當中其中一段對我們有用的**:
[cpp]view plain
copy
// we need to split, so don't try these modes.
if(!bslicestart&&( uirpelx getsps()->getpicwidthinlumasamples() ) && ( uibpely getsps()->getpicheightinlumasamples() ) )
不錯,encodesplitflag就是用於編碼cu分割資訊的函式,它的實現如下:
[cpp]view plain
copy
// split mode
void tencentropy::encodesplitflag( tcomdatacu* pccu, uint uiabspartidx, uint uidepth, bool brd )
if( !brd )
} m_pcentropycoderif->codesplitflag( pccu, uiabspartidx, uidepth );
}
對我們有用的函式是最後的codesplitflag函式,它的實現如下:
[cpp]view plain
copy
void tencsbac::codesplitflag ( tcomdatacu* pccu, uint uiabspartidx, uint uidepth )
可以看到最為有用的一句:
[cpp]view plain
copy
uint uicurrsplitflag = ( pccu->getdepth( uiabspartidx ) > uidepth ) ? 1 : 0;
也就是說,通過判斷pccu->getdepth( uiabspartidx )是否大於uidepth來確定當前cu是否還要繼續分割,後者我們知道,是當前cu的深度,那麼前者呢?自然就是在xcompresscu中確定下來的當前cu的最佳分割模式。至此,我們最想獲得的資訊就在這裡。
經過上述分析後,一句話總結獲取cu最佳劃分的方法:在hm中呼叫完xcompresscu之後(至少也應該是compresscu呼叫完它之後,此時最佳pu為m_ppcbestcu[0]),在呼叫encodecu之前(也可以之後,這個只要保證pccu沒被修改過即可),對compresscu的引數pccu進行類似語句: pccu->getdepth( uiabspartidx ),即可獲得z order為uiabspartidx的4x4塊的深度,如果把整個cu每個4x4塊的深度確定下來,那麼它的劃分自然也就確定下來了。
下圖是我列印出的某一塊cu在最大尺寸64 x 64,最大深度為4(即depth = 0 ~ 3)的某一種劃分情況,每個數字代表對應位置的4x4塊的實際深度,紅線給出cu的最佳劃分。
HEVC學習(十二) CU的最終劃分
相信會有不少人對如何確定cu最終的劃分有所困惑 包括我在內,剛開始接觸時也不知道該怎麼做 我覺得很大的乙個原因就是cu是遞迴劃分的,這就導致在尋找確定最佳分割位置時比較困難。其實,解決問題的辦法說難也不難,關鍵在於思路的轉換,既然對於xcompresscu中是如何儲存劃分模式的覺得難以理解,何不跳出...
HEVC最優CU劃分確定的過程
hevc中cu有64x64,32x32,16x16,8x8四種,對於乙個大的lcu,應該如何劃分cu才能使得rdco最小,我們知道hm中是採用遍歷遞迴的形式進行計算的,但是具體的流程又是怎麼樣的?1,首先對於乙個大的lcu即64x64的塊,我們首先把他當作乙個cu,計算出這個cu最佳的 模式,並記錄...
我在CU上整理的MySQL FAQ
q 如何安裝lamp linux apache mysql php q 如何登入mysql a 使用mysql提供的客戶端工具登入 path to mysql bin mysql uuser ppassword dateabase q 忘記mysql的root密碼,怎麼修改 a 如果 mysql 正...