221 lines
10 KiB
C++
221 lines
10 KiB
C++
/* The copyright in this software is being made available under the BSD
|
|
* License, included below. This software may be subject to other third party
|
|
* and contributor rights, including patent rights, and no such rights are
|
|
* granted under this license.
|
|
*
|
|
* Copyright (c) 2010-2014, ITU/ISO/IEC
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
* * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
|
|
* be used to endorse or promote products derived from this software without
|
|
* specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
|
* THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
/** \file TEncSbac.h
|
|
\brief Context-adaptive entropy encoder class (header)
|
|
*/
|
|
|
|
#ifndef __TENCSBAC__
|
|
#define __TENCSBAC__
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include "TLibCommon/TComBitStream.h"
|
|
#include "TLibCommon/ContextTables.h"
|
|
#include "TLibCommon/ContextModel.h"
|
|
#include "TLibCommon/ContextModel3DBuffer.h"
|
|
#include "TEncEntropy.h"
|
|
#include "TEncBinCoder.h"
|
|
#include "TEncBinCoderCABAC.h"
|
|
#if FAST_BIT_EST
|
|
#include "TEncBinCoderCABACCounter.h"
|
|
#endif
|
|
|
|
class TEncTop;
|
|
|
|
//! \ingroup TLibEncoder
|
|
//! \{
|
|
|
|
// ====================================================================================================================
|
|
// Class definition
|
|
// ====================================================================================================================
|
|
|
|
/// SBAC encoder class
|
|
class TEncSbac : public TEncEntropyIf
|
|
{
|
|
public:
|
|
TEncSbac();
|
|
virtual ~TEncSbac();
|
|
|
|
Void init ( TEncBinIf* p ) { m_pcBinIf = p; }
|
|
Void uninit () { m_pcBinIf = 0; }
|
|
|
|
// Virtual list
|
|
Void resetEntropy ();
|
|
Void determineCabacInitIdx ();
|
|
Void setBitstream ( TComBitIf* p ) { m_pcBitIf = p; m_pcBinIf->init( p ); }
|
|
Void setSlice ( TComSlice* p ) { m_pcSlice = p; }
|
|
|
|
Void load ( const TEncSbac* pSrc );
|
|
Void loadIntraDirMode ( const TEncSbac* pScr, const ChannelType chType );
|
|
Void store ( TEncSbac* pDest ) const;
|
|
Void loadContexts ( const TEncSbac* pSrc );
|
|
Void resetBits () { m_pcBinIf->resetBits(); m_pcBitIf->resetBits(); }
|
|
UInt getNumberOfWrittenBits () { return m_pcBinIf->getNumWrittenBits(); }
|
|
//--SBAC RD
|
|
|
|
Void codeVPS ( TComVPS* pcVPS );
|
|
Void codeSPS ( TComSPS* pcSPS );
|
|
Void codePPS ( TComPPS* pcPPS );
|
|
Void codeSliceHeader ( TComSlice* pcSlice );
|
|
Void codeTilesWPPEntryPoint ( TComSlice* pSlice );
|
|
Void codeTerminatingBit ( UInt uilsLast );
|
|
Void codeSliceFinish ();
|
|
Void codeSaoMaxUvlc ( UInt code, UInt maxSymbol );
|
|
Void codeSaoMerge ( UInt uiCode );
|
|
Void codeSaoTypeIdx ( UInt uiCode);
|
|
Void codeSaoUflc ( UInt uiLength, UInt uiCode );
|
|
Void codeSAOSign ( UInt uiCode); //<! code SAO offset sign
|
|
Void codeScalingList ( TComScalingList* /*scalingList*/ ){ assert (0); return;};
|
|
|
|
Void codeSAOOffsetParam(ComponentID compIdx, SAOOffset& ctbParam, Bool sliceEnabled);
|
|
Void codeSAOBlkParam(SAOBlkParam& saoBlkParam
|
|
, Bool* sliceEnabled
|
|
, Bool leftMergeAvail
|
|
, Bool aboveMergeAvail
|
|
, Bool onlyEstMergeInfo = false
|
|
);
|
|
|
|
private:
|
|
Void xWriteUnarySymbol ( UInt uiSymbol, ContextModel* pcSCModel, Int iOffset );
|
|
Void xWriteUnaryMaxSymbol ( UInt uiSymbol, ContextModel* pcSCModel, Int iOffset, UInt uiMaxSymbol );
|
|
Void xWriteEpExGolomb ( UInt uiSymbol, UInt uiCount );
|
|
Void xWriteCoefRemainExGolomb ( UInt symbol, UInt &rParam, const Bool useLimitedPrefixLength, const ChannelType channelType );
|
|
|
|
Void xCopyFrom ( const TEncSbac* pSrc );
|
|
Void xCopyContextsFrom ( const TEncSbac* pSrc );
|
|
|
|
Void codeDFFlag( UInt /*uiCode*/, const Char* /*pSymbolName*/ ) {printf("Not supported in codeDFFlag()\n"); assert(0); exit(1);};
|
|
Void codeDFSvlc( Int /*iCode*/, const Char* /*pSymbolName*/ ) {printf("Not supported in codeDFSvlc()\n"); assert(0); exit(1);};
|
|
|
|
protected:
|
|
TComBitIf* m_pcBitIf;
|
|
TComSlice* m_pcSlice;
|
|
TEncBinIf* m_pcBinIf;
|
|
|
|
//--Adaptive loop filter
|
|
|
|
public:
|
|
Void codeCUTransquantBypassFlag( TComDataCU* pcCU, UInt uiAbsPartIdx );
|
|
Void codeSkipFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx );
|
|
Void codeMergeFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx );
|
|
Void codeMergeIndex ( TComDataCU* pcCU, UInt uiAbsPartIdx );
|
|
Void codeSplitFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
|
|
Void codeMVPIdx ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList );
|
|
|
|
Void codePartSize ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
|
|
Void codePredMode ( TComDataCU* pcCU, UInt uiAbsPartIdx );
|
|
Void codeIPCMInfo ( TComDataCU* pcCU, UInt uiAbsPartIdx );
|
|
Void codeTransformSubdivFlag ( UInt uiSymbol, UInt uiCtx );
|
|
Void codeQtCbf ( TComTU & rTu, const ComponentID compID, const Bool lowestLevel );
|
|
Void codeQtRootCbf ( TComDataCU* pcCU, UInt uiAbsPartIdx );
|
|
Void codeQtCbfZero ( TComTU &rTu, const ChannelType chType );
|
|
Void codeQtRootCbfZero ( TComDataCU* pcCU );
|
|
Void codeIntraDirLumaAng ( TComDataCU* pcCU, UInt absPartIdx, Bool isMultiple);
|
|
|
|
Void codeIntraDirChroma ( TComDataCU* pcCU, UInt uiAbsPartIdx );
|
|
Void codeInterDir ( TComDataCU* pcCU, UInt uiAbsPartIdx );
|
|
Void codeRefFrmIdx ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList );
|
|
Void codeMvd ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList );
|
|
|
|
Void codeCrossComponentPrediction( TComTU &rTu, ComponentID compID );
|
|
|
|
Void codeDeltaQP ( TComDataCU* pcCU, UInt uiAbsPartIdx );
|
|
Void codeChromaQpAdjustment ( TComDataCU* cu, UInt absPartIdx );
|
|
|
|
Void codeLastSignificantXY ( UInt uiPosX, UInt uiPosY, Int width, Int height, ComponentID component, UInt uiScanIdx );
|
|
Void codeCoeffNxN ( TComTU &rTu, TCoeff* pcCoef, const ComponentID compID );
|
|
Void codeTransformSkipFlags ( TComTU &rTu, ComponentID component );
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------
|
|
// for RD-optimizatioon
|
|
// -------------------------------------------------------------------------------------------------------------------
|
|
|
|
Void estBit (estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, ChannelType chType);
|
|
Void estCBFBit ( estBitsSbacStruct* pcEstBitsSbac );
|
|
Void estSignificantCoeffGroupMapBit( estBitsSbacStruct* pcEstBitsSbac, ChannelType chType );
|
|
Void estSignificantMapBit ( estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, ChannelType chType );
|
|
Void estLastSignificantPositionBit ( estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, ChannelType chType );
|
|
Void estSignificantCoefficientsBit ( estBitsSbacStruct* pcEstBitsSbac, ChannelType chType );
|
|
|
|
Void codeExplicitRdpcmMode ( TComTU &rTu, const ComponentID compID );
|
|
|
|
|
|
TEncBinIf* getEncBinIf() { return m_pcBinIf; }
|
|
private:
|
|
ContextModel m_contextModels[MAX_NUM_CTX_MOD];
|
|
Int m_numContextModels;
|
|
ContextModel3DBuffer m_cCUSplitFlagSCModel;
|
|
ContextModel3DBuffer m_cCUSkipFlagSCModel;
|
|
ContextModel3DBuffer m_cCUMergeFlagExtSCModel;
|
|
ContextModel3DBuffer m_cCUMergeIdxExtSCModel;
|
|
ContextModel3DBuffer m_cCUPartSizeSCModel;
|
|
ContextModel3DBuffer m_cCUPredModeSCModel;
|
|
ContextModel3DBuffer m_cCUIntraPredSCModel;
|
|
ContextModel3DBuffer m_cCUChromaPredSCModel;
|
|
ContextModel3DBuffer m_cCUDeltaQpSCModel;
|
|
ContextModel3DBuffer m_cCUInterDirSCModel;
|
|
ContextModel3DBuffer m_cCURefPicSCModel;
|
|
ContextModel3DBuffer m_cCUMvdSCModel;
|
|
ContextModel3DBuffer m_cCUQtCbfSCModel;
|
|
ContextModel3DBuffer m_cCUTransSubdivFlagSCModel;
|
|
ContextModel3DBuffer m_cCUQtRootCbfSCModel;
|
|
|
|
ContextModel3DBuffer m_cCUSigCoeffGroupSCModel;
|
|
ContextModel3DBuffer m_cCUSigSCModel;
|
|
ContextModel3DBuffer m_cCuCtxLastX;
|
|
ContextModel3DBuffer m_cCuCtxLastY;
|
|
ContextModel3DBuffer m_cCUOneSCModel;
|
|
ContextModel3DBuffer m_cCUAbsSCModel;
|
|
|
|
ContextModel3DBuffer m_cMVPIdxSCModel;
|
|
|
|
ContextModel3DBuffer m_cSaoMergeSCModel;
|
|
ContextModel3DBuffer m_cSaoTypeIdxSCModel;
|
|
ContextModel3DBuffer m_cTransformSkipSCModel;
|
|
ContextModel3DBuffer m_CUTransquantBypassFlagSCModel;
|
|
ContextModel3DBuffer m_explicitRdpcmFlagSCModel;
|
|
ContextModel3DBuffer m_explicitRdpcmDirSCModel;
|
|
ContextModel3DBuffer m_cCrossComponentPredictionSCModel;
|
|
|
|
ContextModel3DBuffer m_ChromaQpAdjFlagSCModel;
|
|
ContextModel3DBuffer m_ChromaQpAdjIdcSCModel;
|
|
|
|
UInt m_golombRiceAdaptationStatistics[RExt__GOLOMB_RICE_ADAPTATION_STATISTICS_SETS];
|
|
};
|
|
|
|
//! \}
|
|
|
|
#endif // !defined(AFX_TENCSBAC_H__DDA7CDC4_EDE3_4015_9D32_2156249C82AA__INCLUDED_)
|