日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【HEVC学习与研究】46、HEVC参考代码中SAO的实现

發布時間:2024/8/1 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【HEVC学习与研究】46、HEVC参考代码中SAO的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、HM10 encoder關于SAO的初始化操作

在編碼開始之前,編碼器將進行與SAO有關的一些初始化設置。如在TAppEncTop::encode()函數中調用TAppEncTop::xInitLibCfg()進行與config相關的設置:

m_cTEncTop.setLFCrossSliceBoundaryFlag( m_bLFCrossSliceBoundaryFlag );//parseCfg時設置,指定loop filter是否能跨越slice邊界,默認為falsem_cTEncTop.setUseSAO ( m_bUseSAO );//parseCfg時設置,指定SAO功能是否開啟,由cfg文件指定m_cTEncTop.setMaxNumOffsetsPerPic (m_maxNumOffsetsPerPic);//每一個像素最大允許的偏移量,默認為2048m_cTEncTop.setSaoLcuBoundary (m_saoLcuBoundary);//是否使用非deblocked像素做SAO參數估計m_cTEncTop.setSaoLcuBasedOptimization (m_saoLcuBasedOptimization);//選擇基于picture還是CTU的估計,默認選擇CTU
在TEncTop::create ()中,會依據前面配置的結果進行初始化操作:

if (m_bUseSAO){m_cEncSAO.setSaoLcuBoundary(getSaoLcuBoundary());m_cEncSAO.setSaoLcuBasedOptimization(getSaoLcuBasedOptimization());m_cEncSAO.setMaxNumOffsetsPerPic(getMaxNumOffsetsPerPic());m_cEncSAO.create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight );m_cEncSAO.createEncBuffer();}


前面三個函數分別實現對m_cEncSAO私有數據成員的賦值,后兩個函數主要為編碼器分配內存以及其他一些初始化操作。隨后,在TEncGOP::init中獲取SAO濾波器對象的指針:

Void TEncGOP::init ( TEncTop* pcTEncTop ) {//......//--Adaptive Loop filterm_pcSAO = pcTEncTop->getSAO();//...... }
2、實際進行SAO濾波操作

在TEncGOP::compressGOP函數中調用SAOProcess實現:

Void TEncSampleAdaptiveOffset::SAOProcess(SAOParam *pcSaoParam, Double dLambda) #endif {m_dLambdaLuma = dLambdaLuma;m_dLambdaChroma = dLambdaChroma;if(m_bUseNIF){m_pcPic->getPicYuvRec()->copyToPic(m_pcYuvTmp);}m_uiSaoBitIncreaseY = max(g_bitDepthY - 10, 0);m_uiSaoBitIncreaseC = max(g_bitDepthC - 10, 0);m_iOffsetThY = 1 << min(g_bitDepthY - 5, 5);m_iOffsetThC = 1 << min(g_bitDepthC - 5, 5);resetSAOParam(pcSaoParam);if( !m_saoLcuBasedOptimization || !m_saoLcuBoundary ){resetStats();}Double dCostFinal = 0;if ( m_saoLcuBasedOptimization){rdoSaoUnitAll(pcSaoParam, dLambdaLuma, dLambdaChroma, depth);}else{pcSaoParam->bSaoFlag[0] = 1;pcSaoParam->bSaoFlag[1] = 0;dCostFinal = 0;Double lambdaRdo = dLambdaLuma;resetStats();getSaoStats(pcSaoParam->psSaoPart[0], 0);runQuadTreeDecision(pcSaoParam->psSaoPart[0], 0, dCostFinal, m_uiMaxSplitLevel, lambdaRdo, 0);pcSaoParam->bSaoFlag[0] = dCostFinal < 0 ? 1:0;if(pcSaoParam->bSaoFlag[0]){convertQT2SaoUnit(pcSaoParam, 0, 0);assignSaoUnitSyntax(pcSaoParam->saoLcuParam[0], pcSaoParam->psSaoPart[0], pcSaoParam->oneUnitFlag[0], 0);}}if (pcSaoParam->bSaoFlag[0]){processSaoUnitAll( pcSaoParam->saoLcuParam[0], pcSaoParam->oneUnitFlag[0], 0);}if (pcSaoParam->bSaoFlag[1]){processSaoUnitAll( pcSaoParam->saoLcuParam[1], pcSaoParam->oneUnitFlag[1], 1);processSaoUnitAll( pcSaoParam->saoLcuParam[2], pcSaoParam->oneUnitFlag[2], 2);} }
具體的實現原理下篇繼續研究

總結

以上是生活随笔為你收集整理的【HEVC学习与研究】46、HEVC参考代码中SAO的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。