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

📄 umc_vc1_enc_mb.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 4 页
字号:
/* /////////////////////////////////////////////////////////////////////////////
//
//                  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) 2007 Intel Corporation. All Rights Reserved.
//
//
//          VC-1 (VC1) encoder, macroblock functionality
//
*/
#include "umc_defs.h"

#if defined (UMC_ENABLE_VC1_VIDEO_ENCODER)

#ifndef _ENCODER_VC1_MB_H_
#define _ENCODER_VC1_MB_H_

#include "ippvc.h"
#include "umc_structures.h"
#include "umc_vc1_enc_def.h"
#include "umc_vc1_enc_bitstream.h"
#include "umc_vc1_enc_debug.h"
#include "umc_vc1_enc_common.h"
#include "umc_vc1_enc_block_template.h"
#include "umc_memory_allocator.h"
#include "umc_vc1_enc_statistic.h"
#include "umc_vc1_enc_tables.h"

namespace UMC_VC1_ENCODER
{

class VC1EncoderCodedMB
{
private:

    eMBType         m_MBtype;

    // inter MB
    sCoordinate     m_dMV[2][4];      //  backward,forward. up to 4 coded MV for 1 MB.
    bool            m_bMVHalf;
    Ipp8u           m_bHybrid;

    eTransformType  m_tsType[6];
    bool            m_bMBTSType;
    Ipp8u           m_uiFirsrCodedBlock;

    // intra
    Ipp16s          m_iDC[6];

    //all
    Ipp8u           m_uRun   [6][65];
    Ipp16s          m_iLevel [6][64];
    Ipp8u           m_nPairs [6][4]; // 6 blocks, 4 subblocks
    Ipp8u           m_uiMBCBPCY;

    //for I MB
    bool            m_bACPrediction;

public:
    VC1EncoderCodedMB()
    {

    }
    UMC::Status Init(eMBType type)
    {
        m_MBtype                = type;
        m_uiMBCBPCY             = 0;
        m_uiFirsrCodedBlock     = 0;
        m_bACPrediction         = false;
        m_bMVHalf               = false;
        m_bHybrid               = false;
        m_bMBTSType             = true;

        memset(m_iDC,0,6*sizeof(Ipp16s));

        memset(m_nPairs[0],0,4*sizeof(Ipp8u));
        memset(m_nPairs[1],0,4*sizeof(Ipp8u));
        memset(m_nPairs[2],0,4*sizeof(Ipp8u));
        memset(m_nPairs[3],0,4*sizeof(Ipp8u));
        memset(m_nPairs[4],0,4*sizeof(Ipp8u));
        memset(m_nPairs[5],0,4*sizeof(Ipp8u));

        m_tsType[0] = VC1_ENC_8x8_TRANSFORM;
        m_tsType[1] = VC1_ENC_8x8_TRANSFORM;
        m_tsType[2] = VC1_ENC_8x8_TRANSFORM;
        m_tsType[3] = VC1_ENC_8x8_TRANSFORM;
        m_tsType[4] = VC1_ENC_8x8_TRANSFORM;
        m_tsType[5] = VC1_ENC_8x8_TRANSFORM;

        return UMC::UMC_OK;
    }
    inline Ipp8u GetMBPattern()
    {
        return
           ((((m_nPairs[0][0] + m_nPairs[0][1] + m_nPairs[0][2] + m_nPairs[0][3])>0)<< (5 - 0))|
            (((m_nPairs[1][0] + m_nPairs[1][1] + m_nPairs[1][2] + m_nPairs[1][3])>0)<< (5 - 1))|
            (((m_nPairs[2][0] + m_nPairs[2][1] + m_nPairs[2][2] + m_nPairs[2][3])>0)<< (5 - 2))|
            (((m_nPairs[3][0] + m_nPairs[3][1] + m_nPairs[3][2] + m_nPairs[3][3])>0)<< (5 - 3))|
            (((m_nPairs[4][0] + m_nPairs[4][1] + m_nPairs[4][2] + m_nPairs[4][3])>0)<< (5 - 4))|
            (((m_nPairs[5][0] + m_nPairs[5][1] + m_nPairs[5][2] + m_nPairs[5][3])>0)<< (5 - 5)));

    }
     inline Ipp32u GetBlocksPattern()
    {
        Ipp8u   blockPattern=0;
        Ipp32u  blocksPattern=0;
        Ipp32s  i;
        bool SubBlk[4];

        for(i=0;i<6;i++)
        {
            switch (m_tsType[i])
            {
            case  VC1_ENC_8x8_TRANSFORM:
                SubBlk[0]=SubBlk[1]=SubBlk[2]=SubBlk[3] = (m_nPairs[i][0]>0);
                break;
            case  VC1_ENC_8x4_TRANSFORM:
                SubBlk[0]=SubBlk[1]= (m_nPairs[i][0]>0);
                SubBlk[2]=SubBlk[3]= (m_nPairs[i][1]>0);
                break;
            case  VC1_ENC_4x8_TRANSFORM:
                SubBlk[0]=SubBlk[2]= (m_nPairs[i][0]>0);
                SubBlk[1]=SubBlk[3]= (m_nPairs[i][1]>0);
                break;
            case  VC1_ENC_4x4_TRANSFORM:
                SubBlk[0] =(m_nPairs[i][0]>0);
                SubBlk[1] =(m_nPairs[i][1]>0);
                SubBlk[2] =(m_nPairs[i][2]>0);
                SubBlk[3] =(m_nPairs[i][3]>0);
                break;
           }
           blocksPattern |= SubBlk[0]<<VC_ENC_PATTERN_POS(i,0)
                         |  SubBlk[1]<<VC_ENC_PATTERN_POS(i,1)
                         |  SubBlk[2]<<VC_ENC_PATTERN_POS(i,2)
                         |  SubBlk[3]<<VC_ENC_PATTERN_POS(i,3) ;

        }
        return blocksPattern;

    }
    inline bool isSkip()
    {
        switch (m_MBtype)
        {
            case VC1_ENC_I_MB:
            case VC1_ENC_P_MB_INTRA:
            case VC1_ENC_B_MB_INTRA:
                 return false;
            case VC1_ENC_B_MB_DIRECT:
                return (m_uiMBCBPCY == 0);
            case VC1_ENC_P_MB_1MV:
            case VC1_ENC_B_MB_F:
                return ((m_uiMBCBPCY == 0)&&(m_dMV[1][0].x==0 && m_dMV[1][0].y==0));
            case VC1_ENC_B_MB_B:
                return ((m_uiMBCBPCY == 0)&&(m_dMV[0][0].x==0 && m_dMV[0][0].y==0));
            case VC1_ENC_B_MB_FB:
                return ((m_uiMBCBPCY == 0)&&(m_dMV[1][0].x==0 && m_dMV[1][0].y==0)&&(m_dMV[0][0].x==0 && m_dMV[0][0].y==0));
            default:
                assert(0);
                return false;

        }


    }
    inline void SetHybrid (Ipp8u bHybrid)
    {
        m_bHybrid = bHybrid;
    }
    inline void SetHalfMV (bool bHalf)
    {
        m_bMVHalf = bHalf;
    }

    inline void SetMBCBPCY (Ipp8u  MBCBPCY)
    {
        m_uiMBCBPCY     =  MBCBPCY; //???
    }
    inline void SetdMV(sCoordinate dmv, bool bForward=true)
    {
        m_dMV[bForward][0].x = m_dMV[bForward][1].x = m_dMV[bForward][2].x = m_dMV[bForward][3].x = dmv.x;
        m_dMV[bForward][0].y = m_dMV[bForward][1].y = m_dMV[bForward][2].y = m_dMV[bForward][3].y = dmv.y;
    }
    inline void SetACPrediction (bool bACPred)
    {
        m_bACPrediction   = bACPred;
    }
    inline void SetTSType(eTransformType* tsType)
    {
        m_tsType[0]= tsType[0];
        m_tsType[1]= tsType[1];
        m_tsType[2]= tsType[2];
        m_tsType[3]= tsType[3];
        m_tsType[4]= tsType[4];
        m_tsType[5]= tsType[5];

        m_bMBTSType = ( m_tsType[0] == m_tsType[1] && m_tsType[0] == m_tsType[2] &&
                        m_tsType[0] == m_tsType[3] && m_tsType[0] == m_tsType[4] &&
                        m_tsType[0] == m_tsType[5]);
    }
    void SaveResidual (Ipp16s* pBlk,Ipp32u  step, const Ipp8u* pScanMatrix, Ipp32s blk);



   UMC::Status WriteMBHeaderI_SM (VC1EncoderBitStreamSM* pCodedMB, bool bBitplanesRaw);
   UMC::Status WriteMBHeaderI_ADV(VC1EncoderBitStreamAdv* pCodedMB,bool bBitplanesRaw, bool bOverlapMB);

 /*  template <class T>
   UMC::Status WriteMBHeaderP_INTRA    ( T*              pCodedMB,
                                         bool            bBitplanesRaw,
                                         const Ipp16u*   pMVDiffTable,
                                         const Ipp16u*   pCBPCYTable);
   template <class T>
   UMC::Status WriteMBHeaderB_INTRA    ( T*              pCodedMB,
                                         bool            bBitplanesRaw,
                                         const Ipp16u*   pMVDiffTable,
                                         const Ipp16u*   pCBPCYTable);*/



   template <class T>
   inline      UMC::Status   WriteBlock (    T*                      pCodedBlock,
                                            const Ipp32u*           pDCEncTable,
                                            Ipp32u                  quant,
                                            const sACTablesSet*     pACTablesSet,
                                            sACEscInfo*             pACEscInfo,
                                            Ipp8u                   blk)
    {
STATISTICS_START_TIME(m_TStat->AC_Coefs_StartTime);
          UMC::Status err = UMC::UMC_OK;
          if (m_MBtype == VC1_ENC_I_MB || m_MBtype == VC1_ENC_P_MB_INTRA  || m_MBtype == VC1_ENC_B_MB_INTRA)
          {
              err = WriteBlockDC(pCodedBlock,pDCEncTable,quant,blk);
              if (err != UMC::UMC_OK)
                  return err;
          }
          err = WriteBlockAC(pCodedBlock,pACTablesSet,pACEscInfo,blk);
STATISTICS_END_TIME(m_TStat->AC_Coefs_StartTime, m_TStat->AC_Coefs_EndTime, m_TStat->AC_Coefs_TotalTime);

          return err;
   }
template <class T>  inline
UMC::Status WriteMVDataPIntra(T* pCodedMB, const Ipp16u* table, Ipp8u blockNum=0)
{
    UMC::Status     ret     =   UMC::UMC_OK;
    bool            NotSkip =   (m_nPairs[0][0]+m_nPairs[1][0]+m_nPairs[2][0]+m_nPairs[3][0]+m_nPairs[4][0]+m_nPairs[5][0]>0);

    Ipp8u           index   =   37*NotSkip + 36 - 1;
    if (!pCodedMB)
        return UMC::UMC_ERR_NULL_PTR;

    ret = pCodedMB->PutBits(table[2*index], table[2*index+1]);
    if (ret != UMC::UMC_OK) return ret;

    //printf("MVDiff index = %d\n", index);
    //printf("DMV_X  = %d, DMV_Y  = %d\n", 0, 0);

    return ret;
}

template <class T>  inline
UMC::Status WriteMVDataInter(T* pCodedMB, const Ipp16u* table, Ipp8u rangeIndex, bool   NotSkip, Ipp8u blockNum=0, bool bForward=true )
{
    UMC::Status     ret     =   UMC::UMC_OK;
    Ipp16s          index   =   0;
    Ipp16s          dx      =   m_dMV[bForward][blockNum].x;
    Ipp16s          dy      =   m_dMV[bForward][blockNum].y;
    bool            signX   =   (dx<0);
    bool            signY   =   (dy<0);
    Ipp8u           limit   =   (m_bMVHalf)? VC1_ENC_HALF_MV_LIMIT : VC1_ENC_MV_LIMIT;


    if (!pCodedMB)
        return UMC::UMC_ERR_NULL_PTR;

    dx = dx*(1 -2*signX);
    dy = dy*(1 -2*signY);

    if (m_bMVHalf)
    {
        dx = dx >> 1;
        dy = dy >> 1;
    }

    index = (dx < limit && dy < limit)? 6*MVSizeOffset[3*dy]+ MVSizeOffset[3*dx] - 1:35;

    if (index < 34)
    {
        Ipp8u diffX = dx - MVSizeOffset[3*dx+1];
        Ipp8u diffY = dy - MVSizeOffset[3*dy+1];
        Ipp8u sizeX = MVSizeOffset[3*dx+2];
        Ipp8u sizeY = MVSizeOffset[3*dy+2];

        diffX =  (diffX<<1)+signX;
        diffY =  (diffY<<1)+signY;

        if (m_bMVHalf)
        {
            sizeX -= sizeX>>3;
            sizeY -= sizeY>>3;
        }
        index+= 37*NotSkip;

        ret = pCodedMB->PutBits(table[2*index], table[2*index+1]);
        if (ret != UMC::UMC_OK) return ret;

        ret = pCodedMB->PutBits(diffX, sizeX);
        if (ret != UMC::UMC_OK) return ret;

        ret = pCodedMB->PutBits(diffY, sizeY);
        if (ret != UMC::UMC_OK) return ret;

#ifdef VC1_ENC_DEBUG_ON
    pDebug->SetMVDiff(m_dMV[bForward][blockNum].x/2, m_dMV[bForward][blockNum].y/2,(!bForward),-1);
#endif
    }
    else
    {
         // escape mode
        Ipp8u sizeX = longMVLength[2*rangeIndex];
        Ipp8u sizeY = longMVLength[2*rangeIndex+1];


        dx = ((1<<sizeX)-1)& (m_dMV[bForward][blockNum].x);
        dy = ((1<<sizeY)-1)& (m_dMV[bForward][blockNum].y);

        if (m_bMVHalf)
        {

⌨️ 快捷键说明

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