📄 umc_vc1_enc_mb.h
字号:
/* /////////////////////////////////////////////////////////////////////////////
//
// 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 + -