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

📄 umc_vc1_dec_seq.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        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 + -