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

📄 umc_vc1_dec_mb_interpolate_adv.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                pMB->pInterpolLumaSrc[back] = interp_params->pSrc;
                pMB->InterpolsrcLumaStep[back] = interp_params->srcStep;
            }
            else
            _own_ippiInterpolateQPBicubicIC_VC1_8u_C1R(interp_params);
             break;
        default:
            VM_ASSERT(0);
        }
    return VC1_OK;
}


static VC1Status InterpolateBlock_InterlaceFieldPictureLuma4MV(VC1Context* pContext,
                                                               Ipp8u *pDst,    Ipp32s dstStep,
                                                               Ipp32s blk_num, Ipp32s back)
{
    _IppVCInterpolate_8u*  interp_params = &pContext->interp_params_luma;
    Ipp32s index = (back)? pContext->m_frmBuff.m_iNextIndex:pContext->m_frmBuff.m_iPrevIndex;
    VC1MB *pMB = pContext->m_pCurrMB;
    VC1PictureLayerHeader* pPicHeader = pContext->m_picLayerHeader;

    Ipp8u* pRefData = NULL;
    Ipp32s refPitch;
    Ipp32s f = 0;

    Ipp16s xMV = pMB->m_pBlocks[blk_num].mv[back][0];
    Ipp16s yMV = pMB->m_pBlocks[blk_num].mv[back][1];

    //VM_Debug::GetInstance().vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field xMv, yMv %d, %d\n"),xMV,yMV);


    if ((pPicHeader->CurrField == 1) &&
        (((pPicHeader->NUMREF + pPicHeader->REFFIELD) ==0) ||
         (pPicHeader->NUMREF == 1) && (!pMB->m_pBlocks[blk_num].mv_s_polarity[back]) && (!back)))
    {
        index = pContext->m_frmBuff.m_iCurrIndex;
    }

    pRefData = pContext->m_frmBuff.m_pFrames[index].m_pY;
    refPitch = pContext->m_frmBuff.m_pFrames[index].m_iYPitch;

    f = CalcMVInterpolateFieldLuma(pContext, pMB->m_pBlocks[blk_num].mv_s_polarity[back], &xMV, &yMV);

  //VM_Debug::GetInstance().vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field X, Y %d, %d\n"),X,Y);
  //VM_Debug::GetInstance().vm_debug_frame(-1,VC1_PRED,VM_STRING("%block number %d \n"),blk_num );
  //VM_Debug::GetInstance().vm_debug_frame(-1,VC1_BFRAMES,VM_STRING("interpolation(%d block)MV(%d,%d) back=%d\n"),blk_num,xMV,yMV,back);
  //VM_Debug::GetInstance().vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field f %d\n"),f);

    xMV = xMV + offset_table_x[blk_num];
    yMV = yMV + offset_table_y[blk_num];

    if (f)
        pRefData += refPitch;
    refPitch  <<= 1;


    interp_params->pSrc = pRefData;
    interp_params->pDst = pDst;
    interp_params->dstStep = dstStep;

#ifdef VC1_DEBUG_ON
//    VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field luma%d, %d\n"),X,Y);
#endif
    //VM_Debug::GetInstance().vm_debug_frame(-1,VC1_PRED,VM_STRING(" vc1_MVMode1MV\n"));

    interp_params->dx = xMV&3;
    interp_params->dy = yMV&3;
    interp_params->pSrc += ( (xMV>>2) +( yMV>>2) * refPitch);

    interp_params->roiSize.width = 8;
    interp_params->roiSize.height = 8;


    _own_ippiInterpolateQPBicubicIC_VC1_8u_C1R(interp_params);
    return VC1_OK;
}

static Ipp32s CalcMVInterpolateFieldChroma(VC1Context* pContext, Ipp32s polarity,
                                      Ipp16s* xMV, Ipp16s* yMV)
{
    VC1SingletonMB* sMB = pContext->m_pSingleMB;
    VC1PictureLayerHeader* pPicHeader = pContext->m_picLayerHeader;
    Ipp32s X, Y;
    Ipp32s f = 0;

    X = pContext->m_pSingleMB->m_currMBXpos;
    Y = pContext->m_pSingleMB->m_currMBYpos;

   if (pPicHeader->CurrField)
       Y -= sMB->heightMB/2;

  DeriveSecondStageChromaMV(pContext, xMV, yMV);

  if(!polarity)
   {
       f = !pPicHeader->BottomField;
       *yMV = *yMV + (pPicHeader->BottomField<<2) - 2;
   }
   else
   {
       f = pPicHeader->BottomField;
   }

   CropChromaPullBack_Adv(pContext, xMV, yMV);

   *xMV = (Ipp16s)((X << 5) + *xMV);
   *yMV = (Ipp16s)((Y << 5) + *yMV);

    return f;
}

static VC1Status InterpolateBlock_InterlaceFieldPictureChroma1MV(VC1Context* pContext,
                                                                 Ipp8u* pDst1, Ipp32s dstStep1,
                                                                 Ipp8u* pDst2, Ipp32s dstStep2,
                                                                 Ipp32s back)
{
    _IppVCInterpolate_8u*  interp_params = &pContext->interp_params_chroma;
    VC1PictureLayerHeader* pPicHeader = pContext->m_picLayerHeader;

    VC1MB *pMB = pContext->m_pCurrMB;
    Ipp32s index = (back)? pContext->m_frmBuff.m_iNextIndex:pContext->m_frmBuff.m_iPrevIndex;

    Ipp8u* pRefData = NULL;

    Ipp16s xMV = pMB->m_pBlocks[0].mv[back][0];
    Ipp16s yMV = pMB->m_pBlocks[0].mv[back][1];

    Ipp32s f = 0;
    Ipp32s refPitch;

    if ((pPicHeader->CurrField == 1) &&
        (((pPicHeader->NUMREF + pPicHeader->REFFIELD) ==0) ||
         (pPicHeader->NUMREF == 1) && (!pMB->m_pBlocks[0].mv_s_polarity[back]) && (!back)))
    {
        index = pContext->m_frmBuff.m_iCurrIndex;
    }


    //1MV
    xMV = pMB->m_pBlocks[0].mv[back][0];
    yMV = pMB->m_pBlocks[0].mv[back][1];

    pMB->m_pBlocks[4].mv_s_polarity[back] = pMB->m_pBlocks[0].mv_s_polarity[back];
    pMB->m_pBlocks[5].mv_s_polarity[back] = pMB->m_pBlocks[0].mv_s_polarity[back];

    //VM_Debug::GetInstance().vm_debug_frame(-1,VC1_BFRAMES,VM_STRING("interpolation(%d block)MV(%d,%d) back=%d\n"),blk_num,xMV,yMV,back);

    refPitch  = pContext->m_frmBuff.m_pFrames[index].m_iUPitch;
    pRefData  = pContext->m_frmBuff.m_pFrames[index].m_pU;

    f = CalcMVInterpolateFieldChroma(pContext, pMB->m_pBlocks[4].mv_s_polarity[back], &xMV, &yMV);

    if (f)
        pRefData += refPitch;
    refPitch  <<= 1;

#ifdef VC1_DEBUG_ON
//    VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field chroma%d, %d\n"),X,Y);
#endif
    interp_params->roiSize.width = 8;
    interp_params->roiSize.height = 8;
    interp_params->dx = xMV&3;
    interp_params->dy = yMV&3;

    if((interp_params->dx + interp_params->dy == 0))
    {
        //U channel
        interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);
        pMB->pInterpolChromaUSrc[back] = interp_params->pSrc;
        pMB->InterpolsrcChromaUStep[back] = interp_params->srcStep;

        //V channel
        refPitch  = pContext->m_frmBuff.m_pFrames[index].m_iVPitch;
        pRefData  = pContext->m_frmBuff.m_pFrames[index].m_pV;

        if (f)
            pRefData += refPitch;
        refPitch  <<= 1;

        interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);

        pMB->pInterpolChromaVSrc[back] = interp_params->pSrc;
        pMB->InterpolsrcChromaVStep[back] = interp_params->srcStep;
    }
    else
    {
        //BLOCK 4
        interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);
        interp_params->pDst = pDst1;
        interp_params->dstStep = dstStep1;

        ippiInterpolateQPBilinear_VC1_8u_C1R(interp_params);

        //BLOCK 5
        refPitch  = pContext->m_frmBuff.m_pFrames[index].m_iVPitch;
        pRefData  = pContext->m_frmBuff.m_pFrames[index].m_pV;

        if (f)
            pRefData += refPitch;
        refPitch  <<= 1;

        interp_params->pDst = pDst2;
        interp_params->dstStep = dstStep2;
        interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);

        ippiInterpolateQPBilinear_VC1_8u_C1R(interp_params);
    }

    return VC1_OK;
}


static VC1Status InterpolateBlock_InterlaceFieldPictureChroma4MV(VC1Context* pContext,
                                                                 Ipp8u* pDst1, Ipp32s dstStep1,
                                                                 Ipp8u* pDst2, Ipp32s dstStep2,
                                                                 Ipp32s back)
{
    _IppVCInterpolate_8u*  interp_params = &pContext->interp_params_chroma;
    Ipp32s index = (back)? pContext->m_frmBuff.m_iNextIndex:pContext->m_frmBuff.m_iPrevIndex;
    VC1MB *pMB = pContext->m_pCurrMB;
    VC1PictureLayerHeader* pPicHeader = pContext->m_picLayerHeader;
    VC1SingletonMB* sMB = pContext->m_pSingleMB;

    Ipp8u* pRefData = NULL;

    Ipp16s xMV = pMB->m_pBlocks[0].mv[back][0];
    Ipp16s yMV = pMB->m_pBlocks[0].mv[back][1];

    Ipp32u MVBcount = 0;
    Ipp32u MVTcount = 0;

    Ipp32s f = 0;
    Ipp32s refPitch;

    if (pPicHeader->NUMREF)
    {
        //4MV NUMREF == 1
        Ipp32s count=0;
        sMB->MVcount =0;
        for (count = 0; count < 4; count++)
        {
            if((pMB->m_pBlocks[count].mv_s_polarity[back] + pPicHeader->BottomField) & 0x1)
            {
                sMB->xLuMVT[MVTcount] = pMB->m_pBlocks[count].mv[back][0];
                sMB->yLuMVT[MVTcount] = pMB->m_pBlocks[count].mv[back][1];
                ++MVTcount;
            }
            else
            {
                sMB->xLuMVB[MVBcount] = pMB->m_pBlocks[count].mv[back][0];
                sMB->yLuMVB[MVBcount] = pMB->m_pBlocks[count].mv[back][1];
                ++MVBcount;
            }
        }
        if (MVBcount == MVTcount)
        {
            sMB->MVcount = 2;
            pMB->m_pBlocks[4].mv_s_polarity[back] = 1;
            pMB->m_pBlocks[5].mv_s_polarity[back] = 1;

            if (pPicHeader->BottomField)
            {
                    sMB->x_LuMV = sMB->xLuMVB;
                    sMB->y_LuMV = sMB->yLuMVB;
            }
            else
            {
                    sMB->x_LuMV = sMB->xLuMVT;
                    sMB->y_LuMV = sMB->yLuMVT;
            }
        }
        else if (MVBcount > MVTcount)
        {
            pMB->m_pBlocks[4].mv_s_polarity[back] = pPicHeader->BottomField;
            pMB->m_pBlocks[5].mv_s_polarity[back] = pPicHeader->BottomField;

            sMB->MVcount = MVBcount;
            sMB->x_LuMV  = sMB->xLuMVB;
            sMB->y_LuMV  = sMB->yLuMVB;
        }
        else
        {
            pMB->m_pBlocks[4].mv_s_polarity[back] = !pPicHeader->BottomField;
            pMB->m_pBlocks[5].mv_s_polarity[back] = !pPicHeader->BottomField;

            sMB->MVcount = MVTcount;
            sMB->x_LuMV  = sMB->xLuMVT;
            sMB->y_LuMV  = sMB->yLuMVT;
        }

        Derive4MV_Field(sMB->MVcount,&xMV,&yMV, sMB->x_LuMV, sMB->y_LuMV);
    }
    else
    {
        //4MV NUMREF == 0
        Ipp32s count;
        for (count=0;count<4;count++)
        {
            sMB->xLuMV[count] = pMB->m_pBlocks[count].mv[back][0];
            sMB->yLuMV[count] = pMB->m_pBlocks[count].mv[back][1];
        }
         //NEED 4mv field one reference picture
        xMV = median4(sMB->xLuMV);
        yMV = median4(sMB->yLuMV);

        pMB->m_pBlocks[4].mv_s_polarity[back] = pMB->m_pBlocks[0].mv_s_polarity[back];
        pMB->m_pBlocks[5].mv_s_polarity[back] = pMB->m_pBlocks[0].mv_s_polarity[back];
    }

    if ((pPicHeader->CurrField == 1) &&
        (((pPicHeader->NUMREF + pPicHeader->REFFIELD) ==0) ||
         (pPicHeader->NUMREF == 1) && (!pMB->m_pBlocks[4].mv_s_polarity[back]) && (!back)))
    {
        index = pContext->m_frmBuff.m_iCurrIndex;
    }


    //VM_Debug::GetInstance().vm_debug_frame(-1,VC1_BFRAMES,VM_STRING("interpolation(%d block)MV(%d,%d) back=%d\n"),blk_num,xMV,yMV,back);

    refPitch  = pContext->m_frmBuff.m_pFrames[index].m_iUPitch;
    pRefData  = pContext->m_frmBuff.m_pFrames[index].m_pU;

    f = CalcMVInterpolateFieldChroma(pContext, pMB->m_pBlocks[4].mv_s_polarity[back], &xMV, &yMV);

    if (f)
        pRefData += refPitch;
    refPitch  <<= 1;

#ifdef VC1_DEBUG_ON
//    VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_PRED,VM_STRING("Before Interpolation field chroma%d, %d\n"),X,Y);
#endif
    interp_params->dx = xMV&3;
    interp_params->dy = yMV&3;

    if((interp_params->dx + interp_params->dy == 0))
    {
        //U channel
        interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);
        pMB->pInterpolChromaUSrc[back] = interp_params->pSrc;
        pMB->InterpolsrcChromaUStep[back] = interp_params->srcStep;

        //V channel
        refPitch  = pContext->m_frmBuff.m_pFrames[index].m_iVPitch;
        pRefData  = pContext->m_frmBuff.m_pFrames[index].m_pV;

        if (f)
            pRefData += refPitch;
        refPitch  <<= 1;

        interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);

        pMB->pInterpolChromaVSrc[back] = interp_params->pSrc;
        pMB->InterpolsrcChromaVStep[back] = interp_params->srcStep;
    }
    else
    {
        interp_params->roiSize.width = 8;
        interp_params->roiSize.height = 8;
        interp_params->pSrc = pRefData + ((xMV>>2) + (yMV>>2) * refPitch);
        interp_params->pDst = pDst1;
        interp_params->dstStep = dstStep1;

        ippiInterpolateQPBilinear_VC1_8u_C1R(interp_params);


        //BLOCK 5
        refPitch  = pContext->m_frmBuff.m_pFrames[index].m_iVPitch;
        pRefData  = pContext->m_frmBuff.m_pFrames[index].m_pV;

        if (f)
            pRefData += refPitch;
        refPitch  <<= 1;

        interp_params->pDst = pDst2;

⌨️ 快捷键说明

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