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

📄 umc_vc1_dec_mv_adv.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        {
            MV_px[0] = MVPred.AMVPred[blk_num]->mv[0][0];
            MV_py[0] = MVPred.AMVPred[blk_num]->mv[0][1];
        }
        validPredictors++;
    }

    if(MVPred.BMVPred[blk_num])
    {
        if(MVPred.FieldMB[blk_num][1])
        {
            MV_px[1] = (MVPred.BMVPred[blk_num]->mv[0][0] + MVPred.BMVPred[blk_num]->mv_bottom[0][0] + 1)>>1;
            MV_py[1] = (MVPred.BMVPred[blk_num]->mv[0][1] + MVPred.BMVPred[blk_num]->mv_bottom[0][1] + 1)>>1;
        }
        else
        {
            MV_px[1] = MVPred.BMVPred[blk_num]->mv[0][0];
            MV_py[1] = MVPred.BMVPred[blk_num]->mv[0][1];
        }
        validPredictors++;
    }

    if(MVPred.CMVPred[blk_num])
    {
        if(MVPred.FieldMB[blk_num][2])
        {
            MV_px[2] = (MVPred.CMVPred[blk_num]->mv[0][0] + MVPred.CMVPred[blk_num]->mv_bottom[0][0] + 1)>>1;
            MV_py[2] = (MVPred.CMVPred[blk_num]->mv[0][1] + MVPred.CMVPred[blk_num]->mv_bottom[0][1] + 1)>>1;
        }
        else
        {
            MV_px[2] = MVPred.CMVPred[blk_num]->mv[0][0];
            MV_py[2] = MVPred.CMVPred[blk_num]->mv[0][1];
        }
        validPredictors++;
    }

    //computing frame predictors
    if (validPredictors > 1)
    {
        // 2 or 3 predictors are available
        *pPredMVx = (Ipp16s)median3(MV_px);
        *pPredMVy = (Ipp16s)median3(MV_py);
    }
    else
    {
        // 1 or 0 predictor is available
        *pPredMVx = MV_px[0]+MV_px[1]+MV_px[2];
        *pPredMVy = MV_py[0]+MV_py[1]+MV_py[2];
    }
}


//       ---- ----            ---- ----
//      | B  | C  |          | C  | B  | (LAST MB in row)
//  ---- ---- ----     or     ---- ----
// | A  |Cur |               | A  |Cur |
//  ---- ----                 ---- ----
void PredictInterlaceFrame1MV(VC1Context* pContext)
{
    VC1MVPredictors MVPred;
    VC1MB* pCurrMB = pContext->m_pCurrMB;

    Ipp32u LeftTopRightPositionFlag = pCurrMB->LeftTopRightPositionFlag;
    Ipp32s width = pContext->m_pSingleMB->widthMB;
    VC1MB *pA = NULL, *pB = NULL, *pC = NULL;

    memset(&MVPred,0,sizeof(VC1MVPredictors));

    //A predictor
    if(VC1_IS_NO_LEFT_MB(LeftTopRightPositionFlag))
    {
        pA=(pContext->m_pCurrMB - 1);

        if(!pA->IntraFlag)
        {
            if(VC1_GET_MBTYPE(pA->mbType) == VC1_MB_1MV_INTER ||   VC1_GET_MBTYPE(pA->mbType) == VC1_MB_2MV_INTER)
                MVPred.AMVPred[0] = &pA->m_pBlocks[0];
            else
                MVPred.AMVPred[0] = &pA->m_pBlocks[1];

            MVPred.FieldMB[0][0] = VC1_IS_MVFIELD(pA->mbType);
        }
    }

    if (VC1_IS_NO_TOP_MB(LeftTopRightPositionFlag))
    {
        //B predictor
        pB=(pContext->m_pCurrMB - width);

        if(!pB->IntraFlag)
        {
            if(VC1_GET_MBTYPE(pB->mbType) == VC1_MB_4MV_INTER)
                MVPred.BMVPred[0] = &pB->m_pBlocks[2];
            else
                MVPred.BMVPred[0] = &pB->m_pBlocks[0];

            MVPred.FieldMB[0][1] = VC1_IS_MVFIELD(pB->mbType);
        }

        //C predictor
        if (VC1_IS_NO_RIGHT_MB(LeftTopRightPositionFlag))
        {
            //this block is not last in row
            pC=(pContext->m_pCurrMB - width + 1);
            if(!pC->IntraFlag)
            {
                if(VC1_GET_MBTYPE(pC->mbType) == VC1_MB_4MV_INTER)
                    MVPred.CMVPred[0] = &pC->m_pBlocks[2];
                else
                    MVPred.CMVPred[0] = &pC->m_pBlocks[0];

                MVPred.FieldMB[0][2] = VC1_IS_MVFIELD(pC->mbType);
            }
        }
        else
        {
            //this block is last in row
            pC=(pContext->m_pCurrMB - width -1);
            if(!pC->IntraFlag)
            {
                if(VC1_GET_MBTYPE(pC->mbType) == VC1_MB_4MV_INTER)
                    MVPred.CMVPred[0] = &pC->m_pBlocks[3];
                else if (VC1_GET_MBTYPE(pC->mbType) == VC1_MB_4MV_FIELD_INTER)
                    MVPred.CMVPred[0] = &pC->m_pBlocks[1];
                else
                    MVPred.CMVPred[0] = &pC->m_pBlocks[0];
                MVPred.FieldMB[0][2] = VC1_IS_MVFIELD(pC->mbType);
            }
        }
    }

    memcpy(&pContext->MVPred,&MVPred,sizeof(VC1MVPredictors));
}


void PredictInterlace4MVFrame_Adv(VC1Context* pContext)
{
    VC1MVPredictors MVPred;
    VC1MB* pCurrMB = pContext->m_pCurrMB;

    Ipp32u LeftTopRightPositionFlag = pCurrMB->LeftTopRightPositionFlag;
    Ipp32s width = pContext->m_pSingleMB->widthMB;
    VC1MB *pA = NULL, *pB = NULL, *pC = NULL;

    memset(&MVPred,0,sizeof(VC1MVPredictors));

    // A predictor
    if(VC1_IS_NO_LEFT_MB(LeftTopRightPositionFlag))
    {
        pA=(pCurrMB - 1); //candidate for blocks 0 and 2

        if(!pA->IntraFlag)
        {
            if(VC1_GET_MBTYPE(pA->mbType) == VC1_MB_1MV_INTER || VC1_GET_MBTYPE(pA->mbType) == VC1_MB_2MV_INTER)
            {
                //block 0
                MVPred.AMVPred[0] = &pA->m_pBlocks[0];
                //block 2
                MVPred.AMVPred[2] = &pA->m_pBlocks[0];
            }
            else if(VC1_GET_MBTYPE(pA->mbType) == VC1_MB_4MV_INTER)
            {
                //block 0
                MVPred.AMVPred[0] = &pA->m_pBlocks[1];
                //block 2
                MVPred.AMVPred[2] = &pA->m_pBlocks[3];
            }
            else
            {
                //block 0
                MVPred.AMVPred[0] = &pA->m_pBlocks[1];
                //block 2
                MVPred.AMVPred[2] = &pA->m_pBlocks[1];
            }

            MVPred.FieldMB[0][0] = VC1_IS_MVFIELD(pA->mbType);
            MVPred.FieldMB[2][0] = MVPred.FieldMB[0][0];
        }
    }

    if(VC1_IS_NO_TOP_MB(LeftTopRightPositionFlag))
    {
        // B predictor
        pB=(pCurrMB - width);
        if(!pB->IntraFlag)
        {
            if(VC1_GET_MBTYPE(pB->mbType) == VC1_MB_1MV_INTER || VC1_GET_MBTYPE(pB->mbType) == VC1_MB_2MV_INTER)
            {
                //block 0
                MVPred.BMVPred[0] = &pB->m_pBlocks[0];
                //block 1
                MVPred.BMVPred[1] = &pB->m_pBlocks[0];
            }
            else if(VC1_GET_MBTYPE(pB->mbType) == VC1_MB_4MV_INTER)
            {
                //block 0
                MVPred.BMVPred[0] = &pB->m_pBlocks[2];
                //block 1
                MVPred.BMVPred[1] = &pB->m_pBlocks[3];
            }
            else
            {
                //block 0
                MVPred.BMVPred[0] = &pB->m_pBlocks[0];
                //block 1
                MVPred.BMVPred[1] = &pB->m_pBlocks[1];
            }
            MVPred.FieldMB[0][1] = VC1_IS_MVFIELD(pB->mbType);
            MVPred.FieldMB[1][1] = MVPred.FieldMB[0][1];
        }

        // C predictor
        if (VC1_IS_NO_RIGHT_MB(LeftTopRightPositionFlag))
        {
            //this block is not last in row
            pC=(pCurrMB - width + 1);
            if(!pC->IntraFlag)
            {
                if(VC1_GET_MBTYPE(pC->mbType) != VC1_MB_4MV_INTER)
                {
                    //block 0
                    MVPred.CMVPred[0] = &pC->m_pBlocks[0];
                    //block 1
                    MVPred.CMVPred[1] = &pC->m_pBlocks[0];
                }
                else
                {
                    //block 0
                    MVPred.CMVPred[0] = &pC->m_pBlocks[2];
                    //block 1
                    MVPred.CMVPred[1] = &pC->m_pBlocks[2];
                }
                MVPred.FieldMB[0][2] = VC1_IS_MVFIELD(pC->mbType);
                MVPred.FieldMB[1][2] = MVPred.FieldMB[0][2];
            }
        }
        else
        {
            //this block is last in row
            pC=(pCurrMB - width -1);
            if(!pC->IntraFlag)
            {
                if(VC1_GET_MBTYPE(pC->mbType) == VC1_MB_1MV_INTER || VC1_GET_MBTYPE(pC->mbType) == VC1_MB_2MV_INTER)
                {
                    //block 0
                    MVPred.CMVPred[0] = &pC->m_pBlocks[0];
                    //block 1
                    MVPred.CMVPred[1] = &pC->m_pBlocks[0];
                }
                else if(VC1_GET_MBTYPE(pC->mbType) == VC1_MB_4MV_INTER)
                {
                    //block 0
                    MVPred.CMVPred[0] = &pC->m_pBlocks[3];
                    //block 1
                    MVPred.CMVPred[1] = &pC->m_pBlocks[3];
                }
                else
                {
                    //block 0
                    MVPred.CMVPred[0] = &pC->m_pBlocks[1];
                    //block 1
                    MVPred.CMVPred[1] = &pC->m_pBlocks[1];
                }
                MVPred.FieldMB[0][2] = VC1_IS_MVFIELD(pC->mbType);
                MVPred.FieldMB[1][2] = MVPred.FieldMB[0][2];
            }
        }
    }

    MVPred.AMVPred[1] = &pCurrMB->m_pBlocks[0];
    MVPred.BMVPred[2] = &pCurrMB->m_pBlocks[0];
    MVPred.CMVPred[2] = &pCurrMB->m_pBlocks[1];
    MVPred.AMVPred[3] = &pCurrMB->m_pBlocks[2];
    MVPred.BMVPred[3] = &pCurrMB->m_pBlocks[0];
    MVPred.CMVPred[3] = &pCurrMB->m_pBlocks[1];

    memcpy(&pContext->MVPred,&MVPred,sizeof(VC1MVPredictors));
}

void PredictInterlace4MVField_Adv(VC1Context* pContext)
{
    VC1MVPredictors MVPred;
    VC1MB* pCurrMB = pContext->m_pCurrMB;

    Ipp32u LeftTopRightPositionFlag = pCurrMB->LeftTopRightPositionFlag;
    Ipp32s width = pContext->m_pSingleMB->widthMB;
    VC1MB *pA = NULL, *pB = NULL, *pC = NULL;

    memset(&MVPred,0,sizeof(VC1MVPredictors));

    // A predictor
    if(VC1_IS_NO_LEFT_MB(LeftTopRightPositionFlag))
    {
        pA=(pCurrMB - 1);

        if(!pA->IntraFlag)
        {
            switch(VC1_GET_MBTYPE(pA->mbType))
            {
            case VC1_MB_1MV_INTER:
                {
                    MVPred.AMVPred[0] = &pA->m_pBlocks[0];
                    MVPred.AMVPred[2] = &pA->m_pBlocks[0];
                }
                break;
            case VC1_MB_2MV_INTER:
                {
                    MVPred.AMVPred[0] = &pA->m_pBlocks[0];
                    MVPred.AMVPred[2] = &pA->m_pBlocks[0];
                    MVPred.FieldMB[2][0] = 1;
                }
                break;
            case VC1_MB_4MV_INTER:
                {
                    MVPred.AMVPred[0] = &pA->m_pBlocks[1];
                    MVPred.AMVPred[2] = &pA->m_pBlocks[3];
                }
                break;
            case VC1_MB_4MV_FIELD_INTER:
                {
                    MVPred.AMVPred[0] = &pA->m_pBlocks[1];
                    MVPred.AMVPred[2] = &pA->m_pBlocks[1];
                    MVPred.FieldMB[2][0] = 1;
                }
                break;
            default:
                pA=NULL;
                break;
            }
        }
    }

    if(VC1_IS_NO_TOP_MB(LeftTopRightPositionFlag))
    {
        // B predictor
        pB=(pCurrMB - width);
        if(!pB->IntraFlag)
        {
            switch(VC1_GET_MBTYPE(pB->mbType))
            {
            case VC1_MB_1MV_INTER:
                {
                    MVPred.BMVPred[0] = &pB->m_pBlocks[0];
                    MVPred.BMVPred[1] = &pB->m_pBlocks[0];
                    MVPred.BMVPred[2] = &pB->m_pBlocks[0];
                    MVPred.BMVPred[3] = &pB->m_pBlocks[0];
                }
                break;
            case VC1_MB_2MV_INTER:
                {
                    MVPred.BMVPred[0] = &pB->m_pBlocks[0];
                    MVPred.BMVPred[1] = &pB->m_pBlocks[0];
                    MVPred.BMVPred[2] = &pB->m_pBlocks[0];
                    MVPred.BMVPred[3] = &pB->m_pBlocks[0];
                    MVPred.FieldMB[2][1] = 1;
                    MVPred.FieldMB[3][1] = 1;
                }
                break;
            case VC1_MB_4MV_INTER:
                {
                    MVPred.BMVPred[0] = &pB->m_pBlocks[2];
                    MVPred.BMVPred[1] = &pB->m_pBlocks[3];
                    MVPred.BMVPred[2] = &pB->m_pBlocks[2];
                    MVPred.BMVPred[3] = &pB->m_pBlocks[3];
                }
                break;
            case VC1_MB_4MV_FIELD_INTER:
                {
                    MVPred.BMVPred[0] = &pB->m_pBlocks[0];
                    MVPred.BMVPred[1] = &pB->m_pBlocks[1];
                    MVPred.BMVPred[2] = &pB->m_pBlocks[0];
                    MVPred.BMVPred[3] = &pB->m_pBlocks[1];
                    MVPred.FieldMB[2][1] = 1;
                    MVPred.FieldMB[3][1] = 1;
                }
                break;
            default:
                pB=NULL;
                break;
            }
        }

        // C predictor
        if (VC1_IS_NO_RIGHT_MB(LeftTopRightPositionFlag))
        {
            //this block is not last in row

⌨️ 快捷键说明

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