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

📄 umc_h264_dec_decode_mb.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        {        case MBTYPE_FORWARD:        case MBTYPE_BACKWARD:        case MBTYPE_BIDIR:            for (i = 0; i < 4; i++)            {                for (j = 0; j < 4; j++)                {                    pMVL0[j].mvx = (Ipp16s) mvxL0;                    pMVL0[j].mvy = (Ipp16s) mvyL0;                    pRefIndexL0[j] = RefIxL0;                }                pMVL0 += 4;                pRefIndexL0 += 4;            }            if (bIsBSlice)            {                for (i = 0; i < 4; i++)                {                    for (j = 0; j < 4; j++)                    {                        pMVL1[j].mvx = (Ipp16s) mvxL1;                        pMVL1[j].mvy = (Ipp16s) mvyL1;                        pRefIndexL1[j] = RefIxL1;                    }                    pMVL1 += 4;                    pRefIndexL1 += 4;                }            }            break;        case MBTYPE_INTER_16x8:            // store in 8 top or bottom half blocks            for (i = 0; i < 2; i++)            {                for (j = 0; j < 4; j++)                {                    pMVL0[j].mvx = (Ipp16s) mvxL0;                    pMVL0[j].mvy = (Ipp16s) mvyL0;                    pRefIndexL0[j] = RefIxL0;                }                pMVL0 += 4;                pRefIndexL0 += 4;            }            if (bIsBSlice)            {                for (i = 0; i < 2; i++)                {                    for (j = 0; j < 4; j++)                    {                        pMVL1[j].mvx = (Ipp16s) mvxL1;                        pMVL1[j].mvy = (Ipp16s) mvyL1;                        pRefIndexL1[j] = RefIxL1;                    }                    pMVL1 += 4;                    pRefIndexL1 += 4;                }                if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR)                    dec_refIxL1++;            }            block++;            sboffset=8;            if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR)                dec_refIxL0++;            dirPart = m_cur_mb.LocalMacroblockInfo->sbdir[block];        // next partition            break;        case MBTYPE_INTER_8x16:            // store in 8 left or right half blocks            for (i = 0; i < 4; i++)            {                for (j = 0; j < 2; j++)                {                    pMVL0[j].mvx = (Ipp16s) mvxL0;                    pMVL0[j].mvy = (Ipp16s) mvyL0;                    pRefIndexL0[j] = RefIxL0;                }                pMVL0 += 4;                pRefIndexL0 += 4;            }            if (bIsBSlice)            {                // store in 8 left or right half blocks                for (i = 0; i < 4; i++)                {                    for (j = 0; j < 2; j++)                    {                        pMVL1[j].mvx = (Ipp16s) mvxL1;                        pMVL1[j].mvy = (Ipp16s) mvyL1;                        pRefIndexL1[j] = RefIxL1;                    }                    pMVL1 += 4;                    pRefIndexL1 += 4;                }                if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR)                    dec_refIxL1++;            }            block++;            sboffset=2;            if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR)                dec_refIxL0++;            dirPart = m_cur_mb.LocalMacroblockInfo->sbdir[block];        // next partition            break;        case MBTYPE_INTER_8x8:        case MBTYPE_INTER_8x8_REF0:            switch (m_cur_mb.GlobalMacroblockInfo->sbtype[block>>2])            {            case SBTYPE_8x8:                pMVL0[0].mvx = (Ipp16s) mvxL0;                pMVL0[0].mvy = (Ipp16s) mvyL0;                pMVL0[1].mvx = (Ipp16s) mvxL0;                pMVL0[1].mvy = (Ipp16s) mvyL0;                pMVL0[4].mvx = (Ipp16s) mvxL0;                pMVL0[4].mvy = (Ipp16s) mvyL0;                pMVL0[4 + 1].mvx = (Ipp16s) mvxL0;                pMVL0[4 + 1].mvy = (Ipp16s) mvyL0;                pRefIndexL0[0] = RefIxL0;                pRefIndexL0[1] = RefIxL0;                pRefIndexL0[4] = RefIxL0;                pRefIndexL0[4+1] = RefIxL0;                if (bIsBSlice)                {                    pMVL1[0].mvx = (Ipp16s) mvxL1;                    pMVL1[0].mvy = (Ipp16s) mvyL1;                    pMVL1[1].mvx = (Ipp16s) mvxL1;                    pMVL1[1].mvy = (Ipp16s) mvyL1;                    pMVL1[4].mvx = (Ipp16s) mvxL1;                    pMVL1[4].mvy = (Ipp16s) mvyL1;                    pMVL1[4 + 1].mvx = (Ipp16s) mvxL1;                    pMVL1[4 + 1].mvy = (Ipp16s) mvyL1;                    pRefIndexL1[0] = RefIxL1;                    pRefIndexL1[1] = RefIxL1;                    pRefIndexL1[4] = RefIxL1;                    pRefIndexL1[4+1] = RefIxL1;                    if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR)                        dec_refIxL1++;                }                if (block == 4)                {                    sboffset += 8 - 2;                }                else                {                    sboffset += 2;                }                block += 4;                if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR)                    dec_refIxL0++;                break;            case SBTYPE_8x4:                pMVL0[0].mvx = (Ipp16s) mvxL0;                pMVL0[0].mvy = (Ipp16s) mvyL0;                pMVL0[1].mvx = (Ipp16s) mvxL0;                pMVL0[1].mvy = (Ipp16s) mvyL0;                pRefIndexL0[0] = RefIxL0;                pRefIndexL0[1] = RefIxL0;                if (bIsBSlice)                {                    pMVL1[0].mvx = (Ipp16s) mvxL1;                    pMVL1[0].mvy = (Ipp16s) mvyL1;                    pMVL1[1].mvx = (Ipp16s) mvxL1;                    pMVL1[1].mvy = (Ipp16s) mvyL1;                    pRefIndexL1[0] = RefIxL1;                    pRefIndexL1[1] = RefIxL1;                }                if (subblock == 1)                {                    if (block == 4)                    {                        sboffset+=2;                    }                    else                    {                        sboffset-=2;                    }                    block += 4;                    subblock = 0;                    if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR)                        dec_refIxL0++;                    if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR)                        dec_refIxL1++;                }                else                {                    subblock++;                    sboffset  += 4;                }                break;            case SBTYPE_4x8:                pMVL0[0].mvx = (Ipp16s) mvxL0;                pMVL0[0].mvy = (Ipp16s) mvyL0;                pMVL0[4].mvx = (Ipp16s) mvxL0;                pMVL0[4].mvy = (Ipp16s) mvyL0;                pRefIndexL0[0] = RefIxL0;                pRefIndexL0[4] = RefIxL0;                if (bIsBSlice)                {                    pMVL1[0].mvx = (Ipp16s) mvxL1;                    pMVL1[0].mvy = (Ipp16s) mvyL1;                    pMVL1[4].mvx = (Ipp16s) mvxL1;                    pMVL1[4].mvy = (Ipp16s) mvyL1;                    pRefIndexL1[0] = RefIxL1;                    pRefIndexL1[4] = RefIxL1;                }                if (subblock == 1)                {                    if (block == 4)                    {                        sboffset += 8 - 3;                    }                    else                    {                        sboffset++;                    }                    block += 4;                    subblock = 0;                    if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR)                        dec_refIxL0++;                    if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR)                        dec_refIxL1++;                }                else                {                    subblock++;                    sboffset++;                }                break;            case SBTYPE_4x4:                pMVL0[0].mvx = (Ipp16s) mvxL0;                pMVL0[0].mvy = (Ipp16s) mvyL0;                pRefIndexL0[0] = RefIxL0;                if (bIsBSlice)                {                    pMVL1[0].mvx = (Ipp16s) mvxL1;                    pMVL1[0].mvy = (Ipp16s) mvyL1;                    pRefIndexL1[0] = RefIxL1;                }                sboffset += (xyoff[block+subblock][0]>>2) +                    ((xyoff[block+subblock][1])>>2)*4;                if (subblock == 3)                {                    block += 4;                    subblock = 0;                    if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR)                        dec_refIxL0++;                    if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR)                        dec_refIxL1++;                }                else                {                    subblock++;                }                break;            case SBTYPE_DIRECT:                // nothing to do except advance to next 8x8 partition                if (block == 4)                {                    sboffset += 8 - 2;                }                else                {                    sboffset += 2;                }                block += 4;                break;            }    // 8x8 switch sbtype            if (block<16)            dirPart = m_cur_mb.LocalMacroblockInfo->sbdir[block>>2];        // next partition            break;        }    // switch mbtype    }    // for partCtrdone:    return status;}    // DecodeMotionVectors///////////////////////////////////////////////////////////////////////////////// DecodeSkipMotionVectors//// Used for computing motion vector for non-B frame SKIP macroblock. No MV// data is transmitted in the bitstream, MV from above and left are used as// MV predictors.//// Initializes MV for the MB in the non-zero case only.//// Returns true if zero MV is to be used for SKIP MB./////////////////////////////////////////////////////////////////////////////////boolH264VideoDecoder::DecodeSkipMotionVectors(){    Ipp32s pmvx, pmvy;    Ipp32s mvx, mvy;    Ipp32s px0, px1;    Ipp32s py0, py1;    Ipp8s slRefIx;    // ref index, sb to the left    Ipp8s saRefIx;    // ref index, sb to the left    bool bUseZeroMV = true;    bool bAboveMVIsZero;    bool bLeftMVIsZero;    H264DecoderMotionVector *sl; // pointer to MV, sb to the left    H264DecoderMotionVector *sa; // pointer to MV, sb above    H264DecoderMotionVector *MV = m_cur_mb.MVs[0]->MotionVectors;    Ipp8s *RefIndex = m_cur_mb.RefIdxs[0]->RefIdxs;    ///////////////////////////////////////////////////////////////////    if (m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num>=0 && m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num>=0)    {        // Both above and left are available        sl = &m_pCurrentFrame->m_mbinfo.MV[0][m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num].MotionVectors[m_cur_mb.CurrentBlockNeighbours.mbs_left[0].block_num];        sa = &m_pCurrentFrame->m_mbinfo.MV[0][m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num].MotionVectors[m_cur_mb.CurrentBlockNeighbours.mb_above.block_num];        slRefIx = m_pCurrentFrame->m_mbinfo.RefIdxs[0][m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num].RefIdxs[m_cur_mb.CurrentBlockNeighbours.mbs_left[0].block_num];        saRefIx = m_pCurrentFrame->m_mbinfo.RefIdxs[0][m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num].RefIdxs[m_cur_mb.CurrentBlockNeighbours.mb_above.block_num];        px0 = sl->mvx;        py0 = sl->mvy;        px1 = sa->mvx;        py1 = sa->mvy;        if (pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo) &&            !GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num]))        {            py0 /= 2;            slRefIx *=2;        }        if (!pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo) &&            GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num]))        {            py0 *= 2;            slRefIx  >>=1;        }        if (pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo)  &&            !GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num]))        {            py1 /= 2;            saRefIx*=2;        }        if (!pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo)  &&            GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num]))  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -