📄 umc_vc1_dec_job.cpp
字号:
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 + -