⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umc_h264_dec_decode_mb_types.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            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 + -