本文主要把实现亮度分量帧内预测的主函数的大体框架通过代码注释的方式介绍一下。

[cpp]  view plain copy
  1. Void
  2. TEncSearch::estIntraPredQT( TComDataCU* pcCU,
  3. TComYuv*    pcOrgYuv,
  4. TComYuv*    pcPredYuv,
  5. TComYuv*    pcResiYuv,
  6. TComYuv*    pcRecoYuv,
  7. UInt&       ruiDistC,
  8. Bool        bLumaOnly )
  9. {
  10. UInt    uiDepth        = pcCU->getDepth(0); //!< 当前CU的深度
  11. UInt    uiNumPU        = pcCU->getNumPartInter(); //!< 当前CU的分割模式,(SIZE_2Nx2N:1, SIZE_2NxN:2, SIZE_Nx2N:2, SIZE_NxN:4 ... )
  12. UInt    uiInitTrDepth  = pcCU->getPartitionSize(0) == SIZE_2Nx2N ? 0 : 1; //!< 用于计算变换的深度,实际深度为该值+uiDepth
  13. UInt    uiWidth        = pcCU->getWidth (0) >> uiInitTrDepth; //!< 当前PU的宽度,如果又分成4个子块,则宽度除以2
  14. UInt    uiHeight       = pcCU->getHeight(0) >> uiInitTrDepth; //!< 当前PU的高度,如果又分成4个子块,则高度除以2
  15. UInt    uiQNumParts    = pcCU->getTotalNumPart() >> 2; // 最小的分区是4x4大小的块,这里计算出以该4x4块为单位的分割数,这么做便于计算当前CU的Zorder坐标
  16. UInt    uiWidthBit     = pcCU->getIntraSizeIdx(0);
  17. UInt    uiOverallDistY = 0;
  18. UInt    uiOverallDistC = 0;
  19. UInt    CandNum;
  20. Double  CandCostList[ FAST_UDI_MAX_RDMODE_NUM ];
  21. //===== set QP and clear Cbf =====
  22. if ( pcCU->getSlice()->getPPS()->getUseDQP() == true)
  23. {
  24. pcCU->setQPSubParts( pcCU->getQP(0), 0, uiDepth );
  25. }
  26. else
  27. {
  28. pcCU->setQPSubParts( pcCU->getSlice()->getSliceQp(), 0, uiDepth );
  29. }
  30. //===== loop over partitions =====
  31. UInt uiPartOffset = 0; //!< 用于记录当前PU的Zorder坐标
  32. for( UInt uiPU = 0; uiPU < uiNumPU; uiPU++, uiPartOffset += uiQNumParts ) //!< 对当前CU中的每个PU进行遍历
  33. {
  34. //===== init pattern for luma prediction =====
  35. Bool bAboveAvail = false;
  36. Bool bLeftAvail  = false;
  37. pcCU->getPattern()->initPattern   ( pcCU, uiInitTrDepth, uiPartOffset ); // set parameters from CU data for accessing neighbouring pixels
  38. // set luma parameters from CU data for accessing ADI data //!< 主要获取当前PU的邻域可用性,对参考样点进行设置及滤波
  39. pcCU->getPattern()->initAdiPattern( pcCU, uiPartOffset, uiInitTrDepth, m_piYuvExt, m_iYuvExtStride, m_iYuvExtHeight, bAboveAvail, bLeftAvail );
  40. //===== determine set of modes to be tested (using prediction signal only) =====
  41. Int numModesAvailable     = 35; //total number of Intra modes
  42. Pel* piOrg         = pcOrgYuv ->getLumaAddr( uiPU, uiWidth );
  43. Pel* piPred        = pcPredYuv->getLumaAddr( uiPU, uiWidth );
  44. UInt uiStride      = pcPredYuv->getStride();
  45. UInt uiRdModeList[FAST_UDI_MAX_RDMODE_NUM];
  46. Int numModesForFullRD = g_aucIntraModeNumFast[ uiWidthBit ]; //!< MPM数目
  47. //!< g_aucIntraModeNumFast[] = {3, 8, 8, 3, 3, 3, 3}; 2x2, 4x4, 8x8, 16x16, 32x32, 64x64, 128x128
  48. Bool doFastSearch = (numModesForFullRD != numModesAvailable); //!< 此处doFastSearch恒为真
  49. if (doFastSearch)
  50. {
  51. assert(numModesForFullRD < numModesAvailable);
  52. for( Int i=0; i < numModesForFullRD; i++ )
  53. {
  54. CandCostList[ i ] = MAX_DOUBLE;
  55. }
  56. CandNum = 0;
  57. for( Int modeIdx = 0; modeIdx < numModesAvailable; modeIdx++ ) //!< 遍历35种帧内预测模式
  58. {
  59. UInt uiMode = modeIdx;
  60. //! 调用亮度帧内预测函数
  61. predIntraLumaAng( pcCU->getPattern(), uiMode, piPred, uiStride, uiWidth, uiHeight, pcCU, bAboveAvail, bLeftAvail );
  62. // use hadamard transform here
  63. UInt uiSad = m_pcRdCost->calcHAD( piOrg, uiStride, piPred, uiStride, uiWidth, uiHeight );
  64. UInt   iModeBits = xModeBitsIntra( pcCU, uiMode, uiPU, uiPartOffset, uiDepth, uiInitTrDepth );
  65. Double cost      = (Double)uiSad + (Double)iModeBits * m_pcRdCost->getSqrtLambda();
  66. CandNum += xUpdateCandList( uiMode, cost, numModesForFullRD, uiRdModeList, CandCostList );
  67. }
  68. #if FAST_UDI_USE_MPM // UDI---Unified Directional Intra
  69. Int uiPreds[3] = {-1, -1, -1};
  70. Int iMode = -1;  //!< 如果三个MPMs的前两个相同,则iMode=1,否则iMode=2
  71. Int numCand = pcCU->getIntraDirLumaPredictor( uiPartOffset, uiPreds, &iMode ); //!< 获取亮度帧内预测模式的三个MPMs
  72. if( iMode >= 0 ) //!< iMode = 1 or 2,因此,numCand会被重新赋值为iMode
  73. {
  74. numCand = iMode;
  75. }
  76. for( Int j=0; j < numCand; j++)
  77. {
  78. Bool mostProbableModeIncluded = false;
  79. Int mostProbableMode = uiPreds[j]; //!< 取出MPM
  80. for( Int i=0; i < numModesForFullRD; i++)
  81. {
  82. mostProbableModeIncluded |= (mostProbableMode == uiRdModeList[i]); //!< 检查MPMs是否被uiRdModeList所包含
  83. }
  84. if (!mostProbableModeIncluded)  //!< 如果没被包含,则将该MPM包含到uiRdModeList里
  85. {
  86. uiRdModeList[numModesForFullRD++] = mostProbableMode;
  87. }
  88. }
  89. #endif // FAST_UDI_USE_MPM
  90. } //!< if (doFastSearch)
  91. else
  92. {
  93. for( Int i=0; i < numModesForFullRD; i++)
  94. {
  95. uiRdModeList[i] = i;
  96. }
  97. }
  98. //===== check modes (using r-d costs) =====
  99. //! 帧内预测模式最佳值的确定主要有以下几个步骤:1. 对numModesForFullRD种预测模式进行遍历,即对每种模式计算出
  100. //! 对应的RD costs,但该步骤中,并不会把一个CU的所有分割都算一遍,而仅仅对于至多深度为1的分割进行遍历,这么做
  101. //! 大大减少了运算量,提高速度;2. 在第1个步骤中,会粗略得到最佳预测模式(在HM9.0中会得到包括次优解在内的两个
  102. //! 预测模式),存储下来,以供第3步使用;3. 在第2步的基础上,对最佳(及次优)预测模式的所有分割模式遍历一遍,
  103. //! 得到最终的最佳结果
  104. #if HHI_RQT_INTRA_SPEEDUP_MOD
  105. UInt   uiSecondBestMode  = MAX_UINT;
  106. Double dSecondBestPUCost = MAX_DOUBLE;
  107. #endif
  108. UInt    uiBestPUMode  = 0; //!< 存放最佳预测模式
  109. UInt    uiBestPUDistY = 0; //!< 存放最佳预测模式对应的亮度失真值
  110. UInt    uiBestPUDistC = 0; //!< 存放最佳预测模式对应的色度失真值
  111. Double  dBestPUCost   = MAX_DOUBLE;  //!< 存放最佳预测模式对应的总代价
  112. for( UInt uiMode = 0; uiMode < numModesForFullRD; uiMode++ ) //!< 遍历存储在uiRdModeList里的模式
  113. {
  114. // set luma prediction mode
  115. UInt uiOrgMode = uiRdModeList[uiMode];
  116. pcCU->setLumaIntraDirSubParts ( uiOrgMode, uiPartOffset, uiDepth + uiInitTrDepth );
  117. // set context models
  118. if( m_bUseSBACRD )
  119. {
  120. m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
  121. }
  122. // determine residual for partition
  123. UInt   uiPUDistY = 0;  //!< 存放当前预测模式对应的亮度失真值
  124. UInt   uiPUDistC = 0;  //!< 存放当前预测模式对应的色度失真值
  125. Double dPUCost   = 0.0; //!< 存放当前预测模式对应的代价
  126. #if HHI_RQT_INTRA_SPEEDUP //! 注意这个函数倒数第二个参数,此时为true
  127. xRecurIntraCodingQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcOrgYuv, pcPredYuv, pcResiYuv, uiPUDistY, uiPUDistC, true, dPUCost );
  128. #else
  129. xRecurIntraCodingQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcOrgYuv, pcPredYuv, pcResiYuv, uiPUDistY, uiPUDistC, dPUCost );
  130. #endif
  131. // check r-d cost
  132. if( dPUCost < dBestPUCost ) //!< 更新最佳预测模式相关参数
  133. {
  134. #if HHI_RQT_INTRA_SPEEDUP_MOD
  135. uiSecondBestMode  = uiBestPUMode;
  136. dSecondBestPUCost = dBestPUCost;
  137. #endif
  138. uiBestPUMode  = uiOrgMode;
  139. uiBestPUDistY = uiPUDistY;
  140. uiBestPUDistC = uiPUDistC;
  141. dBestPUCost   = dPUCost;
  142. xSetIntraResultQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcRecoYuv );
  143. UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> ( ( pcCU->getDepth(0) + uiInitTrDepth ) << 1 );
  144. ::memcpy( m_puhQTTempTrIdx,  pcCU->getTransformIdx()       + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  145. ::memcpy( m_puhQTTempCbf[0], pcCU->getCbf( TEXT_LUMA     ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  146. ::memcpy( m_puhQTTempCbf[1], pcCU->getCbf( TEXT_CHROMA_U ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  147. ::memcpy( m_puhQTTempCbf[2], pcCU->getCbf( TEXT_CHROMA_V ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  148. ::memcpy( m_puhQTTempTransformSkipFlag[0], pcCU->getTransformSkip(TEXT_LUMA)     + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  149. ::memcpy( m_puhQTTempTransformSkipFlag[1], pcCU->getTransformSkip(TEXT_CHROMA_U) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  150. ::memcpy( m_puhQTTempTransformSkipFlag[2], pcCU->getTransformSkip(TEXT_CHROMA_V) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  151. }
  152. #if HHI_RQT_INTRA_SPEEDUP_MOD
  153. else if( dPUCost < dSecondBestPUCost )
  154. {
  155. uiSecondBestMode  = uiOrgMode;
  156. dSecondBestPUCost = dPUCost;
  157. }
  158. #endif
  159. } // Mode loop
  160. #if HHI_RQT_INTRA_SPEEDUP
  161. #if HHI_RQT_INTRA_SPEEDUP_MOD
  162. for( UInt ui =0; ui < 2; ++ui )
  163. #endif
  164. {
  165. #if HHI_RQT_INTRA_SPEEDUP_MOD
  166. UInt uiOrgMode   = ui ? uiSecondBestMode  : uiBestPUMode;
  167. if( uiOrgMode == MAX_UINT )
  168. {
  169. break;
  170. }
  171. #else
  172. UInt uiOrgMode = uiBestPUMode; //!< 设置模式为最佳预测模式
  173. #endif
  174. pcCU->setLumaIntraDirSubParts ( uiOrgMode, uiPartOffset, uiDepth + uiInitTrDepth );
  175. // set context models
  176. if( m_bUseSBACRD )
  177. {
  178. m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
  179. }
  180. // determine residual for partition
  181. UInt   uiPUDistY = 0;
  182. UInt   uiPUDistC = 0;
  183. Double dPUCost   = 0.0;
  184. //! 注意该函数倒数第二个参数,此时为false
  185. xRecurIntraCodingQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcOrgYuv, pcPredYuv, pcResiYuv, uiPUDistY, uiPUDistC, false, dPUCost );
  186. // check r-d cost
  187. if( dPUCost < dBestPUCost )
  188. {
  189. uiBestPUMode  = uiOrgMode;
  190. uiBestPUDistY = uiPUDistY;
  191. uiBestPUDistC = uiPUDistC;
  192. dBestPUCost   = dPUCost;
  193. xSetIntraResultQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcRecoYuv );
  194. UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> ( ( pcCU->getDepth(0) + uiInitTrDepth ) << 1 );
  195. ::memcpy( m_puhQTTempTrIdx,  pcCU->getTransformIdx()       + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  196. ::memcpy( m_puhQTTempCbf[0], pcCU->getCbf( TEXT_LUMA     ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  197. ::memcpy( m_puhQTTempCbf[1], pcCU->getCbf( TEXT_CHROMA_U ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  198. ::memcpy( m_puhQTTempCbf[2], pcCU->getCbf( TEXT_CHROMA_V ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  199. ::memcpy( m_puhQTTempTransformSkipFlag[0], pcCU->getTransformSkip(TEXT_LUMA)     + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  200. ::memcpy( m_puhQTTempTransformSkipFlag[1], pcCU->getTransformSkip(TEXT_CHROMA_U) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  201. ::memcpy( m_puhQTTempTransformSkipFlag[2], pcCU->getTransformSkip(TEXT_CHROMA_V) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
  202. }
  203. } // Mode loop
  204. #endif
  205. //--- update overall distortion ---
  206. uiOverallDistY += uiBestPUDistY;
  207. uiOverallDistC += uiBestPUDistC;
  208. //--- update transform index and cbf ---
  209. UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> ( ( pcCU->getDepth(0) + uiInitTrDepth ) << 1 );
  210. ::memcpy( pcCU->getTransformIdx()       + uiPartOffset, m_puhQTTempTrIdx,  uiQPartNum * sizeof( UChar ) );
  211. ::memcpy( pcCU->getCbf( TEXT_LUMA     ) + uiPartOffset, m_puhQTTempCbf[0], uiQPartNum * sizeof( UChar ) );
  212. ::memcpy( pcCU->getCbf( TEXT_CHROMA_U ) + uiPartOffset, m_puhQTTempCbf[1], uiQPartNum * sizeof( UChar ) );
  213. ::memcpy( pcCU->getCbf( TEXT_CHROMA_V ) + uiPartOffset, m_puhQTTempCbf[2], uiQPartNum * sizeof( UChar ) );
  214. ::memcpy( pcCU->getTransformSkip(TEXT_LUMA)     + uiPartOffset, m_puhQTTempTransformSkipFlag[0], uiQPartNum * sizeof( UChar ) );
  215. ::memcpy( pcCU->getTransformSkip(TEXT_CHROMA_U) + uiPartOffset, m_puhQTTempTransformSkipFlag[1], uiQPartNum * sizeof( UChar ) );
  216. ::memcpy( pcCU->getTransformSkip(TEXT_CHROMA_V) + uiPartOffset, m_puhQTTempTransformSkipFlag[2], uiQPartNum * sizeof( UChar ) );
  217. //--- set reconstruction for next intra prediction blocks ---
  218. if( uiPU != uiNumPU - 1 )
  219. {
  220. Bool bSkipChroma  = false;
  221. Bool bChromaSame  = false;
  222. UInt uiLog2TrSize = g_aucConvertToBit[ pcCU->getSlice()->getSPS()->getMaxCUWidth() >> ( pcCU->getDepth(0) + uiInitTrDepth ) ] + 2;
  223. if( !bLumaOnly && uiLog2TrSize == 2 )
  224. {
  225. assert( uiInitTrDepth  > 0 );
  226. bSkipChroma  = ( uiPU != 0 );
  227. bChromaSame  = true;
  228. }
  229. UInt    uiCompWidth   = pcCU->getWidth ( 0 ) >> uiInitTrDepth;
  230. UInt    uiCompHeight  = pcCU->getHeight( 0 ) >> uiInitTrDepth;
  231. UInt    uiZOrder      = pcCU->getZorderIdxInCU() + uiPartOffset;
  232. Pel*    piDes         = pcCU->getPic()->getPicYuvRec()->getLumaAddr( pcCU->getAddr(), uiZOrder );
  233. UInt    uiDesStride   = pcCU->getPic()->getPicYuvRec()->getStride();
  234. Pel*    piSrc         = pcRecoYuv->getLumaAddr( uiPartOffset );
  235. UInt    uiSrcStride   = pcRecoYuv->getStride();
  236. for( UInt uiY = 0; uiY < uiCompHeight; uiY++, piSrc += uiSrcStride, piDes += uiDesStride )
  237. {
  238. for( UInt uiX = 0; uiX < uiCompWidth; uiX++ )
  239. {
  240. piDes[ uiX ] = piSrc[ uiX ];
  241. }
  242. }
  243. if( !bLumaOnly && !bSkipChroma )
  244. {
  245. if( !bChromaSame )
  246. {
  247. uiCompWidth   >>= 1;
  248. uiCompHeight  >>= 1;
  249. }
  250. piDes         = pcCU->getPic()->getPicYuvRec()->getCbAddr( pcCU->getAddr(), uiZOrder );
  251. uiDesStride   = pcCU->getPic()->getPicYuvRec()->getCStride();
  252. piSrc         = pcRecoYuv->getCbAddr( uiPartOffset );
  253. uiSrcStride   = pcRecoYuv->getCStride();
  254. for( UInt uiY = 0; uiY < uiCompHeight; uiY++, piSrc += uiSrcStride, piDes += uiDesStride )
  255. {
  256. for( UInt uiX = 0; uiX < uiCompWidth; uiX++ )
  257. {
  258. piDes[ uiX ] = piSrc[ uiX ];
  259. }
  260. }
  261. piDes         = pcCU->getPic()->getPicYuvRec()->getCrAddr( pcCU->getAddr(), uiZOrder );
  262. piSrc         = pcRecoYuv->getCrAddr( uiPartOffset );
  263. for( UInt uiY = 0; uiY < uiCompHeight; uiY++, piSrc += uiSrcStride, piDes += uiDesStride )
  264. {
  265. for( UInt uiX = 0; uiX < uiCompWidth; uiX++ )
  266. {
  267. piDes[ uiX ] = piSrc[ uiX ];
  268. }
  269. }
  270. }
  271. }
  272. //=== update PU data ====
  273. pcCU->setLumaIntraDirSubParts     ( uiBestPUMode, uiPartOffset, uiDepth + uiInitTrDepth );
  274. pcCU->copyToPic                   ( uiDepth, uiPU, uiInitTrDepth );
  275. } // PU loop
  276. if( uiNumPU > 1 )
  277. { // set Cbf for all blocks
  278. UInt uiCombCbfY = 0;
  279. UInt uiCombCbfU = 0;
  280. UInt uiCombCbfV = 0;
  281. UInt uiPartIdx  = 0;
  282. for( UInt uiPart = 0; uiPart < 4; uiPart++, uiPartIdx += uiQNumParts )
  283. {
  284. uiCombCbfY |= pcCU->getCbf( uiPartIdx, TEXT_LUMA,     1 );
  285. uiCombCbfU |= pcCU->getCbf( uiPartIdx, TEXT_CHROMA_U, 1 );
  286. uiCombCbfV |= pcCU->getCbf( uiPartIdx, TEXT_CHROMA_V, 1 );
  287. }
  288. for( UInt uiOffs = 0; uiOffs < 4 * uiQNumParts; uiOffs++ )
  289. {
  290. pcCU->getCbf( TEXT_LUMA     )[ uiOffs ] |= uiCombCbfY;
  291. pcCU->getCbf( TEXT_CHROMA_U )[ uiOffs ] |= uiCombCbfU;
  292. pcCU->getCbf( TEXT_CHROMA_V )[ uiOffs ] |= uiCombCbfV;
  293. }
  294. }
  295. //===== reset context models =====
  296. if(m_bUseSBACRD)
  297. {
  298. m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST]);
  299. }
  300. //===== set distortion (rate and r-d costs are determined later) =====
  301. ruiDistC                   = uiOverallDistC;
  302. pcCU->getTotalDistortion() = uiOverallDistY + uiOverallDistC;
  303. }

(转载请注明出处。)

HEVC学习(六) —— 帧内预测系列之四相关推荐

  1. [HEVC] HEVC学习(五) —— 帧内预测系列之三

    [HEVC] HEVC学习(五) -- 帧内预测系列之三 今天主要介绍帧内预测一个很重要的函数initAdiPattern,它的主要功能有三个,(1)检测当前PU的相邻样点包括左上.上.右上.左.左下 ...

  2. H.266/VVC代码学习:帧内预测之角度预测函数(predIntraAng、xPredIntraAng)

    predIntraAng函数 VTM中,帧内预测的角度预测的入口函数为predIntraAng函数,该函数主要是用于进行传统的帧内预测(Planar.DC.角度预测),然后对Planar和DC模式使用 ...

  3. HEVC亮度分量帧内预测模式代码详解

    作者:66 (转载请注明出处) 从我自身的学习历程来看,建议大家先把理论扎实了再去理解代码,代码里也有注释,与理论的地方一对应加上一点C编程基础很容易就能理解. 我们先了解相关理论,此处可参考这一篇博 ...

  4. HEVC学习(五) —— 帧内预测系列之三

    由于研究的需要,现将一晨不变大神的关于HEVC帧内预测的相关博客进行转载,方便自己查阅.一直都看一晨不变大神的帖子,受益匪浅.原著博客地址:http://blog.csdn.net/HEVC_CJL/ ...

  5. Overview of HEVC之4 帧内预测

    帧内预测是根据传输块的尺寸进行操作的,并且空间上相邻传输块的先前解码的边界像素被用来形成预测信号,对4*4到32*32的传输块定义了33种不同的方向预测.图6显示了可能的预测方向.另外也用到了平面预测 ...

  6. ISP(图像信号处理)学习笔记-帧内预测组合(视频编码入门)

    转载小柴柴博主的博文 本文链接:https://blog.csdn.net/cxy19931018/article/details/80635898 PDPC(Position Dependent I ...

  7. H.266/VVC技术学习:帧内预测之PDPC技术

    1.PDPC介绍 为了补偿以上较简单帧内预测模式在利用空间冗余度方面的不足,VVC 中引入了一种根据当前样本的位置及帧内预测模式的角度自适应选取反方向角度上的参考样本信息作为新的一个相对互补性的帧内预 ...

  8. 从HEVC到VVC:帧内预测技术的演进(2) – 多划分及多参考行帧内预测

    当前主流的视频编码标准(如H.264/AVC,VP9,AVS1,HEVC等)均使用当前预测单元最邻近的已重构像素对当前预测单元进行帧内预测.因为当前预测单元与其临近的像素之间有很强的相关性,该帧内预测 ...

  9. HEVC算法和体系结构:预测编码之帧内预测

    预测编码之帧内预测(Intra-Picture Prediction) 预测编码(Prediction Coding)是视频编码的核心技术之一,指利用已编码的一个或几个样本值,根据某种模型或方法,对当 ...

最新文章

  1. MySQL如何从开源中获利
  2. linux下find命令用法
  3. 07_创建tensor,从numpy创建,从List创建,设置默认类型,rand/rand_like,randint,full,arange,linspace/logspace,linspace等等
  4. 假如给Go语言加上注解,程序会变怎样?
  5. 专注是最好的修行,一个80后IT从业者14年的成长与感悟
  6. Android--多选自动搜索提示
  7. 多线程之 NSOperation
  8. (转)《麻省理工科技评论》发布2017年全球十大突破性技术榜单
  9. 线性代数矩阵秩的8大性质、重要定理以及关系
  10. 基于ESP32CAM实现WebSocket服务器实时点灯
  11. html转换为pdf c#,HTML转PDF(C# itextsharp)
  12. SEO过程中外链的误区
  13. python抓取京东商品评价总数_python爬虫抓取和分析京东商城评价
  14. 浅谈互联网流量种类的划分,及其价值所在!做到精准引流定向吸粉。
  15. Python 机器人学习手册:1~5
  16. Mock 模拟测试简介及 Mockito 使用入门
  17. 2 理解网络协议的工作模式
  18. 虚拟机 Ubuntu16.04开机蓝屏问题
  19. 如何从前端入门到放弃
  20. 阿里巴巴2019财年Q1财报:连续六季度高速增长,加码投资未来

热门文章

  1. 使用EasyExcel单元格内换行
  2. powerdesigner下画E-R图
  3. 实例讲解如何在DB2 UDB中正确的监控死锁
  4. 看完把学霸按在地上摩擦,计算机网络知识点总结(4)——题目
  5. 【Kevin Learn QMUI】-->QMUILinkTextView
  6. Webpack是什么(基本含义)
  7. html分级显示的下拉列表,在下拉列表中显示多级树形菜单
  8. 国内量化交易现状总结
  9. 网格化巡查二维码的意义及应用
  10. 关于经济发展之认知(零)