📄 umc_h264_dec_decode_mb_types.cpp
字号:
pRefIntraTypes = m_pMBIntraTypes + m_cur_mb.CurrentBlockNeighbours.mbs_left[1].mb_num*NUM_INTRA_TYPE_ELEMENTS; uModeLeft[1] = (Ipp8u) (pRefIntraTypes[NIT2LIN[m_cur_mb.CurrentBlockNeighbours.mbs_left[1].block_num]] + 1); } else { // MB left in slice but not INTRA, use mode 2 (+1) uModeLeft[1] = 2+1; } } else { uModeLeft[1] = 0; } if (predictors&8) { if (gmbinfo[m_cur_mb.CurrentBlockNeighbours.mbs_left[2].mb_num].mbtype == MBTYPE_INTRA) { pRefIntraTypes = m_pMBIntraTypes + m_cur_mb.CurrentBlockNeighbours.mbs_left[2].mb_num*NUM_INTRA_TYPE_ELEMENTS; uModeLeft[2] = (Ipp8u) (pRefIntraTypes[NIT2LIN[m_cur_mb.CurrentBlockNeighbours.mbs_left[2].block_num]] + 1); } else { // MB left in slice but not INTRA, use mode 2 (+1) uModeLeft[2] = 2+1; } } else { uModeLeft[2] = 0; } if (predictors&16) { if (gmbinfo[m_cur_mb.CurrentBlockNeighbours.mbs_left[3].mb_num].mbtype == MBTYPE_INTRA) { pRefIntraTypes = m_pMBIntraTypes + m_cur_mb.CurrentBlockNeighbours.mbs_left[3].mb_num*NUM_INTRA_TYPE_ELEMENTS; uModeLeft[3] = (Ipp8u) (pRefIntraTypes[NIT2LIN[m_cur_mb.CurrentBlockNeighbours.mbs_left[3].block_num]] + 1); } else { // MB left in slice but not INTRA, use mode 2 (+1) uModeLeft[3] = 2+1; } } else { uModeLeft[3] = 0; } for (block=0; block<4; block++) { uAboveIndex = (block & 1) * 2; // 0,2,0,2 uLeftIndex = (block & 2); // 0,0,2,2 // upper left 4x4 // Predicted mode is minimum of the above and left modes, or // mode 2 if above or left is outside slice, indicated by 0 in // mode array. uPredMode = MIN(uModeLeft[uLeftIndex], uModeAbove[uAboveIndex]); if (uPredMode) uPredMode--; else uPredMode = 2; // If next bitstream bit is 1, use predicted mode, else read new mode if (m_pBitStream->Get1Bit() == 0) { // get 3 more bits to determine new mode uBSMode = (Ipp8u)m_pBitStream->GetBits(3); if (uBSMode < uPredMode) uPredMode = uBSMode; else uPredMode = uBSMode + 1; } // Save mode pMBIntraTypes[0] = uPredMode; uModeAbove[uAboveIndex] = uPredMode + 1; // upper right 4x4 uPredMode = MIN(uPredMode+1, uModeAbove[uAboveIndex+1]); if (uPredMode) uPredMode--; else uPredMode = 2; if (m_pBitStream->Get1Bit() == 0) { uBSMode = (Ipp8u)m_pBitStream->GetBits(3); if (uBSMode < uPredMode) uPredMode = uBSMode; else uPredMode = uBSMode + 1; } pMBIntraTypes[1] = uPredMode; uModeAbove[uAboveIndex+1] = uPredMode + 1; uModeLeft[uLeftIndex] = uPredMode + 1; // lower left 4x4 uPredMode = MIN(uModeLeft[uLeftIndex+1], uModeAbove[uAboveIndex]); if (uPredMode) uPredMode--; else uPredMode = 2; if (m_pBitStream->Get1Bit() == 0) { uBSMode = (Ipp8u)m_pBitStream->GetBits(3); if (uBSMode < uPredMode) uPredMode = uBSMode; else uPredMode = uBSMode + 1; } pMBIntraTypes[2] = uPredMode; uModeAbove[uAboveIndex] = uPredMode + 1; // lower right 4x4 (above and left must always both be in slice) uPredMode = MIN(uPredMode+1, uModeAbove[uAboveIndex+1]) - 1; if (m_pBitStream->Get1Bit() == 0) { uBSMode = (Ipp8u)m_pBitStream->GetBits(3); if (uBSMode < uPredMode) uPredMode = uBSMode; else uPredMode = uBSMode + 1; } pMBIntraTypes[3] = uPredMode; uModeAbove [uAboveIndex+1] = uPredMode + 1; uModeLeft [uLeftIndex+1] = uPredMode + 1; pMBIntraTypes += 4; } // block return UMC_OK;} // decodeIntraTypesIpp8u H264VideoDecoder::DecodeCBP_CAVLC(Ipp32u mbtype,Ipp8u color_fromat){ Ipp8u index; Ipp8u cbp = 255; index = (Ipp8u) m_pBitStream->GetVLCElement(false); if (index < 48) { if (mbtype==MBTYPE_INTRA) cbp = dec_cbp_intra[color_fromat][index]; else cbp = dec_cbp_inter[color_fromat][index]; } return cbp;}Status H264VideoDecoder::DecodeCoeffsIntra16x16_CAVLC(Ipp32u /*cbp*/){ // this variable used only in debug purposes Ipp32u blockcbp; Ipp32u uBlock; Ipp32u uBlockBit = 2; Ipp32u uNC = 0; Ipp32u cbp4x4; Ipp32u uAboveIndex; Ipp32u uLeftIndex; Ipp16s sNumCoeff; Status ps; Ipp8u bFieldDecodeFlag = pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo); // Luma DC 16x16 decode uNC=GetDCBlocksLumaContext(); ps = m_pBitStream->GetCAVLCInfoLuma(uNC, 16, sNumCoeff, m_pCoeffBlocksWrite, m_pCurrentFrame->m_PictureStructureForDec<FRM_STRUCTURE || bFieldDecodeFlag,-1); if (ps != UMC_OK) return ps; m_mbinfo.mbs[m_CurMBAddr].cbp4x4 |= (sNumCoeff ? 1 : 0); blockcbp = m_cur_mb.LocalMacroblockInfo->cbp4x4 >> 1; // bits for blocks with coeffs will be set below cbp4x4 = m_cur_mb.LocalMacroblockInfo->cbp4x4 & 1; // Luma AC decode for (uBlock = 1; uBlock < FIRST_DC_CHROMA; uBlock++) { uAboveIndex = BlockNumToMBCol[uBlock];//((uBlock-1)&1) + (((uBlock-1)&4)>>1); uLeftIndex = BlockNumToMBRow[uBlock]; sNumCoeff = 0; if ((blockcbp & 1) != 0) { uNC=GetBlocksLumaContext(uAboveIndex,uLeftIndex); //------------------------------------------- // Get CAVLC-code coefficient info from bitstream. Following call // updates pbs, bitOffset, sNumCoeff, sNumTrOnes, TrOneSigns, // and uTotalZero and fills CoeffBuf and uRunBeforeBuf. bFieldDecodeFlag = pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo); ps = m_pBitStream->GetCAVLCInfoLuma(uNC, 15, sNumCoeff, m_pCoeffBlocksWrite, m_pCurrentFrame->m_PictureStructureForDec<FRM_STRUCTURE || bFieldDecodeFlag,-1); if (ps != UMC_OK) return ps; cbp4x4 |= sNumCoeff?uBlockBit:0; } // Update num coeff storage for predicting future blocks m_mbinfo.MacroblockCoeffsInfo[m_CurMBAddr].numCoeff[uLeftIndex * 4 + uAboveIndex] = (Ipp8u)sNumCoeff; blockcbp >>= 1; uBlockBit <<= 1; } // uBlock // Chroma DC decode for (uBlock = FIRST_DC_CHROMA; uBlock < FIRST_AC_CHROMA; uBlock++) { if ((blockcbp & 1) != 0) { ps = m_pBitStream->GetCAVLCInfoChroma ( sNumCoeff, m_pCoeffBlocksWrite); if (ps != UMC_OK) return ps; cbp4x4 |= sNumCoeff?uBlockBit:0; } blockcbp >>= 1; // Can't early exit without setting numcoeff for rest of blocks if ((blockcbp == 0) && (uBlock == (FIRST_AC_CHROMA - 1))) { // no AC chroma coeffs, set chroma NumCoef buffers to zero and exit //pMB->numCoeff[16]=pMB->numCoeff[17]=pMB->numCoeff[18]=pMB->numCoeff[19]= //pMB->numCoeff[20]=pMB->numCoeff[21]=pMB->numCoeff[22]=pMB->numCoeff[23]=0; goto done; } uBlockBit <<= 1; } // uBlock // Chroma AC decode for (uBlock = FIRST_AC_CHROMA; uBlock < 27; uBlock++) { uAboveIndex = BlockNumToMBCol[uBlock]; uLeftIndex = BlockNumToMBRow[uBlock]; sNumCoeff = 0; if ((blockcbp & 1) != 0) { uNC=GetBlocksChromaContext(uAboveIndex,uLeftIndex, uBlock > 22); // Get CAVLC-code coefficient info from bitstream. Following call // updates pbs, bitOffset, sNumCoeff, sNumTrOnes, TrOneSigns, // and uTotalZero and fills CoeffBuf and uRunBeforeBuf. bFieldDecodeFlag = pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo); ps = m_pBitStream->GetCAVLCInfoLuma(uNC, 15, sNumCoeff, m_pCoeffBlocksWrite, m_pCurrentFrame->m_PictureStructureForDec<FRM_STRUCTURE || bFieldDecodeFlag,-1); if (ps != UMC_OK) return ps; cbp4x4 |= sNumCoeff?uBlockBit:0; } // Update num coeff storage for predicting future blocks m_mbinfo.MacroblockCoeffsInfo[m_CurMBAddr].numCoeff[uBlock - FIRST_AC_CHROMA + 16] = (Ipp8u)sNumCoeff; blockcbp >>= 1; uBlockBit <<= 1; } // uBlock // update buffer position pointerdone: m_mbinfo.mbs[m_CurMBAddr].cbp4x4 = cbp4x4; return ps;} // decodeCoefficientsStatus H264VideoDecoder::DecodeCoeffs4x4_CAVLC(Ipp32u cbp){ // this variable used only in debug purposes Status ps = UMC_OK; Ipp32u blockcbp; Ipp32u u8x8block = 1; Ipp32u uBlock; Ipp32u uBlockBit; Ipp32u uNC; Ipp32u uAboveIndex; Ipp32u uLeftIndex; Ipp16s sNumCoeff; Ipp8u bFieldDecodeFlag = pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo); // Initialize blockcbp bits from input cbp (from the bitstream) blockcbp = 0; // no coeffs for (uBlock=0; uBlock<6; uBlock++) { if (cbp & u8x8block) blockcbp |= blockcbp_table[uBlock]; u8x8block <<= 1; } uBlock = 1; // start block loop with first luma 4x4 uBlockBit = 2; blockcbp >>= 1; for (uBlock = 1; uBlock<FIRST_DC_CHROMA; uBlock++) { uAboveIndex = BlockNumToMBCol[uBlock]; uLeftIndex = BlockNumToMBRow[uBlock]; sNumCoeff = 0; if ((blockcbp & 1) != 0) { uNC=GetBlocksLumaContext(uAboveIndex,uLeftIndex); // Get CAVLC-code coefficient info from bitstream. Following call // updates pbs, bitOffset, sNumCoeff, sNumTrOnes, TrOneSigns, // and uTotalZero and fills CoeffBuf and uRunBeforeBuf. ps = m_pBitStream->GetCAVLCInfoLuma(uNC, 16, sNumCoeff, m_pCoeffBlocksWrite, m_pCurrentFrame->m_PictureStructureForDec<FRM_STRUCTURE || bFieldDecodeFlag,-1); if (ps != UMC_OK) return ps; m_mbinfo.mbs[m_CurMBAddr].cbp4x4 |= (sNumCoeff ? uBlockBit : 0); } // Update num coeff storage for predicting future blocks m_mbinfo.MacroblockCoeffsInfo[m_CurMBAddr].numCoeff[uLeftIndex * 4 + uAboveIndex] = (Ipp8u) sNumCoeff; blockcbp >>= 1; uBlockBit <<= 1; } // uBlock for (uBlock = FIRST_DC_CHROMA; uBlock < FIRST_AC_CHROMA; uBlock++) { if ((blockcbp & 1) != 0) { ps = m_pBitStream->GetCAVLCInfoChroma ( sNumCoeff, m_pCoeffBlocksWrite); if (ps != UMC_OK) return ps; m_mbinfo.mbs[m_CurMBAddr].cbp4x4 |= (sNumCoeff ? uBlockBit : 0); } blockcbp >>= 1; // Can't early exit without setting numcoeff for rest of blocks if ((blockcbp == 0) && (uBlock == (FIRST_AC_CHROMA - 1))) { // no AC chroma coeffs, set chrroma NumCoef buffers to zero and exit //pMB->numCoeff[16]=pMB->numCoeff[17]=pMB->numCoeff[18]=pMB->numCoeff[19]= //pMB->numCoeff[20]=pMB->numCoeff[21]=pMB->numCoeff[22]=pMB->numCoeff[23]=0; goto done; } uBlockBit <<= 1; } // uBlock for (uBlock = FIRST_AC_CHROMA; uBlock < 27; uBlock++) { uAboveIndex = BlockNumToMBCol[uBlock]; uLeftIndex = BlockNumToMBRow[uBlock]; sNumCoeff = 0; if ((blockcbp & 1) != 0) { uNC=GetBlocksChromaContext(uAboveIndex,uLeftIndex,uBlock > 22); // Get CAVLC-code coefficient info from bitstream. Following call // updates pbs, bitOffset, sNumCoeff, sNumTrOnes, TrOneSigns, // and uTotalZero and fills CoeffBuf and uRunBeforeBuf. bFieldDecodeFlag = pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo); ps = m_pBitStream->GetCAVLCInfoLuma(uNC, 15, sNumCoeff, m_pCoeffBlocksWrite, m_pCurrentFrame->m_PictureStructureForDec<FRM_STRUCTURE || bFieldDecodeFlag,-1); if (ps != UMC_OK) return ps; m_mbinfo.mbs[m_CurMBAddr].cbp4x4 |= (sNumCoeff ? uBlockBit : 0); } // Update num coeff storage for predicting future blocks m_mbinfo.MacroblockCoeffsInfo[m_CurMBAddr].numCoeff[uBlock - FIRST_AC_CHROMA + 16] = (Ipp8u)sNumCoeff; blockcbp >>= 1; uBlockBit <<= 1; } // uBlock // update buffer position pointerdone: return ps;} // decodeCoefficients}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -