📄 umc_vc1_choose_table.cpp
字号:
IppiSize roiSize;
roiSize.width = pContext->m_seqLayerHeader->widthMB * VC1_PIXEL_IN_LUMA;
roiSize.height = HeightMB * VC1_PIXEL_IN_LUMA;
if (0 == StartMBPos)
FirstLastMask |= 1;
if (pContext->m_seqLayerHeader->heightMB == (StartMBPos + HeightMB))
FirstLastMask |= 2;
ExpandRows(pContext->m_pCurrMB->currYPlane, roiSize.width, roiSize.height, pContext->m_pCurrMB->currYPitch, 64, FirstLastMask);
ExpandRows(pContext->m_pCurrMB->currUPlane, roiSize.width/2, roiSize.height/2, pContext->m_pCurrMB->currUPitch, 32, FirstLastMask);
ExpandRows(pContext->m_pCurrMB->currVPlane, roiSize.width/2, roiSize.height/2, pContext->m_pCurrMB->currVPitch, 32, FirstLastMask);
}
void ExpandPlane(Ipp8u* StartPtr, Ipp32s width, Ipp32s height, Ipp32s pitch, Ipp32s padSize)
{
Ipp32s i, m;
Ipp8u *p, *p1, *pc;
IppiSize roiSize;
//Area (1)
p = StartPtr + pitch * (height - 1);
pc = p + pitch;
roiSize.height = padSize;
roiSize.width = width;
ippiCopy_8u_C1R(p, 0, pc, pitch, roiSize);
//Area (2)
p = StartPtr;
p1 = StartPtr + width;
m = height + padSize;
for(i = 0; i < m; i++)
{
ippsSet_8u(p[0], p-padSize, padSize);
ippsSet_8u(p1[-1], p1, padSize);
p += pitch;
p1 += pitch;
}
//Area (3)
p = StartPtr - padSize;
pc = p - pitch;
m = width + 2*padSize;
roiSize.width = m;
ippiCopy_8u_C1R(p, 0, pc, -pitch, roiSize);
}
void ExpandPlane_Interlace(Ipp8u* StartPtr, Ipp32s width, Ipp32s height, Ipp32s pitch, Ipp32s padSize)
{
Ipp32s i, m;// j;
Ipp8u *p, *p1, *pc;
IppiSize roiSize;
//Area (1)
p = StartPtr + pitch * (height - 1);
pc = p + 2*pitch;
roiSize.height = padSize/2;
roiSize.width = width;
ippiCopy_8u_C1R(p, 0, pc, 2*pitch, roiSize);
p = StartPtr + pitch * (height - 2);
pc = p + 2*pitch;
ippiCopy_8u_C1R(p, 0, pc, 2*pitch, roiSize);
//Area (2)
p = StartPtr;
p1 = StartPtr + width;
m = height + padSize;
for(i = 0; i < m; i++)
{
ippsSet_8u(p[0], p-padSize, padSize);
ippsSet_8u(p1[-1], p1, padSize);
p += pitch;
p1 += pitch;
}
//Area (3)
p = StartPtr - padSize;
pc = p - 2*pitch;
m = width + 2*padSize;
roiSize.width = m;
ippiCopy_8u_C1R(p, 0, pc, -2*pitch, roiSize);
p = StartPtr + pitch - padSize;
pc = p - 2*pitch;
m = width + 2*padSize;
roiSize.width = m;
ippiCopy_8u_C1R(p, 0, pc, -2*pitch, roiSize);
}
void ExpandPlane_Field(Ipp8u* StartPtr, Ipp32s width, Ipp32s height, Ipp32s pitch, Ipp32s padSize,Ipp32s bottom)
{
Ipp32s i, m;
Ipp8u *p, *p1, *pc;
Ipp32s offset_up = 0, offset_down =0;
IppiSize roiSize;
if (bottom)
{
offset_down = 1;
offset_up = pitch;
} else
{
offset_down = 2;
offset_up = 0;
}
//Area (1)
p = StartPtr + pitch * (height - offset_down);
pc = p + 2*pitch;
roiSize.height = padSize/2;
roiSize.width = width;
ippiCopy_8u_C1R(p, 0, pc, 2*pitch, roiSize);
//Area (2)
p = StartPtr + offset_up;
p1 = StartPtr + width + offset_up;
m = height + padSize;
for(i = 0; i < m/2; i++)
{
ippsSet_8u(p[0], p-padSize, padSize);
ippsSet_8u(p1[-1], p1, padSize);
p += 2*pitch;
p1 += 2*pitch;
}
//Area (3)
p = StartPtr +offset_up - padSize;
pc = p - 2*pitch;
m = width + 2*padSize;
roiSize.width = m;
ippiCopy_8u_C1R(p, 0, pc, -2*pitch, roiSize);
}
void ExpandFrame(Frame* pFrame,IppiSize roiSize)
{
if(pFrame->m_bIsExpanded == 0)
{
ExpandPlane(pFrame->m_pY, roiSize.width, roiSize.height, pFrame->m_iYPitch, 64);
ExpandPlane(pFrame->m_pU, roiSize.width/2, roiSize.height/2, pFrame->m_iUPitch, 32);
ExpandPlane(pFrame->m_pV, roiSize.width/2, roiSize.height/2, pFrame->m_iVPitch, 32);
pFrame->m_bIsExpanded = 1;
}
}
void ExpandFrame_Adv(VC1Context* pContext, Frame* pFrame)
{
Ipp32s width = 2*(pContext->m_seqLayerHeader->MAX_CODED_WIDTH+1);
Ipp32s height = 2*(pContext->m_seqLayerHeader->MAX_CODED_HEIGHT+1);
if(pFrame->m_bIsExpanded == 0)
{
ExpandPlane(pFrame->m_pY, width, height, pFrame->m_iYPitch, 64);
ExpandPlane(pFrame->m_pU, width/2, height/2, pFrame->m_iUPitch, 32);
ExpandPlane(pFrame->m_pV, width/2, height/2, pFrame->m_iVPitch, 32);
pFrame->m_bIsExpanded = 1;
}
}
void ExpandFrame_Interlace(VC1Context* pContext, Frame* pFrame)
{
Ipp32s width = 2*(pContext->m_seqLayerHeader->MAX_CODED_WIDTH+1);
Ipp32s height = 2*(pContext->m_seqLayerHeader->MAX_CODED_HEIGHT+1);
if((pFrame->m_bIsExpanded == 0)||(pContext->m_picLayerHeader->FCM == VC1_FieldInterlace))
{
ExpandPlane_Interlace(pFrame->m_pY, width, height, pFrame->m_iYPitch, 64);
ExpandPlane_Interlace(pFrame->m_pU, width/2, height/2, pFrame->m_iUPitch, 32);
ExpandPlane_Interlace(pFrame->m_pV, width/2, height/2, pFrame->m_iVPitch, 32);
pFrame->m_bIsExpanded = 1;
}
}
void ExpandFrame_Field(VC1Context* pContext, Frame* pFrame, Ipp32u bottom_field)
{
Ipp32s width = 2*(pContext->m_seqLayerHeader->MAX_CODED_WIDTH+1);
Ipp32s height = 2*(pContext->m_seqLayerHeader->MAX_CODED_HEIGHT+1);
ExpandPlane_Field(pFrame->m_pY, width, height, pFrame->m_iYPitch, 64, bottom_field);
ExpandPlane_Field(pFrame->m_pU, width/2, height/2, pFrame->m_iUPitch, 32, bottom_field);
ExpandPlane_Field(pFrame->m_pV, width/2, height/2, pFrame->m_iVPitch, 32, bottom_field);
}
void ChooseMBModeInterlaceFrame(VC1Context* pContext,
Ipp32u MV4SWITCH,
Ipp32u MBMODETAB)
{
if(MV4SWITCH == 1)
{
pContext->m_picLayerHeader->m_pMBMode =
pContext->m_vlcTbl->MBMODE_INTERLACE_FRAME_TABLES[MBMODETAB];
}
else
{
pContext->m_picLayerHeader->m_pMBMode =
pContext->m_vlcTbl->MBMODE_INTERLACE_FRAME_TABLES[MBMODETAB+4];
}
}
void ChooseMBModeInterlaceField(VC1Context* pContext, Ipp32s MBMODETAB)
{
if(pContext->m_picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV)
{
pContext->m_picLayerHeader->m_pMBMode =
pContext->m_vlcTbl->MBMODE_INTERLACE_FIELD_MIXED_TABLES[MBMODETAB];
}
else
{
pContext->m_picLayerHeader->m_pMBMode =
pContext->m_vlcTbl->MBMODE_INTERLACE_FIELD_TABLES[MBMODETAB];
}
}
void ChoosePredScaleValuePPictbl(VC1PictureLayerHeader* picLayerHeader)
{
if(picLayerHeader->CurrField == 0)
{
picLayerHeader->m_pCurrPredScaleValuePPictbl
= &VC1_PredictScaleValuesPPicTbl1[picLayerHeader->REFDIST];
}
else
picLayerHeader->m_pCurrPredScaleValuePPictbl
= &VC1_PredictScaleValuesPPicTbl2[picLayerHeader->REFDIST];
}
void ChoosePredScaleValueBPictbl(VC1PictureLayerHeader* picLayerHeader)
{
Ipp32u FREFDIST = ((picLayerHeader->ScaleFactor * picLayerHeader->REFDIST) >> 8);
Ipp32u BREFDIST = picLayerHeader->REFDIST - FREFDIST - 1;
picLayerHeader->m_pCurrPredScaleValueB_BPictbl = &VC1_PredictScaleValuesBPicTbl1[BREFDIST];
picLayerHeader->m_pCurrPredScaleValueP_BPictbl[1] = &VC1_PredictScaleValuesPPicTbl1[BREFDIST];
if(picLayerHeader->CurrField == 0)
picLayerHeader->m_pCurrPredScaleValueP_BPictbl[0] = &VC1_PredictScaleValuesPPicTbl1[FREFDIST];
else
picLayerHeader->m_pCurrPredScaleValueP_BPictbl[0] = &VC1_PredictScaleValuesPPicTbl2[FREFDIST];
}
#endif //UMC_ENABLE_VC1_VIDEO_DECODER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -