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

📄 umc_vc1_dec_pic_com.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
字号:
/* /////////////////////////////////////////////////////////////////////////////
//
//                  INTEL CORPORATION PROPRIETARY INFORMATION
//     This software is supplied under the terms of a license agreement or
//     nondisclosure agreement with Intel Corporation and may not be copied
//     or disclosed except in accordance with the terms of that agreement.
//          Copyright(c) 2004-2007 Intel Corporation. All Rights Reserved.
//
//
//          VC-1(VC1) decoder, Common picture layer
//
*/
#include "umc_defs.h"

#if defined (UMC_ENABLE_VC1_VIDEO_DECODER)

#include <string.h>
#include "umc_vc1_dec_seq.h"

#include "umc_vc1_dec_debug.h"


VC1Status DecodePictureHeader (VC1Context* pContext)
{
    VC1Status vc1Sts = VC1_OK;
    Ipp32u tempValue;
    VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader;
    VC1SequenceLayerHeader* seqLayerHeader = pContext->m_seqLayerHeader;

    if(seqLayerHeader->FINTERPFLAG == 1)
        VC1_GET_BITS(1, tempValue); //INTERPFRM

    VC1_GET_BITS(2, tempValue);       //FRMCNT

    if(seqLayerHeader->RANGERED == 1)
    {
        VC1_GET_BITS(1,picLayerHeader->RANGEREDFRM);
        picLayerHeader->RANGEREDFRM <<= 3;
    }
    else
        picLayerHeader->RANGEREDFRM = 0;

    if(pContext->m_FrameSize < 10) //changed from 2
    {
        picLayerHeader->PTYPE = VC1_SKIPPED_FRAME;
    }

    else if(seqLayerHeader->MAXBFRAMES == 0)
    {
        VC1_GET_BITS(1, picLayerHeader->PTYPE);//0 = I, 1 = P
    }
    else
    {
        VC1_GET_BITS(1, picLayerHeader->PTYPE); //1 = P
        if(picLayerHeader->PTYPE == 0)
        {
            VC1_GET_BITS(1, picLayerHeader->PTYPE);
            if(picLayerHeader->PTYPE == 0)
            {
                picLayerHeader->PTYPE = VC1_B_FRAME;
                //it can be BI, will be detected in BFRACTION
            }
            else
            {
                picLayerHeader->PTYPE = VC1_I_FRAME;
            }
        }
        else
        {
            picLayerHeader->PTYPE = VC1_P_FRAME;
        }
    }

    if(picLayerHeader->PTYPE == VC1_B_FRAME)
    {
        Ipp8s  z1;
        Ipp16s z2;
        ippiDecodeHuffmanPair_1u16s(&pContext->m_bitstream.pBitstream,
                                    &pContext->m_bitstream.bitOffset,
                                    pContext->m_vlcTbl->BFRACTION,
                                    &z1,
                                    &z2);
        VM_ASSERT (z2 != VC1_BRACTION_INVALID);
        VM_ASSERT (!(z2 == VC1_BRACTION_BI && seqLayerHeader->PROFILE==VC1_PROFILE_ADVANCED));
        if (z2 == VC1_BRACTION_BI)
        {
            picLayerHeader->PTYPE = VC1_BI_FRAME;
        }
        picLayerHeader->BFRACTION = (z1*2>=z2)?1:0;
        picLayerHeader->ScaleFactor = ((256+z2/2)/z2)*z1;
    }

    //pContext->m_pCurrMB = &pContext->m_MBs[0];
    //pContext->CurrDC = pContext->DCACParams;

    return vc1Sts;
}


VC1Status Decode_PictureLayer(VC1Context* pContext)
{
    VC1Status vc1Sts = VC1_OK;
    switch(pContext->m_picLayerHeader->PTYPE)
    {
    case VC1_I_FRAME:
    case VC1_BI_FRAME:
#ifdef VC1_DEBUG_ON
        VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES,
                                                VM_STRING("I frame type  \n"));
#endif
        vc1Sts = DecodePictureLayer_ProgressiveIpicture(pContext);

        break;
    case VC1_P_FRAME:
        //only for simple and main profile
        vc1Sts = DecodePictureLayer_ProgressivePpicture(pContext);
        break;

    case VC1_B_FRAME:
#ifdef VC1_DEBUG_ON
        VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES,
                                                VM_STRING("B frame type  \n"));
#endif

        vc1Sts = DecodePictureLayer_ProgressiveBpicture(pContext);
        break;

    case VC1_SKIPPED_FRAME:
        pContext->m_frmBuff.m_iDisplayIndex = pContext->m_frmBuff.m_iCurrIndex;
        break;
    }
    return vc1Sts;
}

#endif //UMC_ENABLE_VC1_VIDEO_DECODER

⌨️ 快捷键说明

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