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

📄 umc_vc1_dec_mb_com.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* /////////////////////////////////////////////////////////////////////////////
//
//                  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, MB Layer in P picture for advanced profile
//
*/
#include "umc_defs.h"

#if defined (UMC_ENABLE_VC1_VIDEO_DECODER)

#include "umc_vc1_dec_seq.h"
#include "umc_vc1_dec_debug.h"
#include "umc_vc1_common_blk_order_tbl.h"
#include "umc_vc1_dec_run_level_tbl.h"
#include "umc_vc1_dec_time_statistics.h"


inline
static Ipp16s GetScaleDC(Ipp16s DC, Ipp32u QntCurr, Ipp32u QntPred,
                         Ipp32s CurrDCStepSize, Ipp32s PredDCStepSize)
{
    /* Remove HalfStep */
    QntCurr >>= 1;
    QntPred >>= 1;

    if (QntCurr != QntPred)
        DC = (Ipp16s)((DC * VC1_DQScaleTbl[CurrDCStepSize] * PredDCStepSize + 0x20000)>>18);

    return DC;
}
void GetIntraScaleDCPredictors(VC1Context* pContext)
{
    VC1DCMBParam* CurrDC = pContext->CurrDC;
    VC1DCPredictors DCPred;
    Ipp32u QurrQuant = CurrDC->DoubleQuant;
    Ipp32s QurrDCStep = CurrDC->DCStepSize;

    Ipp32u LeftTopFlag = pContext->m_pCurrMB->LeftTopRightPositionFlag & 0xFF0;
    Ipp32s width = pContext->m_seqLayerHeader->widthMB;

    VC1DCMBParam* pA = NULL, *pB = NULL, *pC = NULL;

    memset(&DCPred.BlkPattern, 0, 6);

    DCPred.DoubleQuant[2] = QurrQuant;

    DCPred.ACTOP[0]  = CurrDC->DCBlkPred[0].ACTOP;
    DCPred.ACLEFT[0] = CurrDC->DCBlkPred[0].ACLEFT;

    DCPred.ACTOP[1]  = CurrDC->DCBlkPred[1].ACTOP;
    DCPred.ACLEFT[1] = CurrDC->DCBlkPred[1].ACLEFT;

    DCPred.ACTOP[2]  = CurrDC->DCBlkPred[2].ACTOP;
    DCPred.ACLEFT[2] = CurrDC->DCBlkPred[2].ACLEFT;

    switch(LeftTopFlag)
    {
    case (VC1_COMMON_MB):
        {
            pA = CurrDC - width;
            pB = CurrDC - width - 1;
            pC = CurrDC - 1;

            DCPred.BlkPattern[0] = 7;
            DCPred.BlkPattern[1] = 7;
            DCPred.BlkPattern[2] = 7;
            DCPred.BlkPattern[3] = 7;
            DCPred.BlkPattern[4] = 7;
            DCPred.BlkPattern[5] = 7;


            DCPred.DoubleQuant[0] = pA->DoubleQuant;
            DCPred.DoubleQuant[1] = pC->DoubleQuant;

            //Luma
            DCPred.DC[6] = GetScaleDC(pA->DCBlkPred[2].DC,QurrQuant,
                                      pA->DoubleQuant, QurrDCStep,
                                      pA->DCStepSize);
            DCPred.ACTOP[6] = pA->DCBlkPred[2].ACTOP;
            DCPred.ACLEFT[6] = pA->DCBlkPred[2].ACLEFT;

            DCPred.DC[7] = GetScaleDC(pA->DCBlkPred[3].DC,QurrQuant,
                                      pA->DoubleQuant, QurrDCStep,
                                      pA->DCStepSize);
            DCPred.ACTOP[7]  = pA->DCBlkPred[3].ACTOP;
            DCPred.ACLEFT[7] = pA->DCBlkPred[3].ACLEFT;


            DCPred.DC[3] = GetScaleDC(pB->DCBlkPred[3].DC, QurrQuant,
                                      pB->DoubleQuant, QurrDCStep,
                                      pB->DCStepSize);
            DCPred.ACTOP[3] = pB->DCBlkPred[3].ACTOP;
            DCPred.ACLEFT[3] = pB->DCBlkPred[3].ACLEFT;

            DCPred.DC[8] = GetScaleDC(pC->DCBlkPred[1].DC,QurrQuant,
                                      pC->DoubleQuant, QurrDCStep,
                                      pC->DCStepSize);
            DCPred.ACTOP[8] = pC->DCBlkPred[1].ACTOP;
            DCPred.ACLEFT[8] = pC->DCBlkPred[1].ACLEFT;

            DCPred.DC[9] = GetScaleDC(pC->DCBlkPred[3].DC,QurrQuant,
                                      pC->DoubleQuant, QurrDCStep,
                                      pC->DCStepSize);
            DCPred.ACTOP[9] = pC->DCBlkPred[3].ACTOP;
            DCPred.ACLEFT[9] = pC->DCBlkPred[3].ACLEFT;

            //chroma
            //block 4
            DCPred.DC[10] = GetScaleDC(pA->DCBlkPred[4].DC,QurrQuant,
                                       pA->DoubleQuant, QurrDCStep,
                                       pA->DCStepSize);
            DCPred.ACTOP[10] =  pA->DCBlkPred[4].ACTOP;
            DCPred.ACLEFT[10] = pA->DCBlkPred[4].ACLEFT;

            DCPred.DC[4] = GetScaleDC(pB->DCBlkPred[4].DC,QurrQuant,
                                      pB->DoubleQuant, QurrDCStep,
                                      pB->DCStepSize);
            DCPred.ACTOP[4] = pB->DCBlkPred[4].ACTOP;
            DCPred.ACLEFT[4] = pB->DCBlkPred[4].ACLEFT;

            DCPred.DC[11] = GetScaleDC(pC->DCBlkPred[4].DC,QurrQuant,
                                       pC->DoubleQuant, QurrDCStep,
                                       pC->DCStepSize);
            DCPred.ACTOP[11] = pC->DCBlkPred[4].ACTOP;
            DCPred.ACLEFT[11] = pC->DCBlkPred[4].ACLEFT;

            //block 5
            DCPred.DC[12] = GetScaleDC(pA->DCBlkPred[5].DC,QurrQuant,
                                      pA->DoubleQuant, QurrDCStep,
                                      pA->DCStepSize);
            DCPred.ACTOP[12] = pA->DCBlkPred[5].ACTOP;
            DCPred.ACLEFT[12] = pA->DCBlkPred[5].ACLEFT;

            DCPred.DC[5] = GetScaleDC(pB->DCBlkPred[5].DC,QurrQuant,
                                      pB->DoubleQuant, QurrDCStep,
                                      pB->DCStepSize);
            DCPred.ACTOP[5] = pB->DCBlkPred[5].ACTOP;
            DCPred.ACLEFT[5] = pB->DCBlkPred[5].ACLEFT;

            DCPred.DC[13] = GetScaleDC(pC->DCBlkPred[5].DC,QurrQuant,
                                       pC->DoubleQuant, QurrDCStep,
                                       pC->DCStepSize);
            DCPred.ACTOP[13] = pC->DCBlkPred[5].ACTOP;
            DCPred.ACLEFT[13] = pC->DCBlkPred[5].ACLEFT;
        }
        break;
    case(VC1_TOP_MB):
        {
            pC = CurrDC - 1;
            DCPred.BlkPattern[0] = 1;
            DCPred.BlkPattern[1] = 1;
            DCPred.BlkPattern[2] = 7;
            DCPred.BlkPattern[3] = 7;
            DCPred.BlkPattern[4] = 1;
            DCPred.BlkPattern[5] = 1;

            DCPred.DoubleQuant[1] = pC->DoubleQuant;

            //Luma
            DCPred.DC[8] = GetScaleDC(pC->DCBlkPred[1].DC,QurrQuant,
                                      pC->DoubleQuant, QurrDCStep,
                                      pC->DCStepSize);
            DCPred.ACTOP[8] = pC->DCBlkPred[1].ACTOP;
            DCPred.ACLEFT[8] = pC->DCBlkPred[1].ACLEFT;

            DCPred.DC[9] = GetScaleDC(pC->DCBlkPred[3].DC,QurrQuant,
                                      pC->DoubleQuant, QurrDCStep,
                                      pC->DCStepSize);
            DCPred.ACTOP[9] = pC->DCBlkPred[3].ACTOP;
            DCPred.ACLEFT[9] = pC->DCBlkPred[3].ACLEFT;

            //chroma
            //block 4
            DCPred.DC[11] = GetScaleDC(pC->DCBlkPred[4].DC,QurrQuant,
                                       pC->DoubleQuant, QurrDCStep,
                                       pC->DCStepSize);
            DCPred.ACTOP[11] = pC->DCBlkPred[4].ACTOP;
            DCPred.ACLEFT[11] = pC->DCBlkPred[4].ACLEFT;

            //block 5
            DCPred.DC[13] = GetScaleDC(pC->DCBlkPred[5].DC,QurrQuant,
                                      pC->DoubleQuant, QurrDCStep,
                                      pC->DCStepSize);
            DCPred.ACTOP[13] = pC->DCBlkPred[5].ACTOP;
            DCPred.ACLEFT[13] = pC->DCBlkPred[5].ACLEFT;
        }
        break;
    case (VC1_LEFT_MB):
        {
            pA = CurrDC - width;
            DCPred.BlkPattern[0] = 4;
            DCPred.BlkPattern[1] = 7;
            DCPred.BlkPattern[2] = 4;
            DCPred.BlkPattern[3] = 7;
            DCPred.BlkPattern[4] = 4;
            DCPred.BlkPattern[5] = 4;


            DCPred.DoubleQuant[0] = pA->DoubleQuant;

            //Luma
            DCPred.DC[6] = GetScaleDC(pA->DCBlkPred[2].DC,QurrQuant,
                                      pA->DoubleQuant, QurrDCStep,
                                      pA->DCStepSize);
            DCPred.ACTOP[6] = pA->DCBlkPred[2].ACTOP;
            DCPred.ACLEFT[6] = pA->DCBlkPred[2].ACLEFT;

            DCPred.DC[7] = GetScaleDC(pA->DCBlkPred[3].DC,QurrQuant,
                                        pA->DoubleQuant, QurrDCStep,
                                        pA->DCStepSize);
            DCPred.ACTOP[7] = pA->DCBlkPred[3].ACTOP;
            DCPred.ACLEFT[7] = pA->DCBlkPred[3].ACLEFT;

            //chroma
            //block 4
            DCPred.DC[10] = GetScaleDC(pA->DCBlkPred[4].DC,QurrQuant,
                                        pA->DoubleQuant, QurrDCStep,
                                        pA->DCStepSize);
            DCPred.ACTOP[10] =  pA->DCBlkPred[4].ACTOP;
            DCPred.ACLEFT[10] = pA->DCBlkPred[4].ACLEFT;

            //block 5
            DCPred.DC[12] = GetScaleDC(pA->DCBlkPred[5].DC,QurrQuant,
                                        pA->DoubleQuant, QurrDCStep,
                                        pA->DCStepSize);
            DCPred.ACTOP[12] =  pA->DCBlkPred[5].ACTOP;
            DCPred.ACLEFT[12] = pA->DCBlkPred[5].ACLEFT;
        }
        break;
    case (VC1_TOP_LEFT_MB):
        {
            DCPred.BlkPattern[0] = 0;
            DCPred.BlkPattern[1] = 1;
            DCPred.BlkPattern[2] = 4;
            DCPred.BlkPattern[3] = 7;
            DCPred.BlkPattern[4] = 0;
            DCPred.BlkPattern[5] = 0;
        }
        break;
    }

    memcpy(&pContext->DCPred, &DCPred,sizeof(VC1DCPredictors));
}

void GetIntraDCPredictors(VC1Context* pContext)
{
    VC1DCMBParam* CurrDC = pContext->CurrDC;
    VC1DCPredictors DCPred;

    Ipp32u LeftTopFlag = pContext->m_pCurrMB->LeftTopRightPositionFlag & 0xFF0;
    Ipp32s width = pContext->m_seqLayerHeader->widthMB;
    Ipp32u QurrQuant = CurrDC->DoubleQuant;

    VC1DCMBParam* pA = NULL, *pB = NULL, *pC = NULL;

    memset(&DCPred.BlkPattern, 0, 6);
    DCPred.DoubleQuant[2] = QurrQuant;

    DCPred.ACTOP[0]  = CurrDC->DCBlkPred[0].ACTOP;
    DCPred.ACLEFT[0] = CurrDC->DCBlkPred[0].ACLEFT;

    DCPred.ACTOP[1]  = CurrDC->DCBlkPred[1].ACTOP;
    DCPred.ACLEFT[1] = CurrDC->DCBlkPred[1].ACLEFT;

    DCPred.ACTOP[2]  = CurrDC->DCBlkPred[2].ACTOP;
    DCPred.ACLEFT[2] = CurrDC->DCBlkPred[2].ACLEFT;

    switch(LeftTopFlag)
    {
    case (VC1_COMMON_MB):
        {
            pA = CurrDC - width;
            pB = CurrDC - width - 1;
            pC = CurrDC - 1;

            DCPred.BlkPattern[0] = 7;
            DCPred.BlkPattern[1] = 7;
            DCPred.BlkPattern[2] = 7;
            DCPred.BlkPattern[3] = 7;
            DCPred.BlkPattern[4] = 7;
            DCPred.BlkPattern[5] = 7;

            DCPred.DoubleQuant[0] = pA->DoubleQuant;
            DCPred.DoubleQuant[1] = pC->DoubleQuant;

            //Luma
            DCPred.DC[6] = pA->DCBlkPred[2].DC;
            DCPred.ACTOP[6] = pA->DCBlkPred[2].ACTOP;
            DCPred.ACLEFT[6] = pA->DCBlkPred[2].ACLEFT;

            DCPred.DC[7] = pA->DCBlkPred[3].DC;
            DCPred.ACTOP[7] =  pA->DCBlkPred[3].ACTOP;
            DCPred.ACLEFT[7] = pA->DCBlkPred[3].ACLEFT;


            DCPred.DC[3] =pB->DCBlkPred[3].DC;
            DCPred.ACTOP[3] =  pB->DCBlkPred[3].ACTOP;
            DCPred.ACLEFT[3] = pB->DCBlkPred[3].ACLEFT;

            DCPred.DC[8] = pC->DCBlkPred[1].DC;
            DCPred.ACTOP[8] =  pC->DCBlkPred[1].ACTOP;
            DCPred.ACLEFT[8] = pC->DCBlkPred[1].ACLEFT;

            DCPred.DC[9] = pC->DCBlkPred[3].DC;
            DCPred.ACTOP[9] =  pC->DCBlkPred[3].ACTOP;
            DCPred.ACLEFT[9] = pC->DCBlkPred[3].ACLEFT;

            //chroma
            //block 4
            DCPred.DC[10] = pA->DCBlkPred[4].DC;
            DCPred.ACTOP[10] =  pA->DCBlkPred[4].ACTOP;
            DCPred.ACLEFT[10] = pA->DCBlkPred[4].ACLEFT;

            DCPred.DC[4] = pB->DCBlkPred[4].DC;
            DCPred.ACTOP[4] =  pB->DCBlkPred[4].ACTOP;
            DCPred.ACLEFT[4] = pB->DCBlkPred[4].ACLEFT;

            DCPred.DC[11] = pC->DCBlkPred[4].DC;
            DCPred.ACTOP[11] =  pC->DCBlkPred[4].ACTOP;
            DCPred.ACLEFT[11] = pC->DCBlkPred[4].ACLEFT;

            //block 5
            DCPred.DC[12] = pA->DCBlkPred[5].DC;
            DCPred.ACTOP[12] =  pA->DCBlkPred[5].ACTOP;
            DCPred.ACLEFT[12] = pA->DCBlkPred[5].ACLEFT;

            DCPred.DC[5] = pB->DCBlkPred[5].DC;
            DCPred.ACTOP[5] =  pB->DCBlkPred[5].ACTOP;
            DCPred.ACLEFT[5] = pB->DCBlkPred[5].ACLEFT;

            DCPred.DC[13] = pC->DCBlkPred[5].DC;
            DCPred.ACTOP[13] =  pC->DCBlkPred[5].ACTOP;
            DCPred.ACLEFT[13] = pC->DCBlkPred[5].ACLEFT;
        }
        break;
    case(VC1_TOP_MB):
        {
            pC = CurrDC - 1;
            DCPred.BlkPattern[0] = 1;
            DCPred.BlkPattern[1] = 1;
            DCPred.BlkPattern[2] = 7;
            DCPred.BlkPattern[3] = 7;
            DCPred.BlkPattern[4] = 1;
            DCPred.BlkPattern[5] = 1;

            DCPred.DoubleQuant[1] = pC->DoubleQuant;

            //Luma
            DCPred.DC[8] = pC->DCBlkPred[1].DC;
            DCPred.ACTOP[8] = pC->DCBlkPred[1].ACTOP;
            DCPred.ACLEFT[8] = pC->DCBlkPred[1].ACLEFT;

            DCPred.DC[9] = pC->DCBlkPred[3].DC;
            DCPred.ACTOP[9] =  pC->DCBlkPred[3].ACTOP;
            DCPred.ACLEFT[9] = pC->DCBlkPred[3].ACLEFT;

⌨️ 快捷键说明

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