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

📄 umc_vc1_dec_skipping.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, Skipping algorithms
//
*/

#include "umc_defs.h"
#if defined (UMC_ENABLE_VC1_VIDEO_DECODER)

#include "umc_vc1_dec_skipping.h"
#include "umc_vc1_common_defs.h"

using namespace UMC::VC1Skipping;
void VC1SkipMaster::SetSkipPeriod(bool ForRefFrames, Ipp32u period)
{
    if (ForRefFrames)
    {
        m_iRefSkipPeriod = period;
        m_iRefSkipCounter = 0;
    }
    else
    {
        m_iBSkipPeriod = period;
        m_iBSkipCounter = 0;
    }
}
void VC1SkipMaster::SetPerformMode(bool ForRefFrames, Ipp32u perfomMode)
{
    if (perfomMode > VC1MaxSpeed)
        return;
    if (ForRefFrames)
        m_RefPerfMode = perfomMode;
    else
        m_BPerfMode = perfomMode;
}
void VC1SkipMaster::MoveToNextState()
{
    switch(m_SpeedMode)
    {
    case B1:
        m_BPerfMode = VC1PostProcDisable;
        break;
    case B2:
        m_BPerfMode = VC1MaxSpeed;
        break;
    case B3:
        m_BPerfMode = VC1MaxSpeed;
        SetSkipPeriod(false,3);
        break;
    case B4:
        m_BPerfMode = VC1MaxSpeed;
        SetSkipPeriod(false,2);
        break;
    case B5:
        m_BPerfMode = VC1MaxSpeed;
        SetSkipPeriod(false,1);
        break;
    case Ref1:
        m_RefPerfMode = VC1PostProcDisable;
        m_BPerfMode = VC1MaxSpeed;
        SetSkipPeriod(false,1);
        break;
    case Ref2:
        m_RefPerfMode = VC1MaxSpeed;
        m_BPerfMode = VC1MaxSpeed;
        SetSkipPeriod(false,1);
        break;
    case Ref3:
        m_RefPerfMode = VC1MaxSpeed;
        m_BPerfMode = VC1MaxSpeed;
        SetSkipPeriod(false,1);
        SetSkipPeriod(true,4);
        break;
    case Ref4:
        m_RefPerfMode = VC1MaxSpeed;
        m_BPerfMode = VC1MaxSpeed;
        SetSkipPeriod(false,1);
        SetSkipPeriod(true,3);
        break;
    default:
        break;
}



}
void VC1SkipMaster::Reset()
{
    m_iRefSkipPeriod = 0;
    m_iRefSkipCounter = 0;
    m_iBSkipPeriod = 0;
    m_iBSkipCounter = 0;
    m_RefPerfMode = VC1Routine;
    m_BPerfMode = VC1Routine;
    //m_SpeedMode = Normal;
}
void VC1SkipMaster::SetVideoDecodingSpeed(SkippingMode skip_mode)
{
    Reset();
    m_SpeedMode = skip_mode;
    MoveToNextState();
}
bool VC1SkipMaster::ChangeVideoDecodingSpeed(Ipp32s& speed_shift)
{
    if (speed_shift)
    {
        if (((Ref4 == m_SpeedMode) && (speed_shift > 0))||
            ((Normal == m_SpeedMode) && (speed_shift < 0)))
            return false;
        Reset();
        m_SpeedMode += speed_shift;
        if (Ref4 < m_SpeedMode)
            m_SpeedMode = Ref4;
        else if (Normal > m_SpeedMode)
            m_SpeedMode = Normal;
        MoveToNextState();
        speed_shift = m_SpeedMode;
    }
    return true;
}

bool VC1SkipMaster::IsNeedSkipFrame(Ipp32u picType)
{
    if (VC1_IS_REFERENCE(picType))
    {
        if (m_SpeedMode < Ref3)
            return false;

        ++m_iRefSkipCounter;
        if (m_iRefSkipCounter == m_iRefSkipPeriod)
        {
            m_iRefSkipCounter = 0;
            return true;
        }
    }
    else
    {
        if (m_SpeedMode < B3)
            return false;

        ++m_iBSkipCounter;
        if (m_iBSkipCounter == m_iBSkipPeriod)
        {
            m_iBSkipCounter = 0;
            return true;
        }
    }
    return false;
}
bool VC1SkipMaster::IsNeedPostProcFrame(Ipp32u picType)
{
    if (VC1_IS_REFERENCE(picType))
    {
        return (m_RefPerfMode == VC1Routine);
    }
    else
    {
        return (m_BPerfMode == VC1Routine);
    }
}
bool VC1SkipMaster::IsNeedSimlifyReconstruct(Ipp32u picType)
{
    if (VC1_IS_REFERENCE(picType))
    {
        return (m_RefPerfMode == VC1MaxSpeed);
    }
    else
    {
        return (m_BPerfMode == VC1MaxSpeed);
    }

}


#endif

⌨️ 快捷键说明

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