HEVC函数分析之TComPattern::fillReferenceSamples()
来源:互联网 发布:电视盒子破解软件 编辑:程序博客网 时间:2024/05/17 04:15
这个函数完全没有难度,参考8.4.4.2.2。第一次看这个代码时感觉很多变量没搞懂啥意思,其实思想很简单。顺便吐槽一下,这个代码写的。。。。shit,传入参数10几个。。。很简单的思路写的代码很不容易读。
1 若参考点都不可用,直接用iDCValue = 1 << (bitDepth - 1)赋值给所有的参考点
2 若参考点都可用,则将对应的数据赋给参考点
3 若参考点部分可用,先赋值可用的对应数据,
此时若左下不可用,则从左下到右上依次扫描,直到找到第一个可用的数据(加入此时扫描到第K个),将其赋值给前面0到K-1个所有没有被赋值的数据。然后从K+1按照左下,左,左上,上,右上的顺序,若扫描到某个不可用时,用其前面最近的那个可用的数据填充。(即在竖直方向上用下面最近的一个可用数据填充,在水平方向上用最近的左面可用数据填充)
敬请参考:http://blog.csdn.net/hevc_cjl/article/details/8175721
Void TComPattern::fillReferenceSamples(Int bitDepth, Pel* piRoiOrigin, Int* piAdiTemp, Bool* bNeighborFlags, Int iNumIntraNeighbor, Int iUnitSize, Int iNumUnitsInCu, Int iTotalUnits, UInt uiCuWidth, UInt uiCuHeight, UInt uiWidth,UInt uiHeight, Int iPicStride, Bool bLMmode ){ Pel* piRoiTemp; Int i, j; Int iDCValue = 1 << (bitDepth - 1); if (iNumIntraNeighbor == 0) { // Fill border with DC value for (i=0; i<uiWidth; i++) { piAdiTemp[i] = iDCValue; } for (i=1; i<uiHeight; i++) { piAdiTemp[i*uiWidth] = iDCValue; } } else if (iNumIntraNeighbor == iTotalUnits) { // Fill top-left border with rec. samples piRoiTemp = piRoiOrigin - iPicStride - 1; piAdiTemp[0] = piRoiTemp[0]; // Fill left border with rec. samples piRoiTemp = piRoiOrigin - 1; if (bLMmode) { piRoiTemp --; // move to the second left column } for (i=0; i<uiCuHeight; i++) { piAdiTemp[(1+i)*uiWidth] = piRoiTemp[0]; piRoiTemp += iPicStride; } // Fill below left border with rec. samples for (i=0; i<uiCuHeight; i++) { piAdiTemp[(1+uiCuHeight+i)*uiWidth] = piRoiTemp[0]; piRoiTemp += iPicStride; } // Fill top border with rec. samples piRoiTemp = piRoiOrigin - iPicStride; for (i=0; i<uiCuWidth; i++) { piAdiTemp[1+i] = piRoiTemp[i]; } // Fill top right border with rec. samples piRoiTemp = piRoiOrigin - iPicStride + uiCuWidth; for (i=0; i<uiCuWidth; i++) { piAdiTemp[1+uiCuWidth+i] = piRoiTemp[i]; } } else // reference samples are partially available { Int iNumUnits2 = iNumUnitsInCu<<1; Int iTotalSamples = iTotalUnits*iUnitSize; Pel piAdiLine[5 * MAX_CU_SIZE]; Pel *piAdiLineTemp; Bool *pbNeighborFlags; Int iNext, iCurr; Pel piRef = 0; // Initialize for (i=0; i<iTotalSamples; i++) { piAdiLine[i] = iDCValue; } // Fill top-left sample piRoiTemp = piRoiOrigin - iPicStride - 1; piAdiLineTemp = piAdiLine + (iNumUnits2*iUnitSize); pbNeighborFlags = bNeighborFlags + iNumUnits2; if (*pbNeighborFlags) { piAdiLineTemp[0] = piRoiTemp[0]; for (i=1; i<iUnitSize; i++) { piAdiLineTemp[i] = piAdiLineTemp[0]; } } // Fill left & below-left samples piRoiTemp += iPicStride; if (bLMmode) { piRoiTemp --; // move the second left column } piAdiLineTemp--; pbNeighborFlags--; for (j=0; j<iNumUnits2; j++) { if (*pbNeighborFlags) { for (i=0; i<iUnitSize; i++) { piAdiLineTemp[-i] = piRoiTemp[i*iPicStride]; } } piRoiTemp += iUnitSize*iPicStride; piAdiLineTemp -= iUnitSize; pbNeighborFlags--; } // Fill above & above-right samples piRoiTemp = piRoiOrigin - iPicStride; piAdiLineTemp = piAdiLine + ((iNumUnits2+1)*iUnitSize); pbNeighborFlags = bNeighborFlags + iNumUnits2 + 1; for (j=0; j<iNumUnits2; j++) { if (*pbNeighborFlags) { for (i=0; i<iUnitSize; i++) { piAdiLineTemp[i] = piRoiTemp[i]; } } piRoiTemp += iUnitSize; piAdiLineTemp += iUnitSize; pbNeighborFlags++; } // Pad reference samples when necessary iCurr = 0; iNext = 1; piAdiLineTemp = piAdiLine; while (iCurr < iTotalUnits) { if (!bNeighborFlags[iCurr]) { if(iCurr == 0) { while (iNext < iTotalUnits && !bNeighborFlags[iNext]) { iNext++; } piRef = piAdiLine[iNext*iUnitSize]; // Pad unavailable samples with new value while (iCurr < iNext) { for (i=0; i<iUnitSize; i++) { piAdiLineTemp[i] = piRef; } piAdiLineTemp += iUnitSize; iCurr++; } } else { piRef = piAdiLine[iCurr*iUnitSize-1]; for (i=0; i<iUnitSize; i++) { piAdiLineTemp[i] = piRef; } piAdiLineTemp += iUnitSize; iCurr++; } } else { piAdiLineTemp += iUnitSize; iCurr++; } } // Copy processed samples piAdiLineTemp = piAdiLine + uiHeight + iUnitSize - 2; for (i=0; i<uiWidth; i++) { piAdiTemp[i] = piAdiLineTemp[i]; } piAdiLineTemp = piAdiLine + uiHeight - 1; for (i=1; i<uiHeight; i++) { piAdiTemp[i*uiWidth] = piAdiLineTemp[-i]; } }}
请指教:1729048547
- HEVC函数分析之TComPattern::fillReferenceSamples()
- HEVC函数分析之TComPattern::initPattern( )
- HEVC函数分析之TComPattern::initAdiPattern()
- (HEVC)帧内预测:fillReferenceSamples函数讲解
- 帧内预测之 fillReferenceSamples函数记录
- 帧内预测-第一步:fillReferenceSamples函数:
- HEVC学习之琐事(一):HEVC编码结构分析
- HEVC帧间预测之三——TEncCu::xCheckRDCostMerge2Nx2N函数分析
- HEVC之CU、PU、TU分析
- HEVC之CU、PU、TU分析
- HEVC之CU、PU、TU分析
- HEVC 常用之 CU、PU、TU分析
- HEVC 常用之 类TComDataCU分析
- HEVC之CU、PU、TU分析
- HEVC 中主要LCU分析函数xCompressCU说明
- HEVC 中主要LCU分析函数xCompressCU说明
- HEVC学习:HM-10.1-dev代码分析之TLibVideoIO库
- HEVC ME之 整像素TZ搜索代码分析
- stardict for ubuntu
- What is move semantics?
- <MySQL Performance: over 1M QPS with InnoDB Memcached Plugin in MySQL 5.7>MySQL的高性能:MySQL 5.7
- 记录本-暂存一些东西
- HBase写被block的分析
- HEVC函数分析之TComPattern::fillReferenceSamples()
- 从PC中向Android模拟器中复制文件
- Effective Java笔记(第二章)
- 操作系统实验资料搜集:信号量,生产者消费者,读者写者等
- hdu 1598 列举+最小生成树★★
- windows环境中mysql忘记root密码的解决办法
- fragstats不能加载grid数据的问题
- Android4.3手机系统安装
- 发两个自己做的shell脚本,是用来录制终端屏幕的