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

📄 umc_vc1_dec_mv_adv.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            pC=(pCurrMB - width + 1);
            if(!pC->IntraFlag)
            {
                switch(VC1_GET_MBTYPE(pC->mbType))
                {
                case VC1_MB_1MV_INTER:
                    {
                        MVPred.CMVPred[0] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[1] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[2] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[3] = &pC->m_pBlocks[0];
                    }
                    break;
                case VC1_MB_2MV_INTER:
                    {
                        MVPred.CMVPred[0] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[1] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[2] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[3] = &pC->m_pBlocks[0];
                        MVPred.FieldMB[2][2] = 1;
                        MVPred.FieldMB[3][2] = 1;
                    }
                    break;
                case VC1_MB_4MV_INTER:
                    {
                        MVPred.CMVPred[0] = &pC->m_pBlocks[2];
                        MVPred.CMVPred[1] = &pC->m_pBlocks[2];
                        MVPred.CMVPred[2] = &pC->m_pBlocks[2];
                        MVPred.CMVPred[3] = &pC->m_pBlocks[2];
                    }
                    break;
                case VC1_MB_4MV_FIELD_INTER:
                    {
                        MVPred.CMVPred[0] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[1] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[2] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[3] = &pC->m_pBlocks[0];
                        MVPred.FieldMB[2][2] = 1;
                        MVPred.FieldMB[3][2] = 1;
                    }
                    break;
                default:
                    pC=NULL;
                    break;
                }
            }
        }
        else
        {
            //this block is last in row
            pC=(pCurrMB - width -1);
            if(!pC->IntraFlag)
            {
                switch(VC1_GET_MBTYPE(pC->mbType))
                {
                case VC1_MB_1MV_INTER:
                    {
                        MVPred.CMVPred[0] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[1] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[2] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[3] = &pC->m_pBlocks[0];
                    }
                    break;
                case VC1_MB_2MV_INTER:
                    {
                        MVPred.CMVPred[0] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[1] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[2] = &pC->m_pBlocks[0];
                        MVPred.CMVPred[3] = &pC->m_pBlocks[0];
                        MVPred.FieldMB[2][2] = 1;
                        MVPred.FieldMB[3][2] = 1;
                    }
                    break;
                case VC1_MB_4MV_INTER:
                    {
                        MVPred.CMVPred[0] = &pC->m_pBlocks[3];
                        MVPred.CMVPred[1] = &pC->m_pBlocks[3];
                        MVPred.CMVPred[2] = &pC->m_pBlocks[3];
                        MVPred.CMVPred[3] = &pC->m_pBlocks[3];
                    }
                    break;
                case VC1_MB_4MV_FIELD_INTER:
                    {
                        MVPred.CMVPred[0] = &pC->m_pBlocks[1];
                        MVPred.CMVPred[1] = &pC->m_pBlocks[1];
                        MVPred.CMVPred[2] = &pC->m_pBlocks[1];
                        MVPred.CMVPred[3] = &pC->m_pBlocks[1];
                        MVPred.FieldMB[2][2] = 1;
                        MVPred.FieldMB[3][2] = 1;
                    }
                    break;
                default:
                    pC=NULL;
                    break;
                }
            }
        }
    }


    MVPred.AMVPred[1] = &pCurrMB->m_pBlocks[0];
    MVPred.AMVPred[3] = &pCurrMB->m_pBlocks[0];
    MVPred.FieldMB[3][0] = 1;

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

}
//2 Field MV candidate MV derivation
void PredictInterlace2MV_Field_Adv(VC1MB* pCurrMB,
                                   Ipp16s pPredMVx[2],Ipp16s pPredMVy[2],
                                   Ipp16s backTop, Ipp16s backBottom,
                                   Ipp32u widthMB)
{
    Ipp32u LeftTopRightPositionFlag = pCurrMB->LeftTopRightPositionFlag;
    Ipp32u OppositeTopField = 0;
    Ipp32u OppositeBottomField = 0;
    Ipp32u SameTopField = 0;
    Ipp32u SameBottomField = 0;

    Ipp16s MV_px[2][3] = {0,0,0,0,0,0};
    Ipp16s MV_py[2][3] = {0,0,0,0,0,0};

    Ipp16s MV_px_sameField[2][3] = {0,0,0,0,0,0};
    Ipp16s MV_py_sameField[2][3] = {0,0,0,0,0,0};

    Ipp16s MV_px_oppField[2][3] = {0,0,0,0,0,0};
    Ipp16s MV_py_oppField[2][3] = {0,0,0,0,0,0};

    VC1MB *pA = NULL, *pB = NULL, *pC = NULL;

    // 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:
                {
                    //add mv of A
                    //top field
                    MV_px[0][0] = pA->m_pBlocks[0].mv[backTop][0];
                    MV_py[0][0] = pA->m_pBlocks[0].mv[backTop][1];

                    //bottom field
                    MV_px[1][0] = pA->m_pBlocks[0].mv[backBottom][0];
                    MV_py[1][0] = pA->m_pBlocks[0].mv[backBottom][1];
                }
                break;
            case VC1_MB_2MV_INTER:
                {
                    //top field
                    //add the top field mv
                    MV_px[0][0] = pA->m_pBlocks[0].mv[backTop][0];
                    MV_py[0][0] = pA->m_pBlocks[0].mv[backTop][1];

                    //bottom field
                    //add the bottom field block mv
                    MV_px[1][0] = pA->m_pBlocks[0].mv_bottom[backBottom][0];
                    MV_py[1][0] = pA->m_pBlocks[0].mv_bottom[backBottom][1];
                }
                break;
            case VC1_MB_4MV_INTER:
                {
                    //top field
                    // add the top right block mv
                    MV_px[0][0] = pA->m_pBlocks[1].mv[backTop][0];
                    MV_py[0][0] = pA->m_pBlocks[1].mv[backTop][1];

                    //bottom field
                    //add the bottom right block mv
                    MV_px[1][0] = pA->m_pBlocks[3].mv[backBottom][0];
                    MV_py[1][0] = pA->m_pBlocks[3].mv[backBottom][1];
                }
                break;
            case VC1_MB_4MV_FIELD_INTER:
                {
                    //top field
                    //add the top right field mv
                    MV_px[0][0] = pA->m_pBlocks[1].mv[backTop][0];
                    MV_py[0][0] = pA->m_pBlocks[1].mv[backTop][1];

                    //bottom feild
                    //add the bottom right field mv
                    MV_px[1][0] = pA->m_pBlocks[1].mv_bottom[backBottom][0];
                    MV_py[1][0] = pA->m_pBlocks[1].mv_bottom[backBottom][1];
                }
                break;
            default:
                pA=NULL;
                break;
            }

            //classifying top candidate mv
            if(MV_py[0][0] & 4)
            {
                MV_px_oppField[0][OppositeTopField] = MV_px[0][0];
                MV_py_oppField[0][OppositeTopField] = MV_py[0][0];
                ++OppositeTopField;
            }
            else
            {
                MV_px_sameField[0][SameTopField] = MV_px[0][0];
                MV_py_sameField[0][SameTopField] = MV_py[0][0];
                ++SameTopField;
            }

            //classifying bottom candidate mv
            if(MV_py[1][0] & 4)
            {
                MV_px_oppField[1][OppositeBottomField] = MV_px[1][0];
                MV_py_oppField[1][OppositeBottomField] = MV_py[1][0];
                ++OppositeBottomField;
            }
            else
            {
                MV_px_sameField[1][SameBottomField] = MV_px[1][0];
                MV_py_sameField[1][SameBottomField] = MV_py[1][0];
                ++SameBottomField;
            }
        }
    }

    if(VC1_IS_NO_TOP_MB(LeftTopRightPositionFlag))
    {
        // B predictor
        pB=(pCurrMB - widthMB);
        if(!pB->IntraFlag)
        {
            switch(VC1_GET_MBTYPE(pB->mbType))
            {
            case VC1_MB_1MV_INTER:
                {
                    //top field
                    MV_px[0][1] = pB->m_pBlocks[0].mv[backTop][0];
                    MV_py[0][1] = pB->m_pBlocks[0].mv[backTop][1];

                    //bottom field
                    MV_px[1][1] = pB->m_pBlocks[0].mv[backBottom][0];
                    MV_py[1][1] = pB->m_pBlocks[0].mv[backBottom][1];
                }
                break;
            case VC1_MB_2MV_INTER:
                {
                    //top field
                    //add the top field mv
                    MV_px[0][1] = pB->m_pBlocks[0].mv[backTop][0];
                    MV_py[0][1] = pB->m_pBlocks[0].mv[backTop][1];

                    //bottom field
                    //add the bottom field mv
                    MV_px[1][1] = pB->m_pBlocks[0].mv_bottom[backBottom][0];
                    MV_py[1][1] = pB->m_pBlocks[0].mv_bottom[backBottom][1];
                }
                break;
            case VC1_MB_4MV_INTER:
                {
                    //top field
                    //add the bottom left block mv
                    MV_px[0][1] = pB->m_pBlocks[2].mv[backTop][0];
                    MV_py[0][1] = pB->m_pBlocks[2].mv[backTop][1];

                    //bottom field
                    //add the bottom left block mv
                    MV_px[1][1] = pB->m_pBlocks[2].mv[backBottom][0];
                    MV_py[1][1] = pB->m_pBlocks[2].mv[backBottom][1];
                }
                break;
            case VC1_MB_4MV_FIELD_INTER:
                {
                    //top field
                    //add the top left field mv
                    MV_px[0][1] = pB->m_pBlocks[0].mv[backTop][0];
                    MV_py[0][1] = pB->m_pBlocks[0].mv[backTop][1];

                    //bottom field
                    //add the bottom left field mv
                    MV_px[1][1] = pB->m_pBlocks[0].mv_bottom[backBottom][0];
                    MV_py[1][1] = pB->m_pBlocks[0].mv_bottom[backBottom][1];
                }
                break;
            default:
                pB=NULL;
                break;
            }

            //classifying top candidate mv
            if(MV_py[0][1] & 4)
            {
                MV_px_oppField[0][OppositeTopField] = MV_px[0][1];
                MV_py_oppField[0][OppositeTopField] = MV_py[0][1];
                ++OppositeTopField;
            }
            else
            {
                MV_px_sameField[0][SameTopField] = MV_px[0][1];
                MV_py_sameField[0][SameTopField] = MV_py[0][1];
                ++SameTopField;
            }

            //classifying bottom candidate mv
            if(MV_py[1][1] & 4)
            {
                MV_px_oppField[1][OppositeBottomField] = MV_px[1][1];
                MV_py_oppField[1][OppositeBottomField] = MV_py[1][1];
                ++OppositeBottomField;
            }
            else
            {
                MV_px_sameField[1][SameBottomField] = MV_px[1][1];
                MV_py_sameField[1][SameBottomField] = MV_py[1][1];
                ++SameBottomField;
            }
        }

        // C predictor
        if (VC1_IS_NO_RIGHT_MB(LeftTopRightPositionFlag))
        {
            //this block is not last in row
            pC=(pCurrMB - widthMB + 1);
            if(!pC->IntraFlag)
            {
                switch(VC1_GET_MBTYPE(pC->mbType))
                {
                case VC1_MB_1MV_INTER:
                    {
                        //top field
                        MV_px[0][2] = pC->m_pBlocks[0].mv[backTop][0];
                        MV_py[0][2] = pC->m_pBlocks[0].mv[backTop][1];

                        //bottom field
                        MV_px[1][2] = pC->m_pBlocks[0].mv[backBottom][0];
                        MV_py[1][2] = pC->m_pBlocks[0].mv[backBottom][1];
                    }
                    break;
                case VC1_MB_2MV_INTER:
                    {
                        //top field
                        //add the top field mv
                        MV_px[0][2] = pC->m_pBlocks[0].mv[backTop][0];
                        MV_py[0][2] = pC->m_pBlocks[0].mv[backTop][1];

                        //bottom field
                        //add the bottom field block mv
                        MV_px[1][2] = pC->m_pBlocks[0].mv_bottom[backBottom][0];
                        MV_py[1][2] = pC->m_pBlocks[0].mv_bottom[backBottom][1];
                    }
                    break;
                case VC1_MB_4MV_INTER:
                    {
                        //top field
                        //add the bottom left block mv
                        MV_px[0][2] = pC->m_pBlocks[2].mv[backTop][0];
                        MV_py[0][2] = pC->m_pBlocks[2].mv[backTop][1];

                        //bottom filed
                        MV_px[1][2] = pC->m_pBlocks[2].mv[backBottom][0];
                        MV_py[1][2] = pC->m_pBlocks[2].mv[backBottom][1];
                    }
                    break;
                case VC1_MB_4MV_FIELD_INTER:
                    {
                        //top field
                        //add the top left field block mv
                        MV_px[0][2] = pC->m_pBlocks[0].mv[backTop][0];
                        MV_py[0][2] = pC->m_pBlocks[0].mv[backTop][1];

                        //bottom field
                        MV_px[1][2] = pC->m_pBlocks[0].mv_bottom[backBottom][0];
                        MV_py[1][2] = pC->m_pBlocks[0].mv_bottom[backBottom][1];
                    }
                    break;
                default:
                    pC=NULL;
                    break;
                }

                //classifying top candidate mv
                if(MV_py[0][2] & 4)
                {
                    MV_px_oppField[0][OppositeTopField] = MV_px[0][2];
                    MV_py_oppField[0][OppositeTopField] = MV_py[0][2];
                    ++OppositeTopField;
                }
                else

⌨️ 快捷键说明

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