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

📄 umc_vc1_enc_picture_sm.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:

    const Ipp16s                (*pTTMBVLC)[4][6] =  0;
    const Ipp8u                 (* pTTBlkVLC)[6] = 0;
    const Ipp8u                 *pSubPattern4x4VLC=0;
    bool                        bSubBlkTS           = m_pSequenceHeader->IsVSTransform() && (!(m_bVSTransform &&m_uiTransformType==VC1_ENC_8x8_TRANSFORM));
    fGetExternalEdge            pGetExternalEdge    = GetExternalEdge[m_uiMVMode==VC1_ENC_MIXED_QUARTER_BICUBIC][bSubBlkTS]; //4 MV, VTS
    fGetInternalEdge            pGetInternalEdge    = GetInternalEdge[m_uiMVMode==VC1_ENC_MIXED_QUARTER_BICUBIC][bSubBlkTS]; //4 MV, VTS

    fDeblockingLumaHor          pDeblockingLumaHor[2]  = {(bSubBlkTS)? DeblockingVSTLumaHor:DeblockingNOVSTLumaHor,
                                                          (bSubBlkTS)? DeblockingVSTLumaHorLast:DeblockingNOVSTLumaHorLast};

    fDeblockingChromaHor        pDeblockingChromaHor[2] = {(bSubBlkTS)? DeblockingVSTChromaHor:DeblockingNOVSTChromaHor,
                                                           (bSubBlkTS)? DeblockingVSTChromaHorLast:DeblockingNOVSTChromaHorLast};

    fDeblockingVSTLumaVer       pDeblockingLumaVer     =   (bSubBlkTS)? DeblockingVSTLumaVer:DeblockingNOVSTLumaVer;
    fDeblockingVSTLumaVer       pDeblockingLumaVerLast =   (bSubBlkTS)? DeblockingVSTLumaVerLast:DeblockingNOVSTLumaVerLast;

    fDeblockingVSTChromaVer     pDeblockingChromaVer     =  (bSubBlkTS)? DeblockingVSTChromaVer:DeblockingNOVSTChromaVer;
    fDeblockingVSTChromaVer     pDeblockingChromaVerLast =  (bSubBlkTS)? DeblockingVSTChromaVerLast:DeblockingNOVSTChromaVerLast;
    //fWriteDCSM                 pWriteDC       =  (m_uiQuant<=2)?
                                                    //pWriteDCSM[m_uiQuant-1]:pWriteDCSM[2];
    IppStatus                  ippSts  = ippStsNoErr;

#ifdef VC1_ENC_STAT
       m_pEncStat->Reset();
#endif

    if (m_uiQuant<5)
    {
        pTTMBVLC            =  TTMBVLC_HighRate;
        pTTBlkVLC           =  TTBLKVLC_HighRate;
        pSubPattern4x4VLC   =  SubPattern4x4VLC_HighRate;
    }
    else if (m_uiQuant<13)
    {
        pTTMBVLC            =  TTMBVLC_MediumRate;
        pTTBlkVLC           =  TTBLKVLC_MediumRate;
        pSubPattern4x4VLC   =  SubPattern4x4VLC_MediumRate;

    }
    else
    {
        pTTMBVLC            =  TTMBVLC_LowRate;
        pTTBlkVLC           =  TTBLKVLC_LowRate;
        pSubPattern4x4VLC   =  SubPattern4x4VLC_LowRate;
    }



    if (m_pSavedMV)
    {
        memset(m_pSavedMV,0,w*h*2*sizeof(Ipp16s));
    }

   TempBlock.InitBlocks(tempBuffer);

   err = m_pMBs->Reset();
   if (err != UMC::UMC_OK)
        return err;

    SetInterpolationParams(&sYInterpolation,&sUInterpolation,&sVInterpolation,
                           tempInterpolationBuffer,true);

    /* -------------------motion estimation------------------------------------*/
    err = SetMEParams_P(&MEParams,&MEFrame);
    if(err !=UMC::UMC_OK)
        return err;
STATISTICS_START_TIME(m_TStat->me_StartTime);

    if(!(m_pME->EstimateFrame(&MEParams,&MEFrame)))
        return UMC::UMC_ERR_INVALID_PARAMS;

STATISTICS_END_TIME(m_TStat->me_StartTime, m_TStat->me_EndTime, m_TStat->me_TotalTime);

    /* -------------------------------------------------------------------------*/
    for (i=0; i < h; i++)
    {
        for (j=0; j < w; j++)
        {

            bool                bIntra      = false;
            Ipp16s              xLuma        =  VC1_ENC_LUMA_SIZE*j;
            Ipp16s              xChroma      =  VC1_ENC_CHROMA_SIZE*j;

            Ipp16s              posY        =  VC1_ENC_LUMA_SIZE*i;
            sCoordinate         MVInt       = {0,0};
            sCoordinate         MVQuarter   = {0,0};
            sCoordinate         MV          = {0,0};
            Ipp8u               MBPattern   = 0;
            Ipp8u               CBPCY       = 0;

            VC1EncoderMBInfo  * pCurMBInfo  = m_pMBs->GetCurrMBInfo();
            VC1EncoderMBData  * pCurMBData  = m_pMBs->GetCurrMBData();

            VC1EncoderMBInfo* left        = m_pMBs->GetLeftMBInfo();
            VC1EncoderMBInfo* topLeft     = m_pMBs->GetTopLeftMBInfo();
            VC1EncoderMBInfo* top         = m_pMBs->GetTopMBInfo();
            VC1EncoderMBInfo* topRight    = m_pMBs->GetTopRightMBInfo();
            VC1EncoderCodedMB*  pCompressedMB = &(m_pCodedMB[w*i+j]);
            bIntra = (MEFrame.MBs[j + i*w].MbType == UMC::MbIntra);

            if (bIntra)
            {
                MV.x = 0;
                MV.y =0;

                pCompressedMB->Init(VC1_ENC_P_MB_INTRA);
                pCurMBInfo->Init(true);

                /*-------------------------- Compression ----------------------------------------------------------*/

                pCurMBData->CopyMBProg(pCurMBRow[0]+xLuma,  m_uiPlaneStep[0],
                                       pCurMBRow[1]+xChroma,m_uiPlaneStep[1],
                                       pCurMBRow[2]+xChroma,m_uiPlaneStep[2]);

                //only intra blocks:
                for (blk = 0; blk<6; blk++)
                {
                    roiSize.height = 8;
                    roiSize.width  = 8;
IPP_STAT_START_TIME(m_IppStat->IppStartTime);
                    _own_Diff8x8C_16s(128, pCurMBData->m_pBlock[blk], pCurMBData->m_uiBlockStep[blk], roiSize, 0);
IPP_STAT_END_TIME(m_IppStat->IppStartTime, m_IppStat->IppEndTime, m_IppStat->IppTotalTime);
STATISTICS_START_TIME(m_TStat->FwdQT_StartTime);
                    IntraTransformQuantACFunction(pCurMBData->m_pBlock[blk], pCurMBData->m_uiBlockStep[blk],
                                            DCQuant, doubleQuant);
STATISTICS_END_TIME(m_TStat->FwdQT_StartTime, m_TStat->FwdQT_EndTime, m_TStat->FwdQT_TotalTime);
                }

STATISTICS_START_TIME(m_TStat->Intra_StartTime);
                dACPrediction = DCACPredictionPFrameSM( pCurMBData,
                                                      ((left)? left->isIntra():0)? m_pMBs->GetLeftMBData():0,
                                                      ((top)? top->isIntra():0)? m_pMBs->GetTopMBData(): 0,
                                                      ((topLeft)? topLeft->isIntra():0)? m_pMBs->GetTopLeftMBData():0,
                                                       &TempBlock, defPredictor,direction);
STATISTICS_END_TIME(m_TStat->Intra_StartTime, m_TStat->Intra_EndTime, m_TStat->Intra_TotalTime);

                for (blk=0; blk<6; blk++)
                {
                    pCompressedMB->SaveResidual(    TempBlock.m_pBlock[blk],
                                                    TempBlock.m_uiBlockStep[blk],
                                                    VC1_Inter_8x8_Scan,
                                                    blk);
                }

                MBPattern = pCompressedMB->GetMBPattern();
                CBPCY = MBPattern;
                pCurMBInfo->SetMBPattern(MBPattern);
                pCompressedMB->SetACPrediction(dACPrediction);
                pCompressedMB->SetMBCBPCY(CBPCY);
                pCurMBInfo->SetEdgesIntra(i==0, j==0);

                // ------------------------------encoding (intra MB)-------------------------------------------
                {
#ifdef VC1_ENC_STAT
                    Ipp32u MBStart = pCodedPicture->GetCurrBit();
                    m_pEncStat->SetTypeBlock(1,j,i);
#endif
                     err = pCompressedMB->WriteMBHeaderP_INTRA    ( pCodedPicture,
                                                                    m_bRawBitplanes,
                                                                    MVDiffTablesVLC[m_uiMVTab],
                                                                    pCBPCYTable);
                     VC1_ENC_CHECK (err)

                    //Blocks coding
                    for (blk = 0; blk<6; blk++)
                    {
#ifdef VC1_ENC_STAT
                        Ipp32u BStart = pCodedPicture->GetCurrBit();
#endif
                        err = pCompressedMB->WriteBlock(pCodedPicture,pDCTableVLCIntra[blk],m_uiQuant,pACTablesSetIntra[blk],&ACEscInfo,blk);
                        VC1_ENC_CHECK (err)

#ifdef VC1_ENC_STAT
                        m_pEncStat->SetLenBlock(pCodedPicture->GetCurrBit()- BStart, j,i,blk);
#endif
                    }//for
#ifdef VC1_ENC_STAT
                    m_pEncStat->SetLenMB(pCodedPicture->GetCurrBit()- MBStart, j,i);
#endif
                 }//coding

#ifdef VC1_ENC_DEBUG_ON
            pDebug->SetMBType(VC1_ENC_P_MB_INTRA);
            pDebug->SetCPB(MBPattern, CBPCY);
            pDebug->SetQuant(m_uiQuant,m_bHalfQuant);
            pDebug->SetBlockDifference(pCurMBData->m_pBlock, pCurMBData->m_uiBlockStep);
#endif

                /*-------------------------- Reconstruction ----------------------------------------------------------*/
STATISTICS_START_TIME(m_TStat->Reconst_StartTime);
                if (bRaiseFrame)
                {
                    Ipp8u *pRFrameY = m_pRaisedPlane[0]+VC1_ENC_LUMA_SIZE*(j+i*m_uiRaisedPlaneStep[0]);
                    Ipp8u *pRFrameU = m_pRaisedPlane[1]+VC1_ENC_CHROMA_SIZE*(j+i*m_uiRaisedPlaneStep[1]);
                    Ipp8u *pRFrameV = m_pRaisedPlane[2]+VC1_ENC_CHROMA_SIZE*(j+i*m_uiRaisedPlaneStep[2]);

                    roiSize.height = 8;
                    roiSize.width  = 8;

                    for (blk=0;blk<6; blk++)
                    {
STATISTICS_START_TIME(m_TStat->InvQT_StartTime);
                        IntraInvTransformQuantACFunction(pCurMBData->m_pBlock[blk],pCurMBData->m_uiBlockStep[blk],
                                        TempBlock.m_pBlock[blk],TempBlock.m_uiBlockStep[blk],
                                        DCQuant, doubleQuant);
STATISTICS_END_TIME(m_TStat->InvQT_StartTime, m_TStat->InvQT_EndTime, m_TStat->InvQT_TotalTime);
IPP_STAT_START_TIME(m_IppStat->IppStartTime);
                        _own_Add8x8C_16s(128, TempBlock.m_pBlock[blk],TempBlock.m_uiBlockStep[blk],roiSize,0);
IPP_STAT_END_TIME(m_IppStat->IppStartTime, m_IppStat->IppEndTime, m_IppStat->IppTotalTime);
                    }
IPP_STAT_START_TIME(m_IppStat->IppStartTime);
                    ippiConvert_16s8u_C1R(TempBlock.m_pBlock[0],TempBlock.m_uiBlockStep[0],pRFrameY,m_uiRaisedPlaneStep[0],blkSizeLuma);
                    ippiConvert_16s8u_C1R(TempBlock.m_pBlock[4],TempBlock.m_uiBlockStep[4],pRFrameU,m_uiRaisedPlaneStep[1],blkSize);
                    ippiConvert_16s8u_C1R(TempBlock.m_pBlock[5],TempBlock.m_uiBlockStep[5],pRFrameV,m_uiRaisedPlaneStep[2],blkSize);
IPP_STAT_END_TIME(m_IppStat->IppStartTime, m_IppStat->IppEndTime, m_IppStat->IppTotalTime);
                }
STATISTICS_END_TIME(m_TStat->Reconst_StartTime, m_TStat->Reconst_EndTime, m_TStat->Reconst_TotalTime);
                /*------------------------------------------- ----------------------------------------------------------*/

            }
            else
            {
                /*--------------------------------------- Inter --------------------------------------------------*/

                sCoordinate                 MVIntChroma     = {0,0};
                sCoordinate                 MVQuarterChroma = {0,0};
                sCoordinate                 MVChroma       =  {0,0};

                sCoordinate                 *mvC=0, *mvB=0, *mvA=0;
                sCoordinate                 mv1, mv2, mv3;
                sCoordinate                 mvPred;
                sCoordinate                 mvDiff;
                eTransformType              BlockTSTypes[6] = { m_uiTransformType, m_uiTransformType,
                                                                m_uiTransformType, m_uiTransformType,
                                                                m_uiTransformType, m_uiTransformType};

                Ipp8u                       SubblockPattern[6]= {0};
                bool                        bMBTSType               = false;
                Ipp8s                       nFirstNonSkippedBlock = -1;
                Ipp8u                       hybrid = 0;


                MV.x  = (bMBHalf)? (MEFrame.MBs[j + i*w].MVs->x>>1)<<1:MEFrame.MBs[j + i*w].MVs->x;
                MV.y  = (bMBHalf)? (MEFrame.MBs[j + i*w].MVs->y>>1)<<1:MEFrame.MBs[j + i*w].MVs->y;
                if ((MV.x>>2)+(Ipp32s)(j*VC1_ENC_LUMA_SIZE) > (Ipp32s)(w*VC1_ENC_LUMA_SIZE))
                {
                    MV.x = (w - j)*VC1_ENC_LUMA_SIZE + (MV.x & 0x03);
                }
                if ((MV.y>>2)+(Ipp32s)(i*VC1_ENC_LUMA_SIZE) > (Ipp32s)(h*VC1_ENC_LUMA_SIZE))
                {
                    MV.y = (h - i)*VC1_ENC_LUMA_SIZE + (MV.y & 0x03);
                }
                if ((MV.x>>2)+(Ipp32s)(j*VC1_ENC_LUMA_SIZE) < -16)
                {
                    MV.x = (1 - (Ipp32s)j)*VC1_ENC_LUMA_SIZE ;
                }
                if ((MV.y>>2)+(Ipp32s)(i*VC1_ENC_LUMA_SIZE) < -16)
                {
                    MV.y = (1 - (Ipp32s)i)*VC1_ENC_LUMA_SIZE ;
                }


                if (bCalculateVSTransform)
                {
                    //copy from ME class
                    Ipp8u LumaTrans = MEFrame.MBs[j + i*w].BlockTrans;
                    Ipp8u BlockTrans = LumaTrans && 0x02;
                    Ipp32u blk_num = 0;

                    for(blk_num = 0; blk_num < 4; blk_num++)
                    {
                        BlockTSTypes[blk_num] = BlkTransformTypeTabl[BlockTrans];
                        LumaTrans>>=2;
                        BlockTrans = LumaTrans && 0x02;

                    }
                    BlockTSTypes[4] = BlkTransformTypeTabl[0];
                    BlockTSTypes[5] = BlkTransformTypeTabl[0];
                }

                /*---------------------------Compression ------------------------------------*/

                pCompressedMB->Init(VC1_ENC_P_MB_1MV);
                pCompressedMB->SetHalfMV (bMBHalf);
                pCompressedMB->SetTSType(BlockTSTypes);

                pCurMBInfo->Init(false);
                pCurMBInfo->SetMV(MV);

                GetIntQuarterMV(MV,&MVInt, &MVQuarter);
                CalculateCroma(MV,&MVChroma);
                pCurMBInfo->SetMVChroma(MV);
                GetIntQuarterMV(MVChroma,&MVIntChroma,&MVQuarterChroma);

STATISTICS_START_TIME(m_TStat->Inter_StartTime);
                GetMVPredictionP(true)
                PredictMV(mvA,mvB,mvC, &mvPred);
                ScalePredict(&mvPred, j*16*4,i*16*4,MVPredMBMin,MVPredMBMax);
                hybrid = HybridPrediction(&mvPred,&MV,mvA,mvC);
STATISTICS_END_TIME(m_TStat->Inter_StartTime, m_TStat->Inter_EndTime, m_TStat->Inter_TotalTime);

                mvDiff.x = MV.x - mvPred.x;
                mvDiff.y = MV.y - mvPred.y;

                pCompressedMB->SetHy

⌨️ 快捷键说明

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