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

📄 umc_vc1_dec_job.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                IntraFlag >>= 1;
            }

            if (pContext->m_pCurrMB->mbType == VC1_MB_INTRA)
            {
                //write to plane
                STATISTICS_START_TIME(m_timeStatistics->write_plane_StartTime);

                if (pContext->m_picLayerHeader->FCM == VC1_FrameInterlace)
                    write_Intraluma_to_interlace_frame_Adv(pContext->m_pCurrMB, pContext->m_pBlock);
                else
                {

                    roiSize.height = VC1_PIXEL_IN_LUMA;
                    roiSize.width = VC1_PIXEL_IN_LUMA;

                    ippiConvert_16s8u_C1R(pContext->m_pBlock,
                        VC1_PIXEL_IN_LUMA*2,
                        pContext->m_pCurrMB->currYPlane,
                        pContext->m_pCurrMB->currYPitch,
                        roiSize);
                }

                roiSize.height = VC1_PIXEL_IN_CHROMA;
                roiSize.width = VC1_PIXEL_IN_CHROMA;

                ippiConvert_16s8u_C1R(pContext->m_pBlock+64*4,
                    VC1_PIXEL_IN_CHROMA*2,
                    pContext->m_pCurrMB->currUPlane,
                    pContext->m_pCurrMB->currUPitch,
                    roiSize);

                ippiConvert_16s8u_C1R(pContext->m_pBlock+64*5,
                    VC1_PIXEL_IN_CHROMA*2,
                    pContext->m_pCurrMB->currVPlane,
                    pContext->m_pCurrMB->currVPitch,
                    roiSize);

                STATISTICS_END_TIME(m_timeStatistics->write_plane_StartTime,
                    m_timeStatistics->write_plane_EndTime,
                    m_timeStatistics->write_plane_TotalTime);
            }
            else
            {
                roiSize.height = 8;
                roiSize.width = 8;

                //write to plane
                STATISTICS_START_TIME(m_timeStatistics->write_plane_StartTime);

                IntraFlag = pContext->m_pCurrMB->IntraFlag;
                for (Ipp32s blk_num = 0; blk_num<4 ;blk_num++)
                {
                    if (IntraFlag & 1) // from assignpattern
                    {
                        plane_offset = (blk_num&1)*8 + (blk_num&2)*4*pContext->m_pCurrMB->currYPitch;
                        ippiConvert_16s8u_C1R(&pContext->m_pBlock[offset_table[blk_num]],
                            VC1_PIXEL_IN_LUMA*2,
                            pContext->m_pCurrMB->currYPlane + plane_offset,
                            pContext->m_pCurrMB->currYPitch,
                            roiSize);
                    }
                    IntraFlag >>= 1;
                }
                //roiSize.height = VC1_PIXEL_IN_CHROMA;
                //roiSize.width = VC1_PIXEL_IN_CHROMA;

                if (IntraFlag & 1) // from assignpattern
                    ippiConvert_16s8u_C1R(pContext->m_pBlock+64*VC1_NUM_OF_LUMA,
                    VC1_PIXEL_IN_CHROMA*2,
                    pContext->m_pCurrMB->currUPlane,
                    pContext->m_pCurrMB->currUPitch,
                    roiSize);

                if (IntraFlag & 2) // from assignpattern
                    ippiConvert_16s8u_C1R(pContext->m_pBlock+64*5,
                    VC1_PIXEL_IN_CHROMA*2,
                    pContext->m_pCurrMB->currVPlane,
                    pContext->m_pCurrMB->currVPitch,
                    roiSize);

                STATISTICS_END_TIME(m_timeStatistics->write_plane_StartTime,
                    m_timeStatistics->write_plane_EndTime,
                    m_timeStatistics->write_plane_TotalTime);

                //#ifdef VC1_DEBUG_ON
                //        if (VC1_DEBUG&VC1_RESPEL)
                //            VM_Debug::GetInstance()._print_blocks(pContext);
                //        if (VC1_DEBUG&VC1_SMOOTHINT)
                //            VM_Debug::GetInstance()._print_macroblocks(pContext);
                //#endif
            }

#ifdef VC1_DEBUG_ON
            //if (VC1_DEBUG&VC1_RESPEL)
            //    VM_Debug::GetInstance()._print_blocks(pContext);
            //if (VC1_DEBUG&VC1_SMOOTHINT&&(!pContext->m_seqLayerHeader->OVERLAP))
            //   VM_Debug::GetInstance(VC1DebugRoutine)._print_macroblocks(pContext);
#endif

            ++pContext->m_pSingleMB->m_currMBXpos;
            pContext->m_pBlock += 8*8*6;
            ++pContext->m_pCurrMB;
            ++pContext->CurrDC;
        }

        pContext->m_pSingleMB->m_currMBXpos = 0;
        ++pContext->m_pSingleMB->m_currMBYpos;
        ++pContext->m_pSingleMB->slice_currMBYpos;
    }


    //pContext->m_pSingleMB->m_currMBXpos = 0;
    //pContext->m_pSingleMB->m_currMBYpos = pTask->m_pSlice->MBStartRow;
    //pContext->m_pBlock = pTask->m_pBlock;
    //pContext->m_pCurrMB = &pContext->m_MBs[pTask->m_pSlice->MBStartRow*m_pContext->m_seqLayerHeader->widthMB];



    return VC1_OK;
}


VC1Status VC1TaskProcessor::VC1MotionCompensation(VC1Context* pContext,VC1Task* pTask)
{

STATISTICS_START_TIME(m_timeStatistics->interpolation_StartTime);

/////////////////////////////////
//Need to correct
if(pContext->m_picLayerHeader->FCM != VC1_FieldInterlace)
{
    pContext->interp_params_luma.srcStep   = pContext->m_pSingleMB->currYPitch;
    pContext->interp_params_chroma.srcStep = pContext->m_pSingleMB->currUPitch;
    pContext->interp_params_luma.dstStep   = pContext->m_pSingleMB->currYPitch;
    pContext->interp_params_chroma.dstStep = pContext->m_pSingleMB->currUPitch;

}
else
{
    pContext->interp_params_luma.srcStep   = 2*pContext->m_pSingleMB->currYPitch;
    pContext->interp_params_chroma.srcStep = 2*pContext->m_pSingleMB->currUPitch;
    pContext->interp_params_luma.dstStep   = 2*pContext->m_pSingleMB->currYPitch;
    pContext->interp_params_chroma.dstStep = 2*pContext->m_pSingleMB->currUPitch;
}

pContext->interp_params_luma.roundControl   = pContext->m_picLayerHeader->RNDCTRL;
pContext->interp_params_chroma.roundControl = pContext->m_picLayerHeader->RNDCTRL;

for (Ipp32s i=0; i < pTask->m_pSlice->MBRowsToDecode;i++)
{
    for (Ipp32s j = 0; j < pContext->m_pSingleMB->widthMB; j++)
    {
        if(pContext->m_pCurrMB->mbType != VC1_MB_INTRA)
        {
            MotionComp_Adv[pContext->m_picLayerHeader->FCM*2+pContext->m_picLayerHeader->PTYPE-1](pContext);

            if (pContext->m_picLayerHeader->PTYPE != VC1_B_FRAME)
                SaveMV_tbl[pContext->m_picLayerHeader->FCM](pContext);
        }
        pContext->m_pPredBlock += 8*8*6;
        ++pContext->m_pSingleMB->m_currMBXpos;
        ++pContext->m_pCurrMB;
    }
    pContext->m_pSingleMB->m_currMBXpos = 0;
    ++pContext->m_pSingleMB->m_currMBYpos;
    ++pContext->m_pSingleMB->slice_currMBYpos;
}

STATISTICS_END_TIME(m_timeStatistics->interpolation_StartTime,
                    m_timeStatistics->interpolation_EndTime,
                    m_timeStatistics->interpolation_TotalTime);
    return VC1_OK;
}

VC1Status VC1TaskProcessor::VC1PrepPlane(VC1Context* pContext,VC1Task* pTask)
{
    Ipp32u offset_table[] = {0,8,128,136};
    Ipp32u plane_offset = 0;
    STATISTICS_START_TIME(m_timeStatistics->mc_StartTime);
    if(pContext->m_picLayerHeader->PTYPE == VC1_P_FRAME)
    {
        for (Ipp32s i = 0; i < pTask->m_pSlice->MBRowsToDecode;i++)
        {
            for (Ipp32s j = 0; j < pContext->m_pSingleMB->widthMB; j++)
            {
                if(!pContext->m_pCurrMB->IntraFlag)
                {
                    if (pContext->m_picLayerHeader->FCM !=VC1_FrameInterlace)
                    {
                        ippiMC16x16_8u_C1(pContext->m_pCurrMB->pInterpolLumaSrc[0],
                            pContext->m_pCurrMB->InterpolsrcLumaStep[0],
                            pContext->m_pBlock,
                            VC1_PIXEL_IN_LUMA*2,
                            pContext->m_pCurrMB->currYPlane,
                            pContext->m_pCurrMB->currYPitch, 0, 0);
                    }
                    else
                    {
                        write_Interluma_to_interlace_frame_MC_Adv(pContext->m_pCurrMB,
                           pContext->m_pCurrMB->pInterpolLumaSrc[0],
                           pContext->m_pCurrMB->InterpolsrcLumaStep[0],
                           pContext->m_pBlock);
                    }

                    ippiMC8x8_8u_C1(pContext->m_pCurrMB->pInterpolChromaUSrc[0],
                                    pContext->m_pCurrMB->InterpolsrcChromaUStep[0],
                                    &pContext->m_pBlock[4*64],
                                    VC1_PIXEL_IN_CHROMA*2,
                                    pContext->m_pCurrMB->currUPlane,
                                    pContext->m_pCurrMB->currUPitch, 0, 0);

                    ippiMC8x8_8u_C1(pContext->m_pCurrMB->pInterpolChromaVSrc[0],
                                    pContext->m_pCurrMB->InterpolsrcChromaVStep[0],
                                    &pContext->m_pBlock[5*64],
                                    VC1_PIXEL_IN_CHROMA*2,
                                    pContext->m_pCurrMB->currVPlane,
                                    pContext->m_pCurrMB->currVPitch, 0, 0);
                }
                else if(pContext->m_pCurrMB->mbType != VC1_MB_INTRA)
                {
                    if (pContext->m_picLayerHeader->FCM !=VC1_FrameInterlace)
                    {
                    for (Ipp32s blk_num = 0; blk_num<4 ;blk_num++)
                    {
                        if (!(pContext->m_pCurrMB->IntraFlag & (1<<blk_num))) // from assignpattern
                        {
                            plane_offset = (blk_num&1)*8 + (blk_num&2)*4*pContext->m_pCurrMB->InterpolsrcLumaStep[0];
                            ippiMC8x8_8u_C1(pContext->m_pCurrMB->pInterpolLumaSrc[0] + plane_offset,
                                pContext->m_pCurrMB->InterpolsrcLumaStep[0],
                                &pContext->m_pBlock[offset_table[blk_num]],
                                VC1_PIXEL_IN_LUMA*2,
                                pContext->m_pCurrMB->currYPlane + plane_offset,
                                pContext->m_pCurrMB->currYPitch, 0, 0);
                        }
                    }
                    }
                    else
                    {
                        write_Interluma_to_interlace_frame_MC_Adv(pContext->m_pCurrMB,
                            pContext->m_pCurrMB->pInterpolLumaSrc[0],
                            pContext->m_pCurrMB->InterpolsrcLumaStep[0],
                            pContext->m_pBlock);
                    }

                    if (!(pContext->m_pCurrMB->IntraFlag & (1<<4)))

                        ippiMC8x8_8u_C1(pContext->m_pCurrMB->pInterpolChromaUSrc[0],
                        pContext->m_pCurrMB->InterpolsrcChromaUStep[0],
                        &pContext->m_pBlock[4*64],
                        VC1_PIXEL_IN_CHROMA*2,
                        pContext->m_pCurrMB->currUPlane,
                        pContext->m_pCurrMB->currUPitch, 0, 0);

                    if (!(pContext->m_pCurrMB->IntraFlag & (1<<5)))
                        ippiMC8x8_8u_C1(pContext->m_pCurrMB->pInterpolChromaVSrc[0],
                        pContext->m_pCurrMB->InterpolsrcChromaVStep[0],
                        &pContext->m_pBlock[5*64],
                        VC1_PIXEL_IN_CHROMA*2,
                        pContext->m_pCurrMB->currVPlane,
                        pContext->m_pCurrMB->currVPitch, 0, 0);
                }
                //#ifdef VC1_DEBUG_ON
                //    if (VC1_DEBUG&VC1_RESPEL)
                //        VM_Debug::GetInstance()._print_blocks(pContext);
                //    if (VC1_DEBUG&VC1_SMOOTHINT)
                //        VM_Debug::GetInstance()._print_macroblocks(pContext);
                //#endif
    #ifdef VC1_DEBUG_ON
                if (VC1_DEBUG&VC1_RESPEL)
                    VM_Debug::GetInstance(VC1DebugRoutine)._print_blocks(pContext);
                //if (VC1_DEBUG&VC1_SMOOTHINT)
                //    VM_Debug::GetInstance()._print_macroblocks(pContext);
    #endif

                ++pContext->m_pCurrMB;
                pContext->m_pBlock += 8*8*6;
                pContext->m_pPredBlock +=8*8*6;
                pContext->m_pSingleMB->m_currMBXpos++;
            }

            pContext->m_pSingleMB->m_currMBXpos = 0;
            ++pContext->m_pSingleMB->m_currMBYpos;
            ++pContext->m_pSingleMB->slice_currMBYpos;
        }

    STATISTICS_END_TIME(m_timeStatistics->mc_StartTime,
        m_timeStatistics->mc_EndTime,
        m_timeStatistics->mc_TotalTime);
    }

    else //B Frames
        for (Ipp32s i=0; i < pTask->m_pSlice->MBRowsToDecode;i++)
        {
            for (Ipp32s j = 0; j < pContext->m_pSingleMB->widthMB; j++)
            {
                if(!pContext->m_pCurrMB->IntraFlag)
                {
                    if(pContext->m_pCurrMB->pInterpolLumaSrc[0] && pContext->m_pCurrMB->pInterpolLumaSrc[1])
                    {
                        if (pContext->m_picLayerHeader->FCM !=VC1_FrameInterlace)
                        {
                            ippiMC16x16B_8u_C1(pContext->m_pCurrMB->pInterpolLumaSrc[0],
                                            pContext->m_pCurrMB->InterpolsrcLumaStep[0], 0,
                                            pContext->m_pCurrMB->pInterpolLumaSrc[1],
                                            pContext->m_pCurrMB->InterpolsrcLumaStep[1], 0,
                                            pContext->m_pBlock,  VC1_PIXEL_IN_LUMA*2,
                                            pContext->m_pCurrMB->currYPlane,
                                            pContext->m_pCurrMB->currYPitch, 0);
                        }
                        else
                        {
                                write_Interluma_to_interlace_B_frame_MC_Adv(pContext->m_pCurrMB,
                                                pContext->m_pCurrMB->pInterpolLumaSrc[0] ,
                                                pContext->m_pCurrMB->InterpolsrcLumaStep[0],
                                                pContext->m_pCurrMB->pInterpolLumaSrc[1],
                                                pContext->m_pCurrMB->InterpolsrcLumaStep[1],
                                                pContext->m_pBlock);

                        }

                        ippiMC8x8B_8u_C1(pContext->m_pCurrMB->pInterpolChromaUSrc[0],
                                         pContext->m_pCurrMB->InterpolsrcChromaUStep[0], 0,
                                         pContext->m_pCurrMB->pInterpolChromaUSrc[1],
                                         pContext->m_pCurrMB->InterpolsrcChromaUStep[1], 0,
                                         &pContext->m_pBlock[4*64], VC1_PIXEL_IN_CHROMA*2,
                                         pContext->m_pCurrMB->currUPlane,
                                         pContext->m_pCurrMB->currUPitch, 0);

                        ippiMC8x8B_8u_C1(pContext->m_pCurrMB->pInterpolChromaVSrc[0],
                                         pContext->m_pCurrMB->InterpolsrcChromaVStep[0], 0,
                                         pContext->m_pCurrMB->pInterpolChromaVSrc[1],
                                         pContext->m_pCurrMB->InterpolsrcChromaVStep[1], 0,
                                         &pContext->m_pBlock[5*64], VC1_PIXEL_IN_CHROMA*2,
                                         pContext->m_pCurrMB->currVPlane,
                                         pContext->m_pCurrMB->currVPitch, 0);
                    }
                    else
                    {
                        Ipp32u back = (pContext->m_pCurrMB->pInterpolLumaSrc[0])?0:1;

                            if (pContext->m_picLayerHeader->FCM !=VC1_FrameInterlace)
                            {
                                ippiMC16x16_8u_C1(pContext->m_pCurrMB->pInterpolLumaSrc[back],
                                    pContext->m_pCurrMB->InterpolsrcLumaStep[back],
                                    pContext->m_pBlock,
                                    VC1_PIXEL_IN_LUMA*2,
                                    pContext->m_pCurrMB->currYPlane,
                                    pContext->m_pCurrMB->currYPitch, 0, 0);
                            }
                            else
                            {
                                write_Interluma_to_interlace_frame_MC_Adv(pContext->m_pCurrMB,
                                pContext->m_pCurrMB->pInterpolLumaSrc[back],
                                pContext->m_pCurrMB->InterpolsrcLumaStep[back],
                                pContext->m_pBlock);
                            }

                            ippiMC8x8_8u_C1(pContext->m_pCurrMB->pInterpolChromaUSrc[back],
                                            pContext->m_pCurrMB->InterpolsrcChromaUStep[back],
                                            &pContext->m_pBlock[4*64],
                                            VC1_PIXEL_IN_CHROMA*2,
                                            pContext->m_pCurrMB->currUPlane,
                                            pContext->m_pCurrMB->currUPitch, 0, 0);

                            ippiMC8x8_8u_C1(pContext->m_pCurrMB->pInterpolChromaVSrc[back],
                                            pContext->m_pCurrMB->InterpolsrcChromaVStep[back],
                                            &pContext->m_pBlock[5*64],
                                            VC1_PIXEL_IN_CHROMA*2,
                                            pContext->m_pCurrMB->currVPlane,
                                            pContext->m_pCurrMB->currVPitch, 0, 0);
                    }
                }
    #ifdef VC1_DEBUG_ON
                if (VC1_DEBUG&VC1_RESPEL)
                    VM_Debug::GetInstance(VC1DebugRoutine)._print_blocks(pContext);
    #endif

                ++pContext->m_pCurrMB;
                pContext->m_pBlock += 8*8*6;
                pContext->m_pPredBlock += 8*8*6;

⌨️ 快捷键说明

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