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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SAO代码解析补充(二)

發布時間:2024/8/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SAO代码解析补充(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:66

1.?理論部分--快速率失真計算方法:

在后面的代碼中用到了,在此說明一下方便后面的理解:

率失真(J = 像素誤差(D+語法編碼代價(λR),R是編碼所需bitλ是系數。

其中像素誤差可以有MSE(最小均方誤差)、MAD(最小平均絕對誤差)等。這里用的MSE,即原始像素與重構像素的差值平方和。

org代表原始像素,rec代表重構像素,offset為補償值,則有:

補償前:

補償后:

補償前后的誤差:


上式中N為像素個數,因此率失真差值為:


可以看出計算差值J比計算J少了約N次對差值進行平方的計算,因此選最優時只需要對比差值J即可。

2.補充:

昨天剩下的兩個函數,saoCOmponentParamDist中,計算過EOBO模式后的mergemergeup是計算取鄰塊SAO模式的率失真,也就是說,函數saoComponentParamDist計算并記錄了EOBO模式下最優模式,但并未在此函數中與融合模式進行對比,具體的對比在調用saoCOmponentParamDist的函數rdoSaoUnitAll的后半部分。

?

圖一、本文涉及的代碼結構(標紅部分)

saoCOmponentParamDist中計算merge率失真的代碼:

?

// merge left or merge upfor (Int idxNeighbor=0;idxNeighbor<2;idxNeighbor++){saoLcuParamNeighbor = NULL;if (allowMergeLeft && addrLeft>=0 && idxNeighbor ==0)//!< 左鄰塊可用{saoLcuParamNeighbor = &(saoParam->saoLcuParam[yCbCr][addrLeft]);//!< 取左鄰塊的SAO參數}else if (allowMergeUp && addrUp>=0 && idxNeighbor ==1)//!< 上鄰塊可用{saoLcuParamNeighbor = &(saoParam->saoLcuParam[yCbCr][addrUp]);//!< 取上鄰塊的SAO參數}if (saoLcuParamNeighbor!=NULL){estDist = 0;typeIdx = saoLcuParamNeighbor->typeIdx;//取鄰塊的SAO模式if (typeIdx>=0){Int mergeBandPosition = (typeIdx == SAO_BO)?saoLcuParamNeighbor->subTypeIdx:0;Int merge_iOffset;for(classIdx = 0; classIdx < m_iNumClass[typeIdx]; classIdx++){merge_iOffset = saoLcuParamNeighbor->offset[classIdx];estDist += estSaoDist(m_iCount [yCbCr][typeIdx][classIdx+mergeBandPosition+1], merge_iOffset, m_iOffsetOrg[yCbCr][typeIdx][classIdx+mergeBandPosition+1], shift);}}else{estDist = 0;}copySaoUnit(&compSaoParam[idxNeighbor], saoLcuParamNeighbor );compSaoParam[idxNeighbor].mergeUpFlag = idxNeighbor;compSaoParam[idxNeighbor].mergeLeftFlag = !idxNeighbor;compDistortion[idxNeighbor+1] += ((Double)estDist/lambda);}}}

其中調用了計算率失真的函數estSaoDist,函數定義為:

inline Int64 TEncSampleAdaptiveOffset::estSaoDist(Int64 count, Int64 offset, Int64 offsetOrg, Int shift){return (( count*offset*offset-offsetOrg*offset*2 ) >> shift);}

這個函數用的是SAO率失真的快速計算方法,其中return (( count*offset*offset-offsetOrg*offset*2 ) >> shift);對應于公式

具體解析看前理論部分。

前面說過,merge模式參與率失真的比較在rdoSaoUnitAll函數后半部分,下面貼后半部分代碼:

//計算亮度和色度模式下的參數融合率失真if( saoParam->bSaoFlag[0] || saoParam->bSaoFlag[1] ){// Cost of new SAO_params初始化參數m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);m_pcRDGoOnSbacCoder->resetBits();if (allowMergeLeft){m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0);}if (allowMergeUp){m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0);}for ( compIdx=0;compIdx<3;compIdx++){if( (compIdx ==0 && saoParam->bSaoFlag[0]) || (compIdx >0 && saoParam->bSaoFlag[1])){m_pcEntropyCoder->encodeSaoOffset(&saoParam->saoLcuParam[compIdx][addr], compIdx);//cost of merge}}rate = m_pcEntropyCoder->getNumberOfWrittenBits();bestCost = compDistortion[0] + (Double)rate;m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);//計算參數融合模式下的率失真for(Int mergeUp=0; mergeUp<2; ++mergeUp){if ( (allowMergeLeft && (mergeUp==0)) || (allowMergeUp && (mergeUp==1)) ){m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);m_pcRDGoOnSbacCoder->resetBits();if (allowMergeLeft){m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(1-mergeUp);}if ( allowMergeUp && (mergeUp==1) ){m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(1);}rate = m_pcEntropyCoder->getNumberOfWrittenBits();//碼率mergeCost = compDistortion[mergeUp+1] + (Double)rate;//率失真if (mergeCost < bestCost)//更新最佳濾波模式{bestCost = mergeCost;m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_TEMP_BEST]); for ( compIdx=0;compIdx<3;compIdx++){mergeSaoParam[compIdx][mergeUp].mergeLeftFlag = 1-mergeUp;mergeSaoParam[compIdx][mergeUp].mergeUpFlag = mergeUp;if( (compIdx==0 && saoParam->bSaoFlag[0]) || (compIdx>0 && saoParam->bSaoFlag[1])){copySaoUnit(&saoParam->saoLcuParam[compIdx][addr], &mergeSaoParam[compIdx][mergeUp] ); }}}}}#if SAO_ENCODING_CHOICE#if SAO_ENCODING_CHOICE_CHROMAif( saoParam->saoLcuParam[0][addr].typeIdx == -1)//Y分量不存在SAO參數{numNoSao[0]++;}if( saoParam->saoLcuParam[1][addr].typeIdx == -1)//CbCr分量不存在SAO參數{numNoSao[1]+=2;}#elsefor ( compIdx=0;compIdx<3;compIdx++){if( depth == 0 && saoParam->saoLcuParam[compIdx][addr].typeIdx == -1){numNoSao++;}}#endif#endifm_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_CURR_BEST]);}//!< if( saoParam->bSaoFlag[0] || saoParam->bSaoFlag[1] )}//!< for (idxX = 0; idxX< frameWidthInCU; idxX++)}//!< for (idxY = 0; idxY< frameHeightInCU; idxY++)#if SAO_ENCODING_CHOICE#if SAO_ENCODING_CHOICE_CHROMAif( !saoParam->bSaoFlag[0]){m_depthSaoRate[0][depth] = 1.0;}else{m_depthSaoRate[0][depth] = numNoSao[0]/((Double) frameHeightInCU*frameWidthInCU);}if( !saoParam->bSaoFlag[1]){m_depthSaoRate[1][depth] = 1.0;}else{m_depthSaoRate[1][depth] = numNoSao[1]/((Double) frameHeightInCU*frameWidthInCU*2);}#elseif( depth == 0){// update SAO Ratem_depth0SaoRate = numNoSao/((Double) frameHeightInCU*frameWidthInCU*3);}#endif#endif} (轉載請注明出處)

總結

以上是生活随笔為你收集整理的SAO代码解析补充(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

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