[x265] [PATCH] cabac: simplify access to cabac context and remove ContextModel3DBuffer.[cpp, h]
Min Chen
chenm003 at 163.com
Fri Oct 18 15:12:55 CEST 2013
# HG changeset patch
# User Min Chen <chenm003 at 163.com>
# Date 1382101769 -28800
# Node ID 9755658ad0e3b6ef590853314281dc1955886a8b
# Parent f3523973eafba8b2157d87bdc06932bf8bac47bf
cabac: simplify access to cabac context and remove ContextModel3DBuffer.[cpp, h]
diff -r f3523973eafb -r 9755658ad0e3 source/Lib/TLibCommon/ContextModel3DBuffer.cpp
--- a/source/Lib/TLibCommon/ContextModel3DBuffer.cpp Fri Oct 18 14:18:05 2013 +0530
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-/* 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-2013, 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 ContextModel3DBuffer.cpp
- \brief context model 3D buffer class
-*/
-
-#include "ContextModel3DBuffer.h"
-
-using namespace x265;
-
-//! \ingroup TLibCommon
-//! \{
-
-// ====================================================================================================================
-// Constructor / destructor / initialization / destroy
-// ====================================================================================================================
-
-ContextModel3DBuffer::ContextModel3DBuffer(UInt uiSizeY, UInt uiSizeX, ContextModel *basePtr, int &count)
- : m_sizeXYZ(uiSizeX * uiSizeY)
-{
- // allocate 3D buffer
- m_contextModel = basePtr;
- count += m_sizeXYZ;
-}
-
-// ====================================================================================================================
-// Public member functions
-// ====================================================================================================================
-
-/**
- * Initialize 3D buffer with respect to slicetype, QP and given initial probability table
- *
- * \param sliceType slice type
- * \param qp input QP value
- * \param psCtxModel given probability table
- */
-void ContextModel3DBuffer::initBuffer(SliceType sliceType, int qp, UChar* ctxModel)
-{
- ctxModel += sliceType * m_sizeXYZ;
-
- for (int n = 0; n < m_sizeXYZ; n++)
- {
- m_contextModel[n].init(qp, ctxModel[n]);
- m_contextModel[n].setBinsCoded(0);
- }
-}
-
-/**
- * Calculate the cost of choosing a probability table based on the current probability of CABAC at encoder
- *
- * \param sliceType slice type
- * \param qp input QP value
- * \param ctxModel given probability table
- */
-UInt ContextModel3DBuffer::calcCost(SliceType sliceType, int qp, UChar* ctxModel)
-{
- UInt cost = 0;
-
- ctxModel += sliceType * m_sizeXYZ;
-
- for (int n = 0; n < m_sizeXYZ; n++)
- {
- ContextModel tmpContextModel;
- tmpContextModel.init(qp, ctxModel[n]);
-
- // Map the 64 CABAC states to their corresponding probability values
- static double aStateToProbLPS[] = { 0.50000000, 0.47460857, 0.45050660, 0.42762859, 0.40591239, 0.38529900, 0.36573242, 0.34715948, 0.32952974, 0.31279528, 0.29691064, 0.28183267, 0.26752040, 0.25393496, 0.24103941, 0.22879875, 0.21717969, 0.20615069, 0.19568177, 0.18574449, 0.17631186, 0.16735824, 0.15885931, 0.15079198, 0.14313433, 0.13586556, 0.12896592, 0.12241667, 0.11620000, 0.11029903, 0.10469773, 0.09938088, 0.09433404, 0.08954349, 0.08499621, 0.08067986, 0.07658271, 0.07269362, 0.06900203, 0.06549791, 0.06217174, 0.05901448, 0.05601756, 0.05317283, 0.05047256, 0.04790942, 0.04547644, 0.04316702, 0.04097487, 0.03889405, 0.03691890, 0.03504406, 0.03326442, 0.03157516, 0.02997168, 0.02844963, 0.02700488, 0.02563349, 0.02433175, 0.02309612, 0.02192323, 0.02080991, 0.01975312, 0.01875000 };
-
- double probLPS = aStateToProbLPS[m_contextModel[n].getState()];
- double prob0, prob1;
- if (m_contextModel[n].getMps() == 1)
- {
- prob0 = probLPS;
- prob1 = 1.0 - prob0;
- }
- else
- {
- prob1 = probLPS;
- prob0 = 1.0 - prob1;
- }
-
- if (m_contextModel[n].getBinsCoded() > 0)
- {
- cost += (UInt)(prob0 * tmpContextModel.getEntropyBits(0) + prob1 * tmpContextModel.getEntropyBits(1));
- }
- }
-
- return cost;
-}
-
-//! \}
diff -r f3523973eafb -r 9755658ad0e3 source/Lib/TLibCommon/ContextModel3DBuffer.h
--- a/source/Lib/TLibCommon/ContextModel3DBuffer.h Fri Oct 18 14:18:05 2013 +0530
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-/* 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-2013, 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 ContextModel3DBuffer.h
- \brief context model 3D buffer class (header)
-*/
-
-#ifndef X265_CONTEXTMODEL3DBUFFER_H
-#define X265_CONTEXTMODEL3DBUFFER_H
-
-#include <stdio.h>
-#include <assert.h>
-#include <memory.h>
-
-#include "CommonDef.h"
-#include "ContextModel.h"
-
-//! \ingroup TLibCommon
-//! \{
-
-// ====================================================================================================================
-// Class definition
-// ====================================================================================================================
-
-namespace x265 {
-// private namespace
-
-/// context model 3D buffer class
-class ContextModel3DBuffer
-{
-protected:
-
- ContextModel* m_contextModel; ///< array of context models
- const UInt m_sizeXYZ; ///< total size of 3D buffer
-
- ContextModel3DBuffer& operator =(const ContextModel3DBuffer&);
-
-public:
-
- ContextModel3DBuffer(UInt uiSizeY, UInt uiSizeX, ContextModel *basePtr, int &count);
- ~ContextModel3DBuffer() {}
-
- // access functions
- ContextModel& get(UInt uiX)
- {
- return m_contextModel[uiX];
- }
-
- // initialization & copy functions
- void initBuffer(SliceType sliceType, int qp, UChar* ctxModel); ///< initialize 3D buffer by slice type & QP
-
- UInt calcCost(SliceType sliceType, int qp, UChar* ctxModel); ///< determine cost of choosing a probability table based on current probabilities
-
- /** copy from another buffer
- * \param src buffer to copy from
- */
- void copyFrom(ContextModel3DBuffer* src)
- {
- assert(m_sizeXYZ == src->m_sizeXYZ);
- ::memcpy(m_contextModel, src->m_contextModel, sizeof(ContextModel) * m_sizeXYZ);
- }
-};
-}
-//! \}
-
-#endif // ifndef X265_CONTEXTMODEL3DBUFFER_H
diff -r f3523973eafb -r 9755658ad0e3 source/Lib/TLibCommon/ContextTables.h
--- a/source/Lib/TLibCommon/ContextTables.h Fri Oct 18 14:18:05 2013 +0530
+++ b/source/Lib/TLibCommon/ContextTables.h Fri Oct 18 21:09:29 2013 +0800
@@ -94,6 +94,36 @@
#define NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX 1
#define CNU 154 ///< dummy initialization value for unused context models 'Context model Not Used'
+// Offset for context
+#define OFF_SPLIT_FLAG_CTX (0)
+#define OFF_SKIP_FLAG_CTX (OFF_SPLIT_FLAG_CTX + NUM_SPLIT_FLAG_CTX)
+#define OFF_MERGE_FLAG_EXT_CTX (OFF_SKIP_FLAG_CTX + NUM_SKIP_FLAG_CTX)
+#define OFF_MERGE_IDX_EXT_CTX (OFF_MERGE_FLAG_EXT_CTX + NUM_MERGE_FLAG_EXT_CTX)
+#define OFF_PART_SIZE_CTX (OFF_MERGE_IDX_EXT_CTX + NUM_MERGE_IDX_EXT_CTX)
+#define OFF_PRED_MODE_CTX (OFF_PART_SIZE_CTX + NUM_PART_SIZE_CTX)
+#define OFF_ADI_CTX (OFF_PRED_MODE_CTX + NUM_PRED_MODE_CTX)
+#define OFF_CHROMA_PRED_CTX (OFF_ADI_CTX + NUM_ADI_CTX)
+#define OFF_DELTA_QP_CTX (OFF_CHROMA_PRED_CTX + NUM_CHROMA_PRED_CTX)
+#define OFF_INTER_DIR_CTX (OFF_DELTA_QP_CTX + NUM_DELTA_QP_CTX)
+#define OFF_REF_NO_CTX (OFF_INTER_DIR_CTX + NUM_INTER_DIR_CTX)
+#define OFF_MV_RES_CTX (OFF_REF_NO_CTX + NUM_REF_NO_CTX)
+#define OFF_QT_CBF_CTX (OFF_MV_RES_CTX + NUM_MV_RES_CTX)
+#define OFF_TRANS_SUBDIV_FLAG_CTX (OFF_QT_CBF_CTX + 2 * NUM_QT_CBF_CTX)
+#define OFF_QT_ROOT_CBF_CTX (OFF_TRANS_SUBDIV_FLAG_CTX + NUM_TRANS_SUBDIV_FLAG_CTX)
+#define OFF_SIG_CG_FLAG_CTX (OFF_QT_ROOT_CBF_CTX + NUM_QT_ROOT_CBF_CTX)
+#define OFF_SIG_FLAG_CTX (OFF_SIG_CG_FLAG_CTX + 2 * NUM_SIG_CG_FLAG_CTX)
+#define OFF_CTX_LAST_FLAG_X (OFF_SIG_FLAG_CTX + NUM_SIG_FLAG_CTX)
+#define OFF_CTX_LAST_FLAG_Y (OFF_CTX_LAST_FLAG_X + 2 * NUM_CTX_LAST_FLAG_XY)
+#define OFF_ONE_FLAG_CTX (OFF_CTX_LAST_FLAG_Y + 2 * NUM_CTX_LAST_FLAG_XY)
+#define OFF_ABS_FLAG_CTX (OFF_ONE_FLAG_CTX + NUM_ONE_FLAG_CTX)
+#define OFF_MVP_IDX_CTX (OFF_ABS_FLAG_CTX + NUM_ABS_FLAG_CTX)
+#define OFF_CU_AMP_CTX (OFF_MVP_IDX_CTX + NUM_MVP_IDX_CTX)
+#define OFF_SAO_MERGE_FLAG_CTX (OFF_CU_AMP_CTX + NUM_CU_AMP_CTX)
+#define OFF_SAO_TYPE_IDX_CTX (OFF_SAO_MERGE_FLAG_CTX + NUM_SAO_MERGE_FLAG_CTX)
+#define OFF_TRANSFORMSKIP_FLAG_CTX (OFF_SAO_TYPE_IDX_CTX + NUM_SAO_TYPE_IDX_CTX)
+#define OFF_CU_TRANSQUANT_BYPASS_FLAG_CTX (OFF_TRANSFORMSKIP_FLAG_CTX + 2 * NUM_TRANSFORMSKIP_FLAG_CTX)
+#define MAX_OFF_CTX_MOD (OFF_CU_TRANSQUANT_BYPASS_FLAG_CTX + NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX)
+
// ====================================================================================================================
// Tables
// ====================================================================================================================
diff -r f3523973eafb -r 9755658ad0e3 source/Lib/TLibEncoder/TEncSbac.cpp
--- a/source/Lib/TLibEncoder/TEncSbac.cpp Fri Oct 18 14:18:05 2013 +0530
+++ b/source/Lib/TLibEncoder/TEncSbac.cpp Fri Oct 18 21:09:29 2013 +0800
@@ -42,6 +42,53 @@
//! \ingroup TLibEncoder
//! \{
+static void initBuffer(ContextModel* contextModel, SliceType sliceType, int qp, UChar* ctxModel, int size)
+{
+ ctxModel += sliceType * size;
+
+ for (int n = 0; n < size; n++)
+ {
+ contextModel[n].init(qp, ctxModel[n]);
+ contextModel[n].setBinsCoded(0);
+ }
+}
+
+static UInt calcCost(ContextModel *contextModel, SliceType sliceType, int qp, UChar* ctxModel, int size)
+{
+ UInt cost = 0;
+
+ ctxModel += sliceType * size;
+
+ for (int n = 0; n < size; n++)
+ {
+ ContextModel tmpContextModel;
+ tmpContextModel.init(qp, ctxModel[n]);
+
+ // Map the 64 CABAC states to their corresponding probability values
+ static double aStateToProbLPS[] = { 0.50000000, 0.47460857, 0.45050660, 0.42762859, 0.40591239, 0.38529900, 0.36573242, 0.34715948, 0.32952974, 0.31279528, 0.29691064, 0.28183267, 0.26752040, 0.25393496, 0.24103941, 0.22879875, 0.21717969, 0.20615069, 0.19568177, 0.18574449, 0.17631186, 0.16735824, 0.15885931, 0.15079198, 0.14313433, 0.13586556, 0.12896592, 0.12241667, 0.11620000, 0.11029903, 0.10469773, 0.09938088, 0.09433404, 0.08954349, 0.08499621, 0.08067986, 0.07658271, 0.07269362, 0.06900203, 0.06549791, 0.06217174, 0.05901448, 0.05601756, 0.05317283, 0.05047256, 0.04790942, 0.04547644, 0.04316702, 0.04097487, 0.03889405, 0.03691890, 0.03504406, 0.03326442, 0.03157516, 0.02997168, 0.02844963, 0.02700488, 0.02563349, 0.02433175, 0.02309612, 0.02192323, 0.02080991, 0.01975312, 0.01875000 };
+
+ double probLPS = aStateToProbLPS[contextModel[n].getState()];
+ double prob0, prob1;
+ if (contextModel[n].getMps() == 1)
+ {
+ prob0 = probLPS;
+ prob1 = 1.0 - prob0;
+ }
+ else
+ {
+ prob1 = probLPS;
+ prob0 = 1.0 - prob1;
+ }
+
+ if (contextModel[n].getBinsCoded() > 0)
+ {
+ cost += (UInt)(prob0 * tmpContextModel.getEntropyBits(0) + prob1 * tmpContextModel.getEntropyBits(1));
+ }
+ }
+
+ return cost;
+}
+
// ====================================================================================================================
// Constructor / destructor / create / destroy
// ====================================================================================================================
@@ -52,36 +99,8 @@
, m_slice(NULL)
, m_binIf(NULL)
, m_coeffCost(0)
- , m_numContextModels(0)
- , m_cuSplitFlagSCModel(1, NUM_SPLIT_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuSkipFlagSCModel(1, NUM_SKIP_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuMergeFlagExtSCModel(1, NUM_MERGE_FLAG_EXT_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuMergeIdxExtSCModel(1, NUM_MERGE_IDX_EXT_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuPartSizeSCModel(1, NUM_PART_SIZE_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuPredModeSCModel(1, NUM_PRED_MODE_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuIntraPredSCModel(1, NUM_ADI_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuChromaPredSCModel(1, NUM_CHROMA_PRED_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuDeltaQpSCModel(1, NUM_DELTA_QP_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuInterDirSCModel(1, NUM_INTER_DIR_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuRefPicSCModel(1, NUM_REF_NO_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuMvdSCModel(1, NUM_MV_RES_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuQtCbfSCModel(2, NUM_QT_CBF_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuTransSubdivFlagSCModel(1, NUM_TRANS_SUBDIV_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuQtRootCbfSCModel(1, NUM_QT_ROOT_CBF_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuSigCoeffGroupSCModel(2, NUM_SIG_CG_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuSigSCModel(1, NUM_SIG_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuCtxLastX(2, NUM_CTX_LAST_FLAG_XY, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuCtxLastY(2, NUM_CTX_LAST_FLAG_XY, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuOneSCModel(1, NUM_ONE_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuAbsSCModel(1, NUM_ABS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_mvpIdxSCModel(1, NUM_MVP_IDX_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuAMPSCModel(1, NUM_CU_AMP_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_saoMergeSCModel(1, NUM_SAO_MERGE_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_saoTypeIdxSCModel(1, NUM_SAO_TYPE_IDX_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_transformSkipSCModel(2, NUM_TRANSFORMSKIP_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
- , m_cuTransquantBypassFlagSCModel(1, NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
{
- assert(m_numContextModels <= MAX_NUM_CTX_MOD);
+ assert(MAX_OFF_CTX_MOD <= MAX_NUM_CTX_MOD);
}
TEncSbac::~TEncSbac()
@@ -103,34 +122,33 @@
sliceType = (SliceType)encCABACTableIdx;
}
- m_cuSplitFlagSCModel.initBuffer(sliceType, qp, (UChar*)INIT_SPLIT_FLAG);
-
- m_cuSkipFlagSCModel.initBuffer(sliceType, qp, (UChar*)INIT_SKIP_FLAG);
- m_cuMergeFlagExtSCModel.initBuffer(sliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT);
- m_cuMergeIdxExtSCModel.initBuffer(sliceType, qp, (UChar*)INIT_MERGE_IDX_EXT);
- m_cuPartSizeSCModel.initBuffer(sliceType, qp, (UChar*)INIT_PART_SIZE);
- m_cuAMPSCModel.initBuffer(sliceType, qp, (UChar*)INIT_CU_AMP_POS);
- m_cuPredModeSCModel.initBuffer(sliceType, qp, (UChar*)INIT_PRED_MODE);
- m_cuIntraPredSCModel.initBuffer(sliceType, qp, (UChar*)INIT_INTRA_PRED_MODE);
- m_cuChromaPredSCModel.initBuffer(sliceType, qp, (UChar*)INIT_CHROMA_PRED_MODE);
- m_cuInterDirSCModel.initBuffer(sliceType, qp, (UChar*)INIT_INTER_DIR);
- m_cuMvdSCModel.initBuffer(sliceType, qp, (UChar*)INIT_MVD);
- m_cuRefPicSCModel.initBuffer(sliceType, qp, (UChar*)INIT_REF_PIC);
- m_cuDeltaQpSCModel.initBuffer(sliceType, qp, (UChar*)INIT_DQP);
- m_cuQtCbfSCModel.initBuffer(sliceType, qp, (UChar*)INIT_QT_CBF);
- m_cuQtRootCbfSCModel.initBuffer(sliceType, qp, (UChar*)INIT_QT_ROOT_CBF);
- m_cuSigCoeffGroupSCModel.initBuffer(sliceType, qp, (UChar*)INIT_SIG_CG_FLAG);
- m_cuSigSCModel.initBuffer(sliceType, qp, (UChar*)INIT_SIG_FLAG);
- m_cuCtxLastX.initBuffer(sliceType, qp, (UChar*)INIT_LAST);
- m_cuCtxLastY.initBuffer(sliceType, qp, (UChar*)INIT_LAST);
- m_cuOneSCModel.initBuffer(sliceType, qp, (UChar*)INIT_ONE_FLAG);
- m_cuAbsSCModel.initBuffer(sliceType, qp, (UChar*)INIT_ABS_FLAG);
- m_mvpIdxSCModel.initBuffer(sliceType, qp, (UChar*)INIT_MVP_IDX);
- m_cuTransSubdivFlagSCModel.initBuffer(sliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG);
- m_saoMergeSCModel.initBuffer(sliceType, qp, (UChar*)INIT_SAO_MERGE_FLAG);
- m_saoTypeIdxSCModel.initBuffer(sliceType, qp, (UChar*)INIT_SAO_TYPE_IDX);
- m_transformSkipSCModel.initBuffer(sliceType, qp, (UChar*)INIT_TRANSFORMSKIP_FLAG);
- m_cuTransquantBypassFlagSCModel.initBuffer(sliceType, qp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG);
+ initBuffer(&m_contextModels[OFF_SPLIT_FLAG_CTX], sliceType, qp, (UChar*)INIT_SPLIT_FLAG, NUM_SPLIT_FLAG_CTX);
+ initBuffer(&m_contextModels[OFF_SKIP_FLAG_CTX], sliceType, qp, (UChar*)INIT_SKIP_FLAG, NUM_SKIP_FLAG_CTX);
+ initBuffer(&m_contextModels[OFF_MERGE_FLAG_EXT_CTX], sliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT, NUM_MERGE_FLAG_EXT_CTX);
+ initBuffer(&m_contextModels[OFF_MERGE_IDX_EXT_CTX], sliceType, qp, (UChar*)INIT_MERGE_IDX_EXT, NUM_MERGE_IDX_EXT_CTX);
+ initBuffer(&m_contextModels[OFF_PART_SIZE_CTX], sliceType, qp, (UChar*)INIT_PART_SIZE, NUM_PART_SIZE_CTX);
+ initBuffer(&m_contextModels[OFF_PRED_MODE_CTX], sliceType, qp, (UChar*)INIT_PRED_MODE, NUM_PRED_MODE_CTX);
+ initBuffer(&m_contextModels[OFF_ADI_CTX], sliceType, qp, (UChar*)INIT_INTRA_PRED_MODE, NUM_ADI_CTX);
+ initBuffer(&m_contextModels[OFF_CHROMA_PRED_CTX], sliceType, qp, (UChar*)INIT_CHROMA_PRED_MODE, NUM_CHROMA_PRED_CTX);
+ initBuffer(&m_contextModels[OFF_DELTA_QP_CTX], sliceType, qp, (UChar*)INIT_DQP, NUM_DELTA_QP_CTX);
+ initBuffer(&m_contextModels[OFF_INTER_DIR_CTX], sliceType, qp, (UChar*)INIT_INTER_DIR, NUM_INTER_DIR_CTX);
+ initBuffer(&m_contextModels[OFF_REF_NO_CTX], sliceType, qp, (UChar*)INIT_REF_PIC, NUM_REF_NO_CTX);
+ initBuffer(&m_contextModels[OFF_MV_RES_CTX], sliceType, qp, (UChar*)INIT_MVD, NUM_MV_RES_CTX);
+ initBuffer(&m_contextModels[OFF_QT_CBF_CTX], sliceType, qp, (UChar*)INIT_QT_CBF, 2 * NUM_QT_CBF_CTX);
+ initBuffer(&m_contextModels[OFF_TRANS_SUBDIV_FLAG_CTX], sliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG, NUM_TRANS_SUBDIV_FLAG_CTX);
+ initBuffer(&m_contextModels[OFF_QT_ROOT_CBF_CTX], sliceType, qp, (UChar*)INIT_QT_ROOT_CBF, NUM_QT_ROOT_CBF_CTX);
+ initBuffer(&m_contextModels[OFF_SIG_CG_FLAG_CTX], sliceType, qp, (UChar*)INIT_SIG_CG_FLAG, 2 * NUM_SIG_CG_FLAG_CTX);
+ initBuffer(&m_contextModels[OFF_SIG_FLAG_CTX], sliceType, qp, (UChar*)INIT_SIG_FLAG, NUM_SIG_FLAG_CTX);
+ initBuffer(&m_contextModels[OFF_CTX_LAST_FLAG_X], sliceType, qp, (UChar*)INIT_LAST, 2 * NUM_CTX_LAST_FLAG_XY);
+ initBuffer(&m_contextModels[OFF_CTX_LAST_FLAG_Y], sliceType, qp, (UChar*)INIT_LAST, 2 * NUM_CTX_LAST_FLAG_XY);
+ initBuffer(&m_contextModels[OFF_ONE_FLAG_CTX], sliceType, qp, (UChar*)INIT_ONE_FLAG, NUM_ONE_FLAG_CTX);
+ initBuffer(&m_contextModels[OFF_ABS_FLAG_CTX], sliceType, qp, (UChar*)INIT_ABS_FLAG, NUM_ABS_FLAG_CTX);
+ initBuffer(&m_contextModels[OFF_MVP_IDX_CTX], sliceType, qp, (UChar*)INIT_MVP_IDX, NUM_MVP_IDX_CTX);
+ initBuffer(&m_contextModels[OFF_CU_AMP_CTX], sliceType, qp, (UChar*)INIT_CU_AMP_POS, NUM_CU_AMP_CTX);
+ initBuffer(&m_contextModels[OFF_SAO_MERGE_FLAG_CTX], sliceType, qp, (UChar*)INIT_SAO_MERGE_FLAG, NUM_SAO_MERGE_FLAG_CTX);
+ initBuffer(&m_contextModels[OFF_SAO_TYPE_IDX_CTX], sliceType, qp, (UChar*)INIT_SAO_TYPE_IDX, NUM_SAO_TYPE_IDX_CTX);
+ initBuffer(&m_contextModels[OFF_TRANSFORMSKIP_FLAG_CTX], sliceType, qp, (UChar*)INIT_TRANSFORMSKIP_FLAG, 2 * NUM_TRANSFORMSKIP_FLAG_CTX);
+ initBuffer(&m_contextModels[OFF_CU_TRANSQUANT_BYPASS_FLAG_CTX], sliceType, qp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG, NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX);
// new structure
m_lastQp = qp;
@@ -156,33 +174,33 @@
UInt curCost = 0;
SliceType curSliceType = aSliceTypeChoices[idx];
- curCost = m_cuSplitFlagSCModel.calcCost(curSliceType, qp, (UChar*)INIT_SPLIT_FLAG);
- curCost += m_cuSkipFlagSCModel.calcCost(curSliceType, qp, (UChar*)INIT_SKIP_FLAG);
- curCost += m_cuMergeFlagExtSCModel.calcCost(curSliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT);
- curCost += m_cuMergeIdxExtSCModel.calcCost(curSliceType, qp, (UChar*)INIT_MERGE_IDX_EXT);
- curCost += m_cuPartSizeSCModel.calcCost(curSliceType, qp, (UChar*)INIT_PART_SIZE);
- curCost += m_cuAMPSCModel.calcCost(curSliceType, qp, (UChar*)INIT_CU_AMP_POS);
- curCost += m_cuPredModeSCModel.calcCost(curSliceType, qp, (UChar*)INIT_PRED_MODE);
- curCost += m_cuIntraPredSCModel.calcCost(curSliceType, qp, (UChar*)INIT_INTRA_PRED_MODE);
- curCost += m_cuChromaPredSCModel.calcCost(curSliceType, qp, (UChar*)INIT_CHROMA_PRED_MODE);
- curCost += m_cuInterDirSCModel.calcCost(curSliceType, qp, (UChar*)INIT_INTER_DIR);
- curCost += m_cuMvdSCModel.calcCost(curSliceType, qp, (UChar*)INIT_MVD);
- curCost += m_cuRefPicSCModel.calcCost(curSliceType, qp, (UChar*)INIT_REF_PIC);
- curCost += m_cuDeltaQpSCModel.calcCost(curSliceType, qp, (UChar*)INIT_DQP);
- curCost += m_cuQtCbfSCModel.calcCost(curSliceType, qp, (UChar*)INIT_QT_CBF);
- curCost += m_cuQtRootCbfSCModel.calcCost(curSliceType, qp, (UChar*)INIT_QT_ROOT_CBF);
- curCost += m_cuSigCoeffGroupSCModel.calcCost(curSliceType, qp, (UChar*)INIT_SIG_CG_FLAG);
- curCost += m_cuSigSCModel.calcCost(curSliceType, qp, (UChar*)INIT_SIG_FLAG);
- curCost += m_cuCtxLastX.calcCost(curSliceType, qp, (UChar*)INIT_LAST);
- curCost += m_cuCtxLastY.calcCost(curSliceType, qp, (UChar*)INIT_LAST);
- curCost += m_cuOneSCModel.calcCost(curSliceType, qp, (UChar*)INIT_ONE_FLAG);
- curCost += m_cuAbsSCModel.calcCost(curSliceType, qp, (UChar*)INIT_ABS_FLAG);
- curCost += m_mvpIdxSCModel.calcCost(curSliceType, qp, (UChar*)INIT_MVP_IDX);
- curCost += m_cuTransSubdivFlagSCModel.calcCost(curSliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG);
- curCost += m_saoMergeSCModel.calcCost(curSliceType, qp, (UChar*)INIT_SAO_MERGE_FLAG);
- curCost += m_saoTypeIdxSCModel.calcCost(curSliceType, qp, (UChar*)INIT_SAO_TYPE_IDX);
- curCost += m_transformSkipSCModel.calcCost(curSliceType, qp, (UChar*)INIT_TRANSFORMSKIP_FLAG);
- curCost += m_cuTransquantBypassFlagSCModel.calcCost(curSliceType, qp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG);
+ curCost = calcCost(&m_contextModels[OFF_SPLIT_FLAG_CTX], curSliceType, qp, (UChar*)INIT_SPLIT_FLAG, NUM_SPLIT_FLAG_CTX);
+ curCost += calcCost(&m_contextModels[OFF_SKIP_FLAG_CTX], curSliceType, qp, (UChar*)INIT_SKIP_FLAG, NUM_SKIP_FLAG_CTX);
+ curCost += calcCost(&m_contextModels[OFF_MERGE_FLAG_EXT_CTX], curSliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT, NUM_MERGE_FLAG_EXT_CTX);
+ curCost += calcCost(&m_contextModels[OFF_MERGE_IDX_EXT_CTX], curSliceType, qp, (UChar*)INIT_MERGE_IDX_EXT, NUM_MERGE_IDX_EXT_CTX);
+ curCost += calcCost(&m_contextModels[OFF_PART_SIZE_CTX], curSliceType, qp, (UChar*)INIT_PART_SIZE, NUM_PART_SIZE_CTX);
+ curCost += calcCost(&m_contextModels[OFF_PRED_MODE_CTX], curSliceType, qp, (UChar*)INIT_PRED_MODE, NUM_PRED_MODE_CTX);
+ curCost += calcCost(&m_contextModels[OFF_ADI_CTX], curSliceType, qp, (UChar*)INIT_INTRA_PRED_MODE, NUM_ADI_CTX);
+ curCost += calcCost(&m_contextModels[OFF_CHROMA_PRED_CTX], curSliceType, qp, (UChar*)INIT_CHROMA_PRED_MODE, NUM_CHROMA_PRED_CTX);
+ curCost += calcCost(&m_contextModels[OFF_DELTA_QP_CTX], curSliceType, qp, (UChar*)INIT_DQP, NUM_DELTA_QP_CTX);
+ curCost += calcCost(&m_contextModels[OFF_INTER_DIR_CTX], curSliceType, qp, (UChar*)INIT_INTER_DIR, NUM_INTER_DIR_CTX);
+ curCost += calcCost(&m_contextModels[OFF_REF_NO_CTX], curSliceType, qp, (UChar*)INIT_REF_PIC, NUM_REF_NO_CTX);
+ curCost += calcCost(&m_contextModels[OFF_MV_RES_CTX], curSliceType, qp, (UChar*)INIT_MVD, NUM_MV_RES_CTX);
+ curCost += calcCost(&m_contextModels[OFF_QT_CBF_CTX], curSliceType, qp, (UChar*)INIT_QT_CBF, 2 * NUM_QT_CBF_CTX);
+ curCost += calcCost(&m_contextModels[OFF_TRANS_SUBDIV_FLAG_CTX], curSliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG, NUM_TRANS_SUBDIV_FLAG_CTX);
+ curCost += calcCost(&m_contextModels[OFF_QT_ROOT_CBF_CTX], curSliceType, qp, (UChar*)INIT_QT_ROOT_CBF, NUM_QT_ROOT_CBF_CTX);
+ curCost += calcCost(&m_contextModels[OFF_SIG_CG_FLAG_CTX], curSliceType, qp, (UChar*)INIT_SIG_CG_FLAG, 2 * NUM_SIG_CG_FLAG_CTX);
+ curCost += calcCost(&m_contextModels[OFF_SIG_FLAG_CTX], curSliceType, qp, (UChar*)INIT_SIG_FLAG, NUM_SIG_FLAG_CTX);
+ curCost += calcCost(&m_contextModels[OFF_CTX_LAST_FLAG_X], curSliceType, qp, (UChar*)INIT_LAST, 2 * NUM_CTX_LAST_FLAG_XY);
+ curCost += calcCost(&m_contextModels[OFF_CTX_LAST_FLAG_Y], curSliceType, qp, (UChar*)INIT_LAST, 2 * NUM_CTX_LAST_FLAG_XY);
+ curCost += calcCost(&m_contextModels[OFF_ONE_FLAG_CTX], curSliceType, qp, (UChar*)INIT_ONE_FLAG, NUM_ONE_FLAG_CTX);
+ curCost += calcCost(&m_contextModels[OFF_ABS_FLAG_CTX], curSliceType, qp, (UChar*)INIT_ABS_FLAG, NUM_ABS_FLAG_CTX);
+ curCost += calcCost(&m_contextModels[OFF_MVP_IDX_CTX], curSliceType, qp, (UChar*)INIT_MVP_IDX, NUM_MVP_IDX_CTX);
+ curCost += calcCost(&m_contextModels[OFF_CU_AMP_CTX], curSliceType, qp, (UChar*)INIT_CU_AMP_POS, NUM_CU_AMP_CTX);
+ curCost += calcCost(&m_contextModels[OFF_SAO_MERGE_FLAG_CTX], curSliceType, qp, (UChar*)INIT_SAO_MERGE_FLAG, NUM_SAO_MERGE_FLAG_CTX);
+ curCost += calcCost(&m_contextModels[OFF_SAO_TYPE_IDX_CTX], curSliceType, qp, (UChar*)INIT_SAO_TYPE_IDX, NUM_SAO_TYPE_IDX_CTX);
+ curCost += calcCost(&m_contextModels[OFF_TRANSFORMSKIP_FLAG_CTX], curSliceType, qp, (UChar*)INIT_TRANSFORMSKIP_FLAG, 2 * NUM_TRANSFORMSKIP_FLAG_CTX);
+ curCost += calcCost(&m_contextModels[OFF_CU_TRANSQUANT_BYPASS_FLAG_CTX], curSliceType, qp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG, NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX);
if (curCost < bestCost)
{
bestSliceType = curSliceType;
@@ -338,7 +356,7 @@
{
m_binIf->copyState(src->m_binIf);
- this->m_cuIntraPredSCModel.copyFrom(&src->m_cuIntraPredSCModel);
+ ::memcpy(&this->m_contextModels[OFF_ADI_CTX], &src->m_contextModels[OFF_ADI_CTX], sizeof(ContextModel) * NUM_ADI_CTX);
}
void TEncSbac::store(TEncSbac* pDest)
@@ -353,7 +371,7 @@
this->m_coeffCost = src->m_coeffCost;
this->m_lastQp = src->m_lastQp;
- memcpy(m_contextModels, src->m_contextModels, m_numContextModels * sizeof(ContextModel));
+ memcpy(m_contextModels, src->m_contextModels, MAX_OFF_CTX_MOD * sizeof(ContextModel));
}
void TEncSbac::codeMVPIdx(TComDataCU* cu, UInt absPartIdx, RefPicList eRefList)
@@ -361,7 +379,7 @@
int symbol = cu->getMVPIdx(eRefList, absPartIdx);
int num = AMVP_MAX_NUM_CANDS;
- xWriteUnaryMaxSymbol(symbol, &m_mvpIdxSCModel.get(0), 1, num - 1);
+ xWriteUnaryMaxSymbol(symbol, &m_contextModels[OFF_MVP_IDX_CTX], 1, num - 1);
}
void TEncSbac::codePartSize(TComDataCU* cu, UInt absPartIdx, UInt depth)
@@ -372,7 +390,7 @@
{
if (depth == g_maxCUDepth - g_addCUDepth)
{
- m_binIf->encodeBin(partSize == SIZE_2Nx2N ? 1 : 0, m_cuPartSizeSCModel.get(0));
+ m_binIf->encodeBin(partSize == SIZE_2Nx2N ? 1 : 0, m_contextModels[OFF_PART_SIZE_CTX]);
}
return;
}
@@ -381,24 +399,20 @@
{
case SIZE_2Nx2N:
{
- m_binIf->encodeBin(1, m_cuPartSizeSCModel.get(0));
+ m_binIf->encodeBin(1, m_contextModels[OFF_PART_SIZE_CTX]);
break;
}
case SIZE_2NxN:
case SIZE_2NxnU:
case SIZE_2NxnD:
{
- m_binIf->encodeBin(0, m_cuPartSizeSCModel.get(0));
- m_binIf->encodeBin(1, m_cuPartSizeSCModel.get(1));
+ m_binIf->encodeBin(0, m_contextModels[OFF_PART_SIZE_CTX + 0]);
+ m_binIf->encodeBin(1, m_contextModels[OFF_PART_SIZE_CTX + 1]);
if (cu->getSlice()->getSPS()->getAMPAcc(depth))
{
- if (partSize == SIZE_2NxN)
+ m_binIf->encodeBin((partSize == SIZE_2NxN) ? 1 : 0, m_contextModels[OFF_CU_AMP_CTX]);
+ if (partSize != SIZE_2NxN)
{
- m_binIf->encodeBin(1, m_cuAMPSCModel.get(0));
- }
- else
- {
- m_binIf->encodeBin(0, m_cuAMPSCModel.get(0));
m_binIf->encodeBinEP((partSize == SIZE_2NxnU ? 0 : 1));
}
}
@@ -408,21 +422,17 @@
case SIZE_nLx2N:
case SIZE_nRx2N:
{
- m_binIf->encodeBin(0, m_cuPartSizeSCModel.get(0));
- m_binIf->encodeBin(0, m_cuPartSizeSCModel.get(1));
+ m_binIf->encodeBin(0, m_contextModels[OFF_PART_SIZE_CTX + 0]);
+ m_binIf->encodeBin(0, m_contextModels[OFF_PART_SIZE_CTX + 1]);
if (depth == g_maxCUDepth - g_addCUDepth && !(cu->getWidth(absPartIdx) == 8 && cu->getHeight(absPartIdx) == 8))
{
- m_binIf->encodeBin(1, m_cuPartSizeSCModel.get(2));
+ m_binIf->encodeBin(1, m_contextModels[OFF_PART_SIZE_CTX + 2]);
}
if (cu->getSlice()->getSPS()->getAMPAcc(depth))
{
- if (partSize == SIZE_Nx2N)
+ m_binIf->encodeBin((partSize == SIZE_Nx2N) ? 1 : 0, m_contextModels[OFF_CU_AMP_CTX]);
+ if (partSize != SIZE_Nx2N)
{
- m_binIf->encodeBin(1, m_cuAMPSCModel.get(0));
- }
- else
- {
- m_binIf->encodeBin(0, m_cuAMPSCModel.get(0));
m_binIf->encodeBinEP((partSize == SIZE_nLx2N ? 0 : 1));
}
}
@@ -432,9 +442,9 @@
{
if (depth == g_maxCUDepth - g_addCUDepth && !(cu->getWidth(absPartIdx) == 8 && cu->getHeight(absPartIdx) == 8))
{
- m_binIf->encodeBin(0, m_cuPartSizeSCModel.get(0));
- m_binIf->encodeBin(0, m_cuPartSizeSCModel.get(1));
- m_binIf->encodeBin(0, m_cuPartSizeSCModel.get(2));
+ m_binIf->encodeBin(0, m_contextModels[OFF_PART_SIZE_CTX + 0]);
+ m_binIf->encodeBin(0, m_contextModels[OFF_PART_SIZE_CTX + 1]);
+ m_binIf->encodeBin(0, m_contextModels[OFF_PART_SIZE_CTX + 2]);
}
break;
}
@@ -455,14 +465,14 @@
// get context function is here
int predMode = cu->getPredictionMode(absPartIdx);
- m_binIf->encodeBin(predMode == MODE_INTER ? 0 : 1, m_cuPredModeSCModel.get(0));
+ m_binIf->encodeBin(predMode == MODE_INTER ? 0 : 1, m_contextModels[OFF_PRED_MODE_CTX]);
}
void TEncSbac::codeCUTransquantBypassFlag(TComDataCU* cu, UInt absPartIdx)
{
UInt symbol = cu->getCUTransquantBypass(absPartIdx);
- m_binIf->encodeBin(symbol, m_cuTransquantBypassFlagSCModel.get(0));
+ m_binIf->encodeBin(symbol, m_contextModels[OFF_CU_TRANSQUANT_BYPASS_FLAG_CTX]);
}
/** code skip flag
@@ -476,7 +486,7 @@
UInt symbol = cu->isSkipped(absPartIdx) ? 1 : 0;
UInt ctxSkip = cu->getCtxSkipFlag(absPartIdx);
- m_binIf->encodeBin(symbol, m_cuSkipFlagSCModel.get(ctxSkip));
+ m_binIf->encodeBin(symbol, m_contextModels[OFF_SKIP_FLAG_CTX + ctxSkip]);
DTRACE_CABAC_VL(g_nSymbolCounter++);
DTRACE_CABAC_T("\tSkipFlag");
DTRACE_CABAC_T("\tuiCtxSkip: ");
@@ -495,7 +505,7 @@
{
const UInt symbol = cu->getMergeFlag(absPartIdx) ? 1 : 0;
- m_binIf->encodeBin(symbol, m_cuMergeFlagExtSCModel.get(0));
+ m_binIf->encodeBin(symbol, m_contextModels[OFF_MERGE_FLAG_EXT_CTX]);
DTRACE_CABAC_VL(g_nSymbolCounter++);
DTRACE_CABAC_T("\tMergeFlag: ");
@@ -524,7 +534,7 @@
const UInt symbol = ui == unaryIdx ? 0 : 1;
if (ui == 0)
{
- m_binIf->encodeBin(symbol, m_cuMergeIdxExtSCModel.get(0));
+ m_binIf->encodeBin(symbol, m_contextModels[OFF_MERGE_IDX_EXT_CTX]);
}
else
{
@@ -552,14 +562,14 @@
UInt currSplitFlag = (cu->getDepth(absPartIdx) > depth) ? 1 : 0;
assert(ctx < 3);
- m_binIf->encodeBin(currSplitFlag, m_cuSplitFlagSCModel.get(ctx));
+ m_binIf->encodeBin(currSplitFlag, m_contextModels[OFF_SPLIT_FLAG_CTX + ctx]);
DTRACE_CABAC_VL(g_nSymbolCounter++)
DTRACE_CABAC_T("\tSplitFlag\n")
}
void TEncSbac::codeTransformSubdivFlag(UInt symbol, UInt ctx)
{
- m_binIf->encodeBin(symbol, m_cuTransSubdivFlagSCModel.get(ctx));
+ m_binIf->encodeBin(symbol, m_contextModels[OFF_TRANS_SUBDIV_FLAG_CTX + ctx]);
DTRACE_CABAC_VL(g_nSymbolCounter++)
DTRACE_CABAC_T("\tparseTransformSubdivFlag()")
DTRACE_CABAC_T("\tsymbol=")
@@ -590,7 +600,7 @@
}
}
- m_binIf->encodeBin((predIdx[j] != -1) ? 1 : 0, m_cuIntraPredSCModel.get(0));
+ m_binIf->encodeBin((predIdx[j] != -1) ? 1 : 0, m_contextModels[OFF_ADI_CTX]);
}
for (j = 0; j < partNum; j++)
@@ -633,7 +643,7 @@
if (intraDirChroma == DM_CHROMA_IDX)
{
- m_binIf->encodeBin(0, m_cuChromaPredSCModel.get(0));
+ m_binIf->encodeBin(0, m_contextModels[OFF_CHROMA_PRED_CTX]);
}
else
{
@@ -649,7 +659,7 @@
}
}
- m_binIf->encodeBin(1, m_cuChromaPredSCModel.get(0));
+ m_binIf->encodeBin(1, m_contextModels[OFF_CHROMA_PRED_CTX]);
m_binIf->encodeBinsEP(intraDirChroma, 2);
}
@@ -662,11 +672,11 @@
if (cu->getPartitionSize(absPartIdx) == SIZE_2Nx2N || cu->getHeight(absPartIdx) != 8)
{
- m_binIf->encodeBin(interDir == 2 ? 1 : 0, m_cuInterDirSCModel.get(ctx));
+ m_binIf->encodeBin(interDir == 2 ? 1 : 0, m_contextModels[OFF_INTER_DIR_CTX + ctx]);
}
if (interDir < 2)
{
- m_binIf->encodeBin(interDir, m_cuInterDirSCModel.get(4));
+ m_binIf->encodeBin(interDir, m_contextModels[OFF_INTER_DIR_CTX + 4]);
}
}
@@ -675,7 +685,7 @@
{
int refFrame = cu->getCUMvField(eRefList)->getRefIdx(absPartIdx);
int idx = 0;
- m_binIf->encodeBin((refFrame == 0 ? 0 : 1), m_cuRefPicSCModel.get(0));
+ m_binIf->encodeBin((refFrame == 0 ? 0 : 1), m_contextModels[OFF_REF_NO_CTX]);
if (refFrame > 0)
{
@@ -687,7 +697,7 @@
const UInt symbol = i == refFrame ? 0 : 1;
if (i == 0)
{
- m_binIf->encodeBin(symbol, m_cuRefPicSCModel.get(idx));
+ m_binIf->encodeBin(symbol, m_contextModels[OFF_REF_NO_CTX + idx]);
}
else
{
@@ -713,8 +723,8 @@
const int hor = cuMvField->getMvd(absPartIdx).x;
const int ver = cuMvField->getMvd(absPartIdx).y;
- m_binIf->encodeBin(hor != 0 ? 1 : 0, m_cuMvdSCModel.get(0));
- m_binIf->encodeBin(ver != 0 ? 1 : 0, m_cuMvdSCModel.get(0));
+ m_binIf->encodeBin(hor != 0 ? 1 : 0, m_contextModels[OFF_MV_RES_CTX]);
+ m_binIf->encodeBin(ver != 0 ? 1 : 0, m_contextModels[OFF_MV_RES_CTX]);
const bool bHorAbsGr0 = hor != 0;
const bool bVerAbsGr0 = ver != 0;
@@ -723,12 +733,12 @@
if (bHorAbsGr0)
{
- m_binIf->encodeBin(horAbs > 1 ? 1 : 0, m_cuMvdSCModel.get(1));
+ m_binIf->encodeBin(horAbs > 1 ? 1 : 0, m_contextModels[OFF_MV_RES_CTX + 1]);
}
if (bVerAbsGr0)
{
- m_binIf->encodeBin(verAbs > 1 ? 1 : 0, m_cuMvdSCModel.get(1));
+ m_binIf->encodeBin(verAbs > 1 ? 1 : 0, m_contextModels[OFF_MV_RES_CTX + 1]);
}
if (bHorAbsGr0)
@@ -762,7 +772,7 @@
UInt absDQp = (UInt)((dqp > 0) ? dqp : (-dqp));
UInt TUValue = X265_MIN((int)absDQp, CU_DQP_TU_CMAX);
- xWriteUnaryMaxSymbol(TUValue, &m_cuDeltaQpSCModel.get(0), 1, CU_DQP_TU_CMAX);
+ xWriteUnaryMaxSymbol(TUValue, &m_contextModels[OFF_DELTA_QP_CTX], 1, CU_DQP_TU_CMAX);
if (absDQp >= CU_DQP_TU_CMAX)
{
xWriteEpExGolomb(absDQp - CU_DQP_TU_CMAX, CU_DQP_EG_k);
@@ -780,7 +790,7 @@
UInt cbf = cu->getCbf(absPartIdx, ttype, trDepth);
UInt ctx = cu->getCtxQtCbf(ttype, trDepth);
- m_binIf->encodeBin(cbf, m_cuQtCbfSCModel.get((ttype ? TEXT_CHROMA : 0) * NUM_QT_CBF_CTX + ctx));
+ m_binIf->encodeBin(cbf, m_contextModels[OFF_QT_CBF_CTX + (ttype ? TEXT_CHROMA : 0) * NUM_QT_CBF_CTX + ctx]);
DTRACE_CABAC_VL(g_nSymbolCounter++)
DTRACE_CABAC_T("\tparseQtCbf()")
DTRACE_CABAC_T("\tsymbol=")
@@ -806,7 +816,7 @@
}
UInt useTransformSkip = cu->getTransformSkip(absPartIdx, ttype);
- m_binIf->encodeBin(useTransformSkip, m_transformSkipSCModel.get((ttype ? TEXT_CHROMA : TEXT_LUMA) * NUM_TRANSFORMSKIP_FLAG_CTX));
+ m_binIf->encodeBin(useTransformSkip, m_contextModels[OFF_TRANSFORMSKIP_FLAG_CTX + (ttype ? TEXT_CHROMA : TEXT_LUMA) * NUM_TRANSFORMSKIP_FLAG_CTX]);
DTRACE_CABAC_VL(g_nSymbolCounter++)
DTRACE_CABAC_T("\tparseTransformSkip()");
DTRACE_CABAC_T("\tsymbol=")
@@ -906,7 +916,7 @@
UInt cbf = cu->getQtRootCbf(absPartIdx);
UInt ctx = 0;
- m_binIf->encodeBin(cbf, m_cuQtRootCbfSCModel.get(ctx));
+ m_binIf->encodeBin(cbf, m_contextModels[OFF_QT_ROOT_CBF_CTX + ctx]);
DTRACE_CABAC_VL(g_nSymbolCounter++)
DTRACE_CABAC_T("\tparseQtRootCbf()")
DTRACE_CABAC_T("\tsymbol=")
@@ -925,7 +935,7 @@
UInt cbf = 0;
UInt ctx = cu->getCtxQtCbf(ttype, trDepth);
- m_binIf->encodeBin(cbf, m_cuQtCbfSCModel.get((ttype ? TEXT_CHROMA : 0) * NUM_QT_CBF_CTX + ctx));
+ m_binIf->encodeBin(cbf, m_contextModels[OFF_QT_CBF_CTX + (ttype ? TEXT_CHROMA : 0) * NUM_QT_CBF_CTX + ctx]);
}
void TEncSbac::codeQtRootCbfZero(TComDataCU*)
@@ -935,7 +945,7 @@
UInt cbf = 0;
UInt ctx = 0;
- m_binIf->encodeBin(cbf, m_cuQtRootCbfSCModel.get(ctx));
+ m_binIf->encodeBin(cbf, m_contextModels[OFF_QT_ROOT_CBF_CTX + ctx]);
}
/** Encode (X,Y) position of the last significant coefficient
@@ -957,8 +967,8 @@
}
UInt ctxLast;
- ContextModel *ctxX = &m_cuCtxLastX.get(ttype ? NUM_CTX_LAST_FLAG_XY : 0);
- ContextModel *ctxY = &m_cuCtxLastY.get(ttype ? NUM_CTX_LAST_FLAG_XY : 0);
+ ContextModel *ctxX = &m_contextModels[OFF_CTX_LAST_FLAG_X + (ttype ? NUM_CTX_LAST_FLAG_XY : 0)];
+ ContextModel *ctxY = &m_contextModels[OFF_CTX_LAST_FLAG_Y + (ttype ? NUM_CTX_LAST_FLAG_XY : 0)];
UInt groupIdxX = g_groupIdx[posx];
UInt groupIdxY = g_groupIdx[posy];
@@ -1110,8 +1120,8 @@
codeLastSignificantXY(posLastX, posLastY, width, height, ttype, scanIdx);
//===== code significance flag =====
- ContextModel * const baseCoeffGroupCtx = &m_cuSigCoeffGroupSCModel.get(ttype ? NUM_SIG_CG_FLAG_CTX : 0);
- ContextModel * const baseCtx = (ttype == TEXT_LUMA) ? &m_cuSigSCModel.get(0) : &m_cuSigSCModel.get(NUM_SIG_FLAG_CTX_LUMA);
+ ContextModel * const baseCoeffGroupCtx = &m_contextModels[OFF_SIG_CG_FLAG_CTX + (ttype ? NUM_SIG_CG_FLAG_CTX : 0)];
+ ContextModel * const baseCtx = (ttype == TEXT_LUMA) ? &m_contextModels[OFF_SIG_FLAG_CTX] : &m_contextModels[OFF_SIG_FLAG_CTX + NUM_SIG_FLAG_CTX_LUMA];
const int lastScanSet = scanPosLast >> LOG2_SCAN_SET_SIZE;
UInt c1 = 1;
@@ -1197,7 +1207,7 @@
ctxSet++;
}
c1 = 1;
- ContextModel *baseCtxMod = (ttype == TEXT_LUMA) ? &m_cuOneSCModel.get(4 * ctxSet) : &m_cuOneSCModel.get(NUM_ONE_FLAG_CTX_LUMA + 4 * ctxSet);
+ ContextModel *baseCtxMod = (ttype == TEXT_LUMA) ? &m_contextModels[OFF_ONE_FLAG_CTX + 4 * ctxSet] : &m_contextModels[OFF_ONE_FLAG_CTX + NUM_ONE_FLAG_CTX_LUMA + 4 * ctxSet];
int numC1Flag = X265_MIN(numNonZero, C1FLAG_NUMBER);
int firstC2FlagIdx = -1;
@@ -1222,7 +1232,7 @@
if (c1 == 0)
{
- baseCtxMod = (ttype == TEXT_LUMA) ? &m_cuAbsSCModel.get(ctxSet) : &m_cuAbsSCModel.get(NUM_ABS_FLAG_CTX_LUMA + ctxSet);
+ baseCtxMod = (ttype == TEXT_LUMA) ? &m_contextModels[OFF_ABS_FLAG_CTX + ctxSet] : &m_contextModels[OFF_ABS_FLAG_CTX + NUM_ABS_FLAG_CTX_LUMA + ctxSet];
if (firstC2FlagIdx != -1)
{
UInt symbol = absCoeff[firstC2FlagIdx] > 2;
@@ -1316,14 +1326,8 @@
*/
void TEncSbac::codeSaoMerge(UInt code)
{
- if (code == 0)
- {
- m_binIf->encodeBin(0, m_saoMergeSCModel.get(0));
- }
- else
- {
- m_binIf->encodeBin(1, m_saoMergeSCModel.get(0));
- }
+ assert((code == 0) || (code == 1));
+ m_binIf->encodeBin(code, m_contextModels[OFF_SAO_MERGE_FLAG_CTX]);
}
/** Code SAO type index
@@ -1331,13 +1335,9 @@
*/
void TEncSbac::codeSaoTypeIdx(UInt code)
{
- if (code == 0)
+ m_binIf->encodeBin((code == 0) ? 0 : 1, m_contextModels[OFF_SAO_TYPE_IDX_CTX]);
+ if (code != 0)
{
- m_binIf->encodeBin(0, m_saoTypeIdxSCModel.get(0));
- }
- else
- {
- m_binIf->encodeBin(1, m_saoTypeIdxSCModel.get(0));
m_binIf->encodeBinEP(code <= 4 ? 1 : 0);
}
}
@@ -1369,7 +1369,7 @@
*/
void TEncSbac::estCBFBit(estBitsSbacStruct* estBitsSbac)
{
- ContextModel *ctx = &m_cuQtCbfSCModel.get(0);
+ ContextModel *ctx = &m_contextModels[OFF_QT_CBF_CTX];
for (UInt uiCtxInc = 0; uiCtxInc < 3 * NUM_QT_CBF_CTX; uiCtxInc++)
{
@@ -1377,7 +1377,7 @@
estBitsSbac->blockCbpBits[uiCtxInc][1] = ctx[uiCtxInc].getEntropyBits(1);
}
- ctx = &m_cuQtRootCbfSCModel.get(0);
+ ctx = &m_contextModels[OFF_QT_ROOT_CBF_CTX];
for (UInt uiCtxInc = 0; uiCtxInc < 4; uiCtxInc++)
{
@@ -1401,7 +1401,7 @@
{
for (UInt bin = 0; bin < 2; bin++)
{
- estBitsSbac->significantCoeffGroupBits[ctxIdx][bin] = m_cuSigCoeffGroupSCModel.get((ttype ? NUM_SIG_CG_FLAG_CTX : 0) + ctxIdx).getEntropyBits(bin);
+ estBitsSbac->significantCoeffGroupBits[ctxIdx][bin] = m_contextModels[OFF_SIG_CG_FLAG_CTX + ((ttype ? NUM_SIG_CG_FLAG_CTX : 0) + ctxIdx)].getEntropyBits(bin);
}
}
}
@@ -1431,14 +1431,14 @@
{
for (UInt bin = 0; bin < 2; bin++)
{
- estBitsSbac->significantBits[0][bin] = m_cuSigSCModel.get(0).getEntropyBits(bin);
+ estBitsSbac->significantBits[0][bin] = m_contextModels[OFF_SIG_FLAG_CTX].getEntropyBits(bin);
}
for (int ctxIdx = firstCtx; ctxIdx < firstCtx + numCtx; ctxIdx++)
{
for (UInt bin = 0; bin < 2; bin++)
{
- estBitsSbac->significantBits[ctxIdx][bin] = m_cuSigSCModel.get(ctxIdx).getEntropyBits(bin);
+ estBitsSbac->significantBits[ctxIdx][bin] = m_contextModels[OFF_SIG_FLAG_CTX + ctxIdx].getEntropyBits(bin);
}
}
}
@@ -1446,14 +1446,14 @@
{
for (UInt bin = 0; bin < 2; bin++)
{
- estBitsSbac->significantBits[0][bin] = m_cuSigSCModel.get(NUM_SIG_FLAG_CTX_LUMA + 0).getEntropyBits(bin);
+ estBitsSbac->significantBits[0][bin] = m_contextModels[OFF_SIG_FLAG_CTX + (NUM_SIG_FLAG_CTX_LUMA + 0)].getEntropyBits(bin);
}
for (int ctxIdx = firstCtx; ctxIdx < firstCtx + numCtx; ctxIdx++)
{
for (UInt bin = 0; bin < 2; bin++)
{
- estBitsSbac->significantBits[ctxIdx][bin] = m_cuSigSCModel.get(NUM_SIG_FLAG_CTX_LUMA + ctxIdx).getEntropyBits(bin);
+ estBitsSbac->significantBits[ctxIdx][bin] = m_contextModels[OFF_SIG_FLAG_CTX + (NUM_SIG_FLAG_CTX_LUMA + ctxIdx)].getEntropyBits(bin);
}
}
}
@@ -1470,16 +1470,16 @@
for (ctx = 0; ctx < g_groupIdx[width - 1]; ctx++)
{
int ctxOffset = blkSizeOffsetX + (ctx >> shiftX);
- estBitsSbac->lastXBits[ctx] = bitsX + m_cuCtxLastX.get((ttype ? NUM_CTX_LAST_FLAG_XY : 0) + ctxOffset).getEntropyBits(0);
- bitsX += m_cuCtxLastX.get((ttype ? NUM_CTX_LAST_FLAG_XY : 0) + ctxOffset).getEntropyBits(1);
+ estBitsSbac->lastXBits[ctx] = bitsX + m_contextModels[OFF_CTX_LAST_FLAG_X + ((ttype ? NUM_CTX_LAST_FLAG_XY : 0) + ctxOffset)].getEntropyBits(0);
+ bitsX += m_contextModels[OFF_CTX_LAST_FLAG_X + ((ttype ? NUM_CTX_LAST_FLAG_XY : 0) + ctxOffset)].getEntropyBits(1);
}
estBitsSbac->lastXBits[ctx] = bitsX;
for (ctx = 0; ctx < g_groupIdx[height - 1]; ctx++)
{
int ctxOffset = blkSizeOffsetY + (ctx >> shiftY);
- estBitsSbac->lastYBits[ctx] = bitsY + m_cuCtxLastY.get((ttype ? NUM_CTX_LAST_FLAG_XY : 0) + ctxOffset).getEntropyBits(0);
- bitsY += m_cuCtxLastY.get((ttype ? NUM_CTX_LAST_FLAG_XY : 0) + ctxOffset).getEntropyBits(1);
+ estBitsSbac->lastYBits[ctx] = bitsY + m_contextModels[OFF_CTX_LAST_FLAG_Y + ((ttype ? NUM_CTX_LAST_FLAG_XY : 0) + ctxOffset)].getEntropyBits(0);
+ bitsY += m_contextModels[OFF_CTX_LAST_FLAG_Y + ((ttype ? NUM_CTX_LAST_FLAG_XY : 0) + ctxOffset)].getEntropyBits(1);
}
estBitsSbac->lastYBits[ctx] = bitsY;
@@ -1495,8 +1495,8 @@
{
if (ttype == TEXT_LUMA)
{
- ContextModel *ctxOne = &m_cuOneSCModel.get(0);
- ContextModel *ctxAbs = &m_cuAbsSCModel.get(0);
+ ContextModel *ctxOne = &m_contextModels[OFF_ONE_FLAG_CTX];
+ ContextModel *ctxAbs = &m_contextModels[OFF_ABS_FLAG_CTX];
for (int ctxIdx = 0; ctxIdx < NUM_ONE_FLAG_CTX_LUMA; ctxIdx++)
{
@@ -1512,8 +1512,8 @@
}
else
{
- ContextModel *ctxOne = &m_cuOneSCModel.get(NUM_ONE_FLAG_CTX_LUMA);
- ContextModel *ctxAbs = &m_cuAbsSCModel.get(NUM_ABS_FLAG_CTX_LUMA);
+ ContextModel *ctxOne = &m_contextModels[OFF_ONE_FLAG_CTX + NUM_ONE_FLAG_CTX_LUMA];
+ ContextModel *ctxAbs = &m_contextModels[OFF_ABS_FLAG_CTX + NUM_ABS_FLAG_CTX_LUMA];
for (int ctxIdx = 0; ctxIdx < NUM_ONE_FLAG_CTX_CHROMA; ctxIdx++)
{
@@ -1536,7 +1536,7 @@
*/
void TEncSbac::xCopyContextsFrom(TEncSbac* src)
{
- memcpy(m_contextModels, src->m_contextModels, m_numContextModels * sizeof(m_contextModels[0]));
+ memcpy(m_contextModels, src->m_contextModels, MAX_OFF_CTX_MOD * sizeof(m_contextModels[0]));
}
void TEncSbac::loadContexts(TEncSbac* src)
diff -r f3523973eafb -r 9755658ad0e3 source/Lib/TLibEncoder/TEncSbac.h
--- a/source/Lib/TLibEncoder/TEncSbac.h Fri Oct 18 14:18:05 2013 +0530
+++ b/source/Lib/TLibEncoder/TEncSbac.h Fri Oct 18 21:09:29 2013 +0800
@@ -41,7 +41,6 @@
#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"
@@ -173,39 +172,7 @@
private:
UInt m_lastQp;
-
ContextModel m_contextModels[MAX_NUM_CTX_MOD];
- int m_numContextModels;
- ContextModel3DBuffer m_cuSplitFlagSCModel;
- ContextModel3DBuffer m_cuSkipFlagSCModel;
- ContextModel3DBuffer m_cuMergeFlagExtSCModel;
- ContextModel3DBuffer m_cuMergeIdxExtSCModel;
- ContextModel3DBuffer m_cuPartSizeSCModel;
- ContextModel3DBuffer m_cuPredModeSCModel;
- ContextModel3DBuffer m_cuIntraPredSCModel;
- ContextModel3DBuffer m_cuChromaPredSCModel;
- ContextModel3DBuffer m_cuDeltaQpSCModel;
- ContextModel3DBuffer m_cuInterDirSCModel;
- ContextModel3DBuffer m_cuRefPicSCModel;
- ContextModel3DBuffer m_cuMvdSCModel;
- ContextModel3DBuffer m_cuQtCbfSCModel;
- ContextModel3DBuffer m_cuTransSubdivFlagSCModel;
- ContextModel3DBuffer m_cuQtRootCbfSCModel;
-
- ContextModel3DBuffer m_cuSigCoeffGroupSCModel;
- ContextModel3DBuffer m_cuSigSCModel;
- ContextModel3DBuffer m_cuCtxLastX;
- ContextModel3DBuffer m_cuCtxLastY;
- ContextModel3DBuffer m_cuOneSCModel;
- ContextModel3DBuffer m_cuAbsSCModel;
-
- ContextModel3DBuffer m_mvpIdxSCModel;
-
- ContextModel3DBuffer m_cuAMPSCModel;
- ContextModel3DBuffer m_saoMergeSCModel;
- ContextModel3DBuffer m_saoTypeIdxSCModel;
- ContextModel3DBuffer m_transformSkipSCModel;
- ContextModel3DBuffer m_cuTransquantBypassFlagSCModel;
};
}
//! \}
diff -r f3523973eafb -r 9755658ad0e3 source/common/CMakeLists.txt
--- a/source/common/CMakeLists.txt Fri Oct 18 14:18:05 2013 +0530
+++ b/source/common/CMakeLists.txt Fri Oct 18 21:09:29 2013 +0800
@@ -9,7 +9,6 @@
set(LIBCOMMON_HDR
../Lib/TLibCommon/CommonDef.h
../Lib/TLibCommon/ContextModel.h
- ../Lib/TLibCommon/ContextModel3DBuffer.h
../Lib/TLibCommon/ContextTables.h
../Lib/TLibCommon/NAL.h
../Lib/TLibCommon/SEI.h
@@ -33,7 +32,6 @@
../Lib/TLibCommon/TypeDef.h)
set(LIBCOMMON_SRC
../Lib/TLibCommon/ContextModel.cpp
- ../Lib/TLibCommon/ContextModel3DBuffer.cpp
../Lib/TLibCommon/TComBitStream.cpp
../Lib/TLibCommon/TComDataCU.cpp
../Lib/TLibCommon/TComLoopFilter.cpp
More information about the x265-devel
mailing list