📄 umc_vc1_dec_seq.cpp
字号:
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->m_pLowMotionChromaDCDiff);
pContext->m_vlcTbl->m_pLowMotionChromaDCDiff = NULL;
}
if(pContext->m_vlcTbl->m_pHighMotionChromaDCDiff)
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->m_pHighMotionChromaDCDiff);
pContext->m_vlcTbl->m_pHighMotionChromaDCDiff = NULL;
}
if(pContext->m_vlcTbl->m_pCBPCY_Ipic)
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->m_pCBPCY_Ipic);
pContext->m_vlcTbl->m_pCBPCY_Ipic = NULL;
}
if(LowMotionInterACDecodeSet.pRLTable)
{
ippiHuffmanTableFree_32s(LowMotionInterACDecodeSet.pRLTable);
LowMotionInterACDecodeSet.pRLTable = NULL;
}
if(HighMotionInterACDecodeSet.pRLTable)
{
ippiHuffmanTableFree_32s(HighMotionInterACDecodeSet.pRLTable);
HighMotionInterACDecodeSet.pRLTable = NULL;
}
if(LowMotionIntraACDecodeSet.pRLTable)
{
ippiHuffmanTableFree_32s(LowMotionIntraACDecodeSet.pRLTable);
LowMotionIntraACDecodeSet.pRLTable = NULL;
}
if(HighMotionIntraACDecodeSet.pRLTable)
{
ippiHuffmanTableFree_32s(HighMotionIntraACDecodeSet.pRLTable);
HighMotionIntraACDecodeSet.pRLTable = NULL;
}
if(MidRateIntraACDecodeSet.pRLTable)
{
ippiHuffmanTableFree_32s(MidRateIntraACDecodeSet.pRLTable);
MidRateIntraACDecodeSet.pRLTable = NULL;
}
if(MidRateInterACDecodeSet.pRLTable)
{
ippiHuffmanTableFree_32s(MidRateInterACDecodeSet.pRLTable);
MidRateInterACDecodeSet.pRLTable = NULL;
}
if(HighRateIntraACDecodeSet.pRLTable)
{
ippiHuffmanTableFree_32s(HighRateIntraACDecodeSet.pRLTable);
HighRateIntraACDecodeSet.pRLTable = NULL;
}
if(HighRateInterACDecodeSet.pRLTable)
{
ippiHuffmanTableFree_32s(HighRateInterACDecodeSet.pRLTable);
HighRateInterACDecodeSet.pRLTable = NULL;
}
if(pContext->m_vlcTbl->m_Bitplane_IMODE)
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->m_Bitplane_IMODE);
pContext->m_vlcTbl->m_Bitplane_IMODE = NULL;
}
if(pContext->m_vlcTbl->m_BitplaneTaledbits)
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->m_BitplaneTaledbits);
pContext->m_vlcTbl->m_BitplaneTaledbits = NULL;
}
if(pContext->m_vlcTbl->REFDIST_TABLE)
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->REFDIST_TABLE);
pContext->m_vlcTbl->REFDIST_TABLE = NULL;
}
{
for(i = 0; i < 4; i++)
{
if(pContext->m_vlcTbl->MVDIFF_PB_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->MVDIFF_PB_TABLES[i]);
pContext->m_vlcTbl->MVDIFF_PB_TABLES[i] = NULL;
}
}
}
{
for(i = 0; i < 4; i++)
{
if(pContext->m_vlcTbl->CBPCY_PB_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->CBPCY_PB_TABLES[i]);
pContext->m_vlcTbl->CBPCY_PB_TABLES[i] = NULL;
}
}
}
{
for(i = 0; i < 3; i++)
{
if(pContext->m_vlcTbl->TTMB_PB_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->TTMB_PB_TABLES[i]);
pContext->m_vlcTbl->TTMB_PB_TABLES[i] = NULL;
}
}
}
{
for(i = 0; i < 8; i++)
{
if(pContext->m_vlcTbl->MBMODE_INTERLACE_FRAME_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->MBMODE_INTERLACE_FRAME_TABLES[i]);
pContext->m_vlcTbl->MBMODE_INTERLACE_FRAME_TABLES[i] = NULL;
}
}
}
{
for(i = 0; i < 4; i++)
{
if(pContext->m_vlcTbl->MV2BP_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->MV2BP_TABLES[i]);
pContext->m_vlcTbl->MV2BP_TABLES[i] = NULL;
}
}
}
{
for(i = 0; i < 3; i++)
{
if(pContext->m_vlcTbl->TTBLK_PB_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->TTBLK_PB_TABLES[i]);
pContext->m_vlcTbl->TTBLK_PB_TABLES[i] = NULL;
}
}
}
{
for(i = 0; i < 3; i++)
{
if(pContext->m_vlcTbl->SBP_PB_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->SBP_PB_TABLES[i]);
pContext->m_vlcTbl->SBP_PB_TABLES[i] = NULL;
}
}
}
{
for(i = 0; i < 4; i++)
{
if(pContext->m_vlcTbl->MV4BP_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->MV4BP_TABLES[i]);
pContext->m_vlcTbl->MV4BP_TABLES[i] = NULL;
}
}
}
{
for(i = 0; i < 8; i++)
{
if(pContext->m_vlcTbl->CBPCY_PB_INTERLACE_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->CBPCY_PB_INTERLACE_TABLES[i]);
pContext->m_vlcTbl->CBPCY_PB_INTERLACE_TABLES[i] = NULL;
}
}
}
{
for(i = 0; i < 8; i++)
{
if(pContext->m_vlcTbl->MBMODE_INTERLACE_FIELD_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->MBMODE_INTERLACE_FIELD_TABLES[i]);
pContext->m_vlcTbl->MBMODE_INTERLACE_FIELD_TABLES[i] = NULL;
}
}
}
{
for(i = 0; i < 8; i++)
{
if(pContext->m_vlcTbl->MBMODE_INTERLACE_FIELD_MIXED_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->MBMODE_INTERLACE_FIELD_MIXED_TABLES[i]);
pContext->m_vlcTbl->MBMODE_INTERLACE_FIELD_MIXED_TABLES[i] = NULL;
}
}
}
{
for(i = 0; i < 12; i++)
{
if(pContext->m_vlcTbl->MV_INTERLACE_TABLES[i])
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->MV_INTERLACE_TABLES[i]);
pContext->m_vlcTbl->MV_INTERLACE_TABLES[i] = 0;
}
}
}
if(pContext->m_vlcTbl->BFRACTION)
{
ippiHuffmanTableFree_32s(pContext->m_vlcTbl->BFRACTION);
pContext->m_vlcTbl->BFRACTION = NULL;
}
}
Ipp32u DecodeBegin(VC1Context* pContext, Ipp32u stream_subtype)
{
VM_ASSERT(pContext != NULL);
Ipp32u width = 0;
Ipp32u height = 0;
Ipp32s temp_value;
Ipp32s seq_size = 0;
Ipp8u* seqStart = NULL;
//!!!!!!!!!
Ipp32u frame_size = 1;
Ipp8u* ptr = NULL;
Ipp32u StartCode = 0;
if ((stream_subtype == VC1_VIDEO_VC1)||
(stream_subtype == WVC1_VIDEO))
{
//read start code
VC1_GET_BITS(32,temp_value);
//StartCode = *((Ipp32u*)(pContext->m_pBufferStart));
StartCode = ((*(pContext->m_pBufferStart+3))<<24) + ((*(pContext->m_pBufferStart+2))<<16) +
((*(pContext->m_pBufferStart+1))<<8) + *(pContext->m_pBufferStart);
// advance profile
pContext->m_seqLayerHeader->PROFILE = 3;
if(StartCode != (VC1_SequenceHeader|0x00000100))
{
return frame_size;
}
SequenceLayer(pContext);
width = (pContext->m_seqLayerHeader->MAX_CODED_WIDTH+1)*2;
height = (pContext->m_seqLayerHeader->MAX_CODED_HEIGHT+1)*2;
pContext->m_seqLayerHeader->widthMB = (Ipp16u)((width+15)/VC1_PIXEL_IN_LUMA);
pContext->m_seqLayerHeader->heightMB = (Ipp16u)((height+15)/VC1_PIXEL_IN_LUMA);
ptr = (Ipp8u*)pContext->m_bitstream.pBitstream;
//StartCode = (*((Ipp32u*)(ptr)))&0xFFFFFF00;
StartCode = ((*(ptr+3))<<24) + ((*(ptr+2))<<16) + ((*(ptr+1))<<8) + *(ptr);
StartCode &= 0xFFFFFF00;
while((StartCode != 0x00000100) && (ptr < pContext->m_pBufferStart + pContext->m_FrameSize))
{
ptr++;
//StartCode = (*((Ipp32u*)(ptr)))&0xFFFFFF00;
StartCode = ((*(ptr+3))<<24) + ((*(ptr+2))<<16) + ((*(ptr+1))<<8) + *(ptr);
StartCode &= 0xFFFFFF00;
}
pContext->m_FrameSize = ptr - pContext->m_pBufferStart;
}
else
{
//read sequence header size
SwapData(pContext->m_pBufferStart, pContext->m_FrameSize);
if (stream_subtype != WMV3_VIDEO)
{
seqStart = pContext->m_pBufferStart + 4;
seq_size = ((*(seqStart+3))<<24) + ((*(seqStart+2))<<16) + ((*(seqStart+1))<<8) + *(seqStart);
assert(seq_size > 0);
assert(seq_size < 100);
seqStart = pContext->m_pBufferStart + 8 + seq_size;
height = ((*(seqStart+3))<<24) + ((*(seqStart+2))<<16) + ((*(seqStart+1))<<8) + *(seqStart);
seqStart+=4;
width = ((*(seqStart+3))<<24) + ((*(seqStart+2))<<16) + ((*(seqStart+1))<<8) + *(seqStart);
VC1_GET_BITS(32,temp_value); //!!!!!!!
VC1_GET_BITS(32,temp_value); //!!!!!
pContext->m_seqLayerHeader->widthMB = (Ipp16u)((width+15)/VC1_PIXEL_IN_LUMA);
pContext->m_seqLayerHeader->heightMB = (Ipp16u)((height+15)/VC1_PIXEL_IN_LUMA);
pContext->m_seqLayerHeader->MAX_CODED_HEIGHT = height/2 - 1;
pContext->m_seqLayerHeader->MAX_CODED_WIDTH = width/2 - 1;
}
SwapData(pContext->m_pBufferStart, pContext->m_FrameSize);
SequenceLayer(pContext);
}
if (stream_subtype == WMV3_VIDEO)
return 1;
height = pContext->m_seqLayerHeader->heightMB*VC1_PIXEL_IN_LUMA;
width = ((pContext->m_seqLayerHeader->widthMB * VC1_PIXEL_IN_LUMA) & 0xFFFFFF80)+ 0x080;
frame_size = (height + 128)*(width + 128)
+ ((height / 2 + 64)*(width / 2 + 64))*2;
return frame_size; //!!!!!
}
VC1Status GetNextPicHeader_Adv(VC1Context* pContext)
{
VC1Status vc1Sts = VC1_OK;
memset(pContext->m_picLayerHeader, 0, sizeof(VC1PictureLayerHeader));
vc1Sts = DecodePictureHeader_Adv(pContext);
return vc1Sts;
}
VC1Status GetNextPicHeader(VC1Context* pContext)
{
VC1Status vc1Sts = VC1_OK;
memset(pContext->m_picLayerHeader, 0, sizeof(VC1PictureLayerHeader));
vc1Sts = DecodePictureHeader(pContext);
return vc1Sts;
}
#ifdef _OWN_FUNCTION
//range map
void _own_ippiRangeMap_VC1_8u_C1R(Ipp8u* pSrc, Ipp32s srcStep,
Ipp8u* pDst, Ipp32s dstStep,
IppiSize roiSize,
Ipp32s rangeMapParam)
{
Ipp32s i=0;
Ipp32s j=0;
Ipp32s temp;
for (i = 0; i < roiSize.height; i++)
{
for (j = 0; j < roiSize.width; j++)
{
temp = pSrc[i*srcStep+j];
temp = (temp - 128)*(rangeMapParam+9)+4;
temp = temp>>3;
temp = temp+128;
pDst[i*dstStep+j] = (Ipp8u)VC1_CLIP(temp);
}
}
}
#endif
VC1Status DecodeFrame (VC1Context* pContext)
{
VC1Status vc1Sts = VC1_OK;
vc1Sts = Decode_PictureLayer(pContext);
return vc1Sts;
}
#endif //UMC_ENABLE_VC1_VIDEO_DECODER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -