diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 9b339ebdc050a792b315a1d2617f87cd2bd11682..b5a5343eb42936d3721fdc19d94aacb67dfcf009 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -242,12 +242,10 @@ void EncApp::xInitLibCfg() #if ENABLE_WPP_PARALLELISM m_cEncLib.setUseAltDQPCoding ( m_AltDQPCoding ); #endif -#if JVET_K1000_SIMPLIFIED_EMT m_cEncLib.setIntraEMT ( m_EMT & 1 ); m_cEncLib.setFastIntraEMT ( m_FastEMT & m_EMT & 1 ); m_cEncLib.setInterEMT ( ( m_EMT >> 1 ) & 1 ); m_cEncLib.setFastInterEMT ( ( m_FastEMT >> 1 ) & ( m_EMT >> 1 ) & 1 ); -#endif #if JVET_K0157 m_cEncLib.setUseCompositeRef ( m_compositeRefEnabled ); #endif diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 2150b9ef7299556b8f6578434d2475d64417d0db..1b47da629f81df58a0530a4a838753d965bb88e2 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -844,7 +844,6 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) "\t1: Enable LMChroma\n") #else #endif -#if JVET_K1000_SIMPLIFIED_EMT ("EMT,-emt", m_EMT, 0, "Enhanced Multiple Transform (EMT)\n" "\t0: Disable EMT\n" "\t1: Enable only Intra EMT\n" @@ -855,7 +854,6 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) "\t1: Enable fast methods only for Intra EMT\n" "\t2: Enable fast methods only for Inter EMT\n" "\t3: Enable fast methods for both Intra & Inter EMT\n") -#endif #if JVET_K0157 ("CompositeLTReference", m_compositeRefEnabled, false, "Enable Composite Long Term Reference Frame") #endif @@ -1956,10 +1954,8 @@ bool EncAppCfg::xCheckParameter() xConfirmPara( m_useSaveLoadEncInfo, "Encoder decision saving can only be applied when encoding with NEXT profile" ); xConfirmPara( m_useSaveLoadSplitDecision, "Encoder split decision saving can only be applied when encoding with NEXT profile" ); #endif -#if JVET_K1000_SIMPLIFIED_EMT xConfirmPara( m_EMT, "EMT only allowed with NEXT profile" ); xConfirmPara( m_FastEMT, "EMT only allowed with NEXT profile" ); -#endif #if JVET_K0157 xConfirmPara(m_compositeRefEnabled, "Composite Reference Frame is only allowed with NEXT profile"); #endif @@ -2341,10 +2337,8 @@ bool EncAppCfg::xCheckParameter() { xConfirmPara( m_maxNumMergeCand > 5, "MaxNumMergeCand must be 5 or smaller." ); } -#if JVET_K1000_SIMPLIFIED_EMT xConfirmPara( m_EMT < 0 || m_EMT >3, "EMT must be 0, 1, 2 or 3" ); xConfirmPara( m_FastEMT < 0 || m_FastEMT >3, "FEMT must be 0, 1, 2 or 3" ); -#endif if( m_usePCM) { for (uint32_t channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++) @@ -3226,9 +3220,7 @@ void EncAppCfg::xPrintParameter() #if JVET_K0190 msg( VERBOSE, "LMChroma:%d ", m_LMChroma ); #endif -#if JVET_K1000_SIMPLIFIED_EMT msg( VERBOSE, "EMT: %1d(intra) %1d(inter) ", m_EMT & 1, ( m_EMT >> 1 ) & 1 ); -#endif #if JVET_K0157 msg(VERBOSE, "CompositeLTReference:%d ", m_compositeRefEnabled); #endif @@ -3252,9 +3244,7 @@ void EncAppCfg::xPrintParameter() #if JVET_K0357_AMVR if( m_ImvMode == 2 ) msg( VERBOSE, "IMV4PelFast:%d ", m_Imv4PelFast ); #endif -#if JVET_K1000_SIMPLIFIED_EMT if( m_EMT ) msg( VERBOSE, "EMTFast: %1d(intra) %1d(inter) ", ( m_FastEMT & m_EMT & 1 ), ( m_FastEMT >> 1 ) & ( m_EMT >> 1 ) & 1 ); -#endif if( m_QTBT ) msg( VERBOSE, "AMaxBT:%d ", m_useAMaxBT ); if( m_QTBT ) msg( VERBOSE, "E0023FastEnc:%d ", m_e0023FastEnc ); if( m_QTBT ) msg( VERBOSE, "ContentBasedFastQtbt:%d ", m_contentBasedFastQtbt ); diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 106893be4d47790f170557887aee64d855bb661d..8a060f6df82d961d222f4cb3a8c4b78e29bd415c 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -225,10 +225,8 @@ protected: #if JVET_K0190 int m_LMChroma; #endif -#if JVET_K1000_SIMPLIFIED_EMT int m_EMT; ///< XZ: Enhanced Multiple Transform int m_FastEMT; ///< XZ: Fast Methods of Enhanced Multiple Transform -#endif #if JVET_K0157 bool m_compositeRefEnabled; diff --git a/source/Lib/CommonLib/CodingStatistics.h b/source/Lib/CommonLib/CodingStatistics.h index 43496c0356fad85d3ef477cd0dcc62cd4dd5b41b..db496883ed55a35123ac2d19cd6b746ebc34c222 100644 --- a/source/Lib/CommonLib/CodingStatistics.h +++ b/source/Lib/CommonLib/CodingStatistics.h @@ -110,13 +110,9 @@ enum CodingStatisticsType #if JVET_K0357_AMVR STATS__CABAC_BITS__IMV_FLAG, #endif -#if JVET_K1000_SIMPLIFIED_EMT STATS__CABAC_BITS__EMT_CU_FLAG, STATS__CABAC_BITS__EMT_TU_INDEX, -#endif -#if JVET_K1000_SIMPLIFIED_EMT STATS__TOOL_EMT, -#endif STATS__TOOL_TOTAL, STATS__NUM_STATS }; @@ -194,10 +190,8 @@ static inline const char* getName(CodingStatisticsType name) #if JVET_K0357_AMVR "CABAC_BITS__IMV_FLAG", #endif -#if JVET_K1000_SIMPLIFIED_EMT "CABAC_BITS__EMT_CU_FLAG", "CABAC_BITS__EMT_TU_INDX", -#endif "CABAC_BITS__OTHER", "CABAC_BITS__INVALID", "TOOL_FRAME", diff --git a/source/Lib/CommonLib/CommonDef.h b/source/Lib/CommonLib/CommonDef.h index d878f43d5bd1a0489a65f8b5aafc010739d7bd89..a22503274cb15dd96ae715ca15118b4165d6ed66 100644 --- a/source/Lib/CommonLib/CommonDef.h +++ b/source/Lib/CommonLib/CommonDef.h @@ -224,17 +224,10 @@ static const int DM_CHROMA_IDX = NUM_INTRA_MODE; ///< chro static const uint8_t INTER_MODE_IDX = 255; ///< index for inter modes -#if JVET_K1000_SIMPLIFIED_EMT static const uint32_t EMT_INTRA_MAX_CU = 32; ///< Max Intra CU size applying EMT, supported values: 8, 16, 32, 64, 128 static const uint32_t EMT_INTER_MAX_CU = 32; ///< Max Inter CU size applying EMT, supported values: 8, 16, 32, 64, 128 -#if JVET_K1000_SIMPLIFIED_EMT static const uint32_t EMT_INTRA_MAX_CU_WITH_QTBT = 32; ///< Max Intra CU size applying EMT, supported values: 8, 16, 32, 64, 128 static const uint32_t EMT_INTER_MAX_CU_WITH_QTBT = 32; ///< Max Inter CU size applying EMT, supported values: 8, 16, 32, 64, 128 -#else -static const uint32_t EMT_INTRA_MAX_CU_WITH_QTBT = 64; ///< Max Intra CU size applying EMT, supported values: 8, 16, 32, 64, 128 -static const uint32_t EMT_INTER_MAX_CU_WITH_QTBT = 64; ///< Max Inter CU size applying EMT, supported values: 8, 16, 32, 64, 128 -#endif -#endif #if INTRA67_3MPM static const int NUM_MOST_PROBABLE_MODES = 3; @@ -340,9 +333,7 @@ static const int MAX_ENCODER_DEBLOCKING_QUALITY_LAYERS = 8 ; static const uint32_t LUMA_LEVEL_TO_DQP_LUT_MAXSIZE = 1024; ///< max LUT size for QP offset based on luma #endif -#if JVET_K1000_SIMPLIFIED_EMT static const int NUM_EMT_CU_FLAG_CTX = 6; ///< number of context models for EMT CU-level flag -#endif //QTBT high level parameters //for I slice luma CTB configuration para. diff --git a/source/Lib/CommonLib/ContextModelling.cpp b/source/Lib/CommonLib/ContextModelling.cpp index ad1154433cebc5d5f0c57ee59d520115c810e1cc..c9589b85c0cfd3e26bed416688c0a1502dc6dc76 100644 --- a/source/Lib/CommonLib/ContextModelling.cpp +++ b/source/Lib/CommonLib/ContextModelling.cpp @@ -297,9 +297,7 @@ CoeffCodingContext::CoeffCodingContext(const TransformUnit& tu, ComponentID comp #if JVET_K0072 #else #endif -#if JVET_K1000_SIMPLIFIED_EMT , m_emtNumSigCoeff (0) -#endif { // LOGTODO unsigned log2sizeX = m_log2BlockWidth; diff --git a/source/Lib/CommonLib/ContextModelling.h b/source/Lib/CommonLib/ContextModelling.h index ff3743f96a0c5059017fb5007d5fc37790578658..6d234252a677ae428ada384a0099b572491d6a59 100644 --- a/source/Lib/CommonLib/ContextModelling.h +++ b/source/Lib/CommonLib/ContextModelling.h @@ -431,10 +431,8 @@ public: } #endif -#if JVET_K1000_SIMPLIFIED_EMT unsigned emtNumSigCoeff() const { return m_emtNumSigCoeff; } void setEmtNumSigCoeff( unsigned val ) { m_emtNumSigCoeff = val; } -#endif private: // constant @@ -516,9 +514,7 @@ private: #if JVET_K0072 #else #endif -#if JVET_K1000_SIMPLIFIED_EMT unsigned m_emtNumSigCoeff; -#endif }; diff --git a/source/Lib/CommonLib/Contexts.cpp b/source/Lib/CommonLib/Contexts.cpp index b387c12caabc004df24bc3a9bb36e0313f6cf210..c474b3cdcc05b77073e90b2a41e8e2887c5b79e5 100644 --- a/source/Lib/CommonLib/Contexts.cpp +++ b/source/Lib/CommonLib/Contexts.cpp @@ -714,7 +714,6 @@ const CtxSet ContextSetCfg::RdpcmDir = ContextSetCfg::addCtxSet { CNU, CNU,}, }); -#if JVET_K1000_SIMPLIFIED_EMT const CtxSet ContextSetCfg::EMTTuIndex = ContextSetCfg::addCtxSet ({ { CNU, CNU, CNU, CNU,}, @@ -728,7 +727,6 @@ const CtxSet ContextSetCfg::EMTCuFlag = ContextSetCfg::addCtxSet { CNU, CNU, CNU, CNU, CNU, CNU,}, { CNU, CNU, CNU, CNU, CNU, CNU,}, }); -#endif const CtxSet ContextSetCfg::CrossCompPred = ContextSetCfg::addCtxSet ({ diff --git a/source/Lib/CommonLib/Contexts.h b/source/Lib/CommonLib/Contexts.h index d98a572cd88ef9a806ceddd112a75ea42635168b..b15860c821715cb5fc5fe19aa3eb86bca869eb68 100644 --- a/source/Lib/CommonLib/Contexts.h +++ b/source/Lib/CommonLib/Contexts.h @@ -202,10 +202,8 @@ public: static const CtxSet TransquantBypassFlag; static const CtxSet RdpcmFlag; static const CtxSet RdpcmDir; -#if JVET_K1000_SIMPLIFIED_EMT static const CtxSet EMTTuIndex; static const CtxSet EMTCuFlag; -#endif static const CtxSet CrossCompPred; static const CtxSet ChromaQpAdjFlag; static const CtxSet ChromaQpAdjIdc; diff --git a/source/Lib/CommonLib/Rom.cpp b/source/Lib/CommonLib/Rom.cpp index 84c9beca97ea9ca805a2651e8f4d1b721e4a5e06..baba1e315fc2d6f8f69f5d212a5fd88f647b53f5 100644 --- a/source/Lib/CommonLib/Rom.cpp +++ b/source/Lib/CommonLib/Rom.cpp @@ -257,9 +257,6 @@ void initROM() case 3: iT = g_aiTr16[0][0]; break; case 4: iT = g_aiTr32[0][0]; break; case 5: iT = g_aiTr64[0][0]; break; -#if !JVET_K1000_SIMPLIFIED_EMT - case 6: iT = g_aiTr128[0][0]; break; -#endif default: exit(0); break; } @@ -282,17 +279,6 @@ void initROM() v = sin(PI*(k + 0.5)*(n + 1) / (c + 0.5)) * sqrt(2.0 / (c + 0.5)); iT[DST7*c*c + k*c + n] = (int16_t)(s * v + (v > 0 ? 0.5 : -0.5)); -#if !JVET_K1000_SIMPLIFIED_EMT - // DCT-V - w0 = (k == 0) ? sqrt(0.5) : 1.0; - double w1 = (n == 0) ? sqrt(0.5) : 1.0; - v = cos(PI*n*k / (c - 0.5)) * w0 * w1 * sqrt(2.0 / (c - 0.5)); - iT[DCT5*c*c + k*c + n] = (int16_t)(s * v + (v > 0 ? 0.5 : -0.5)); - - // DST-I - v = sin(PI*(n + 1)*(k + 1) / (c + 1)) * sqrt(2.0 / (c + 1)); - iT[DST1*c*c + k*c + n] = (int16_t)(s * v + (v > 0 ? 0.5 : -0.5)); -#endif } } c <<= 1; @@ -474,13 +460,8 @@ const int g_invQuantScales[SCALING_LIST_REM_NUM] = //-------------------------------------------------------------------------------------------------- //structures -#if JVET_K1000_SIMPLIFIED_EMT //EMT transform sets -#if JVET_K1000_SIMPLIFIED_EMT const int g_aiTrSubsetIntra[3][2] = { { DST7, DCT8 }, { DST7, DCT8 }, { DST7, DCT8 } }; -#else -const int g_aiTrSubsetIntra[3][2] = { { DST7, DCT8 }, { DST7, DST1 }, { DST7, DCT5 } }; -#endif const int g_aiTrSubsetInter[4] = { DCT8, DST7 }; const uint8_t g_aucTrSetVert[NUM_INTRA_MODE - 1] = @@ -503,7 +484,6 @@ const uint8_t g_aucTrSetHorz35[35] = //EMT threshold const uint32_t g_EmtSigNumThr = 2; -#endif //EMT transform coeficient variable TMatrixCoeff g_aiTr2 [NUM_TRANS_TYPE][ 2][ 2]; @@ -512,9 +492,6 @@ TMatrixCoeff g_aiTr8 [NUM_TRANS_TYPE][ 8][ 8]; TMatrixCoeff g_aiTr16 [NUM_TRANS_TYPE][ 16][ 16]; TMatrixCoeff g_aiTr32 [NUM_TRANS_TYPE][ 32][ 32]; TMatrixCoeff g_aiTr64 [NUM_TRANS_TYPE][ 64][ 64]; -#if !JVET_K1000_SIMPLIFIED_EMT -TMatrixCoeff g_aiTr128[NUM_TRANS_TYPE][128][128]; -#endif //-------------------------------------------------------------------------------------------------- //coefficients diff --git a/source/Lib/CommonLib/Rom.h b/source/Lib/CommonLib/Rom.h index 0fe6ba2222e8c87feac1a5fe78573ddfbd5dd335..1b98dbe27410715935c5ff7588e130f424fd40dc 100644 --- a/source/Lib/CommonLib/Rom.h +++ b/source/Lib/CommonLib/Rom.h @@ -70,25 +70,8 @@ extern uint32_t* g_scanOrderPosXY[SCAN_NUMBER_OF_GROUP_TYPES][SCAN_NUMBER extern const int g_quantScales [SCALING_LIST_REM_NUM]; // Q(QP%6) extern const int g_invQuantScales[SCALING_LIST_REM_NUM]; // IQ(QP%6) -#if JVET_K1000_SIMPLIFIED_EMT static const int g_numTransformMatrixSizes = 6; static const int g_transformMatrixShift[TRANSFORM_NUMBER_OF_DIRECTIONS] = { 6, 6 }; -#else -static const int g_numTransformMatrixSizes = 7; -#if RExt__HIGH_PRECISION_FORWARD_TRANSFORM -static const int g_transformMatrixShift[TRANSFORM_NUMBER_OF_DIRECTIONS] = { 14, 6 }; -#else -static const int g_transformMatrixShift[TRANSFORM_NUMBER_OF_DIRECTIONS] = { 6, 6 }; -#endif - -extern const TMatrixCoeff g_aiT2 [TRANSFORM_NUMBER_OF_DIRECTIONS][ 2][ 2]; -extern const TMatrixCoeff g_aiT4 [TRANSFORM_NUMBER_OF_DIRECTIONS][ 4][ 4]; -extern const TMatrixCoeff g_aiT8 [TRANSFORM_NUMBER_OF_DIRECTIONS][ 8][ 8]; -extern const TMatrixCoeff g_aiT16 [TRANSFORM_NUMBER_OF_DIRECTIONS][ 16][ 16]; -extern const TMatrixCoeff g_aiT32 [TRANSFORM_NUMBER_OF_DIRECTIONS][ 32][ 32]; -extern const TMatrixCoeff g_aiT64 [TRANSFORM_NUMBER_OF_DIRECTIONS][ 64][ 64]; -extern const TMatrixCoeff g_aiT128[TRANSFORM_NUMBER_OF_DIRECTIONS][128][128]; -#endif // ==================================================================================================================== @@ -146,7 +129,6 @@ static const unsigned mpmCtx[NUM_INTRA_MODE] = extern const TMatrixCoeff g_as_DST_MAT_4 [TRANSFORM_NUMBER_OF_DIRECTIONS][4][4]; #endif -#if JVET_K1000_SIMPLIFIED_EMT extern const int g_aiTrSubsetIntra[3][2]; extern const int g_aiTrSubsetInter[4]; @@ -157,7 +139,6 @@ extern const uint8_t g_aucTrSetVert35[35]; extern const uint8_t g_aucTrSetHorz35[35]; extern const uint32_t g_EmtSigNumThr; -#endif extern TMatrixCoeff g_aiTr2 [NUM_TRANS_TYPE][ 2][ 2]; extern TMatrixCoeff g_aiTr4 [NUM_TRANS_TYPE][ 4][ 4]; @@ -165,9 +146,6 @@ extern TMatrixCoeff g_aiTr8 [NUM_TRANS_TYPE][ 8][ 8]; extern TMatrixCoeff g_aiTr16 [NUM_TRANS_TYPE][ 16][ 16]; extern TMatrixCoeff g_aiTr32 [NUM_TRANS_TYPE][ 32][ 32]; extern TMatrixCoeff g_aiTr64 [NUM_TRANS_TYPE][ 64][ 64]; -#if !JVET_K1000_SIMPLIFIED_EMT -extern TMatrixCoeff g_aiTr128 [NUM_TRANS_TYPE][128][128]; -#endif // ==================================================================================================================== diff --git a/source/Lib/CommonLib/RomTr.cpp b/source/Lib/CommonLib/RomTr.cpp index 493f77f82b5fa7785810907cccc70818a8609438..4f2b3c3d869ec079129fe1b1b117f7d8d9abaaef 100644 --- a/source/Lib/CommonLib/RomTr.cpp +++ b/source/Lib/CommonLib/RomTr.cpp @@ -37,423 +37,5 @@ #include "Rom.h" -#if !JVET_K1000_SIMPLIFIED_EMT - -//-------------------------------------------------------------------------------------------------- -// Transformations - -#if HEVC_USE_4x4_DSTVII -#define DEFINE_DST4x4_MATRIX(a,b,c,d) \ -{ \ - { a, b, c, d }, \ - { c, c, 0, -c }, \ - { d, -a, -c, b }, \ - { b, -d, c, -a }, \ -} - -#endif -#define DEFINE_DCT2x2_MATRIX(a) \ -{ \ - {a, a}, \ - {a, -a} \ -} - -#define DEFINE_DCT4x4_MATRIX(a,b,c) \ -{ \ - { a, a, a, a}, \ - { b, c, -c, -b}, \ - { a, -a, -a, a}, \ - { c, -b, b, -c} \ -} - -#define DEFINE_DCT8x8_MATRIX(a,b,c,d,e,f,g) \ -{ \ - { a, a, a, a, a, a, a, a}, \ - { d, e, f, g, -g, -f, -e, -d}, \ - { b, c, -c, -b, -b, -c, c, b}, \ - { e, -g, -d, -f, f, d, g, -e}, \ - { a, -a, -a, a, a, -a, -a, a}, \ - { f, -d, g, e, -e, -g, d, -f}, \ - { c, -b, b, -c, -c, b, -b, c}, \ - { g, -f, e, -d, d, -e, f, -g} \ -} - -#define DEFINE_DCT16x16_MATRIX(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) \ -{ \ - { a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a}, \ - { h, i, j, k, l, m, n, o, -o, -n, -m, -l, -k, -j, -i, -h}, \ - { d, e, f, g, -g, -f, -e, -d, -d, -e, -f, -g, g, f, e, d}, \ - { i, l, o, -m, -j, -h, -k, -n, n, k, h, j, m, -o, -l, -i}, \ - { b, c, -c, -b, -b, -c, c, b, b, c, -c, -b, -b, -c, c, b}, \ - { j, o, -k, -i, -n, l, h, m, -m, -h, -l, n, i, k, -o, -j}, \ - { e, -g, -d, -f, f, d, g, -e, -e, g, d, f, -f, -d, -g, e}, \ - { k, -m, -i, o, h, n, -j, -l, l, j, -n, -h, -o, i, m, -k}, \ - { a, -a, -a, a, a, -a, -a, a, a, -a, -a, a, a, -a, -a, a}, \ - { l, -j, -n, h, -o, -i, m, k, -k, -m, i, o, -h, n, j, -l}, \ - { f, -d, g, e, -e, -g, d, -f, -f, d, -g, -e, e, g, -d, f}, \ - { m, -h, l, n, -i, k, o, -j, j, -o, -k, i, -n, -l, h, -m}, \ - { c, -b, b, -c, -c, b, -b, c, c, -b, b, -c, -c, b, -b, c}, \ - { n, -k, h, -j, m, o, -l, i, -i, l, -o, -m, j, -h, k, -n}, \ - { g, -f, e, -d, d, -e, f, -g, -g, f, -e, d, -d, e, -f, g}, \ - { o, -n, m, -l, k, -j, i, -h, h, -i, j, -k, l, -m, n, -o} \ -} - -#define DEFINE_DCT32x32_MATRIX(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E) \ -{ \ - { a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a}, \ - { p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, -E, -D, -C, -B, -A, -z, -y, -x, -w, -v, -u, -t, -s, -r, -q, -p}, \ - { h, i, j, k, l, m, n, o, -o, -n, -m, -l, -k, -j, -i, -h, -h, -i, -j, -k, -l, -m, -n, -o, o, n, m, l, k, j, i, h}, \ - { q, t, w, z, C, -E, -B, -y, -v, -s, -p, -r, -u, -x, -A, -D, D, A, x, u, r, p, s, v, y, B, E, -C, -z, -w, -t, -q}, \ - { d, e, f, g, -g, -f, -e, -d, -d, -e, -f, -g, g, f, e, d, d, e, f, g, -g, -f, -e, -d, -d, -e, -f, -g, g, f, e, d}, \ - { r, w, B, -D, -y, -t, -p, -u, -z, -E, A, v, q, s, x, C, -C, -x, -s, -q, -v, -A, E, z, u, p, t, y, D, -B, -w, -r}, \ - { i, l, o, -m, -j, -h, -k, -n, n, k, h, j, m, -o, -l, -i, -i, -l, -o, m, j, h, k, n, -n, -k, -h, -j, -m, o, l, i}, \ - { s, z, -D, -w, -p, -v, -C, A, t, r, y, -E, -x, -q, -u, -B, B, u, q, x, E, -y, -r, -t, -A, C, v, p, w, D, -z, -s}, \ - { b, c, -c, -b, -b, -c, c, b, b, c, -c, -b, -b, -c, c, b, b, c, -c, -b, -b, -c, c, b, b, c, -c, -b, -b, -c, c, b}, \ - { t, C, -y, -p, -x, D, u, s, B, -z, -q, -w, E, v, r, A, -A, -r, -v, -E, w, q, z, -B, -s, -u, -D, x, p, y, -C, -t}, \ - { j, o, -k, -i, -n, l, h, m, -m, -h, -l, n, i, k, -o, -j, -j, -o, k, i, n, -l, -h, -m, m, h, l, -n, -i, -k, o, j}, \ - { u, -E, -t, -v, D, s, w, -C, -r, -x, B, q, y, -A, -p, -z, z, p, A, -y, -q, -B, x, r, C, -w, -s, -D, v, t, E, -u}, \ - { e, -g, -d, -f, f, d, g, -e, -e, g, d, f, -f, -d, -g, e, e, -g, -d, -f, f, d, g, -e, -e, g, d, f, -f, -d, -g, e}, \ - { v, -B, -p, -C, u, w, -A, -q, -D, t, x, -z, -r, -E, s, y, -y, -s, E, r, z, -x, -t, D, q, A, -w, -u, C, p, B, -v}, \ - { k, -m, -i, o, h, n, -j, -l, l, j, -n, -h, -o, i, m, -k, -k, m, i, -o, -h, -n, j, l, -l, -j, n, h, o, -i, -m, k}, \ - { w, -y, -u, A, s, -C, -q, E, p, D, -r, -B, t, z, -v, -x, x, v, -z, -t, B, r, -D, -p, -E, q, C, -s, -A, u, y, -w}, \ - { a, -a, -a, a, a, -a, -a, a, a, -a, -a, a, a, -a, -a, a, a, -a, -a, a, a, -a, -a, a, a, -a, -a, a, a, -a, -a, a}, \ - { x, -v, -z, t, B, -r, -D, p, -E, -q, C, s, -A, -u, y, w, -w, -y, u, A, -s, -C, q, E, -p, D, r, -B, -t, z, v, -x}, \ - { l, -j, -n, h, -o, -i, m, k, -k, -m, i, o, -h, n, j, -l, -l, j, n, -h, o, i, -m, -k, k, m, -i, -o, h, -n, -j, l}, \ - { y, -s, -E, r, -z, -x, t, D, -q, A, w, -u, -C, p, -B, -v, v, B, -p, C, u, -w, -A, q, -D, -t, x, z, -r, E, s, -y}, \ - { f, -d, g, e, -e, -g, d, -f, -f, d, -g, -e, e, g, -d, f, f, -d, g, e, -e, -g, d, -f, -f, d, -g, -e, e, g, -d, f}, \ - { z, -p, A, y, -q, B, x, -r, C, w, -s, D, v, -t, E, u, -u, -E, t, -v, -D, s, -w, -C, r, -x, -B, q, -y, -A, p, -z}, \ - { m, -h, l, n, -i, k, o, -j, j, -o, -k, i, -n, -l, h, -m, -m, h, -l, -n, i, -k, -o, j, -j, o, k, -i, n, l, -h, m}, \ - { A, -r, v, -E, -w, q, -z, -B, s, -u, D, x, -p, y, C, -t, t, -C, -y, p, -x, -D, u, -s, B, z, -q, w, E, -v, r, -A}, \ - { c, -b, b, -c, -c, b, -b, c, c, -b, b, -c, -c, b, -b, c, c, -b, b, -c, -c, b, -b, c, c, -b, b, -c, -c, b, -b, c}, \ - { B, -u, q, -x, E, y, -r, t, -A, -C, v, -p, w, -D, -z, s, -s, z, D, -w, p, -v, C, A, -t, r, -y, -E, x, -q, u, -B}, \ - { n, -k, h, -j, m, o, -l, i, -i, l, -o, -m, j, -h, k, -n, -n, k, -h, j, -m, -o, l, -i, i, -l, o, m, -j, h, -k, n}, \ - { C, -x, s, -q, v, -A, -E, z, -u, p, -t, y, -D, -B, w, -r, r, -w, B, D, -y, t, -p, u, -z, E, A, -v, q, -s, x, -C}, \ - { g, -f, e, -d, d, -e, f, -g, -g, f, -e, d, -d, e, -f, g, g, -f, e, -d, d, -e, f, -g, -g, f, -e, d, -d, e, -f, g}, \ - { D, -A, x, -u, r, -p, s, -v, y, -B, E, C, -z, w, -t, q, -q, t, -w, z, -C, -E, B, -y, v, -s, p, -r, u, -x, A, -D}, \ - { o, -n, m, -l, k, -j, i, -h, h, -i, j, -k, l, -m, n, -o, -o, n, -m, l, -k, j, -i, h, -h, i, -j, k, -l, m, -n, o}, \ - { E, -D, C, -B, A, -z, y, -x, w, -v, u, -t, s, -r, q, -p, p, -q, r, -s, t, -u, v, -w, x, -y, z, -A, B, -C, D, -E} \ -} - - -#define DEFINE_DCT64x64_MATRIX(aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk, bl, bm, bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bz, ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck) \ -{ \ - { aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa }, \ - { bf, bg, bh, bi, bj, bk, bl, bm, bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bz, ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, -ck, -cj, -ci, -ch, -cg, -cf, -ce, -cd, -cc, -cb, -ca, -bz, -by, -bx, -bw, -bv, -bu, -bt, -bs, -br, -bq, -bp, -bo, -bn, -bm, -bl, -bk, -bj, -bi, -bh, -bg, -bf }, \ - { ap, aq, ar, as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, -be, -bd, -bc, -bb, -ba, -az, -ay, -ax, -aw, -av, -au, -at, -as, -ar, -aq, -ap, -ap, -aq, -ar, -as, -at, -au, -av, -aw, -ax, -ay, -az, -ba, -bb, -bc, -bd, -be, be, bd, bc, bb, ba, az, ay, ax, aw, av, au, at, as, ar, aq, ap }, \ - { bg, bj, bm, bp, bs, bv, by, cb, ce, ch, ck, -ci, -cf, -cc, -bz, -bw, -bt, -bq, -bn, -bk, -bh, -bf, -bi, -bl, -bo, -br, -bu, -bx, -ca, -cd, -cg, -cj, cj, cg, cd, ca, bx, bu, br, bo, bl, bi, bf, bh, bk, bn, bq, bt, bw, bz, cc, cf, ci, -ck, -ch, -ce, -cb, -by, -bv, -bs, -bp, -bm, -bj, -bg }, \ - { ah, ai, aj, ak, al, am, an, ao, -ao, -an, -am, -al, -ak, -aj, -ai, -ah, -ah, -ai, -aj, -ak, -al, -am, -an, -ao, ao, an, am, al, ak, aj, ai, ah, ah, ai, aj, ak, al, am, an, ao, -ao, -an, -am, -al, -ak, -aj, -ai, -ah, -ah, -ai, -aj, -ak, -al, -am, -an, -ao, ao, an, am, al, ak, aj, ai, ah }, \ - { bh, bm, br, bw, cb, cg, -ck, -cf, -ca, -bv, -bq, -bl, -bg, -bi, -bn, -bs, -bx, -cc, -ch, cj, ce, bz, bu, bp, bk, bf, bj, bo, bt, by, cd, ci, -ci, -cd, -by, -bt, -bo, -bj, -bf, -bk, -bp, -bu, -bz, -ce, -cj, ch, cc, bx, bs, bn, bi, bg, bl, bq, bv, ca, cf, ck, -cg, -cb, -bw, -br, -bm, -bh }, \ - { aq, at, aw, az, bc, -be, -bb, -ay, -av, -as, -ap, -ar, -au, -ax, -ba, -bd, bd, ba, ax, au, ar, ap, as, av, ay, bb, be, -bc, -az, -aw, -at, -aq, -aq, -at, -aw, -az, -bc, be, bb, ay, av, as, ap, ar, au, ax, ba, bd, -bd, -ba, -ax, -au, -ar, -ap, -as, -av, -ay, -bb, -be, bc, az, aw, at, aq }, \ - { bi, bp, bw, cd, ck, -ce, -bx, -bq, -bj, -bh, -bo, -bv, -cc, -cj, cf, by, br, bk, bg, bn, bu, cb, ci, -cg, -bz, -bs, -bl, -bf, -bm, -bt, -ca, -ch, ch, ca, bt, bm, bf, bl, bs, bz, cg, -ci, -cb, -bu, -bn, -bg, -bk, -br, -by, -cf, cj, cc, bv, bo, bh, bj, bq, bx, ce, -ck, -cd, -bw, -bp, -bi }, \ - { ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad, ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad, ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad, ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad }, \ - { bj, bs, cb, ck, -cc, -bt, -bk, -bi, -br, -ca, -cj, cd, bu, bl, bh, bq, bz, ci, -ce, -bv, -bm, -bg, -bp, -by, -ch, cf, bw, bn, bf, bo, bx, cg, -cg, -bx, -bo, -bf, -bn, -bw, -cf, ch, by, bp, bg, bm, bv, ce, -ci, -bz, -bq, -bh, -bl, -bu, -cd, cj, ca, br, bi, bk, bt, cc, -ck, -cb, -bs, -bj }, \ - { ar, aw, bb, -bd, -ay, -at, -ap, -au, -az, -be, ba, av, aq, as, ax, bc, -bc, -ax, -as, -aq, -av, -ba, be, az, au, ap, at, ay, bd, -bb, -aw, -ar, -ar, -aw, -bb, bd, ay, at, ap, au, az, be, -ba, -av, -aq, -as, -ax, -bc, bc, ax, as, aq, av, ba, -be, -az, -au, -ap, -at, -ay, -bd, bb, aw, ar }, \ - { bk, bv, cg, -ce, -bt, -bi, -bm, -bx, -ci, cc, br, bg, bo, bz, ck, -ca, -bp, -bf, -bq, -cb, cj, by, bn, bh, bs, cd, -ch, -bw, -bl, -bj, -bu, -cf, cf, bu, bj, bl, bw, ch, -cd, -bs, -bh, -bn, -by, -cj, cb, bq, bf, bp, ca, -ck, -bz, -bo, -bg, -br, -cc, ci, bx, bm, bi, bt, ce, -cg, -bv, -bk }, \ - { ai, al, ao, -am, -aj, -ah, -ak, -an, an, ak, ah, aj, am, -ao, -al, -ai, -ai, -al, -ao, am, aj, ah, ak, an, -an, -ak, -ah, -aj, -am, ao, al, ai, ai, al, ao, -am, -aj, -ah, -ak, -an, an, ak, ah, aj, am, -ao, -al, -ai, -ai, -al, -ao, am, aj, ah, ak, an, -an, -ak, -ah, -aj, -am, ao, al, ai }, \ - { bl, by, -ck, -bx, -bk, -bm, -bz, cj, bw, bj, bn, ca, -ci, -bv, -bi, -bo, -cb, ch, bu, bh, bp, cc, -cg, -bt, -bg, -bq, -cd, cf, bs, bf, br, ce, -ce, -br, -bf, -bs, -cf, cd, bq, bg, bt, cg, -cc, -bp, -bh, -bu, -ch, cb, bo, bi, bv, ci, -ca, -bn, -bj, -bw, -cj, bz, bm, bk, bx, ck, -by, -bl }, \ - { as, az, -bd, -aw, -ap, -av, -bc, ba, at, ar, ay, -be, -ax, -aq, -au, -bb, bb, au, aq, ax, be, -ay, -ar, -at, -ba, bc, av, ap, aw, bd, -az, -as, -as, -az, bd, aw, ap, av, bc, -ba, -at, -ar, -ay, be, ax, aq, au, bb, -bb, -au, -aq, -ax, -be, ay, ar, at, ba, -bc, -av, -ap, -aw, -bd, az, as }, \ - { bm, cb, -cf, -bq, -bi, -bx, cj, bu, bf, bt, ci, -by, -bj, -bp, -ce, cc, bn, bl, ca, -cg, -br, -bh, -bw, ck, bv, bg, bs, ch, -bz, -bk, -bo, -cd, cd, bo, bk, bz, -ch, -bs, -bg, -bv, -ck, bw, bh, br, cg, -ca, -bl, -bn, -cc, ce, bp, bj, by, -ci, -bt, -bf, -bu, -cj, bx, bi, bq, cf, -cb, -bm }, \ - { ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab }, \ - { bn, ce, -ca, -bj, -br, -ci, bw, bf, bv, -cj, -bs, -bi, -bz, cf, bo, bm, cd, -cb, -bk, -bq, -ch, bx, bg, bu, -ck, -bt, -bh, -by, cg, bp, bl, cc, -cc, -bl, -bp, -cg, by, bh, bt, ck, -bu, -bg, -bx, ch, bq, bk, cb, -cd, -bm, -bo, -cf, bz, bi, bs, cj, -bv, -bf, -bw, ci, br, bj, ca, -ce, -bn }, \ - { at, bc, -ay, -ap, -ax, bd, au, as, bb, -az, -aq, -aw, be, av, ar, ba, -ba, -ar, -av, -be, aw, aq, az, -bb, -as, -au, -bd, ax, ap, ay, -bc, -at, -at, -bc, ay, ap, ax, -bd, -au, -as, -bb, az, aq, aw, -be, -av, -ar, -ba, ba, ar, av, be, -aw, -aq, -az, bb, as, au, bd, -ax, -ap, -ay, bc, at }, \ - { bo, ch, -bv, -bh, -ca, cc, bj, bt, -cj, -bq, -bm, -cf, bx, bf, by, -ce, -bl, -br, -ck, bs, bk, cd, -bz, -bg, -bw, cg, bn, bp, ci, -bu, -bi, -cb, cb, bi, bu, -ci, -bp, -bn, -cg, bw, bg, bz, -cd, -bk, -bs, ck, br, bl, ce, -by, -bf, -bx, cf, bm, bq, cj, -bt, -bj, -cc, ca, bh, bv, -ch, -bo }, \ - { aj, ao, -ak, -ai, -an, al, ah, am, -am, -ah, -al, an, ai, ak, -ao, -aj, -aj, -ao, ak, ai, an, -al, -ah, -am, am, ah, al, -an, -ai, -ak, ao, aj, aj, ao, -ak, -ai, -an, al, ah, am, -am, -ah, -al, an, ai, ak, -ao, -aj, -aj, -ao, ak, ai, an, -al, -ah, -am, am, ah, al, -an, -ai, -ak, ao, aj }, \ - { bp, ck, -bq, -bo, -cj, br, bn, ci, -bs, -bm, -ch, bt, bl, cg, -bu, -bk, -cf, bv, bj, ce, -bw, -bi, -cd, bx, bh, cc, -by, -bg, -cb, bz, bf, ca, -ca, -bf, -bz, cb, bg, by, -cc, -bh, -bx, cd, bi, bw, -ce, -bj, -bv, cf, bk, bu, -cg, -bl, -bt, ch, bm, bs, -ci, -bn, -br, cj, bo, bq, -ck, -bp }, \ - { au, -be, -at, -av, bd, as, aw, -bc, -ar, -ax, bb, aq, ay, -ba, -ap, -az, az, ap, ba, -ay, -aq, -bb, ax, ar, bc, -aw, -as, -bd, av, at, be, -au, -au, be, at, av, -bd, -as, -aw, bc, ar, ax, -bb, -aq, -ay, ba, ap, az, -az, -ap, -ba, ay, aq, bb, -ax, -ar, -bc, aw, as, bd, -av, -at, -be, au }, \ - { bq, -ci, -bl, -bv, cd, bg, ca, -by, -bi, -cf, bt, bn, ck, -bo, -bs, cg, bj, bx, -cb, -bf, -cc, bw, bk, ch, -br, -bp, cj, bm, bu, -ce, -bh, -bz, bz, bh, ce, -bu, -bm, -cj, bp, br, -ch, -bk, -bw, cc, bf, cb, -bx, -bj, -cg, bs, bo, -ck, -bn, -bt, cf, bi, by, -ca, -bg, -cd, bv, bl, ci, -bq }, \ - { ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae, ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae, ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae, ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae }, \ - { br, -cf, -bg, -cc, bu, bo, -ci, -bj, -bz, bx, bl, ck, -bm, -bw, ca, bi, ch, -bp, -bt, cd, bf, ce, -bs, -bq, cg, bh, cb, -bv, -bn, cj, bk, by, -by, -bk, -cj, bn, bv, -cb, -bh, -cg, bq, bs, -ce, -bf, -cd, bt, bp, -ch, -bi, -ca, bw, bm, -ck, -bl, -bx, bz, bj, ci, -bo, -bu, cc, bg, cf, -br }, \ - { av, -bb, -ap, -bc, au, aw, -ba, -aq, -bd, at, ax, -az, -ar, -be, as, ay, -ay, -as, be, ar, az, -ax, -at, bd, aq, ba, -aw, -au, bc, ap, bb, -av, -av, bb, ap, bc, -au, -aw, ba, aq, bd, -at, -ax, az, ar, be, -as, -ay, ay, as, -be, -ar, -az, ax, at, -bd, -aq, -ba, aw, au, -bc, -ap, -bb, av }, \ - { bs, -cc, -bi, -cj, bl, bz, -bv, -bp, cf, bf, cg, -bo, -bw, by, bm, -ci, -bh, -cd, br, bt, -cb, -bj, -ck, bk, ca, -bu, -bq, ce, bg, ch, -bn, -bx, bx, bn, -ch, -bg, -ce, bq, bu, -ca, -bk, ck, bj, cb, -bt, -br, cd, bh, ci, -bm, -by, bw, bo, -cg, -bf, -cf, bp, bv, -bz, -bl, cj, bi, cc, -bs }, \ - { ak, -am, -ai, ao, ah, an, -aj, -al, al, aj, -an, -ah, -ao, ai, am, -ak, -ak, am, ai, -ao, -ah, -an, aj, al, -al, -aj, an, ah, ao, -ai, -am, ak, ak, -am, -ai, ao, ah, an, -aj, -al, al, aj, -an, -ah, -ao, ai, am, -ak, -ak, am, ai, -ao, -ah, -an, aj, al, -al, -aj, an, ah, ao, -ai, -am, ak }, \ - { bt, -bz, -bn, cf, bh, ck, -bi, -ce, bo, by, -bu, -bs, ca, bm, -cg, -bg, -cj, bj, cd, -bp, -bx, bv, br, -cb, -bl, ch, bf, ci, -bk, -cc, bq, bw, -bw, -bq, cc, bk, -ci, -bf, -ch, bl, cb, -br, -bv, bx, bp, -cd, -bj, cj, bg, cg, -bm, -ca, bs, bu, -by, -bo, ce, bi, -ck, -bh, -cf, bn, bz, -bt }, \ - { aw, -ay, -au, ba, as, -bc, -aq, be, ap, bd, -ar, -bb, at, az, -av, -ax, ax, av, -az, -at, bb, ar, -bd, -ap, -be, aq, bc, -as, -ba, au, ay, -aw, -aw, ay, au, -ba, -as, bc, aq, -be, -ap, -bd, ar, bb, -at, -az, av, ax, -ax, -av, az, at, -bb, -ar, bd, ap, be, -aq, -bc, as, ba, -au, -ay, aw }, \ - { bu, -bw, -bs, by, bq, -ca, -bo, cc, bm, -ce, -bk, cg, bi, -ci, -bg, ck, bf, cj, -bh, -ch, bj, cf, -bl, -cd, bn, cb, -bp, -bz, br, bx, -bt, -bv, bv, bt, -bx, -br, bz, bp, -cb, -bn, cd, bl, -cf, -bj, ch, bh, -cj, -bf, -ck, bg, ci, -bi, -cg, bk, ce, -bm, -cc, bo, ca, -bq, -by, bs, bw, -bu }, \ - { aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa }, \ - { bv, -bt, -bx, br, bz, -bp, -cb, bn, cd, -bl, -cf, bj, ch, -bh, -cj, bf, -ck, -bg, ci, bi, -cg, -bk, ce, bm, -cc, -bo, ca, bq, -by, -bs, bw, bu, -bu, -bw, bs, by, -bq, -ca, bo, cc, -bm, -ce, bk, cg, -bi, -ci, bg, ck, -bf, cj, bh, -ch, -bj, cf, bl, -cd, -bn, cb, bp, -bz, -br, bx, bt, -bv }, \ - { ax, -av, -az, at, bb, -ar, -bd, ap, -be, -aq, bc, as, -ba, -au, ay, aw, -aw, -ay, au, ba, -as, -bc, aq, be, -ap, bd, ar, -bb, -at, az, av, -ax, -ax, av, az, -at, -bb, ar, bd, -ap, be, aq, -bc, -as, ba, au, -ay, -aw, aw, ay, -au, -ba, as, bc, -aq, -be, ap, -bd, -ar, bb, at, -az, -av, ax }, \ - { bw, -bq, -cc, bk, ci, -bf, ch, bl, -cb, -br, bv, bx, -bp, -cd, bj, cj, -bg, cg, bm, -ca, -bs, bu, by, -bo, -ce, bi, ck, -bh, cf, bn, -bz, -bt, bt, bz, -bn, -cf, bh, -ck, -bi, ce, bo, -by, -bu, bs, ca, -bm, -cg, bg, -cj, -bj, cd, bp, -bx, -bv, br, cb, -bl, -ch, bf, -ci, -bk, cc, bq, -bw }, \ - { al, -aj, -an, ah, -ao, -ai, am, ak, -ak, -am, ai, ao, -ah, an, aj, -al, -al, aj, an, -ah, ao, ai, -am, -ak, ak, am, -ai, -ao, ah, -an, -aj, al, al, -aj, -an, ah, -ao, -ai, am, ak, -ak, -am, ai, ao, -ah, an, aj, -al, -al, aj, an, -ah, ao, ai, -am, -ak, ak, am, -ai, -ao, ah, -an, -aj, al }, \ - { bx, -bn, -ch, bg, -ce, -bq, bu, ca, -bk, -ck, bj, -cb, -bt, br, cd, -bh, ci, bm, -by, -bw, bo, cg, -bf, cf, bp, -bv, -bz, bl, cj, -bi, cc, bs, -bs, -cc, bi, -cj, -bl, bz, bv, -bp, -cf, bf, -cg, -bo, bw, by, -bm, -ci, bh, -cd, -br, bt, cb, -bj, ck, bk, -ca, -bu, bq, ce, -bg, ch, bn, -bx }, \ - { ay, -as, -be, ar, -az, -ax, at, bd, -aq, ba, aw, -au, -bc, ap, -bb, -av, av, bb, -ap, bc, au, -aw, -ba, aq, -bd, -at, ax, az, -ar, be, as, -ay, -ay, as, be, -ar, az, ax, -at, -bd, aq, -ba, -aw, au, bc, -ap, bb, av, -av, -bb, ap, -bc, -au, aw, ba, -aq, bd, at, -ax, -az, ar, -be, -as, ay }, \ - { by, -bk, cj, bn, -bv, -cb, bh, -cg, -bq, bs, ce, -bf, cd, bt, -bp, -ch, bi, -ca, -bw, bm, ck, -bl, bx, bz, -bj, ci, bo, -bu, -cc, bg, -cf, -br, br, cf, -bg, cc, bu, -bo, -ci, bj, -bz, -bx, bl, -ck, -bm, bw, ca, -bi, ch, bp, -bt, -cd, bf, -ce, -bs, bq, cg, -bh, cb, bv, -bn, -cj, bk, -by }, \ - { af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af, af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af, af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af, af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af }, \ - { bz, -bh, ce, bu, -bm, cj, bp, -br, -ch, bk, -bw, -cc, bf, -cb, -bx, bj, -cg, -bs, bo, ck, -bn, bt, cf, -bi, by, ca, -bg, cd, bv, -bl, ci, bq, -bq, -ci, bl, -bv, -cd, bg, -ca, -by, bi, -cf, -bt, bn, -ck, -bo, bs, cg, -bj, bx, cb, -bf, cc, bw, -bk, ch, br, -bp, -cj, bm, -bu, -ce, bh, -bz }, \ - { az, -ap, ba, ay, -aq, bb, ax, -ar, bc, aw, -as, bd, av, -at, be, au, -au, -be, at, -av, -bd, as, -aw, -bc, ar, -ax, -bb, aq, -ay, -ba, ap, -az, -az, ap, -ba, -ay, aq, -bb, -ax, ar, -bc, -aw, as, -bd, -av, at, -be, -au, au, be, -at, av, bd, -as, aw, bc, -ar, ax, bb, -aq, ay, ba, -ap, az }, \ - { ca, -bf, bz, cb, -bg, by, cc, -bh, bx, cd, -bi, bw, ce, -bj, bv, cf, -bk, bu, cg, -bl, bt, ch, -bm, bs, ci, -bn, br, cj, -bo, bq, ck, -bp, bp, -ck, -bq, bo, -cj, -br, bn, -ci, -bs, bm, -ch, -bt, bl, -cg, -bu, bk, -cf, -bv, bj, -ce, -bw, bi, -cd, -bx, bh, -cc, -by, bg, -cb, -bz, bf, -ca }, \ - { am, -ah, al, an, -ai, ak, ao, -aj, aj, -ao, -ak, ai, -an, -al, ah, -am, -am, ah, -al, -an, ai, -ak, -ao, aj, -aj, ao, ak, -ai, an, al, -ah, am, am, -ah, al, an, -ai, ak, ao, -aj, aj, -ao, -ak, ai, -an, -al, ah, -am, -am, ah, -al, -an, ai, -ak, -ao, aj, -aj, ao, ak, -ai, an, al, -ah, am }, \ - { cb, -bi, bu, ci, -bp, bn, -cg, -bw, bg, -bz, -cd, bk, -bs, -ck, br, -bl, ce, by, -bf, bx, cf, -bm, bq, -cj, -bt, bj, -cc, -ca, bh, -bv, -ch, bo, -bo, ch, bv, -bh, ca, cc, -bj, bt, cj, -bq, bm, -cf, -bx, bf, -by, -ce, bl, -br, ck, bs, -bk, cd, bz, -bg, bw, cg, -bn, bp, -ci, -bu, bi, -cb }, \ - { ba, -ar, av, -be, -aw, aq, -az, -bb, as, -au, bd, ax, -ap, ay, bc, -at, at, -bc, -ay, ap, -ax, -bd, au, -as, bb, az, -aq, aw, be, -av, ar, -ba, -ba, ar, -av, be, aw, -aq, az, bb, -as, au, -bd, -ax, ap, -ay, -bc, at, -at, bc, ay, -ap, ax, bd, -au, as, -bb, -az, aq, -aw, -be, av, -ar, ba }, \ - { cc, -bl, bp, -cg, -by, bh, -bt, ck, bu, -bg, bx, ch, -bq, bk, -cb, -cd, bm, -bo, cf, bz, -bi, bs, -cj, -bv, bf, -bw, -ci, br, -bj, ca, ce, -bn, bn, -ce, -ca, bj, -br, ci, bw, -bf, bv, cj, -bs, bi, -bz, -cf, bo, -bm, cd, cb, -bk, bq, -ch, -bx, bg, -bu, -ck, bt, -bh, by, cg, -bp, bl, -cc }, \ - { ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac }, \ - { cd, -bo, bk, -bz, -ch, bs, -bg, bv, -ck, -bw, bh, -br, cg, ca, -bl, bn, -cc, -ce, bp, -bj, by, ci, -bt, bf, -bu, cj, bx, -bi, bq, -cf, -cb, bm, -bm, cb, cf, -bq, bi, -bx, -cj, bu, -bf, bt, -ci, -by, bj, -bp, ce, cc, -bn, bl, -ca, -cg, br, -bh, bw, ck, -bv, bg, -bs, ch, bz, -bk, bo, -cd }, \ - { bb, -au, aq, -ax, be, ay, -ar, at, -ba, -bc, av, -ap, aw, -bd, -az, as, -as, az, bd, -aw, ap, -av, bc, ba, -at, ar, -ay, -be, ax, -aq, au, -bb, -bb, au, -aq, ax, -be, -ay, ar, -at, ba, bc, -av, ap, -aw, bd, az, -as, as, -az, -bd, aw, -ap, av, -bc, -ba, at, -ar, ay, be, -ax, aq, -au, bb }, \ - { ce, -br, bf, -bs, cf, cd, -bq, bg, -bt, cg, cc, -bp, bh, -bu, ch, cb, -bo, bi, -bv, ci, ca, -bn, bj, -bw, cj, bz, -bm, bk, -bx, ck, by, -bl, bl, -by, -ck, bx, -bk, bm, -bz, -cj, bw, -bj, bn, -ca, -ci, bv, -bi, bo, -cb, -ch, bu, -bh, bp, -cc, -cg, bt, -bg, bq, -cd, -cf, bs, -bf, br, -ce }, \ - { an, -ak, ah, -aj, am, ao, -al, ai, -ai, al, -ao, -am, aj, -ah, ak, -an, -an, ak, -ah, aj, -am, -ao, al, -ai, ai, -al, ao, am, -aj, ah, -ak, an, an, -ak, ah, -aj, am, ao, -al, ai, -ai, al, -ao, -am, aj, -ah, ak, -an, -an, ak, -ah, aj, -am, -ao, al, -ai, ai, -al, ao, am, -aj, ah, -ak, an }, \ - { cf, -bu, bj, -bl, bw, -ch, -cd, bs, -bh, bn, -by, cj, cb, -bq, bf, -bp, ca, ck, -bz, bo, -bg, br, -cc, -ci, bx, -bm, bi, -bt, ce, cg, -bv, bk, -bk, bv, -cg, -ce, bt, -bi, bm, -bx, ci, cc, -br, bg, -bo, bz, -ck, -ca, bp, -bf, bq, -cb, -cj, by, -bn, bh, -bs, cd, ch, -bw, bl, -bj, bu, -cf }, \ - { bc, -ax, as, -aq, av, -ba, -be, az, -au, ap, -at, ay, -bd, -bb, aw, -ar, ar, -aw, bb, bd, -ay, at, -ap, au, -az, be, ba, -av, aq, -as, ax, -bc, -bc, ax, -as, aq, -av, ba, be, -az, au, -ap, at, -ay, bd, bb, -aw, ar, -ar, aw, -bb, -bd, ay, -at, ap, -au, az, -be, -ba, av, -aq, as, -ax, bc }, \ - { cg, -bx, bo, -bf, bn, -bw, cf, ch, -by, bp, -bg, bm, -bv, ce, ci, -bz, bq, -bh, bl, -bu, cd, cj, -ca, br, -bi, bk, -bt, cc, ck, -cb, bs, -bj, bj, -bs, cb, -ck, -cc, bt, -bk, bi, -br, ca, -cj, -cd, bu, -bl, bh, -bq, bz, -ci, -ce, bv, -bm, bg, -bp, by, -ch, -cf, bw, -bn, bf, -bo, bx, -cg }, \ - { ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag, ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag, ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag, ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag }, \ - { ch, -ca, bt, -bm, bf, -bl, bs, -bz, cg, ci, -cb, bu, -bn, bg, -bk, br, -by, cf, cj, -cc, bv, -bo, bh, -bj, bq, -bx, ce, ck, -cd, bw, -bp, bi, -bi, bp, -bw, cd, -ck, -ce, bx, -bq, bj, -bh, bo, -bv, cc, -cj, -cf, by, -br, bk, -bg, bn, -bu, cb, -ci, -cg, bz, -bs, bl, -bf, bm, -bt, ca, -ch }, \ - { bd, -ba, ax, -au, ar, -ap, as, -av, ay, -bb, be, bc, -az, aw, -at, aq, -aq, at, -aw, az, -bc, -be, bb, -ay, av, -as, ap, -ar, au, -ax, ba, -bd, -bd, ba, -ax, au, -ar, ap, -as, av, -ay, bb, -be, -bc, az, -aw, at, -aq, aq, -at, aw, -az, bc, be, -bb, ay, -av, as, -ap, ar, -au, ax, -ba, bd }, \ - { ci, -cd, by, -bt, bo, -bj, bf, -bk, bp, -bu, bz, -ce, cj, ch, -cc, bx, -bs, bn, -bi, bg, -bl, bq, -bv, ca, -cf, ck, cg, -cb, bw, -br, bm, -bh, bh, -bm, br, -bw, cb, -cg, -ck, cf, -ca, bv, -bq, bl, -bg, bi, -bn, bs, -bx, cc, -ch, -cj, ce, -bz, bu, -bp, bk, -bf, bj, -bo, bt, -by, cd, -ci }, \ - { ao, -an, am, -al, ak, -aj, ai, -ah, ah, -ai, aj, -ak, al, -am, an, -ao, -ao, an, -am, al, -ak, aj, -ai, ah, -ah, ai, -aj, ak, -al, am, -an, ao, ao, -an, am, -al, ak, -aj, ai, -ah, ah, -ai, aj, -ak, al, -am, an, -ao, -ao, an, -am, al, -ak, aj, -ai, ah, -ah, ai, -aj, ak, -al, am, -an, ao }, \ - { cj, -cg, cd, -ca, bx, -bu, br, -bo, bl, -bi, bf, -bh, bk, -bn, bq, -bt, bw, -bz, cc, -cf, ci, ck, -ch, ce, -cb, by, -bv, bs, -bp, bm, -bj, bg, -bg, bj, -bm, bp, -bs, bv, -by, cb, -ce, ch, -ck, -ci, cf, -cc, bz, -bw, bt, -bq, bn, -bk, bh, -bf, bi, -bl, bo, -br, bu, -bx, ca, -cd, cg, -cj }, \ - { be, -bd, bc, -bb, ba, -az, ay, -ax, aw, -av, au, -at, as, -ar, aq, -ap, ap, -aq, ar, -as, at, -au, av, -aw, ax, -ay, az, -ba, bb, -bc, bd, -be, -be, bd, -bc, bb, -ba, az, -ay, ax, -aw, av, -au, at, -as, ar, -aq, ap, -ap, aq, -ar, as, -at, au, -av, aw, -ax, ay, -az, ba, -bb, bc, -bd, be }, \ - { ck, -cj, ci, -ch, cg, -cf, ce, -cd, cc, -cb, ca, -bz, by, -bx, bw, -bv, bu, -bt, bs, -br, bq, -bp, bo, -bn, bm, -bl, bk, -bj, bi, -bh, bg, -bf, bf, -bg, bh, -bi, bj, -bk, bl, -bm, bn, -bo, bp, -bq, br, -bs, bt, -bu, bv, -bw, bx, -by, bz, -ca, cb, -cc, cd, -ce, cf, -cg, ch, -ci, cj, -ck }, \ - } - - -#define DEFINE_DCT128x128_MATRIX( aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk, bl, bm, bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bz, ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, cl, cm, cn, co, cp, cq, cr, cs, ct, cu, cv, cw, cx, cy, cz, da, db, dc, dd, de, df, dg, dh, di, dj, dk, dl, dm, dn, d_, dp, dq, dr, ds, dt, du, dv, dw, dx, dy, dz, ea, eb, ec, ed, ee, ef, eg, eh, ei, ej, ek, el, em, en, eo, ep, eq, er, es, et, eu, ev, ew ) \ -{ \ - { aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa } ,\ - { cl, cm, cn, co, cp, cq, cr, cs, ct, cu, cv, cw, cx, cy, cz, da, db, dc, dd, de, df, dg, dh, di, dj, dk, dl, dm, dn, d_, dp, dq, dr, ds, dt, du, dv, dw, dx, dy, dz, ea, eb, ec, ed, ee, ef, eg, eh, ei, ej, ek, el, em, en, eo, ep, eq, er, es, et, eu, ev, ew, -ew, -ev, -eu, -et, -es, -er, -eq, -ep, -eo, -en, -em, -el, -ek, -ej, -ei, -eh, -eg, -ef, -ee, -ed, -ec, -eb, -ea, -dz, -dy, -dx, -dw, -dv, -du, -dt, -ds, -dr, -dq, -dp, -d_, -dn, -dm, -dl, -dk, -dj, -di, -dh, -dg, -df, -de, -dd, -dc, -db, -da, -cz, -cy, -cx, -cw, -cv, -cu, -ct, -cs, -cr, -cq, -cp, -co, -cn, -cm, -cl } ,\ - { bf, bg, bh, bi, bj, bk, bl, bm, bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bz, ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, -ck, -cj, -ci, -ch, -cg, -cf, -ce, -cd, -cc, -cb, -ca, -bz, -by, -bx, -bw, -bv, -bu, -bt, -bs, -br, -bq, -bp, -bo, -bn, -bm, -bl, -bk, -bj, -bi, -bh, -bg, -bf, -bf, -bg, -bh, -bi, -bj, -bk, -bl, -bm, -bn, -bo, -bp, -bq, -br, -bs, -bt, -bu, -bv, -bw, -bx, -by, -bz, -ca, -cb, -cc, -cd, -ce, -cf, -cg, -ch, -ci, -cj, -ck, ck, cj, ci, ch, cg, cf, ce, cd, cc, cb, ca, bz, by, bx, bw, bv, bu, bt, bs, br, bq, bp, bo, bn, bm, bl, bk, bj, bi, bh, bg, bf } ,\ - { cm, cp, cs, cv, cy, db, de, dh, dk, dn, dq, dt, dw, dz, ec, ef, ei, el, eo, er, eu, -ew, -et, -eq, -en, -ek, -eh, -ee, -eb, -dy, -dv, -ds, -dp, -dm, -dj, -dg, -dd, -da, -cx, -cu, -cr, -co, -cl, -cn, -cq, -ct, -cw, -cz, -dc, -df, -di, -dl, -d_, -dr, -du, -dx, -ea, -ed, -eg, -ej, -em, -ep, -es, -ev, ev, es, ep, em, ej, eg, ed, ea, dx, du, dr, d_, dl, di, df, dc, cz, cw, ct, cq, cn, cl, co, cr, cu, cx, da, dd, dg, dj, dm, dp, ds, dv, dy, eb, ee, eh, ek, en, eq, et, ew, -eu, -er, -eo, -el, -ei, -ef, -ec, -dz, -dw, -dt, -dq, -dn, -dk, -dh, -de, -db, -cy, -cv, -cs, -cp, -cm } ,\ - { ap, aq, ar, as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, -be, -bd, -bc, -bb, -ba, -az, -ay, -ax, -aw, -av, -au, -at, -as, -ar, -aq, -ap, -ap, -aq, -ar, -as, -at, -au, -av, -aw, -ax, -ay, -az, -ba, -bb, -bc, -bd, -be, be, bd, bc, bb, ba, az, ay, ax, aw, av, au, at, as, ar, aq, ap, ap, aq, ar, as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, -be, -bd, -bc, -bb, -ba, -az, -ay, -ax, -aw, -av, -au, -at, -as, -ar, -aq, -ap, -ap, -aq, -ar, -as, -at, -au, -av, -aw, -ax, -ay, -az, -ba, -bb, -bc, -bd, -be, be, bd, bc, bb, ba, az, ay, ax, aw, av, au, at, as, ar, aq, ap } ,\ - { cn, cs, cx, dc, dh, dm, dr, dw, eb, eg, el, eq, ev, -et, -eo, -ej, -ee, -dz, -du, -dp, -dk, -df, -da, -cv, -cq, -cl, -cp, -cu, -cz, -de, -dj, -d_, -dt, -dy, -ed, -ei, -en, -es, ew, er, em, eh, ec, dx, ds, dn, di, dd, cy, ct, co, cm, cr, cw, db, dg, dl, dq, dv, ea, ef, ek, ep, eu, -eu, -ep, -ek, -ef, -ea, -dv, -dq, -dl, -dg, -db, -cw, -cr, -cm, -co, -ct, -cy, -dd, -di, -dn, -ds, -dx, -ec, -eh, -em, -er, -ew, es, en, ei, ed, dy, dt, d_, dj, de, cz, cu, cp, cl, cq, cv, da, df, dk, dp, du, dz, ee, ej, eo, et, -ev, -eq, -el, -eg, -eb, -dw, -dr, -dm, -dh, -dc, -cx, -cs, -cn } ,\ - { bg, bj, bm, bp, bs, bv, by, cb, ce, ch, ck, -ci, -cf, -cc, -bz, -bw, -bt, -bq, -bn, -bk, -bh, -bf, -bi, -bl, -bo, -br, -bu, -bx, -ca, -cd, -cg, -cj, cj, cg, cd, ca, bx, bu, br, bo, bl, bi, bf, bh, bk, bn, bq, bt, bw, bz, cc, cf, ci, -ck, -ch, -ce, -cb, -by, -bv, -bs, -bp, -bm, -bj, -bg, -bg, -bj, -bm, -bp, -bs, -bv, -by, -cb, -ce, -ch, -ck, ci, cf, cc, bz, bw, bt, bq, bn, bk, bh, bf, bi, bl, bo, br, bu, bx, ca, cd, cg, cj, -cj, -cg, -cd, -ca, -bx, -bu, -br, -bo, -bl, -bi, -bf, -bh, -bk, -bn, -bq, -bt, -bw, -bz, -cc, -cf, -ci, ck, ch, ce, cb, by, bv, bs, bp, bm, bj, bg } ,\ - { co, cv, dc, dj, dq, dx, ee, el, es, -eu, -en, -eg, -dz, -ds, -dl, -de, -cx, -cq, -cm, -ct, -da, -dh, -d_, -dv, -ec, -ej, -eq, ew, ep, ei, eb, du, dn, dg, cz, cs, cl, cr, cy, df, dm, dt, ea, eh, eo, ev, -er, -ek, -ed, -dw, -dp, -di, -db, -cu, -cn, -cp, -cw, -dd, -dk, -dr, -dy, -ef, -em, -et, et, em, ef, dy, dr, dk, dd, cw, cp, cn, cu, db, di, dp, dw, ed, ek, er, -ev, -eo, -eh, -ea, -dt, -dm, -df, -cy, -cr, -cl, -cs, -cz, -dg, -dn, -du, -eb, -ei, -ep, -ew, eq, ej, ec, dv, d_, dh, da, ct, cm, cq, cx, de, dl, ds, dz, eg, en, eu, -es, -el, -ee, -dx, -dq, -dj, -dc, -cv, -co } ,\ - { ah, ai, aj, ak, al, am, an, ao, -ao, -an, -am, -al, -ak, -aj, -ai, -ah, -ah, -ai, -aj, -ak, -al, -am, -an, -ao, ao, an, am, al, ak, aj, ai, ah, ah, ai, aj, ak, al, am, an, ao, -ao, -an, -am, -al, -ak, -aj, -ai, -ah, -ah, -ai, -aj, -ak, -al, -am, -an, -ao, ao, an, am, al, ak, aj, ai, ah, ah, ai, aj, ak, al, am, an, ao, -ao, -an, -am, -al, -ak, -aj, -ai, -ah, -ah, -ai, -aj, -ak, -al, -am, -an, -ao, ao, an, am, al, ak, aj, ai, ah, ah, ai, aj, ak, al, am, an, ao, -ao, -an, -am, -al, -ak, -aj, -ai, -ah, -ah, -ai, -aj, -ak, -al, -am, -an, -ao, ao, an, am, al, ak, aj, ai, ah } ,\ - { cp, cy, dh, dq, dz, ei, er, -et, -ek, -eb, -ds, -dj, -da, -cr, -cn, -cw, -df, -d_, -dx, -eg, -ep, ev, em, ed, du, dl, dc, ct, cl, cu, dd, dm, dv, ee, en, ew, -eo, -ef, -dw, -dn, -de, -cv, -cm, -cs, -db, -dk, -dt, -ec, -el, -eu, eq, eh, dy, dp, dg, cx, co, cq, cz, di, dr, ea, ej, es, -es, -ej, -ea, -dr, -di, -cz, -cq, -co, -cx, -dg, -dp, -dy, -eh, -eq, eu, el, ec, dt, dk, db, cs, cm, cv, de, dn, dw, ef, eo, -ew, -en, -ee, -dv, -dm, -dd, -cu, -cl, -ct, -dc, -dl, -du, -ed, -em, -ev, ep, eg, dx, d_, df, cw, cn, cr, da, dj, ds, eb, ek, et, -er, -ei, -dz, -dq, -dh, -cy, -cp } ,\ - { bh, bm, br, bw, cb, cg, -ck, -cf, -ca, -bv, -bq, -bl, -bg, -bi, -bn, -bs, -bx, -cc, -ch, cj, ce, bz, bu, bp, bk, bf, bj, bo, bt, by, cd, ci, -ci, -cd, -by, -bt, -bo, -bj, -bf, -bk, -bp, -bu, -bz, -ce, -cj, ch, cc, bx, bs, bn, bi, bg, bl, bq, bv, ca, cf, ck, -cg, -cb, -bw, -br, -bm, -bh, -bh, -bm, -br, -bw, -cb, -cg, ck, cf, ca, bv, bq, bl, bg, bi, bn, bs, bx, cc, ch, -cj, -ce, -bz, -bu, -bp, -bk, -bf, -bj, -bo, -bt, -by, -cd, -ci, ci, cd, by, bt, bo, bj, bf, bk, bp, bu, bz, ce, cj, -ch, -cc, -bx, -bs, -bn, -bi, -bg, -bl, -bq, -bv, -ca, -cf, -ck, cg, cb, bw, br, bm, bh } ,\ - { cq, db, dm, dx, ei, et, -ep, -ee, -dt, -di, -cx, -cm, -cu, -df, -dq, -eb, -em, ew, el, ea, dp, de, ct, cn, cy, dj, du, ef, eq, -es, -eh, -dw, -dl, -da, -cp, -cr, -dc, -dn, -dy, -ej, -eu, eo, ed, ds, dh, cw, cl, cv, dg, dr, ec, en, -ev, -ek, -dz, -d_, -dd, -cs, -co, -cz, -dk, -dv, -eg, -er, er, eg, dv, dk, cz, co, cs, dd, d_, dz, ek, ev, -en, -ec, -dr, -dg, -cv, -cl, -cw, -dh, -ds, -ed, -eo, eu, ej, dy, dn, dc, cr, cp, da, dl, dw, eh, es, -eq, -ef, -du, -dj, -cy, -cn, -ct, -de, -dp, -ea, -el, -ew, em, eb, dq, df, cu, cm, cx, di, dt, ee, ep, -et, -ei, -dx, -dm, -db, -cq } ,\ - { aq, at, aw, az, bc, -be, -bb, -ay, -av, -as, -ap, -ar, -au, -ax, -ba, -bd, bd, ba, ax, au, ar, ap, as, av, ay, bb, be, -bc, -az, -aw, -at, -aq, -aq, -at, -aw, -az, -bc, be, bb, ay, av, as, ap, ar, au, ax, ba, bd, -bd, -ba, -ax, -au, -ar, -ap, -as, -av, -ay, -bb, -be, bc, az, aw, at, aq, aq, at, aw, az, bc, -be, -bb, -ay, -av, -as, -ap, -ar, -au, -ax, -ba, -bd, bd, ba, ax, au, ar, ap, as, av, ay, bb, be, -bc, -az, -aw, -at, -aq, -aq, -at, -aw, -az, -bc, be, bb, ay, av, as, ap, ar, au, ax, ba, bd, -bd, -ba, -ax, -au, -ar, -ap, -as, -av, -ay, -bb, -be, bc, az, aw, at, aq } ,\ - { cr, de, dr, ee, er, -ep, -ec, -dp, -dc, -cp, -ct, -dg, -dt, -eg, -et, en, ea, dn, da, cn, cv, di, dv, ei, ev, -el, -dy, -dl, -cy, -cl, -cx, -dk, -dx, -ek, ew, ej, dw, dj, cw, cm, cz, dm, dz, em, -eu, -eh, -du, -dh, -cu, -co, -db, -d_, -eb, -eo, es, ef, ds, df, cs, cq, dd, dq, ed, eq, -eq, -ed, -dq, -dd, -cq, -cs, -df, -ds, -ef, -es, eo, eb, d_, db, co, cu, dh, du, eh, eu, -em, -dz, -dm, -cz, -cm, -cw, -dj, -dw, -ej, -ew, ek, dx, dk, cx, cl, cy, dl, dy, el, -ev, -ei, -dv, -di, -cv, -cn, -da, -dn, -ea, -en, et, eg, dt, dg, ct, cp, dc, dp, ec, ep, -er, -ee, -dr, -de, -cr } ,\ - { bi, bp, bw, cd, ck, -ce, -bx, -bq, -bj, -bh, -bo, -bv, -cc, -cj, cf, by, br, bk, bg, bn, bu, cb, ci, -cg, -bz, -bs, -bl, -bf, -bm, -bt, -ca, -ch, ch, ca, bt, bm, bf, bl, bs, bz, cg, -ci, -cb, -bu, -bn, -bg, -bk, -br, -by, -cf, cj, cc, bv, bo, bh, bj, bq, bx, ce, -ck, -cd, -bw, -bp, -bi, -bi, -bp, -bw, -cd, -ck, ce, bx, bq, bj, bh, bo, bv, cc, cj, -cf, -by, -br, -bk, -bg, -bn, -bu, -cb, -ci, cg, bz, bs, bl, bf, bm, bt, ca, ch, -ch, -ca, -bt, -bm, -bf, -bl, -bs, -bz, -cg, ci, cb, bu, bn, bg, bk, br, by, cf, -cj, -cc, -bv, -bo, -bh, -bj, -bq, -bx, -ce, ck, cd, bw, bp, bi } ,\ - { cs, dh, dw, el, -et, -ee, -dp, -da, -cl, -cz, -d_, -ed, -es, em, dx, di, ct, cr, dg, dv, ek, -eu, -ef, -dq, -db, -cm, -cy, -dn, -ec, -er, en, dy, dj, cu, cq, df, du, ej, -ev, -eg, -dr, -dc, -cn, -cx, -dm, -eb, -eq, eo, dz, dk, cv, cp, de, dt, ei, -ew, -eh, -ds, -dd, -co, -cw, -dl, -ea, -ep, ep, ea, dl, cw, co, dd, ds, eh, ew, -ei, -dt, -de, -cp, -cv, -dk, -dz, -eo, eq, eb, dm, cx, cn, dc, dr, eg, ev, -ej, -du, -df, -cq, -cu, -dj, -dy, -en, er, ec, dn, cy, cm, db, dq, ef, eu, -ek, -dv, -dg, -cr, -ct, -di, -dx, -em, es, ed, d_, cz, cl, da, dp, ee, et, -el, -dw, -dh, -cs } ,\ - { ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad, ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad, ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad, ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad, ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad, ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad, ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad, ad, ae, af, ag, -ag, -af, -ae, -ad, -ad, -ae, -af, -ag, ag, af, ae, ad } ,\ - { ct, dk, eb, es, -ek, -dt, -dc, -cl, -db, -ds, -ej, et, ec, dl, cu, cs, dj, ea, er, -el, -du, -dd, -cm, -da, -dr, -ei, eu, ed, dm, cv, cr, di, dz, eq, -em, -dv, -de, -cn, -cz, -dq, -eh, ev, ee, dn, cw, cq, dh, dy, ep, -en, -dw, -df, -co, -cy, -dp, -eg, ew, ef, d_, cx, cp, dg, dx, eo, -eo, -dx, -dg, -cp, -cx, -d_, -ef, -ew, eg, dp, cy, co, df, dw, en, -ep, -dy, -dh, -cq, -cw, -dn, -ee, -ev, eh, dq, cz, cn, de, dv, em, -eq, -dz, -di, -cr, -cv, -dm, -ed, -eu, ei, dr, da, cm, dd, du, el, -er, -ea, -dj, -cs, -cu, -dl, -ec, -et, ej, ds, db, cl, dc, dt, ek, -es, -eb, -dk, -ct } ,\ - { bj, bs, cb, ck, -cc, -bt, -bk, -bi, -br, -ca, -cj, cd, bu, bl, bh, bq, bz, ci, -ce, -bv, -bm, -bg, -bp, -by, -ch, cf, bw, bn, bf, bo, bx, cg, -cg, -bx, -bo, -bf, -bn, -bw, -cf, ch, by, bp, bg, bm, bv, ce, -ci, -bz, -bq, -bh, -bl, -bu, -cd, cj, ca, br, bi, bk, bt, cc, -ck, -cb, -bs, -bj, -bj, -bs, -cb, -ck, cc, bt, bk, bi, br, ca, cj, -cd, -bu, -bl, -bh, -bq, -bz, -ci, ce, bv, bm, bg, bp, by, ch, -cf, -bw, -bn, -bf, -bo, -bx, -cg, cg, bx, bo, bf, bn, bw, cf, -ch, -by, -bp, -bg, -bm, -bv, -ce, ci, bz, bq, bh, bl, bu, cd, -cj, -ca, -br, -bi, -bk, -bt, -cc, ck, cb, bs, bj } ,\ - { cu, dn, eg, -eu, -eb, -di, -cp, -cz, -ds, -el, ep, dw, dd, cl, de, dx, eq, -ek, -dr, -cy, -cq, -dj, -ec, -ev, ef, dm, ct, cv, d_, eh, -et, -ea, -dh, -co, -da, -dt, -em, eo, dv, dc, cm, df, dy, er, -ej, -dq, -cx, -cr, -dk, -ed, -ew, ee, dl, cs, cw, dp, ei, -es, -dz, -dg, -cn, -db, -du, -en, en, du, db, cn, dg, dz, es, -ei, -dp, -cw, -cs, -dl, -ee, ew, ed, dk, cr, cx, dq, ej, -er, -dy, -df, -cm, -dc, -dv, -eo, em, dt, da, co, dh, ea, et, -eh, -d_, -cv, -ct, -dm, -ef, ev, ec, dj, cq, cy, dr, ek, -eq, -dx, -de, -cl, -dd, -dw, -ep, el, ds, cz, cp, di, eb, eu, -eg, -dn, -cu } ,\ - { ar, aw, bb, -bd, -ay, -at, -ap, -au, -az, -be, ba, av, aq, as, ax, bc, -bc, -ax, -as, -aq, -av, -ba, be, az, au, ap, at, ay, bd, -bb, -aw, -ar, -ar, -aw, -bb, bd, ay, at, ap, au, az, be, -ba, -av, -aq, -as, -ax, -bc, bc, ax, as, aq, av, ba, -be, -az, -au, -ap, -at, -ay, -bd, bb, aw, ar, ar, aw, bb, -bd, -ay, -at, -ap, -au, -az, -be, ba, av, aq, as, ax, bc, -bc, -ax, -as, -aq, -av, -ba, be, az, au, ap, at, ay, bd, -bb, -aw, -ar, -ar, -aw, -bb, bd, ay, at, ap, au, az, be, -ba, -av, -aq, -as, -ax, -bc, bc, ax, as, aq, av, ba, -be, -az, -au, -ap, -at, -ay, -bd, bb, aw, ar } ,\ - { cv, dq, el, -en, -ds, -cx, -ct, -d_, -ej, ep, du, cz, cr, dm, eh, -er, -dw, -db, -cp, -dk, -ef, et, dy, dd, cn, di, ed, -ev, -ea, -df, -cl, -dg, -eb, -ew, ec, dh, cm, de, dz, eu, -ee, -dj, -co, -dc, -dx, -es, eg, dl, cq, da, dv, eq, -ei, -dn, -cs, -cy, -dt, -eo, ek, dp, cu, cw, dr, em, -em, -dr, -cw, -cu, -dp, -ek, eo, dt, cy, cs, dn, ei, -eq, -dv, -da, -cq, -dl, -eg, es, dx, dc, co, dj, ee, -eu, -dz, -de, -cm, -dh, -ec, ew, eb, dg, cl, df, ea, ev, -ed, -di, -cn, -dd, -dy, -et, ef, dk, cp, db, dw, er, -eh, -dm, -cr, -cz, -du, -ep, ej, d_, ct, cx, ds, en, -el, -dq, -cv } ,\ - { bk, bv, cg, -ce, -bt, -bi, -bm, -bx, -ci, cc, br, bg, bo, bz, ck, -ca, -bp, -bf, -bq, -cb, cj, by, bn, bh, bs, cd, -ch, -bw, -bl, -bj, -bu, -cf, cf, bu, bj, bl, bw, ch, -cd, -bs, -bh, -bn, -by, -cj, cb, bq, bf, bp, ca, -ck, -bz, -bo, -bg, -br, -cc, ci, bx, bm, bi, bt, ce, -cg, -bv, -bk, -bk, -bv, -cg, ce, bt, bi, bm, bx, ci, -cc, -br, -bg, -bo, -bz, -ck, ca, bp, bf, bq, cb, -cj, -by, -bn, -bh, -bs, -cd, ch, bw, bl, bj, bu, cf, -cf, -bu, -bj, -bl, -bw, -ch, cd, bs, bh, bn, by, cj, -cb, -bq, -bf, -bp, -ca, ck, bz, bo, bg, br, cc, -ci, -bx, -bm, -bi, -bt, -ce, cg, bv, bk } ,\ - { cw, dt, eq, -eg, -dj, -cm, -dg, -ed, et, dw, cz, ct, dq, en, -ej, -dm, -cp, -dd, -ea, ew, dz, dc, cq, dn, ek, -em, -dp, -cs, -da, -dx, -eu, ec, df, cn, dk, eh, -ep, -ds, -cv, -cx, -du, -er, ef, di, cl, dh, ee, -es, -dv, -cy, -cu, -dr, -eo, ei, dl, co, de, eb, -ev, -dy, -db, -cr, -d_, -el, el, d_, cr, db, dy, ev, -eb, -de, -co, -dl, -ei, eo, dr, cu, cy, dv, es, -ee, -dh, -cl, -di, -ef, er, du, cx, cv, ds, ep, -eh, -dk, -cn, -df, -ec, eu, dx, da, cs, dp, em, -ek, -dn, -cq, -dc, -dz, -ew, ea, dd, cp, dm, ej, -en, -dq, -ct, -cz, -dw, -et, ed, dg, cm, dj, eg, -eq, -dt, -cw } ,\ - { ai, al, ao, -am, -aj, -ah, -ak, -an, an, ak, ah, aj, am, -ao, -al, -ai, -ai, -al, -ao, am, aj, ah, ak, an, -an, -ak, -ah, -aj, -am, ao, al, ai, ai, al, ao, -am, -aj, -ah, -ak, -an, an, ak, ah, aj, am, -ao, -al, -ai, -ai, -al, -ao, am, aj, ah, ak, an, -an, -ak, -ah, -aj, -am, ao, al, ai, ai, al, ao, -am, -aj, -ah, -ak, -an, an, ak, ah, aj, am, -ao, -al, -ai, -ai, -al, -ao, am, aj, ah, ak, an, -an, -ak, -ah, -aj, -am, ao, al, ai, ai, al, ao, -am, -aj, -ah, -ak, -an, an, ak, ah, aj, am, -ao, -al, -ai, -ai, -al, -ao, am, aj, ah, ak, an, -an, -ak, -ah, -aj, -am, ao, al, ai } ,\ - { cx, dw, ev, -dz, -da, -cu, -dt, -es, ec, dd, cr, dq, ep, -ef, -dg, -co, -dn, -em, ei, dj, cl, dk, ej, -el, -dm, -cn, -dh, -eg, eo, dp, cq, de, ed, -er, -ds, -ct, -db, -ea, eu, dv, cw, cy, dx, ew, -dy, -cz, -cv, -du, -et, eb, dc, cs, dr, eq, -ee, -df, -cp, -d_, -en, eh, di, cm, dl, ek, -ek, -dl, -cm, -di, -eh, en, d_, cp, df, ee, -eq, -dr, -cs, -dc, -eb, et, du, cv, cz, dy, -ew, -dx, -cy, -cw, -dv, -eu, ea, db, ct, ds, er, -ed, -de, -cq, -dp, -eo, eg, dh, cn, dm, el, -ej, -dk, -cl, -dj, -ei, em, dn, co, dg, ef, -ep, -dq, -cr, -dd, -ec, es, dt, cu, da, dz, -ev, -dw, -cx } ,\ - { bl, by, -ck, -bx, -bk, -bm, -bz, cj, bw, bj, bn, ca, -ci, -bv, -bi, -bo, -cb, ch, bu, bh, bp, cc, -cg, -bt, -bg, -bq, -cd, cf, bs, bf, br, ce, -ce, -br, -bf, -bs, -cf, cd, bq, bg, bt, cg, -cc, -bp, -bh, -bu, -ch, cb, bo, bi, bv, ci, -ca, -bn, -bj, -bw, -cj, bz, bm, bk, bx, ck, -by, -bl, -bl, -by, ck, bx, bk, bm, bz, -cj, -bw, -bj, -bn, -ca, ci, bv, bi, bo, cb, -ch, -bu, -bh, -bp, -cc, cg, bt, bg, bq, cd, -cf, -bs, -bf, -br, -ce, ce, br, bf, bs, cf, -cd, -bq, -bg, -bt, -cg, cc, bp, bh, bu, ch, -cb, -bo, -bi, -bv, -ci, ca, bn, bj, bw, cj, -bz, -bm, -bk, -bx, -ck, by, bl } ,\ - { cy, dz, -et, -ds, -cr, -df, -eg, em, dl, cl, dm, en, -ef, -de, -cs, -dt, -eu, dy, cx, cz, ea, -es, -dr, -cq, -dg, -eh, el, dk, cm, dn, eo, -ee, -dd, -ct, -du, -ev, dx, cw, da, eb, -er, -dq, -cp, -dh, -ei, ek, dj, cn, d_, ep, -ed, -dc, -cu, -dv, -ew, dw, cv, db, ec, -eq, -dp, -co, -di, -ej, ej, di, co, dp, eq, -ec, -db, -cv, -dw, ew, dv, cu, dc, ed, -ep, -d_, -cn, -dj, -ek, ei, dh, cp, dq, er, -eb, -da, -cw, -dx, ev, du, ct, dd, ee, -eo, -dn, -cm, -dk, -el, eh, dg, cq, dr, es, -ea, -cz, -cx, -dy, eu, dt, cs, de, ef, -en, -dm, -cl, -dl, -em, eg, df, cr, ds, et, -dz, -cy } ,\ - { as, az, -bd, -aw, -ap, -av, -bc, ba, at, ar, ay, -be, -ax, -aq, -au, -bb, bb, au, aq, ax, be, -ay, -ar, -at, -ba, bc, av, ap, aw, bd, -az, -as, -as, -az, bd, aw, ap, av, bc, -ba, -at, -ar, -ay, be, ax, aq, au, bb, -bb, -au, -aq, -ax, -be, ay, ar, at, ba, -bc, -av, -ap, -aw, -bd, az, as, as, az, -bd, -aw, -ap, -av, -bc, ba, at, ar, ay, -be, -ax, -aq, -au, -bb, bb, au, aq, ax, be, -ay, -ar, -at, -ba, bc, av, ap, aw, bd, -az, -as, -as, -az, bd, aw, ap, av, bc, -ba, -at, -ar, -ay, be, ax, aq, au, bb, -bb, -au, -aq, -ax, -be, ay, ar, at, ba, -bc, -av, -ap, -aw, -bd, az, as } ,\ - { cz, ec, -eo, -dl, -cn, -dq, -et, dx, cu, de, eh, -ej, -dg, -cs, -dv, ev, ds, cp, dj, em, -ee, -db, -cx, -ea, eq, dn, cl, d_, er, -dz, -cw, -dc, -ef, el, di, cq, dt, ew, -du, -cr, -dh, -ek, eg, dd, cv, dy, -es, -dp, -cm, -dm, -ep, eb, cy, da, ed, -en, -dk, -co, -dr, -eu, dw, ct, df, ei, -ei, -df, -ct, -dw, eu, dr, co, dk, en, -ed, -da, -cy, -eb, ep, dm, cm, dp, es, -dy, -cv, -dd, -eg, ek, dh, cr, du, -ew, -dt, -cq, -di, -el, ef, dc, cw, dz, -er, -d_, -cl, -dn, -eq, ea, cx, db, ee, -em, -dj, -cp, -ds, -ev, dv, cs, dg, ej, -eh, -de, -cu, -dx, et, dq, cn, dl, eo, -ec, -cz } ,\ - { bm, cb, -cf, -bq, -bi, -bx, cj, bu, bf, bt, ci, -by, -bj, -bp, -ce, cc, bn, bl, ca, -cg, -br, -bh, -bw, ck, bv, bg, bs, ch, -bz, -bk, -bo, -cd, cd, bo, bk, bz, -ch, -bs, -bg, -bv, -ck, bw, bh, br, cg, -ca, -bl, -bn, -cc, ce, bp, bj, by, -ci, -bt, -bf, -bu, -cj, bx, bi, bq, cf, -cb, -bm, -bm, -cb, cf, bq, bi, bx, -cj, -bu, -bf, -bt, -ci, by, bj, bp, ce, -cc, -bn, -bl, -ca, cg, br, bh, bw, -ck, -bv, -bg, -bs, -ch, bz, bk, bo, cd, -cd, -bo, -bk, -bz, ch, bs, bg, bv, ck, -bw, -bh, -br, -cg, ca, bl, bn, cc, -ce, -bp, -bj, -by, ci, bt, bf, bu, cj, -bx, -bi, -bq, -cf, cb, bm } ,\ - { da, ef, -ej, -de, -cw, -eb, en, di, cs, dx, -er, -dm, -co, -dt, ev, dq, cl, dp, eu, -du, -cp, -dl, -eq, dy, ct, dh, em, -ec, -cx, -dd, -ei, eg, db, cz, ee, -ek, -df, -cv, -ea, eo, dj, cr, dw, -es, -dn, -cn, -ds, ew, dr, cm, d_, et, -dv, -cq, -dk, -ep, dz, cu, dg, el, -ed, -cy, -dc, -eh, eh, dc, cy, ed, -el, -dg, -cu, -dz, ep, dk, cq, dv, -et, -d_, -cm, -dr, -ew, ds, cn, dn, es, -dw, -cr, -dj, -eo, ea, cv, df, ek, -ee, -cz, -db, -eg, ei, dd, cx, ec, -em, -dh, -ct, -dy, eq, dl, cp, du, -eu, -dp, -cl, -dq, -ev, dt, co, dm, er, -dx, -cs, -di, -en, eb, cw, de, ej, -ef, -da } ,\ - { ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab, ab, ac, -ac, -ab, -ab, -ac, ac, ab } ,\ - { db, ei, -ee, -cx, -df, -em, ea, ct, dj, eq, -dw, -cp, -dn, -eu, ds, cl, dr, -ev, -d_, -co, -dv, er, dk, cs, dz, -en, -dg, -cw, -ed, ej, dc, da, eh, -ef, -cy, -de, -el, eb, cu, di, ep, -dx, -cq, -dm, -et, dt, cm, dq, -ew, -dp, -cn, -du, es, dl, cr, dy, -eo, -dh, -cv, -ec, ek, dd, cz, eg, -eg, -cz, -dd, -ek, ec, cv, dh, eo, -dy, -cr, -dl, -es, du, cn, dp, ew, -dq, -cm, -dt, et, dm, cq, dx, -ep, -di, -cu, -eb, el, de, cy, ef, -eh, -da, -dc, -ej, ed, cw, dg, en, -dz, -cs, -dk, -er, dv, co, d_, ev, -dr, -cl, -ds, eu, dn, cp, dw, -eq, -dj, -ct, -ea, em, df, cx, ee, -ei, -db } ,\ - { bn, ce, -ca, -bj, -br, -ci, bw, bf, bv, -cj, -bs, -bi, -bz, cf, bo, bm, cd, -cb, -bk, -bq, -ch, bx, bg, bu, -ck, -bt, -bh, -by, cg, bp, bl, cc, -cc, -bl, -bp, -cg, by, bh, bt, ck, -bu, -bg, -bx, ch, bq, bk, cb, -cd, -bm, -bo, -cf, bz, bi, bs, cj, -bv, -bf, -bw, ci, br, bj, ca, -ce, -bn, -bn, -ce, ca, bj, br, ci, -bw, -bf, -bv, cj, bs, bi, bz, -cf, -bo, -bm, -cd, cb, bk, bq, ch, -bx, -bg, -bu, ck, bt, bh, by, -cg, -bp, -bl, -cc, cc, bl, bp, cg, -by, -bh, -bt, -ck, bu, bg, bx, -ch, -bq, -bk, -cb, cd, bm, bo, cf, -bz, -bi, -bs, -cj, bv, bf, bw, -ci, -br, -bj, -ca, ce, bn } ,\ - { dc, el, -dz, -cq, -d_, ew, dn, cr, ea, -ek, -db, -dd, -em, dy, cp, dp, -ev, -dm, -cs, -eb, ej, da, de, en, -dx, -co, -dq, eu, dl, ct, ec, -ei, -cz, -df, -eo, dw, cn, dr, -et, -dk, -cu, -ed, eh, cy, dg, ep, -dv, -cm, -ds, es, dj, cv, ee, -eg, -cx, -dh, -eq, du, cl, dt, -er, -di, -cw, -ef, ef, cw, di, er, -dt, -cl, -du, eq, dh, cx, eg, -ee, -cv, -dj, -es, ds, cm, dv, -ep, -dg, -cy, -eh, ed, cu, dk, et, -dr, -cn, -dw, eo, df, cz, ei, -ec, -ct, -dl, -eu, dq, co, dx, -en, -de, -da, -ej, eb, cs, dm, ev, -dp, -cp, -dy, em, dd, db, ek, -ea, -cr, -dn, -ew, d_, cq, dz, -el, -dc } ,\ - { at, bc, -ay, -ap, -ax, bd, au, as, bb, -az, -aq, -aw, be, av, ar, ba, -ba, -ar, -av, -be, aw, aq, az, -bb, -as, -au, -bd, ax, ap, ay, -bc, -at, -at, -bc, ay, ap, ax, -bd, -au, -as, -bb, az, aq, aw, -be, -av, -ar, -ba, ba, ar, av, be, -aw, -aq, -az, bb, as, au, bd, -ax, -ap, -ay, bc, at, at, bc, -ay, -ap, -ax, bd, au, as, bb, -az, -aq, -aw, be, av, ar, ba, -ba, -ar, -av, -be, aw, aq, az, -bb, -as, -au, -bd, ax, ap, ay, -bc, -at, -at, -bc, ay, ap, ax, -bd, -au, -as, -bb, az, aq, aw, -be, -av, -ar, -ba, ba, ar, av, be, -aw, -aq, -az, bb, as, au, bd, -ax, -ap, -ay, bc, at } ,\ - { dd, eo, -du, -cm, -dx, el, da, dg, er, -dr, -cp, -ea, ei, cx, dj, eu, -d_, -cs, -ed, ef, cu, dm, -ew, -dl, -cv, -eg, ec, cr, dp, -et, -di, -cy, -ej, dz, co, ds, -eq, -df, -db, -em, dw, cl, dv, -en, -dc, -de, -ep, dt, cn, dy, -ek, -cz, -dh, -es, dq, cq, eb, -eh, -cw, -dk, -ev, dn, ct, ee, -ee, -ct, -dn, ev, dk, cw, eh, -eb, -cq, -dq, es, dh, cz, ek, -dy, -cn, -dt, ep, de, dc, en, -dv, -cl, -dw, em, db, df, eq, -ds, -co, -dz, ej, cy, di, et, -dp, -cr, -ec, eg, cv, dl, ew, -dm, -cu, -ef, ed, cs, d_, -eu, -dj, -cx, -ei, ea, cp, dr, -er, -dg, -da, -el, dx, cm, du, -eo, -dd } ,\ - { bo, ch, -bv, -bh, -ca, cc, bj, bt, -cj, -bq, -bm, -cf, bx, bf, by, -ce, -bl, -br, -ck, bs, bk, cd, -bz, -bg, -bw, cg, bn, bp, ci, -bu, -bi, -cb, cb, bi, bu, -ci, -bp, -bn, -cg, bw, bg, bz, -cd, -bk, -bs, ck, br, bl, ce, -by, -bf, -bx, cf, bm, bq, cj, -bt, -bj, -cc, ca, bh, bv, -ch, -bo, -bo, -ch, bv, bh, ca, -cc, -bj, -bt, cj, bq, bm, cf, -bx, -bf, -by, ce, bl, br, ck, -bs, -bk, -cd, bz, bg, bw, -cg, -bn, -bp, -ci, bu, bi, cb, -cb, -bi, -bu, ci, bp, bn, cg, -bw, -bg, -bz, cd, bk, bs, -ck, -br, -bl, -ce, by, bf, bx, -cf, -bm, -bq, -cj, bt, bj, cc, -ca, -bh, -bv, ch, bo } ,\ - { de, er, -dp, -ct, -eg, ea, cn, dv, -el, -cy, -dk, ew, dj, cz, em, -du, -co, -eb, ef, cs, dq, -eq, -dd, -df, -es, d_, cu, eh, -dz, -cm, -dw, ek, cx, dl, -ev, -di, -da, -en, dt, cp, ec, -ee, -cr, -dr, ep, dc, dg, et, -dn, -cv, -ei, dy, cl, dx, -ej, -cw, -dm, eu, dh, db, eo, -ds, -cq, -ed, ed, cq, ds, -eo, -db, -dh, -eu, dm, cw, ej, -dx, -cl, -dy, ei, cv, dn, -et, -dg, -dc, -ep, dr, cr, ee, -ec, -cp, -dt, en, da, di, ev, -dl, -cx, -ek, dw, cm, dz, -eh, -cu, -d_, es, df, dd, eq, -dq, -cs, -ef, eb, co, du, -em, -cz, -dj, -ew, dk, cy, el, -dv, -cn, -ea, eg, ct, dp, -er, -de } ,\ - { aj, ao, -ak, -ai, -an, al, ah, am, -am, -ah, -al, an, ai, ak, -ao, -aj, -aj, -ao, ak, ai, an, -al, -ah, -am, am, ah, al, -an, -ai, -ak, ao, aj, aj, ao, -ak, -ai, -an, al, ah, am, -am, -ah, -al, an, ai, ak, -ao, -aj, -aj, -ao, ak, ai, an, -al, -ah, -am, am, ah, al, -an, -ai, -ak, ao, aj, aj, ao, -ak, -ai, -an, al, ah, am, -am, -ah, -al, an, ai, ak, -ao, -aj, -aj, -ao, ak, ai, an, -al, -ah, -am, am, ah, al, -an, -ai, -ak, ao, aj, aj, ao, -ak, -ai, -an, al, ah, am, -am, -ah, -al, an, ai, ak, -ao, -aj, -aj, -ao, ak, ai, an, -al, -ah, -am, am, ah, al, -an, -ai, -ak, ao, aj } ,\ - { df, eu, -dk, -da, -ep, dp, cv, ek, -du, -cq, -ef, dz, cl, ea, -ee, -cp, -dv, ej, cu, dq, -eo, -cz, -dl, et, de, dg, ev, -dj, -db, -eq, d_, cw, el, -dt, -cr, -eg, dy, cm, eb, -ed, -co, -dw, ei, ct, dr, -en, -cy, -dm, es, dd, dh, ew, -di, -dc, -er, dn, cx, em, -ds, -cs, -eh, dx, cn, ec, -ec, -cn, -dx, eh, cs, ds, -em, -cx, -dn, er, dc, di, -ew, -dh, -dd, -es, dm, cy, en, -dr, -ct, -ei, dw, co, ed, -eb, -cm, -dy, eg, cr, dt, -el, -cw, -d_, eq, db, dj, -ev, -dg, -de, -et, dl, cz, eo, -dq, -cu, -ej, dv, cp, ee, -ea, -cl, -dz, ef, cq, du, -ek, -cv, -dp, ep, da, dk, -eu, -df } ,\ - { bp, ck, -bq, -bo, -cj, br, bn, ci, -bs, -bm, -ch, bt, bl, cg, -bu, -bk, -cf, bv, bj, ce, -bw, -bi, -cd, bx, bh, cc, -by, -bg, -cb, bz, bf, ca, -ca, -bf, -bz, cb, bg, by, -cc, -bh, -bx, cd, bi, bw, -ce, -bj, -bv, cf, bk, bu, -cg, -bl, -bt, ch, bm, bs, -ci, -bn, -br, cj, bo, bq, -ck, -bp, -bp, -ck, bq, bo, cj, -br, -bn, -ci, bs, bm, ch, -bt, -bl, -cg, bu, bk, cf, -bv, -bj, -ce, bw, bi, cd, -bx, -bh, -cc, by, bg, cb, -bz, -bf, -ca, ca, bf, bz, -cb, -bg, -by, cc, bh, bx, -cd, -bi, -bw, ce, bj, bv, -cf, -bk, -bu, cg, bl, bt, -ch, -bm, -bs, ci, bn, br, -cj, -bo, -bq, ck, bp } ,\ - { dg, -ew, -df, -dh, ev, de, di, -eu, -dd, -dj, et, dc, dk, -es, -db, -dl, er, da, dm, -eq, -cz, -dn, ep, cy, d_, -eo, -cx, -dp, en, cw, dq, -em, -cv, -dr, el, cu, ds, -ek, -ct, -dt, ej, cs, du, -ei, -cr, -dv, eh, cq, dw, -eg, -cp, -dx, ef, co, dy, -ee, -cn, -dz, ed, cm, ea, -ec, -cl, -eb, eb, cl, ec, -ea, -cm, -ed, dz, cn, ee, -dy, -co, -ef, dx, cp, eg, -dw, -cq, -eh, dv, cr, ei, -du, -cs, -ej, dt, ct, ek, -ds, -cu, -el, dr, cv, em, -dq, -cw, -en, dp, cx, eo, -d_, -cy, -ep, dn, cz, eq, -dm, -da, -er, dl, db, es, -dk, -dc, -et, dj, dd, eu, -di, -de, -ev, dh, df, ew, -dg } ,\ - { au, -be, -at, -av, bd, as, aw, -bc, -ar, -ax, bb, aq, ay, -ba, -ap, -az, az, ap, ba, -ay, -aq, -bb, ax, ar, bc, -aw, -as, -bd, av, at, be, -au, -au, be, at, av, -bd, -as, -aw, bc, ar, ax, -bb, -aq, -ay, ba, ap, az, -az, -ap, -ba, ay, aq, bb, -ax, -ar, -bc, aw, as, bd, -av, -at, -be, au, au, -be, -at, -av, bd, as, aw, -bc, -ar, -ax, bb, aq, ay, -ba, -ap, -az, az, ap, ba, -ay, -aq, -bb, ax, ar, bc, -aw, -as, -bd, av, at, be, -au, -au, be, at, av, -bd, -as, -aw, bc, ar, ax, -bb, -aq, -ay, ba, ap, az, -az, -ap, -ba, ay, aq, bb, -ax, -ar, -bc, aw, as, bd, -av, -at, -be, au } ,\ - { dh, -et, -da, -d_, em, ct, dv, -ef, -cm, -ec, dy, cq, ej, -dr, -cx, -eq, dk, de, -ew, -dd, -dl, ep, cw, ds, -ei, -cp, -dz, eb, cn, eg, -du, -cu, -en, dn, db, eu, -dg, -di, es, cz, dp, -el, -cs, -dw, ee, cl, ed, -dx, -cr, -ek, dq, cy, er, -dj, -df, ev, dc, dm, -eo, -cv, -dt, eh, co, ea, -ea, -co, -eh, dt, cv, eo, -dm, -dc, -ev, df, dj, -er, -cy, -dq, ek, cr, dx, -ed, -cl, -ee, dw, cs, el, -dp, -cz, -es, di, dg, -eu, -db, -dn, en, cu, du, -eg, -cn, -eb, dz, cp, ei, -ds, -cw, -ep, dl, dd, ew, -de, -dk, eq, cx, dr, -ej, -cq, -dy, ec, cm, ef, -dv, -ct, -em, d_, da, et, -dh } ,\ - { bq, -ci, -bl, -bv, cd, bg, ca, -by, -bi, -cf, bt, bn, ck, -bo, -bs, cg, bj, bx, -cb, -bf, -cc, bw, bk, ch, -br, -bp, cj, bm, bu, -ce, -bh, -bz, bz, bh, ce, -bu, -bm, -cj, bp, br, -ch, -bk, -bw, cc, bf, cb, -bx, -bj, -cg, bs, bo, -ck, -bn, -bt, cf, bi, by, -ca, -bg, -cd, bv, bl, ci, -bq, -bq, ci, bl, bv, -cd, -bg, -ca, by, bi, cf, -bt, -bn, -ck, bo, bs, -cg, -bj, -bx, cb, bf, cc, -bw, -bk, -ch, br, bp, -cj, -bm, -bu, ce, bh, bz, -bz, -bh, -ce, bu, bm, cj, -bp, -br, ch, bk, bw, -cc, -bf, -cb, bx, bj, cg, -bs, -bo, ck, bn, bt, -cf, -bi, -by, ca, bg, cd, -bv, -bl, -ci, bq } ,\ - { di, -eq, -cv, -dv, ed, cn, ei, -dq, -da, -ev, dd, dn, -el, -cq, -ea, dy, cs, en, -dl, -df, et, cy, ds, -eg, -cl, -ef, dt, cx, es, -dg, -dk, eo, ct, dx, -eb, -cp, -ek, d_, dc, -ew, -db, -dp, ej, co, ec, -dw, -cu, -ep, dj, dh, -er, -cw, -du, ee, cm, eh, -dr, -cz, -eu, de, dm, -em, -cr, -dz, dz, cr, em, -dm, -de, eu, cz, dr, -eh, -cm, -ee, du, cw, er, -dh, -dj, ep, cu, dw, -ec, -co, -ej, dp, db, ew, -dc, -d_, ek, cp, eb, -dx, -ct, -eo, dk, dg, -es, -cx, -dt, ef, cl, eg, -ds, -cy, -et, df, dl, -en, -cs, -dy, ea, cq, el, -dn, -dd, ev, da, dq, -ei, -cn, -ed, dv, cv, eq, -di } ,\ - { ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae, ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae, ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae, ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae, ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae, ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae, ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae, ae, -ag, -ad, -af, af, ad, ag, -ae, -ae, ag, ad, af, -af, -ad, -ag, ae } ,\ - { dj, -en, -cq, -ec, du, cy, ev, -db, -dr, ef, cn, ek, -dm, -dg, eq, ct, dz, -dx, -cv, -es, de, d_, -ei, -cl, -eh, dp, dd, -et, -cw, -dw, ea, cs, ep, -dh, -dl, el, co, ee, -ds, -da, ew, cz, dt, -ed, -cp, -em, dk, di, -eo, -cr, -eb, dv, cx, eu, -dc, -dq, eg, cm, ej, -dn, -df, er, cu, dy, -dy, -cu, -er, df, dn, -ej, -cm, -eg, dq, dc, -eu, -cx, -dv, eb, cr, eo, -di, -dk, em, cp, ed, -dt, -cz, -ew, da, ds, -ee, -co, -el, dl, dh, -ep, -cs, -ea, dw, cw, et, -dd, -dp, eh, cl, ei, -d_, -de, es, cv, dx, -dz, -ct, -eq, dg, dm, -ek, -cn, -ef, dr, db, -ev, -cy, -du, ec, cq, en, -dj } ,\ - { br, -cf, -bg, -cc, bu, bo, -ci, -bj, -bz, bx, bl, ck, -bm, -bw, ca, bi, ch, -bp, -bt, cd, bf, ce, -bs, -bq, cg, bh, cb, -bv, -bn, cj, bk, by, -by, -bk, -cj, bn, bv, -cb, -bh, -cg, bq, bs, -ce, -bf, -cd, bt, bp, -ch, -bi, -ca, bw, bm, -ck, -bl, -bx, bz, bj, ci, -bo, -bu, cc, bg, cf, -br, -br, cf, bg, cc, -bu, -bo, ci, bj, bz, -bx, -bl, -ck, bm, bw, -ca, -bi, -ch, bp, bt, -cd, -bf, -ce, bs, bq, -cg, -bh, -cb, bv, bn, -cj, -bk, -by, by, bk, cj, -bn, -bv, cb, bh, cg, -bq, -bs, ce, bf, cd, -bt, -bp, ch, bi, ca, -bw, -bm, ck, bl, bx, -bz, -bj, -ci, bo, bu, -cc, -bg, -cf, br } ,\ - { dk, -ek, -cl, -ej, dl, dj, -el, -cm, -ei, dm, di, -em, -cn, -eh, dn, dh, -en, -co, -eg, d_, dg, -eo, -cp, -ef, dp, df, -ep, -cq, -ee, dq, de, -eq, -cr, -ed, dr, dd, -er, -cs, -ec, ds, dc, -es, -ct, -eb, dt, db, -et, -cu, -ea, du, da, -eu, -cv, -dz, dv, cz, -ev, -cw, -dy, dw, cy, -ew, -cx, -dx, dx, cx, ew, -cy, -dw, dy, cw, ev, -cz, -dv, dz, cv, eu, -da, -du, ea, cu, et, -db, -dt, eb, ct, es, -dc, -ds, ec, cs, er, -dd, -dr, ed, cr, eq, -de, -dq, ee, cq, ep, -df, -dp, ef, cp, eo, -dg, -d_, eg, co, en, -dh, -dn, eh, cn, em, -di, -dm, ei, cm, el, -dj, -dl, ej, cl, ek, -dk } ,\ - { av, -bb, -ap, -bc, au, aw, -ba, -aq, -bd, at, ax, -az, -ar, -be, as, ay, -ay, -as, be, ar, az, -ax, -at, bd, aq, ba, -aw, -au, bc, ap, bb, -av, -av, bb, ap, bc, -au, -aw, ba, aq, bd, -at, -ax, az, ar, be, -as, -ay, ay, as, -be, -ar, -az, ax, at, -bd, -aq, -ba, aw, au, -bc, -ap, -bb, av, av, -bb, -ap, -bc, au, aw, -ba, -aq, -bd, at, ax, -az, -ar, -be, as, ay, -ay, -as, be, ar, az, -ax, -at, bd, aq, ba, -aw, -au, bc, ap, bb, -av, -av, bb, ap, bc, -au, -aw, ba, aq, bd, -at, -ax, az, ar, be, -as, -ay, ay, as, -be, -ar, -az, ax, at, -bd, -aq, -ba, aw, au, -bc, -ap, -bb, av } ,\ - { dl, -eh, -cp, -eq, dc, du, -dy, -cy, eu, ct, ed, -dp, -dh, el, cl, em, -dg, -dq, ec, cu, ev, -cx, -dz, dt, dd, -ep, -co, -ei, dk, dm, -eg, -cq, -er, db, dv, -dx, -cz, et, cs, ee, -d_, -di, ek, cm, en, -df, -dr, eb, cv, ew, -cw, -ea, ds, de, -eo, -cn, -ej, dj, dn, -ef, -cr, -es, da, dw, -dw, -da, es, cr, ef, -dn, -dj, ej, cn, eo, -de, -ds, ea, cw, -ew, -cv, -eb, dr, df, -en, -cm, -ek, di, d_, -ee, -cs, -et, cz, dx, -dv, -db, er, cq, eg, -dm, -dk, ei, co, ep, -dd, -dt, dz, cx, -ev, -cu, -ec, dq, dg, -em, -cl, -el, dh, dp, -ed, -ct, -eu, cy, dy, -du, -dc, eq, cp, eh, -dl } ,\ - { bs, -cc, -bi, -cj, bl, bz, -bv, -bp, cf, bf, cg, -bo, -bw, by, bm, -ci, -bh, -cd, br, bt, -cb, -bj, -ck, bk, ca, -bu, -bq, ce, bg, ch, -bn, -bx, bx, bn, -ch, -bg, -ce, bq, bu, -ca, -bk, ck, bj, cb, -bt, -br, cd, bh, ci, -bm, -by, bw, bo, -cg, -bf, -cf, bp, bv, -bz, -bl, cj, bi, cc, -bs, -bs, cc, bi, cj, -bl, -bz, bv, bp, -cf, -bf, -cg, bo, bw, -by, -bm, ci, bh, cd, -br, -bt, cb, bj, ck, -bk, -ca, bu, bq, -ce, -bg, -ch, bn, bx, -bx, -bn, ch, bg, ce, -bq, -bu, ca, bk, -ck, -bj, -cb, bt, br, -cd, -bh, -ci, bm, by, -bw, -bo, cg, bf, cf, -bp, -bv, bz, bl, -cj, -bi, -cc, bs } ,\ - { dm, -ee, -cu, ew, ct, ef, -dl, -dn, ed, cv, -ev, -cs, -eg, dk, d_, -ec, -cw, eu, cr, eh, -dj, -dp, eb, cx, -et, -cq, -ei, di, dq, -ea, -cy, es, cp, ej, -dh, -dr, dz, cz, -er, -co, -ek, dg, ds, -dy, -da, eq, cn, el, -df, -dt, dx, db, -ep, -cm, -em, de, du, -dw, -dc, eo, cl, en, -dd, -dv, dv, dd, -en, -cl, -eo, dc, dw, -du, -de, em, cm, ep, -db, -dx, dt, df, -el, -cn, -eq, da, dy, -ds, -dg, ek, co, er, -cz, -dz, dr, dh, -ej, -cp, -es, cy, ea, -dq, -di, ei, cq, et, -cx, -eb, dp, dj, -eh, -cr, -eu, cw, ec, -d_, -dk, eg, cs, ev, -cv, -ed, dn, dl, -ef, -ct, -ew, cu, ee, -dm } ,\ - { ak, -am, -ai, ao, ah, an, -aj, -al, al, aj, -an, -ah, -ao, ai, am, -ak, -ak, am, ai, -ao, -ah, -an, aj, al, -al, -aj, an, ah, ao, -ai, -am, ak, ak, -am, -ai, ao, ah, an, -aj, -al, al, aj, -an, -ah, -ao, ai, am, -ak, -ak, am, ai, -ao, -ah, -an, aj, al, -al, -aj, an, ah, ao, -ai, -am, ak, ak, -am, -ai, ao, ah, an, -aj, -al, al, aj, -an, -ah, -ao, ai, am, -ak, -ak, am, ai, -ao, -ah, -an, aj, al, -al, -aj, an, ah, ao, -ai, -am, ak, ak, -am, -ai, ao, ah, an, -aj, -al, al, aj, -an, -ah, -ao, ai, am, -ak, -ak, am, ai, -ao, -ah, -an, aj, al, -al, -aj, an, ah, ao, -ai, -am, ak } ,\ - { dn, -eb, -cz, ep, cl, eq, -cy, -ec, dm, d_, -ea, -da, eo, cm, er, -cx, -ed, dl, dp, -dz, -db, en, cn, es, -cw, -ee, dk, dq, -dy, -dc, em, co, et, -cv, -ef, dj, dr, -dx, -dd, el, cp, eu, -cu, -eg, di, ds, -dw, -de, ek, cq, ev, -ct, -eh, dh, dt, -dv, -df, ej, cr, ew, -cs, -ei, dg, du, -du, -dg, ei, cs, -ew, -cr, -ej, df, dv, -dt, -dh, eh, ct, -ev, -cq, -ek, de, dw, -ds, -di, eg, cu, -eu, -cp, -el, dd, dx, -dr, -dj, ef, cv, -et, -co, -em, dc, dy, -dq, -dk, ee, cw, -es, -cn, -en, db, dz, -dp, -dl, ed, cx, -er, -cm, -eo, da, ea, -d_, -dm, ec, cy, -eq, -cl, -ep, cz, eb, -dn } ,\ - { bt, -bz, -bn, cf, bh, ck, -bi, -ce, bo, by, -bu, -bs, ca, bm, -cg, -bg, -cj, bj, cd, -bp, -bx, bv, br, -cb, -bl, ch, bf, ci, -bk, -cc, bq, bw, -bw, -bq, cc, bk, -ci, -bf, -ch, bl, cb, -br, -bv, bx, bp, -cd, -bj, cj, bg, cg, -bm, -ca, bs, bu, -by, -bo, ce, bi, -ck, -bh, -cf, bn, bz, -bt, -bt, bz, bn, -cf, -bh, -ck, bi, ce, -bo, -by, bu, bs, -ca, -bm, cg, bg, cj, -bj, -cd, bp, bx, -bv, -br, cb, bl, -ch, -bf, -ci, bk, cc, -bq, -bw, bw, bq, -cc, -bk, ci, bf, ch, -bl, -cb, br, bv, -bx, -bp, cd, bj, -cj, -bg, -cg, bm, ca, -bs, -bu, by, bo, -ce, -bi, ck, bh, cf, -bn, -bz, bt } ,\ - { d_, -dy, -de, ei, cu, -es, -cl, -er, cv, eh, -df, -dx, dp, dn, -dz, -dd, ej, ct, -et, -cm, -eq, cw, eg, -dg, -dw, dq, dm, -ea, -dc, ek, cs, -eu, -cn, -ep, cx, ef, -dh, -dv, dr, dl, -eb, -db, el, cr, -ev, -co, -eo, cy, ee, -di, -du, ds, dk, -ec, -da, em, cq, -ew, -cp, -en, cz, ed, -dj, -dt, dt, dj, -ed, -cz, en, cp, ew, -cq, -em, da, ec, -dk, -ds, du, di, -ee, -cy, eo, co, ev, -cr, -el, db, eb, -dl, -dr, dv, dh, -ef, -cx, ep, cn, eu, -cs, -ek, dc, ea, -dm, -dq, dw, dg, -eg, -cw, eq, cm, et, -ct, -ej, dd, dz, -dn, -dp, dx, df, -eh, -cv, er, cl, es, -cu, -ei, de, dy, -d_ } ,\ - { aw, -ay, -au, ba, as, -bc, -aq, be, ap, bd, -ar, -bb, at, az, -av, -ax, ax, av, -az, -at, bb, ar, -bd, -ap, -be, aq, bc, -as, -ba, au, ay, -aw, -aw, ay, au, -ba, -as, bc, aq, -be, -ap, -bd, ar, bb, -at, -az, av, ax, -ax, -av, az, at, -bb, -ar, bd, ap, be, -aq, -bc, as, ba, -au, -ay, aw, aw, -ay, -au, ba, as, -bc, -aq, be, ap, bd, -ar, -bb, at, az, -av, -ax, ax, av, -az, -at, bb, ar, -bd, -ap, -be, aq, bc, -as, -ba, au, ay, -aw, -aw, ay, au, -ba, -as, bc, aq, -be, -ap, -bd, ar, bb, -at, -az, av, ax, -ax, -av, az, at, -bb, -ar, bd, ap, be, -aq, -bc, as, ba, -au, -ay, aw } ,\ - { dp, -dv, -dj, eb, dd, -eh, -cx, en, cr, -et, -cl, -eu, cq, eo, -cw, -ei, dc, ec, -di, -dw, d_, dq, -du, -dk, ea, de, -eg, -cy, em, cs, -es, -cm, -ev, cp, ep, -cv, -ej, db, ed, -dh, -dx, dn, dr, -dt, -dl, dz, df, -ef, -cz, el, ct, -er, -cn, -ew, co, eq, -cu, -ek, da, ee, -dg, -dy, dm, ds, -ds, -dm, dy, dg, -ee, -da, ek, cu, -eq, -co, ew, cn, er, -ct, -el, cz, ef, -df, -dz, dl, dt, -dr, -dn, dx, dh, -ed, -db, ej, cv, -ep, -cp, ev, cm, es, -cs, -em, cy, eg, -de, -ea, dk, du, -dq, -d_, dw, di, -ec, -dc, ei, cw, -eo, -cq, eu, cl, et, -cr, -en, cx, eh, -dd, -eb, dj, dv, -dp } ,\ - { bu, -bw, -bs, by, bq, -ca, -bo, cc, bm, -ce, -bk, cg, bi, -ci, -bg, ck, bf, cj, -bh, -ch, bj, cf, -bl, -cd, bn, cb, -bp, -bz, br, bx, -bt, -bv, bv, bt, -bx, -br, bz, bp, -cb, -bn, cd, bl, -cf, -bj, ch, bh, -cj, -bf, -ck, bg, ci, -bi, -cg, bk, ce, -bm, -cc, bo, ca, -bq, -by, bs, bw, -bu, -bu, bw, bs, -by, -bq, ca, bo, -cc, -bm, ce, bk, -cg, -bi, ci, bg, -ck, -bf, -cj, bh, ch, -bj, -cf, bl, cd, -bn, -cb, bp, bz, -br, -bx, bt, bv, -bv, -bt, bx, br, -bz, -bp, cb, bn, -cd, -bl, cf, bj, -ch, -bh, cj, bf, ck, -bg, -ci, bi, cg, -bk, -ce, bm, cc, -bo, -ca, bq, by, -bs, -bw, bu } ,\ - { dq, -ds, -d_, du, dm, -dw, -dk, dy, di, -ea, -dg, ec, de, -ee, -dc, eg, da, -ei, -cy, ek, cw, -em, -cu, eo, cs, -eq, -cq, es, co, -eu, -cm, ew, cl, ev, -cn, -et, cp, er, -cr, -ep, ct, en, -cv, -el, cx, ej, -cz, -eh, db, ef, -dd, -ed, df, eb, -dh, -dz, dj, dx, -dl, -dv, dn, dt, -dp, -dr, dr, dp, -dt, -dn, dv, dl, -dx, -dj, dz, dh, -eb, -df, ed, dd, -ef, -db, eh, cz, -ej, -cx, el, cv, -en, -ct, ep, cr, -er, -cp, et, cn, -ev, -cl, -ew, cm, eu, -co, -es, cq, eq, -cs, -eo, cu, em, -cw, -ek, cy, ei, -da, -eg, dc, ee, -de, -ec, dg, ea, -di, -dy, dk, dw, -dm, -du, d_, ds, -dq } ,\ - { aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa, aa, -aa, -aa, aa } ,\ - { dr, -dp, -dt, dn, dv, -dl, -dx, dj, dz, -dh, -eb, df, ed, -dd, -ef, db, eh, -cz, -ej, cx, el, -cv, -en, ct, ep, -cr, -er, cp, et, -cn, -ev, cl, -ew, -cm, eu, co, -es, -cq, eq, cs, -eo, -cu, em, cw, -ek, -cy, ei, da, -eg, -dc, ee, de, -ec, -dg, ea, di, -dy, -dk, dw, dm, -du, -d_, ds, dq, -dq, -ds, d_, du, -dm, -dw, dk, dy, -di, -ea, dg, ec, -de, -ee, dc, eg, -da, -ei, cy, ek, -cw, -em, cu, eo, -cs, -eq, cq, es, -co, -eu, cm, ew, -cl, ev, cn, -et, -cp, er, cr, -ep, -ct, en, cv, -el, -cx, ej, cz, -eh, -db, ef, dd, -ed, -df, eb, dh, -dz, -dj, dx, dl, -dv, -dn, dt, dp, -dr } ,\ - { bv, -bt, -bx, br, bz, -bp, -cb, bn, cd, -bl, -cf, bj, ch, -bh, -cj, bf, -ck, -bg, ci, bi, -cg, -bk, ce, bm, -cc, -bo, ca, bq, -by, -bs, bw, bu, -bu, -bw, bs, by, -bq, -ca, bo, cc, -bm, -ce, bk, cg, -bi, -ci, bg, ck, -bf, cj, bh, -ch, -bj, cf, bl, -cd, -bn, cb, bp, -bz, -br, bx, bt, -bv, -bv, bt, bx, -br, -bz, bp, cb, -bn, -cd, bl, cf, -bj, -ch, bh, cj, -bf, ck, bg, -ci, -bi, cg, bk, -ce, -bm, cc, bo, -ca, -bq, by, bs, -bw, -bu, bu, bw, -bs, -by, bq, ca, -bo, -cc, bm, ce, -bk, -cg, bi, ci, -bg, -ck, bf, -cj, -bh, ch, bj, -cf, -bl, cd, bn, -cb, -bp, bz, br, -bx, -bt, bv } ,\ - { ds, -dm, -dy, dg, ee, -da, -ek, cu, eq, -co, -ew, cn, -er, -ct, el, cz, -ef, -df, dz, dl, -dt, -dr, dn, dx, -dh, -ed, db, ej, -cv, -ep, cp, ev, -cm, es, cs, -em, -cy, eg, de, -ea, -dk, du, dq, -d_, -dw, di, ec, -dc, -ei, cw, eo, -cq, -eu, cl, -et, -cr, en, cx, -eh, -dd, eb, dj, -dv, -dp, dp, dv, -dj, -eb, dd, eh, -cx, -en, cr, et, -cl, eu, cq, -eo, -cw, ei, dc, -ec, -di, dw, d_, -dq, -du, dk, ea, -de, -eg, cy, em, -cs, -es, cm, -ev, -cp, ep, cv, -ej, -db, ed, dh, -dx, -dn, dr, dt, -dl, -dz, df, ef, -cz, -el, ct, er, -cn, ew, co, -eq, -cu, ek, da, -ee, -dg, dy, dm, -ds } ,\ - { ax, -av, -az, at, bb, -ar, -bd, ap, -be, -aq, bc, as, -ba, -au, ay, aw, -aw, -ay, au, ba, -as, -bc, aq, be, -ap, bd, ar, -bb, -at, az, av, -ax, -ax, av, az, -at, -bb, ar, bd, -ap, be, aq, -bc, -as, ba, au, -ay, -aw, aw, ay, -au, -ba, as, bc, -aq, -be, ap, -bd, -ar, bb, at, -az, -av, ax, ax, -av, -az, at, bb, -ar, -bd, ap, -be, -aq, bc, as, -ba, -au, ay, aw, -aw, -ay, au, ba, -as, -bc, aq, be, -ap, bd, ar, -bb, -at, az, av, -ax, -ax, av, az, -at, -bb, ar, bd, -ap, be, aq, -bc, -as, ba, au, -ay, -aw, aw, ay, -au, -ba, as, bc, -aq, -be, ap, -bd, -ar, bb, at, -az, -av, ax } ,\ - { dt, -dj, -ed, cz, en, -cp, ew, cq, -em, -da, ec, dk, -ds, -du, di, ee, -cy, -eo, co, -ev, -cr, el, db, -eb, -dl, dr, dv, -dh, -ef, cx, ep, -cn, eu, cs, -ek, -dc, ea, dm, -dq, -dw, dg, eg, -cw, -eq, cm, -et, -ct, ej, dd, -dz, -dn, dp, dx, -df, -eh, cv, er, -cl, es, cu, -ei, -de, dy, d_, -d_, -dy, de, ei, -cu, -es, cl, -er, -cv, eh, df, -dx, -dp, dn, dz, -dd, -ej, ct, et, -cm, eq, cw, -eg, -dg, dw, dq, -dm, -ea, dc, ek, -cs, -eu, cn, -ep, -cx, ef, dh, -dv, -dr, dl, eb, -db, -el, cr, ev, -co, eo, cy, -ee, -di, du, ds, -dk, -ec, da, em, -cq, -ew, cp, -en, -cz, ed, dj, -dt } ,\ - { bw, -bq, -cc, bk, ci, -bf, ch, bl, -cb, -br, bv, bx, -bp, -cd, bj, cj, -bg, cg, bm, -ca, -bs, bu, by, -bo, -ce, bi, ck, -bh, cf, bn, -bz, -bt, bt, bz, -bn, -cf, bh, -ck, -bi, ce, bo, -by, -bu, bs, ca, -bm, -cg, bg, -cj, -bj, cd, bp, -bx, -bv, br, cb, -bl, -ch, bf, -ci, -bk, cc, bq, -bw, -bw, bq, cc, -bk, -ci, bf, -ch, -bl, cb, br, -bv, -bx, bp, cd, -bj, -cj, bg, -cg, -bm, ca, bs, -bu, -by, bo, ce, -bi, -ck, bh, -cf, -bn, bz, bt, -bt, -bz, bn, cf, -bh, ck, bi, -ce, -bo, by, bu, -bs, -ca, bm, cg, -bg, cj, bj, -cd, -bp, bx, bv, -br, -cb, bl, ch, -bf, ci, bk, -cc, -bq, bw } ,\ - { du, -dg, -ei, cs, ew, -cr, ej, df, -dv, -dt, dh, eh, -ct, -ev, cq, -ek, -de, dw, ds, -di, -eg, cu, eu, -cp, el, dd, -dx, -dr, dj, ef, -cv, -et, co, -em, -dc, dy, dq, -dk, -ee, cw, es, -cn, en, db, -dz, -dp, dl, ed, -cx, -er, cm, -eo, -da, ea, d_, -dm, -ec, cy, eq, -cl, ep, cz, -eb, -dn, dn, eb, -cz, -ep, cl, -eq, -cy, ec, dm, -d_, -ea, da, eo, -cm, er, cx, -ed, -dl, dp, dz, -db, -en, cn, -es, -cw, ee, dk, -dq, -dy, dc, em, -co, et, cv, -ef, -dj, dr, dx, -dd, -el, cp, -eu, -cu, eg, di, -ds, -dw, de, ek, -cq, ev, ct, -eh, -dh, dt, dv, -df, -ej, cr, -ew, -cs, ei, dg, -du } ,\ - { al, -aj, -an, ah, -ao, -ai, am, ak, -ak, -am, ai, ao, -ah, an, aj, -al, -al, aj, an, -ah, ao, ai, -am, -ak, ak, am, -ai, -ao, ah, -an, -aj, al, al, -aj, -an, ah, -ao, -ai, am, ak, -ak, -am, ai, ao, -ah, an, aj, -al, -al, aj, an, -ah, ao, ai, -am, -ak, ak, am, -ai, -ao, ah, -an, -aj, al, al, -aj, -an, ah, -ao, -ai, am, ak, -ak, -am, ai, ao, -ah, an, aj, -al, -al, aj, an, -ah, ao, ai, -am, -ak, ak, am, -ai, -ao, ah, -an, -aj, al, al, -aj, -an, ah, -ao, -ai, am, ak, -ak, -am, ai, ao, -ah, an, aj, -al, -al, aj, an, -ah, ao, ai, -am, -ak, ak, am, -ai, -ao, ah, -an, -aj, al } ,\ - { dv, -dd, -en, cl, -eo, -dc, dw, du, -de, -em, cm, -ep, -db, dx, dt, -df, -el, cn, -eq, -da, dy, ds, -dg, -ek, co, -er, -cz, dz, dr, -dh, -ej, cp, -es, -cy, ea, dq, -di, -ei, cq, -et, -cx, eb, dp, -dj, -eh, cr, -eu, -cw, ec, d_, -dk, -eg, cs, -ev, -cv, ed, dn, -dl, -ef, ct, -ew, -cu, ee, dm, -dm, -ee, cu, ew, -ct, ef, dl, -dn, -ed, cv, ev, -cs, eg, dk, -d_, -ec, cw, eu, -cr, eh, dj, -dp, -eb, cx, et, -cq, ei, di, -dq, -ea, cy, es, -cp, ej, dh, -dr, -dz, cz, er, -co, ek, dg, -ds, -dy, da, eq, -cn, el, df, -dt, -dx, db, ep, -cm, em, de, -du, -dw, dc, eo, -cl, en, dd, -dv } ,\ - { bx, -bn, -ch, bg, -ce, -bq, bu, ca, -bk, -ck, bj, -cb, -bt, br, cd, -bh, ci, bm, -by, -bw, bo, cg, -bf, cf, bp, -bv, -bz, bl, cj, -bi, cc, bs, -bs, -cc, bi, -cj, -bl, bz, bv, -bp, -cf, bf, -cg, -bo, bw, by, -bm, -ci, bh, -cd, -br, bt, cb, -bj, ck, bk, -ca, -bu, bq, ce, -bg, ch, bn, -bx, -bx, bn, ch, -bg, ce, bq, -bu, -ca, bk, ck, -bj, cb, bt, -br, -cd, bh, -ci, -bm, by, bw, -bo, -cg, bf, -cf, -bp, bv, bz, -bl, -cj, bi, -cc, -bs, bs, cc, -bi, cj, bl, -bz, -bv, bp, cf, -bf, cg, bo, -bw, -by, bm, ci, -bh, cd, br, -bt, -cb, bj, -ck, -bk, ca, bu, -bq, -ce, bg, -ch, -bn, bx } ,\ - { dw, -da, -es, cr, -ef, -dn, dj, ej, -cn, eo, de, -ds, -ea, cw, ew, -cv, eb, dr, -df, -en, cm, -ek, -di, d_, ee, -cs, et, cz, -dx, -dv, db, er, -cq, eg, dm, -dk, -ei, co, -ep, -dd, dt, dz, -cx, -ev, cu, -ec, -dq, dg, em, -cl, el, dh, -dp, -ed, ct, -eu, -cy, dy, du, -dc, -eq, cp, -eh, -dl, dl, eh, -cp, eq, dc, -du, -dy, cy, eu, -ct, ed, dp, -dh, -el, cl, -em, -dg, dq, ec, -cu, ev, cx, -dz, -dt, dd, ep, -co, ei, dk, -dm, -eg, cq, -er, -db, dv, dx, -cz, -et, cs, -ee, -d_, di, ek, -cm, en, df, -dr, -eb, cv, -ew, -cw, ea, ds, -de, -eo, cn, -ej, -dj, dn, ef, -cr, es, da, -dw } ,\ - { ay, -as, -be, ar, -az, -ax, at, bd, -aq, ba, aw, -au, -bc, ap, -bb, -av, av, bb, -ap, bc, au, -aw, -ba, aq, -bd, -at, ax, az, -ar, be, as, -ay, -ay, as, be, -ar, az, ax, -at, -bd, aq, -ba, -aw, au, bc, -ap, bb, av, -av, -bb, ap, -bc, -au, aw, ba, -aq, bd, at, -ax, -az, ar, -be, -as, ay, ay, -as, -be, ar, -az, -ax, at, bd, -aq, ba, aw, -au, -bc, ap, -bb, -av, av, bb, -ap, bc, au, -aw, -ba, aq, -bd, -at, ax, az, -ar, be, as, -ay, -ay, as, be, -ar, az, ax, -at, -bd, aq, -ba, -aw, au, bc, -ap, bb, av, -av, -bb, ap, -bc, -au, aw, ba, -aq, bd, at, -ax, -az, ar, -be, -as, ay } ,\ - { dx, -cx, ew, cy, -dw, -dy, cw, -ev, -cz, dv, dz, -cv, eu, da, -du, -ea, cu, -et, -db, dt, eb, -ct, es, dc, -ds, -ec, cs, -er, -dd, dr, ed, -cr, eq, de, -dq, -ee, cq, -ep, -df, dp, ef, -cp, eo, dg, -d_, -eg, co, -en, -dh, dn, eh, -cn, em, di, -dm, -ei, cm, -el, -dj, dl, ej, -cl, ek, dk, -dk, -ek, cl, -ej, -dl, dj, el, -cm, ei, dm, -di, -em, cn, -eh, -dn, dh, en, -co, eg, d_, -dg, -eo, cp, -ef, -dp, df, ep, -cq, ee, dq, -de, -eq, cr, -ed, -dr, dd, er, -cs, ec, ds, -dc, -es, ct, -eb, -dt, db, et, -cu, ea, du, -da, -eu, cv, -dz, -dv, cz, ev, -cw, dy, dw, -cy, -ew, cx, -dx } ,\ - { by, -bk, cj, bn, -bv, -cb, bh, -cg, -bq, bs, ce, -bf, cd, bt, -bp, -ch, bi, -ca, -bw, bm, ck, -bl, bx, bz, -bj, ci, bo, -bu, -cc, bg, -cf, -br, br, cf, -bg, cc, bu, -bo, -ci, bj, -bz, -bx, bl, -ck, -bm, bw, ca, -bi, ch, bp, -bt, -cd, bf, -ce, -bs, bq, cg, -bh, cb, bv, -bn, -cj, bk, -by, -by, bk, -cj, -bn, bv, cb, -bh, cg, bq, -bs, -ce, bf, -cd, -bt, bp, ch, -bi, ca, bw, -bm, -ck, bl, -bx, -bz, bj, -ci, -bo, bu, cc, -bg, cf, br, -br, -cf, bg, -cc, -bu, bo, ci, -bj, bz, bx, -bl, ck, bm, -bw, -ca, bi, -ch, -bp, bt, cd, -bf, ce, bs, -bq, -cg, bh, -cb, -bv, bn, cj, -bk, by } ,\ - { dy, -cu, er, df, -dn, -ej, cm, -eg, -dq, dc, eu, -cx, dv, eb, -cr, eo, di, -dk, -em, cp, -ed, -dt, cz, -ew, -da, ds, ee, -co, el, dl, -dh, -ep, cs, -ea, -dw, cw, -et, -dd, dp, eh, -cl, ei, d_, -de, -es, cv, -dx, -dz, ct, -eq, -dg, dm, ek, -cn, ef, dr, -db, -ev, cy, -du, -ec, cq, -en, -dj, dj, en, -cq, ec, du, -cy, ev, db, -dr, -ef, cn, -ek, -dm, dg, eq, -ct, dz, dx, -cv, es, de, -d_, -ei, cl, -eh, -dp, dd, et, -cw, dw, ea, -cs, ep, dh, -dl, -el, co, -ee, -ds, da, ew, -cz, dt, ed, -cp, em, dk, -di, -eo, cr, -eb, -dv, cx, -eu, -dc, dq, eg, -cm, ej, dn, -df, -er, cu, -dy } ,\ - { af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af, af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af, af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af, af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af, af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af, af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af, af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af, af, -ad, ag, ae, -ae, -ag, ad, -af, -af, ad, -ag, -ae, ae, ag, -ad, af } ,\ - { dz, -cr, em, dm, -de, -eu, cz, -dr, -eh, cm, -ee, -du, cw, -er, -dh, dj, ep, -cu, dw, ec, -co, ej, dp, -db, ew, dc, -d_, -ek, cp, -eb, -dx, ct, -eo, -dk, dg, es, -cx, dt, ef, -cl, eg, ds, -cy, et, df, -dl, -en, cs, -dy, -ea, cq, -el, -dn, dd, ev, -da, dq, ei, -cn, ed, dv, -cv, eq, di, -di, -eq, cv, -dv, -ed, cn, -ei, -dq, da, -ev, -dd, dn, el, -cq, ea, dy, -cs, en, dl, -df, -et, cy, -ds, -eg, cl, -ef, -dt, cx, -es, -dg, dk, eo, -ct, dx, eb, -cp, ek, d_, -dc, -ew, db, -dp, -ej, co, -ec, -dw, cu, -ep, -dj, dh, er, -cw, du, ee, -cm, eh, dr, -cz, eu, de, -dm, -em, cr, -dz } ,\ - { bz, -bh, ce, bu, -bm, cj, bp, -br, -ch, bk, -bw, -cc, bf, -cb, -bx, bj, -cg, -bs, bo, ck, -bn, bt, cf, -bi, by, ca, -bg, cd, bv, -bl, ci, bq, -bq, -ci, bl, -bv, -cd, bg, -ca, -by, bi, -cf, -bt, bn, -ck, -bo, bs, cg, -bj, bx, cb, -bf, cc, bw, -bk, ch, br, -bp, -cj, bm, -bu, -ce, bh, -bz, -bz, bh, -ce, -bu, bm, -cj, -bp, br, ch, -bk, bw, cc, -bf, cb, bx, -bj, cg, bs, -bo, -ck, bn, -bt, -cf, bi, -by, -ca, bg, -cd, -bv, bl, -ci, -bq, bq, ci, -bl, bv, cd, -bg, ca, by, -bi, cf, bt, -bn, ck, bo, -bs, -cg, bj, -bx, -cb, bf, -cc, -bw, bk, -ch, -br, bp, cj, -bm, bu, ce, -bh, bz } ,\ - { ea, -co, eh, dt, -cv, eo, dm, -dc, ev, df, -dj, -er, cy, -dq, -ek, cr, -dx, -ed, cl, -ee, -dw, cs, -el, -dp, cz, -es, -di, dg, eu, -db, dn, en, -cu, du, eg, -cn, eb, dz, -cp, ei, ds, -cw, ep, dl, -dd, ew, de, -dk, -eq, cx, -dr, -ej, cq, -dy, -ec, cm, -ef, -dv, ct, -em, -d_, da, -et, -dh, dh, et, -da, d_, em, -ct, dv, ef, -cm, ec, dy, -cq, ej, dr, -cx, eq, dk, -de, -ew, dd, -dl, -ep, cw, -ds, -ei, cp, -dz, -eb, cn, -eg, -du, cu, -en, -dn, db, -eu, -dg, di, es, -cz, dp, el, -cs, dw, ee, -cl, ed, dx, -cr, ek, dq, -cy, er, dj, -df, -ev, dc, -dm, -eo, cv, -dt, -eh, co, -ea } ,\ - { az, -ap, ba, ay, -aq, bb, ax, -ar, bc, aw, -as, bd, av, -at, be, au, -au, -be, at, -av, -bd, as, -aw, -bc, ar, -ax, -bb, aq, -ay, -ba, ap, -az, -az, ap, -ba, -ay, aq, -bb, -ax, ar, -bc, -aw, as, -bd, -av, at, -be, -au, au, be, -at, av, bd, -as, aw, bc, -ar, ax, bb, -aq, ay, ba, -ap, az, az, -ap, ba, ay, -aq, bb, ax, -ar, bc, aw, -as, bd, av, -at, be, au, -au, -be, at, -av, -bd, as, -aw, -bc, ar, -ax, -bb, aq, -ay, -ba, ap, -az, -az, ap, -ba, -ay, aq, -bb, -ax, ar, -bc, -aw, as, -bd, -av, at, -be, -au, au, be, -at, av, bd, -as, aw, bc, -ar, ax, bb, -aq, ay, ba, -ap, az } ,\ - { eb, -cl, ec, ea, -cm, ed, dz, -cn, ee, dy, -co, ef, dx, -cp, eg, dw, -cq, eh, dv, -cr, ei, du, -cs, ej, dt, -ct, ek, ds, -cu, el, dr, -cv, em, dq, -cw, en, dp, -cx, eo, d_, -cy, ep, dn, -cz, eq, dm, -da, er, dl, -db, es, dk, -dc, et, dj, -dd, eu, di, -de, ev, dh, -df, ew, dg, -dg, -ew, df, -dh, -ev, de, -di, -eu, dd, -dj, -et, dc, -dk, -es, db, -dl, -er, da, -dm, -eq, cz, -dn, -ep, cy, -d_, -eo, cx, -dp, -en, cw, -dq, -em, cv, -dr, -el, cu, -ds, -ek, ct, -dt, -ej, cs, -du, -ei, cr, -dv, -eh, cq, -dw, -eg, cp, -dx, -ef, co, -dy, -ee, cn, -dz, -ed, cm, -ea, -ec, cl, -eb } ,\ - { ca, -bf, bz, cb, -bg, by, cc, -bh, bx, cd, -bi, bw, ce, -bj, bv, cf, -bk, bu, cg, -bl, bt, ch, -bm, bs, ci, -bn, br, cj, -bo, bq, ck, -bp, bp, -ck, -bq, bo, -cj, -br, bn, -ci, -bs, bm, -ch, -bt, bl, -cg, -bu, bk, -cf, -bv, bj, -ce, -bw, bi, -cd, -bx, bh, -cc, -by, bg, -cb, -bz, bf, -ca, -ca, bf, -bz, -cb, bg, -by, -cc, bh, -bx, -cd, bi, -bw, -ce, bj, -bv, -cf, bk, -bu, -cg, bl, -bt, -ch, bm, -bs, -ci, bn, -br, -cj, bo, -bq, -ck, bp, -bp, ck, bq, -bo, cj, br, -bn, ci, bs, -bm, ch, bt, -bl, cg, bu, -bk, cf, bv, -bj, ce, bw, -bi, cd, bx, -bh, cc, by, -bg, cb, bz, -bf, ca } ,\ - { ec, -cn, dx, eh, -cs, ds, em, -cx, dn, er, -dc, di, ew, -dh, dd, -es, -dm, cy, -en, -dr, ct, -ei, -dw, co, -ed, -eb, cm, -dy, -eg, cr, -dt, -el, cw, -d_, -eq, db, -dj, -ev, dg, -de, et, dl, -cz, eo, dq, -cu, ej, dv, -cp, ee, ea, -cl, dz, ef, -cq, du, ek, -cv, dp, ep, -da, dk, eu, -df, df, -eu, -dk, da, -ep, -dp, cv, -ek, -du, cq, -ef, -dz, cl, -ea, -ee, cp, -dv, -ej, cu, -dq, -eo, cz, -dl, -et, de, -dg, ev, dj, -db, eq, d_, -cw, el, dt, -cr, eg, dy, -cm, eb, ed, -co, dw, ei, -ct, dr, en, -cy, dm, es, -dd, dh, -ew, -di, dc, -er, -dn, cx, -em, -ds, cs, -eh, -dx, cn, -ec } ,\ - { am, -ah, al, an, -ai, ak, ao, -aj, aj, -ao, -ak, ai, -an, -al, ah, -am, -am, ah, -al, -an, ai, -ak, -ao, aj, -aj, ao, ak, -ai, an, al, -ah, am, am, -ah, al, an, -ai, ak, ao, -aj, aj, -ao, -ak, ai, -an, -al, ah, -am, -am, ah, -al, -an, ai, -ak, -ao, aj, -aj, ao, ak, -ai, an, al, -ah, am, am, -ah, al, an, -ai, ak, ao, -aj, aj, -ao, -ak, ai, -an, -al, ah, -am, -am, ah, -al, -an, ai, -ak, -ao, aj, -aj, ao, ak, -ai, an, al, -ah, am, am, -ah, al, an, -ai, ak, ao, -aj, aj, -ao, -ak, ai, -an, -al, ah, -am, -am, ah, -al, -an, ai, -ak, -ao, aj, -aj, ao, ak, -ai, an, al, -ah, am } ,\ - { ed, -cq, ds, eo, -db, dh, -eu, -dm, cw, -ej, -dx, cl, -dy, -ei, cv, -dn, -et, dg, -dc, ep, dr, -cr, ee, ec, -cp, dt, en, -da, di, -ev, -dl, cx, -ek, -dw, cm, -dz, -eh, cu, -d_, -es, df, -dd, eq, dq, -cs, ef, eb, -co, du, em, -cz, dj, -ew, -dk, cy, -el, -dv, cn, -ea, -eg, ct, -dp, -er, de, -de, er, dp, -ct, eg, ea, -cn, dv, el, -cy, dk, ew, -dj, cz, -em, -du, co, -eb, -ef, cs, -dq, -eq, dd, -df, es, d_, -cu, eh, dz, -cm, dw, ek, -cx, dl, ev, -di, da, -en, -dt, cp, -ec, -ee, cr, -dr, -ep, dc, -dg, et, dn, -cv, ei, dy, -cl, dx, ej, -cw, dm, eu, -dh, db, -eo, -ds, cq, -ed } ,\ - { cb, -bi, bu, ci, -bp, bn, -cg, -bw, bg, -bz, -cd, bk, -bs, -ck, br, -bl, ce, by, -bf, bx, cf, -bm, bq, -cj, -bt, bj, -cc, -ca, bh, -bv, -ch, bo, -bo, ch, bv, -bh, ca, cc, -bj, bt, cj, -bq, bm, -cf, -bx, bf, -by, -ce, bl, -br, ck, bs, -bk, cd, bz, -bg, bw, cg, -bn, bp, -ci, -bu, bi, -cb, -cb, bi, -bu, -ci, bp, -bn, cg, bw, -bg, bz, cd, -bk, bs, ck, -br, bl, -ce, -by, bf, -bx, -cf, bm, -bq, cj, bt, -bj, cc, ca, -bh, bv, ch, -bo, bo, -ch, -bv, bh, -ca, -cc, bj, -bt, -cj, bq, -bm, cf, bx, -bf, by, ce, -bl, br, -ck, -bs, bk, -cd, -bz, bg, -bw, -cg, bn, -bp, ci, bu, -bi, cb } ,\ - { ee, -ct, dn, ev, -dk, cw, -eh, -eb, cq, -dq, -es, dh, -cz, ek, dy, -cn, dt, ep, -de, dc, -en, -dv, cl, -dw, -em, db, -df, eq, ds, -co, dz, ej, -cy, di, -et, -dp, cr, -ec, -eg, cv, -dl, ew, dm, -cu, ef, ed, -cs, d_, eu, -dj, cx, -ei, -ea, cp, -dr, -er, dg, -da, el, dx, -cm, du, eo, -dd, dd, -eo, -du, cm, -dx, -el, da, -dg, er, dr, -cp, ea, ei, -cx, dj, -eu, -d_, cs, -ed, -ef, cu, -dm, -ew, dl, -cv, eg, ec, -cr, dp, et, -di, cy, -ej, -dz, co, -ds, -eq, df, -db, em, dw, -cl, dv, en, -dc, de, -ep, -dt, cn, -dy, -ek, cz, -dh, es, dq, -cq, eb, eh, -cw, dk, -ev, -dn, ct, -ee } ,\ - { ba, -ar, av, -be, -aw, aq, -az, -bb, as, -au, bd, ax, -ap, ay, bc, -at, at, -bc, -ay, ap, -ax, -bd, au, -as, bb, az, -aq, aw, be, -av, ar, -ba, -ba, ar, -av, be, aw, -aq, az, bb, -as, au, -bd, -ax, ap, -ay, -bc, at, -at, bc, ay, -ap, ax, bd, -au, as, -bb, -az, aq, -aw, -be, av, -ar, ba, ba, -ar, av, -be, -aw, aq, -az, -bb, as, -au, bd, ax, -ap, ay, bc, -at, at, -bc, -ay, ap, -ax, -bd, au, -as, bb, az, -aq, aw, be, -av, ar, -ba, -ba, ar, -av, be, aw, -aq, az, bb, -as, au, -bd, -ax, ap, -ay, -bc, at, -at, bc, ay, -ap, ax, bd, -au, as, -bb, -az, aq, -aw, -be, av, -ar, ba } ,\ - { ef, -cw, di, -er, -dt, cl, -du, -eq, dh, -cx, eg, ee, -cv, dj, -es, -ds, cm, -dv, -ep, dg, -cy, eh, ed, -cu, dk, -et, -dr, cn, -dw, -eo, df, -cz, ei, ec, -ct, dl, -eu, -dq, co, -dx, -en, de, -da, ej, eb, -cs, dm, -ev, -dp, cp, -dy, -em, dd, -db, ek, ea, -cr, dn, -ew, -d_, cq, -dz, -el, dc, -dc, el, dz, -cq, d_, ew, -dn, cr, -ea, -ek, db, -dd, em, dy, -cp, dp, ev, -dm, cs, -eb, -ej, da, -de, en, dx, -co, dq, eu, -dl, ct, -ec, -ei, cz, -df, eo, dw, -cn, dr, et, -dk, cu, -ed, -eh, cy, -dg, ep, dv, -cm, ds, es, -dj, cv, -ee, -eg, cx, -dh, eq, du, -cl, dt, er, -di, cw, -ef } ,\ - { cc, -bl, bp, -cg, -by, bh, -bt, ck, bu, -bg, bx, ch, -bq, bk, -cb, -cd, bm, -bo, cf, bz, -bi, bs, -cj, -bv, bf, -bw, -ci, br, -bj, ca, ce, -bn, bn, -ce, -ca, bj, -br, ci, bw, -bf, bv, cj, -bs, bi, -bz, -cf, bo, -bm, cd, cb, -bk, bq, -ch, -bx, bg, -bu, -ck, bt, -bh, by, cg, -bp, bl, -cc, -cc, bl, -bp, cg, by, -bh, bt, -ck, -bu, bg, -bx, -ch, bq, -bk, cb, cd, -bm, bo, -cf, -bz, bi, -bs, cj, bv, -bf, bw, ci, -br, bj, -ca, -ce, bn, -bn, ce, ca, -bj, br, -ci, -bw, bf, -bv, -cj, bs, -bi, bz, cf, -bo, bm, -cd, -cb, bk, -bq, ch, bx, -bg, bu, ck, -bt, bh, -by, -cg, bp, -bl, cc } ,\ - { eg, -cz, dd, -ek, -ec, cv, -dh, eo, dy, -cr, dl, -es, -du, cn, -dp, ew, dq, -cm, dt, et, -dm, cq, -dx, -ep, di, -cu, eb, el, -de, cy, -ef, -eh, da, -dc, ej, ed, -cw, dg, -en, -dz, cs, -dk, er, dv, -co, d_, -ev, -dr, cl, -ds, -eu, dn, -cp, dw, eq, -dj, ct, -ea, -em, df, -cx, ee, ei, -db, db, -ei, -ee, cx, -df, em, ea, -ct, dj, -eq, -dw, cp, -dn, eu, ds, -cl, dr, ev, -d_, co, -dv, -er, dk, -cs, dz, en, -dg, cw, -ed, -ej, dc, -da, eh, ef, -cy, de, -el, -eb, cu, -di, ep, dx, -cq, dm, -et, -dt, cm, -dq, -ew, dp, -cn, du, es, -dl, cr, -dy, -eo, dh, -cv, ec, ek, -dd, cz, -eg } ,\ - { ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac, ac, -ab, ab, -ac, -ac, ab, -ab, ac } ,\ - { eh, -dc, cy, -ed, -el, dg, -cu, dz, ep, -dk, cq, -dv, -et, d_, -cm, dr, -ew, -ds, cn, -dn, es, dw, -cr, dj, -eo, -ea, cv, -df, ek, ee, -cz, db, -eg, -ei, dd, -cx, ec, em, -dh, ct, -dy, -eq, dl, -cp, du, eu, -dp, cl, -dq, ev, dt, -co, dm, -er, -dx, cs, -di, en, eb, -cw, de, -ej, -ef, da, -da, ef, ej, -de, cw, -eb, -en, di, -cs, dx, er, -dm, co, -dt, -ev, dq, -cl, dp, -eu, -du, cp, -dl, eq, dy, -ct, dh, -em, -ec, cx, -dd, ei, eg, -db, cz, -ee, -ek, df, -cv, ea, eo, -dj, cr, -dw, -es, dn, -cn, ds, ew, -dr, cm, -d_, et, dv, -cq, dk, -ep, -dz, cu, -dg, el, ed, -cy, dc, -eh } ,\ - { cd, -bo, bk, -bz, -ch, bs, -bg, bv, -ck, -bw, bh, -br, cg, ca, -bl, bn, -cc, -ce, bp, -bj, by, ci, -bt, bf, -bu, cj, bx, -bi, bq, -cf, -cb, bm, -bm, cb, cf, -bq, bi, -bx, -cj, bu, -bf, bt, -ci, -by, bj, -bp, ce, cc, -bn, bl, -ca, -cg, br, -bh, bw, ck, -bv, bg, -bs, ch, bz, -bk, bo, -cd, -cd, bo, -bk, bz, ch, -bs, bg, -bv, ck, bw, -bh, br, -cg, -ca, bl, -bn, cc, ce, -bp, bj, -by, -ci, bt, -bf, bu, -cj, -bx, bi, -bq, cf, cb, -bm, bm, -cb, -cf, bq, -bi, bx, cj, -bu, bf, -bt, ci, by, -bj, bp, -ce, -cc, bn, -bl, ca, cg, -br, bh, -bw, -ck, bv, -bg, bs, -ch, -bz, bk, -bo, cd } ,\ - { ei, -df, ct, -dw, -eu, dr, -co, dk, -en, -ed, da, -cy, eb, ep, -dm, cm, -dp, es, dy, -cv, dd, -eg, -ek, dh, -cr, du, ew, -dt, cq, -di, el, ef, -dc, cw, -dz, -er, d_, -cl, dn, -eq, -ea, cx, -db, ee, em, -dj, cp, -ds, ev, dv, -cs, dg, -ej, -eh, de, -cu, dx, et, -dq, cn, -dl, eo, ec, -cz, cz, -ec, -eo, dl, -cn, dq, -et, -dx, cu, -de, eh, ej, -dg, cs, -dv, -ev, ds, -cp, dj, -em, -ee, db, -cx, ea, eq, -dn, cl, -d_, er, dz, -cw, dc, -ef, -el, di, -cq, dt, -ew, -du, cr, -dh, ek, eg, -dd, cv, -dy, -es, dp, -cm, dm, -ep, -eb, cy, -da, ed, en, -dk, co, -dr, eu, dw, -ct, df, -ei } ,\ - { bb, -au, aq, -ax, be, ay, -ar, at, -ba, -bc, av, -ap, aw, -bd, -az, as, -as, az, bd, -aw, ap, -av, bc, ba, -at, ar, -ay, -be, ax, -aq, au, -bb, -bb, au, -aq, ax, -be, -ay, ar, -at, ba, bc, -av, ap, -aw, bd, az, -as, as, -az, -bd, aw, -ap, av, -bc, -ba, at, -ar, ay, be, -ax, aq, -au, bb, bb, -au, aq, -ax, be, ay, -ar, at, -ba, -bc, av, -ap, aw, -bd, -az, as, -as, az, bd, -aw, ap, -av, bc, ba, -at, ar, -ay, -be, ax, -aq, au, -bb, -bb, au, -aq, ax, -be, -ay, ar, -at, ba, bc, -av, ap, -aw, bd, az, -as, as, -az, -bd, aw, -ap, av, -bc, -ba, at, -ar, ay, be, -ax, aq, -au, bb } ,\ - { ej, -di, co, -dp, eq, ec, -db, cv, -dw, -ew, dv, -cu, dc, -ed, -ep, d_, -cn, dj, -ek, -ei, dh, -cp, dq, -er, -eb, da, -cw, dx, ev, -du, ct, -dd, ee, eo, -dn, cm, -dk, el, eh, -dg, cq, -dr, es, ea, -cz, cx, -dy, -eu, dt, -cs, de, -ef, -en, dm, -cl, dl, -em, -eg, df, -cr, ds, -et, -dz, cy, -cy, dz, et, -ds, cr, -df, eg, em, -dl, cl, -dm, en, ef, -de, cs, -dt, eu, dy, -cx, cz, -ea, -es, dr, -cq, dg, -eh, -el, dk, -cm, dn, -eo, -ee, dd, -ct, du, -ev, -dx, cw, -da, eb, er, -dq, cp, -dh, ei, ek, -dj, cn, -d_, ep, ed, -dc, cu, -dv, ew, dw, -cv, db, -ec, -eq, dp, -co, di, -ej } ,\ - { ce, -br, bf, -bs, cf, cd, -bq, bg, -bt, cg, cc, -bp, bh, -bu, ch, cb, -bo, bi, -bv, ci, ca, -bn, bj, -bw, cj, bz, -bm, bk, -bx, ck, by, -bl, bl, -by, -ck, bx, -bk, bm, -bz, -cj, bw, -bj, bn, -ca, -ci, bv, -bi, bo, -cb, -ch, bu, -bh, bp, -cc, -cg, bt, -bg, bq, -cd, -cf, bs, -bf, br, -ce, -ce, br, -bf, bs, -cf, -cd, bq, -bg, bt, -cg, -cc, bp, -bh, bu, -ch, -cb, bo, -bi, bv, -ci, -ca, bn, -bj, bw, -cj, -bz, bm, -bk, bx, -ck, -by, bl, -bl, by, ck, -bx, bk, -bm, bz, cj, -bw, bj, -bn, ca, ci, -bv, bi, -bo, cb, ch, -bu, bh, -bp, cc, cg, -bt, bg, -bq, cd, cf, -bs, bf, -br, ce } ,\ - { ek, -dl, cm, -di, eh, en, -d_, cp, -df, ee, eq, -dr, cs, -dc, eb, et, -du, cv, -cz, dy, ew, -dx, cy, -cw, dv, -eu, -ea, db, -ct, ds, -er, -ed, de, -cq, dp, -eo, -eg, dh, -cn, dm, -el, -ej, dk, -cl, dj, -ei, -em, dn, -co, dg, -ef, -ep, dq, -cr, dd, -ec, -es, dt, -cu, da, -dz, -ev, dw, -cx, cx, -dw, ev, dz, -da, cu, -dt, es, ec, -dd, cr, -dq, ep, ef, -dg, co, -dn, em, ei, -dj, cl, -dk, ej, el, -dm, cn, -dh, eg, eo, -dp, cq, -de, ed, er, -ds, ct, -db, ea, eu, -dv, cw, -cy, dx, -ew, -dy, cz, -cv, du, -et, -eb, dc, -cs, dr, -eq, -ee, df, -cp, d_, -en, -eh, di, -cm, dl, -ek } ,\ - { an, -ak, ah, -aj, am, ao, -al, ai, -ai, al, -ao, -am, aj, -ah, ak, -an, -an, ak, -ah, aj, -am, -ao, al, -ai, ai, -al, ao, am, -aj, ah, -ak, an, an, -ak, ah, -aj, am, ao, -al, ai, -ai, al, -ao, -am, aj, -ah, ak, -an, -an, ak, -ah, aj, -am, -ao, al, -ai, ai, -al, ao, am, -aj, ah, -ak, an, an, -ak, ah, -aj, am, ao, -al, ai, -ai, al, -ao, -am, aj, -ah, ak, -an, -an, ak, -ah, aj, -am, -ao, al, -ai, ai, -al, ao, am, -aj, ah, -ak, an, an, -ak, ah, -aj, am, ao, -al, ai, -ai, al, -ao, -am, aj, -ah, ak, -an, -an, ak, -ah, aj, -am, -ao, al, -ai, ai, -al, ao, am, -aj, ah, -ak, an } ,\ - { el, -d_, cr, -db, dy, -ev, -eb, de, -co, dl, -ei, -eo, dr, -cu, cy, -dv, es, ee, -dh, cl, -di, ef, er, -du, cx, -cv, ds, -ep, -eh, dk, -cn, df, -ec, -eu, dx, -da, cs, -dp, em, ek, -dn, cq, -dc, dz, -ew, -ea, dd, -cp, dm, -ej, -en, dq, -ct, cz, -dw, et, ed, -dg, cm, -dj, eg, eq, -dt, cw, -cw, dt, -eq, -eg, dj, -cm, dg, -ed, -et, dw, -cz, ct, -dq, en, ej, -dm, cp, -dd, ea, ew, -dz, dc, -cq, dn, -ek, -em, dp, -cs, da, -dx, eu, ec, -df, cn, -dk, eh, ep, -ds, cv, -cx, du, -er, -ef, di, -cl, dh, -ee, -es, dv, -cy, cu, -dr, eo, ei, -dl, co, -de, eb, ev, -dy, db, -cr, d_, -el } ,\ - { cf, -bu, bj, -bl, bw, -ch, -cd, bs, -bh, bn, -by, cj, cb, -bq, bf, -bp, ca, ck, -bz, bo, -bg, br, -cc, -ci, bx, -bm, bi, -bt, ce, cg, -bv, bk, -bk, bv, -cg, -ce, bt, -bi, bm, -bx, ci, cc, -br, bg, -bo, bz, -ck, -ca, bp, -bf, bq, -cb, -cj, by, -bn, bh, -bs, cd, ch, -bw, bl, -bj, bu, -cf, -cf, bu, -bj, bl, -bw, ch, cd, -bs, bh, -bn, by, -cj, -cb, bq, -bf, bp, -ca, -ck, bz, -bo, bg, -br, cc, ci, -bx, bm, -bi, bt, -ce, -cg, bv, -bk, bk, -bv, cg, ce, -bt, bi, -bm, bx, -ci, -cc, br, -bg, bo, -bz, ck, ca, -bp, bf, -bq, cb, cj, -by, bn, -bh, bs, -cd, -ch, bw, -bl, bj, -bu, cf } ,\ - { em, -dr, cw, -cu, dp, -ek, -eo, dt, -cy, cs, -dn, ei, eq, -dv, da, -cq, dl, -eg, -es, dx, -dc, co, -dj, ee, eu, -dz, de, -cm, dh, -ec, -ew, eb, -dg, cl, -df, ea, -ev, -ed, di, -cn, dd, -dy, et, ef, -dk, cp, -db, dw, -er, -eh, dm, -cr, cz, -du, ep, ej, -d_, ct, -cx, ds, -en, -el, dq, -cv, cv, -dq, el, en, -ds, cx, -ct, d_, -ej, -ep, du, -cz, cr, -dm, eh, er, -dw, db, -cp, dk, -ef, -et, dy, -dd, cn, -di, ed, ev, -ea, df, -cl, dg, -eb, ew, ec, -dh, cm, -de, dz, -eu, -ee, dj, -co, dc, -dx, es, eg, -dl, cq, -da, dv, -eq, -ei, dn, -cs, cy, -dt, eo, ek, -dp, cu, -cw, dr, -em } ,\ - { bc, -ax, as, -aq, av, -ba, -be, az, -au, ap, -at, ay, -bd, -bb, aw, -ar, ar, -aw, bb, bd, -ay, at, -ap, au, -az, be, ba, -av, aq, -as, ax, -bc, -bc, ax, -as, aq, -av, ba, be, -az, au, -ap, at, -ay, bd, bb, -aw, ar, -ar, aw, -bb, -bd, ay, -at, ap, -au, az, -be, -ba, av, -aq, as, -ax, bc, bc, -ax, as, -aq, av, -ba, -be, az, -au, ap, -at, ay, -bd, -bb, aw, -ar, ar, -aw, bb, bd, -ay, at, -ap, au, -az, be, ba, -av, aq, -as, ax, -bc, -bc, ax, -as, aq, -av, ba, be, -az, au, -ap, at, -ay, bd, bb, -aw, ar, -ar, aw, -bb, -bd, ay, -at, ap, -au, az, -be, -ba, av, -aq, as, -ax, bc } ,\ - { en, -du, db, -cn, dg, -dz, es, ei, -dp, cw, -cs, dl, -ee, -ew, ed, -dk, cr, -cx, dq, -ej, -er, dy, -df, cm, -dc, dv, -eo, -em, dt, -da, co, -dh, ea, -et, -eh, d_, -cv, ct, -dm, ef, ev, -ec, dj, -cq, cy, -dr, ek, eq, -dx, de, -cl, dd, -dw, ep, el, -ds, cz, -cp, di, -eb, eu, eg, -dn, cu, -cu, dn, -eg, -eu, eb, -di, cp, -cz, ds, -el, -ep, dw, -dd, cl, -de, dx, -eq, -ek, dr, -cy, cq, -dj, ec, -ev, -ef, dm, -ct, cv, -d_, eh, et, -ea, dh, -co, da, -dt, em, eo, -dv, dc, -cm, df, -dy, er, ej, -dq, cx, -cr, dk, -ed, ew, ee, -dl, cs, -cw, dp, -ei, -es, dz, -dg, cn, -db, du, -en } ,\ - { cg, -bx, bo, -bf, bn, -bw, cf, ch, -by, bp, -bg, bm, -bv, ce, ci, -bz, bq, -bh, bl, -bu, cd, cj, -ca, br, -bi, bk, -bt, cc, ck, -cb, bs, -bj, bj, -bs, cb, -ck, -cc, bt, -bk, bi, -br, ca, -cj, -cd, bu, -bl, bh, -bq, bz, -ci, -ce, bv, -bm, bg, -bp, by, -ch, -cf, bw, -bn, bf, -bo, bx, -cg, -cg, bx, -bo, bf, -bn, bw, -cf, -ch, by, -bp, bg, -bm, bv, -ce, -ci, bz, -bq, bh, -bl, bu, -cd, -cj, ca, -br, bi, -bk, bt, -cc, -ck, cb, -bs, bj, -bj, bs, -cb, ck, cc, -bt, bk, -bi, br, -ca, cj, cd, -bu, bl, -bh, bq, -bz, ci, ce, -bv, bm, -bg, bp, -by, ch, cf, -bw, bn, -bf, bo, -bx, cg } ,\ - { eo, -dx, dg, -cp, cx, -d_, ef, -ew, -eg, dp, -cy, co, -df, dw, -en, -ep, dy, -dh, cq, -cw, dn, -ee, ev, eh, -dq, cz, -cn, de, -dv, em, eq, -dz, di, -cr, cv, -dm, ed, -eu, -ei, dr, -da, cm, -dd, du, -el, -er, ea, -dj, cs, -cu, dl, -ec, et, ej, -ds, db, -cl, dc, -dt, ek, es, -eb, dk, -ct, ct, -dk, eb, -es, -ek, dt, -dc, cl, -db, ds, -ej, -et, ec, -dl, cu, -cs, dj, -ea, er, el, -du, dd, -cm, da, -dr, ei, eu, -ed, dm, -cv, cr, -di, dz, -eq, -em, dv, -de, cn, -cz, dq, -eh, -ev, ee, -dn, cw, -cq, dh, -dy, ep, en, -dw, df, -co, cy, -dp, eg, ew, -ef, d_, -cx, cp, -dg, dx, -eo } ,\ - { ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag, ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag, ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag, ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag, ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag, ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag, ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag, ag, -af, ae, -ad, ad, -ae, af, -ag, -ag, af, -ae, ad, -ad, ae, -af, ag } ,\ - { ep, -ea, dl, -cw, co, -dd, ds, -eh, ew, ei, -dt, de, -cp, cv, -dk, dz, -eo, -eq, eb, -dm, cx, -cn, dc, -dr, eg, -ev, -ej, du, -df, cq, -cu, dj, -dy, en, er, -ec, dn, -cy, cm, -db, dq, -ef, eu, ek, -dv, dg, -cr, ct, -di, dx, -em, -es, ed, -d_, cz, -cl, da, -dp, ee, -et, -el, dw, -dh, cs, -cs, dh, -dw, el, et, -ee, dp, -da, cl, -cz, d_, -ed, es, em, -dx, di, -ct, cr, -dg, dv, -ek, -eu, ef, -dq, db, -cm, cy, -dn, ec, -er, -en, dy, -dj, cu, -cq, df, -du, ej, ev, -eg, dr, -dc, cn, -cx, dm, -eb, eq, eo, -dz, dk, -cv, cp, -de, dt, -ei, -ew, eh, -ds, dd, -co, cw, -dl, ea, -ep } ,\ - { ch, -ca, bt, -bm, bf, -bl, bs, -bz, cg, ci, -cb, bu, -bn, bg, -bk, br, -by, cf, cj, -cc, bv, -bo, bh, -bj, bq, -bx, ce, ck, -cd, bw, -bp, bi, -bi, bp, -bw, cd, -ck, -ce, bx, -bq, bj, -bh, bo, -bv, cc, -cj, -cf, by, -br, bk, -bg, bn, -bu, cb, -ci, -cg, bz, -bs, bl, -bf, bm, -bt, ca, -ch, -ch, ca, -bt, bm, -bf, bl, -bs, bz, -cg, -ci, cb, -bu, bn, -bg, bk, -br, by, -cf, -cj, cc, -bv, bo, -bh, bj, -bq, bx, -ce, -ck, cd, -bw, bp, -bi, bi, -bp, bw, -cd, ck, ce, -bx, bq, -bj, bh, -bo, bv, -cc, cj, cf, -by, br, -bk, bg, -bn, bu, -cb, ci, cg, -bz, bs, -bl, bf, -bm, bt, -ca, ch } ,\ - { eq, -ed, dq, -dd, cq, -cs, df, -ds, ef, -es, -eo, eb, -d_, db, -co, cu, -dh, du, -eh, eu, em, -dz, dm, -cz, cm, -cw, dj, -dw, ej, -ew, -ek, dx, -dk, cx, -cl, cy, -dl, dy, -el, -ev, ei, -dv, di, -cv, cn, -da, dn, -ea, en, et, -eg, dt, -dg, ct, -cp, dc, -dp, ec, -ep, -er, ee, -dr, de, -cr, cr, -de, dr, -ee, er, ep, -ec, dp, -dc, cp, -ct, dg, -dt, eg, -et, -en, ea, -dn, da, -cn, cv, -di, dv, -ei, ev, el, -dy, dl, -cy, cl, -cx, dk, -dx, ek, ew, -ej, dw, -dj, cw, -cm, cz, -dm, dz, -em, -eu, eh, -du, dh, -cu, co, -db, d_, -eb, eo, es, -ef, ds, -df, cs, -cq, dd, -dq, ed, -eq } ,\ - { bd, -ba, ax, -au, ar, -ap, as, -av, ay, -bb, be, bc, -az, aw, -at, aq, -aq, at, -aw, az, -bc, -be, bb, -ay, av, -as, ap, -ar, au, -ax, ba, -bd, -bd, ba, -ax, au, -ar, ap, -as, av, -ay, bb, -be, -bc, az, -aw, at, -aq, aq, -at, aw, -az, bc, be, -bb, ay, -av, as, -ap, ar, -au, ax, -ba, bd, bd, -ba, ax, -au, ar, -ap, as, -av, ay, -bb, be, bc, -az, aw, -at, aq, -aq, at, -aw, az, -bc, -be, bb, -ay, av, -as, ap, -ar, au, -ax, ba, -bd, -bd, ba, -ax, au, -ar, ap, -as, av, -ay, bb, -be, -bc, az, -aw, at, -aq, aq, -at, aw, -az, bc, be, -bb, ay, -av, as, -ap, ar, -au, ax, -ba, bd } ,\ - { er, -eg, dv, -dk, cz, -co, cs, -dd, d_, -dz, ek, -ev, -en, ec, -dr, dg, -cv, cl, -cw, dh, -ds, ed, -eo, -eu, ej, -dy, dn, -dc, cr, -cp, da, -dl, dw, -eh, es, eq, -ef, du, -dj, cy, -cn, ct, -de, dp, -ea, el, -ew, -em, eb, -dq, df, -cu, cm, -cx, di, -dt, ee, -ep, -et, ei, -dx, dm, -db, cq, -cq, db, -dm, dx, -ei, et, ep, -ee, dt, -di, cx, -cm, cu, -df, dq, -eb, em, ew, -el, ea, -dp, de, -ct, cn, -cy, dj, -du, ef, -eq, -es, eh, -dw, dl, -da, cp, -cr, dc, -dn, dy, -ej, eu, eo, -ed, ds, -dh, cw, -cl, cv, -dg, dr, -ec, en, ev, -ek, dz, -d_, dd, -cs, co, -cz, dk, -dv, eg, -er } ,\ - { ci, -cd, by, -bt, bo, -bj, bf, -bk, bp, -bu, bz, -ce, cj, ch, -cc, bx, -bs, bn, -bi, bg, -bl, bq, -bv, ca, -cf, ck, cg, -cb, bw, -br, bm, -bh, bh, -bm, br, -bw, cb, -cg, -ck, cf, -ca, bv, -bq, bl, -bg, bi, -bn, bs, -bx, cc, -ch, -cj, ce, -bz, bu, -bp, bk, -bf, bj, -bo, bt, -by, cd, -ci, -ci, cd, -by, bt, -bo, bj, -bf, bk, -bp, bu, -bz, ce, -cj, -ch, cc, -bx, bs, -bn, bi, -bg, bl, -bq, bv, -ca, cf, -ck, -cg, cb, -bw, br, -bm, bh, -bh, bm, -br, bw, -cb, cg, ck, -cf, ca, -bv, bq, -bl, bg, -bi, bn, -bs, bx, -cc, ch, cj, -ce, bz, -bu, bp, -bk, bf, -bj, bo, -bt, by, -cd, ci } ,\ - { es, -ej, ea, -dr, di, -cz, cq, -co, cx, -dg, dp, -dy, eh, -eq, -eu, el, -ec, dt, -dk, db, -cs, cm, -cv, de, -dn, dw, -ef, eo, ew, -en, ee, -dv, dm, -dd, cu, -cl, ct, -dc, dl, -du, ed, -em, ev, ep, -eg, dx, -d_, df, -cw, cn, -cr, da, -dj, ds, -eb, ek, -et, -er, ei, -dz, dq, -dh, cy, -cp, cp, -cy, dh, -dq, dz, -ei, er, et, -ek, eb, -ds, dj, -da, cr, -cn, cw, -df, d_, -dx, eg, -ep, -ev, em, -ed, du, -dl, dc, -ct, cl, -cu, dd, -dm, dv, -ee, en, -ew, -eo, ef, -dw, dn, -de, cv, -cm, cs, -db, dk, -dt, ec, -el, eu, eq, -eh, dy, -dp, dg, -cx, co, -cq, cz, -di, dr, -ea, ej, -es } ,\ - { ao, -an, am, -al, ak, -aj, ai, -ah, ah, -ai, aj, -ak, al, -am, an, -ao, -ao, an, -am, al, -ak, aj, -ai, ah, -ah, ai, -aj, ak, -al, am, -an, ao, ao, -an, am, -al, ak, -aj, ai, -ah, ah, -ai, aj, -ak, al, -am, an, -ao, -ao, an, -am, al, -ak, aj, -ai, ah, -ah, ai, -aj, ak, -al, am, -an, ao, ao, -an, am, -al, ak, -aj, ai, -ah, ah, -ai, aj, -ak, al, -am, an, -ao, -ao, an, -am, al, -ak, aj, -ai, ah, -ah, ai, -aj, ak, -al, am, -an, ao, ao, -an, am, -al, ak, -aj, ai, -ah, ah, -ai, aj, -ak, al, -am, an, -ao, -ao, an, -am, al, -ak, aj, -ai, ah, -ah, ai, -aj, ak, -al, am, -an, ao } ,\ - { et, -em, ef, -dy, dr, -dk, dd, -cw, cp, -cn, cu, -db, di, -dp, dw, -ed, ek, -er, -ev, eo, -eh, ea, -dt, dm, -df, cy, -cr, cl, -cs, cz, -dg, dn, -du, eb, -ei, ep, -ew, -eq, ej, -ec, dv, -d_, dh, -da, ct, -cm, cq, -cx, de, -dl, ds, -dz, eg, -en, eu, es, -el, ee, -dx, dq, -dj, dc, -cv, co, -co, cv, -dc, dj, -dq, dx, -ee, el, -es, -eu, en, -eg, dz, -ds, dl, -de, cx, -cq, cm, -ct, da, -dh, d_, -dv, ec, -ej, eq, ew, -ep, ei, -eb, du, -dn, dg, -cz, cs, -cl, cr, -cy, df, -dm, dt, -ea, eh, -eo, ev, er, -ek, ed, -dw, dp, -di, db, -cu, cn, -cp, cw, -dd, dk, -dr, dy, -ef, em, -et } ,\ - { cj, -cg, cd, -ca, bx, -bu, br, -bo, bl, -bi, bf, -bh, bk, -bn, bq, -bt, bw, -bz, cc, -cf, ci, ck, -ch, ce, -cb, by, -bv, bs, -bp, bm, -bj, bg, -bg, bj, -bm, bp, -bs, bv, -by, cb, -ce, ch, -ck, -ci, cf, -cc, bz, -bw, bt, -bq, bn, -bk, bh, -bf, bi, -bl, bo, -br, bu, -bx, ca, -cd, cg, -cj, -cj, cg, -cd, ca, -bx, bu, -br, bo, -bl, bi, -bf, bh, -bk, bn, -bq, bt, -bw, bz, -cc, cf, -ci, -ck, ch, -ce, cb, -by, bv, -bs, bp, -bm, bj, -bg, bg, -bj, bm, -bp, bs, -bv, by, -cb, ce, -ch, ck, ci, -cf, cc, -bz, bw, -bt, bq, -bn, bk, -bh, bf, -bi, bl, -bo, br, -bu, bx, -ca, cd, -cg, cj } ,\ - { eu, -ep, ek, -ef, ea, -dv, dq, -dl, dg, -db, cw, -cr, cm, -co, ct, -cy, dd, -di, dn, -ds, dx, -ec, eh, -em, er, -ew, -es, en, -ei, ed, -dy, dt, -d_, dj, -de, cz, -cu, cp, -cl, cq, -cv, da, -df, dk, -dp, du, -dz, ee, -ej, eo, -et, -ev, eq, -el, eg, -eb, dw, -dr, dm, -dh, dc, -cx, cs, -cn, cn, -cs, cx, -dc, dh, -dm, dr, -dw, eb, -eg, el, -eq, ev, et, -eo, ej, -ee, dz, -du, dp, -dk, df, -da, cv, -cq, cl, -cp, cu, -cz, de, -dj, d_, -dt, dy, -ed, ei, -en, es, ew, -er, em, -eh, ec, -dx, ds, -dn, di, -dd, cy, -ct, co, -cm, cr, -cw, db, -dg, dl, -dq, dv, -ea, ef, -ek, ep, -eu } ,\ - { be, -bd, bc, -bb, ba, -az, ay, -ax, aw, -av, au, -at, as, -ar, aq, -ap, ap, -aq, ar, -as, at, -au, av, -aw, ax, -ay, az, -ba, bb, -bc, bd, -be, -be, bd, -bc, bb, -ba, az, -ay, ax, -aw, av, -au, at, -as, ar, -aq, ap, -ap, aq, -ar, as, -at, au, -av, aw, -ax, ay, -az, ba, -bb, bc, -bd, be, be, -bd, bc, -bb, ba, -az, ay, -ax, aw, -av, au, -at, as, -ar, aq, -ap, ap, -aq, ar, -as, at, -au, av, -aw, ax, -ay, az, -ba, bb, -bc, bd, -be, -be, bd, -bc, bb, -ba, az, -ay, ax, -aw, av, -au, at, -as, ar, -aq, ap, -ap, aq, -ar, as, -at, au, -av, aw, -ax, ay, -az, ba, -bb, bc, -bd, be } ,\ - { ev, -es, ep, -em, ej, -eg, ed, -ea, dx, -du, dr, -d_, dl, -di, df, -dc, cz, -cw, ct, -cq, cn, -cl, co, -cr, cu, -cx, da, -dd, dg, -dj, dm, -dp, ds, -dv, dy, -eb, ee, -eh, ek, -en, eq, -et, ew, eu, -er, eo, -el, ei, -ef, ec, -dz, dw, -dt, dq, -dn, dk, -dh, de, -db, cy, -cv, cs, -cp, cm, -cm, cp, -cs, cv, -cy, db, -de, dh, -dk, dn, -dq, dt, -dw, dz, -ec, ef, -ei, el, -eo, er, -eu, -ew, et, -eq, en, -ek, eh, -ee, eb, -dy, dv, -ds, dp, -dm, dj, -dg, dd, -da, cx, -cu, cr, -co, cl, -cn, cq, -ct, cw, -cz, dc, -df, di, -dl, d_, -dr, du, -dx, ea, -ed, eg, -ej, em, -ep, es, -ev } ,\ - { ck, -cj, ci, -ch, cg, -cf, ce, -cd, cc, -cb, ca, -bz, by, -bx, bw, -bv, bu, -bt, bs, -br, bq, -bp, bo, -bn, bm, -bl, bk, -bj, bi, -bh, bg, -bf, bf, -bg, bh, -bi, bj, -bk, bl, -bm, bn, -bo, bp, -bq, br, -bs, bt, -bu, bv, -bw, bx, -by, bz, -ca, cb, -cc, cd, -ce, cf, -cg, ch, -ci, cj, -ck, -ck, cj, -ci, ch, -cg, cf, -ce, cd, -cc, cb, -ca, bz, -by, bx, -bw, bv, -bu, bt, -bs, br, -bq, bp, -bo, bn, -bm, bl, -bk, bj, -bi, bh, -bg, bf, -bf, bg, -bh, bi, -bj, bk, -bl, bm, -bn, bo, -bp, bq, -br, bs, -bt, bu, -bv, bw, -bx, by, -bz, ca, -cb, cc, -cd, ce, -cf, cg, -ch, ci, -cj, ck } ,\ - { ew, -ev, eu, -et, es, -er, eq, -ep, eo, -en, em, -el, ek, -ej, ei, -eh, eg, -ef, ee, -ed, ec, -eb, ea, -dz, dy, -dx, dw, -dv, du, -dt, ds, -dr, dq, -dp, d_, -dn, dm, -dl, dk, -dj, di, -dh, dg, -df, de, -dd, dc, -db, da, -cz, cy, -cx, cw, -cv, cu, -ct, cs, -cr, cq, -cp, co, -cn, cm, -cl, cl, -cm, cn, -co, cp, -cq, cr, -cs, ct, -cu, cv, -cw, cx, -cy, cz, -da, db, -dc, dd, -de, df, -dg, dh, -di, dj, -dk, dl, -dm, dn, -d_, dp, -dq, dr, -ds, dt, -du, dv, -dw, dx, -dy, dz, -ea, eb, -ec, ed, -ee, ef, -eg, eh, -ei, ej, -ek, el, -em, en, -eo, ep, -eq, er, -es, et, -eu, ev, -ew } ,\ -} - - - - - -//-------------------------------------------------------------------------------------------------- - -//coefficients - -#if RExt__HIGH_PRECISION_FORWARD_TRANSFORM -const TMatrixCoeff g_aiT2[TRANSFORM_NUMBER_OF_DIRECTIONS][2][2] = -{ - DEFINE_DCT2x2_MATRIX( 16384), - DEFINE_DCT2x2_MATRIX( 64) -}; - -const TMatrixCoeff g_aiT4 [TRANSFORM_NUMBER_OF_DIRECTIONS][4][4] = -{ - DEFINE_DCT4x4_MATRIX (16384, 21266, 9224), - DEFINE_DCT4x4_MATRIX ( 64, 83, 36) -}; - -const TMatrixCoeff g_aiT8 [TRANSFORM_NUMBER_OF_DIRECTIONS][8][8] = -{ - DEFINE_DCT8x8_MATRIX (16384, 21266, 9224, 22813, 19244, 12769, 4563), - DEFINE_DCT8x8_MATRIX ( 64, 83, 36, 89, 75, 50, 18) -}; - -const TMatrixCoeff g_aiT16[TRANSFORM_NUMBER_OF_DIRECTIONS][16][16] = -{ - DEFINE_DCT16x16_MATRIX(16384, 21266, 9224, 22813, 19244, 12769, 4563, 23120, 22063, 20450, 17972, 14642, 11109, 6446, 2316), - DEFINE_DCT16x16_MATRIX( 64, 83, 36, 89, 75, 50, 18, 90, 87, 80, 70, 57, 43, 25, 9) -}; - -const TMatrixCoeff g_aiT32[TRANSFORM_NUMBER_OF_DIRECTIONS][32][32] = -{ - DEFINE_DCT32x32_MATRIX(16384, 21266, 9224, 22813, 19244, 12769, 4563, 23120, 22063, 20450, 17972, 14642, 11109, 6446, 2316, 23106, 22852, 22445, 21848, 20995, 19810, 18601, 17143, 15718, 13853, 11749, 9846, 7908, 5573, 3281, 946), - DEFINE_DCT32x32_MATRIX( 64, 83, 36, 89, 75, 50, 18, 90, 87, 80, 70, 57, 43, 25, 9, 90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13, 4) -}; - -const TMatrixCoeff g_aiT64[TRANSFORM_NUMBER_OF_DIRECTIONS][64][64] = -{ - DEFINE_DCT64x64_MATRIX( 65536, 85627, 35468, 90901, 77062, 51491, 18081, 92236, 88691, 81738, 71644, 58797, 43690, 26904, 9084, 92570, 91679, 89904, 87264, 83783, 79496, 74443, 68673, 62241, 55211, 47648, 39627, 31224, 22520, 13599, 4548, 92654, 92431, 91985, 91317, 90430, 89325, 88004, 86472, 84731, 82786, 80641, 78303, 75775, 73065, 70180, 67125, 63908, 60537, 57021, 53367, 49585, 45683, 41671, 37559, 33356, 29073, 24719, 20307, 15845, 11345, 6818, 2275 ), - DEFINE_DCT64x64_MATRIX( 256, 334, 139, 355, 301, 201, 71, 360, 346, 319, 280, 230, 171, 105, 35, 362, 358, 351, 341, 327, 311, 291, 268, 243, 216, 186, 155, 122, 88, 53, 18, 362, 361, 359, 357, 353, 349, 344, 338, 331, 323, 315, 306, 296, 285, 274, 262, 250, 236, 223, 208, 194, 178, 163, 147, 130, 114, 97, 79, 62, 44, 27, 9 ) -}; - -const TMatrixCoeff g_aiT128[TRANSFORM_NUMBER_OF_DIRECTIONS][128][128] = -{ - DEFINE_DCT128x128_MATRIX( 65536, 85627, 35468, 90901, 77062, 51491, 18081, 92236, 88691, 81738, 71644, 58797, 43690, 26904, 9084, 92570, 91679, 89904, 87264, 83783, 79496, 74443, 68673, 62241, 55211, 47648, 39627, 31224, 22520, 13599, 4548, 92654, 92431, 91985, 91317, 90430, 89325, 88004, 86472, 84731, 82786, 80641, 78303, 75775, 73065, 70180, 67125, 63908, 60537, 57021, 53367, 49585, 45683, 41671, 37559, 33356, 29073, 24719, 20307, 15845, 11345, 6818, 2275, 92675, 92619, 92507, 92340, 92117, 91839, 91505, 91116, 90672, 90174, 89621, 89015, 88354, 87641, 86874, 86056, 85185, 84263, 83291, 82268, 81196, 80075, 78905, 77688, 76425, 75115, 73760, 72360, 70917, 69431, 67904, 66335, 64727, 63079, 61394, 59672, 57913, 56120, 54293, 52433, 50542, 48620, 46669, 44690, 42684, 40652, 38595, 36516, 34414, 32292, 30150, 27990, 25814, 23621, 21415, 19195, 16964, 14723, 12473, 10216, 7952, 5683, 3411, 1137 ), - DEFINE_DCT128x128_MATRIX( 256, 334, 139, 355, 301, 201, 71, 360, 346, 319, 280, 230, 171, 105, 35, 362, 358, 351, 341, 327, 311, 291, 268, 243, 216, 186, 155, 122, 88, 53, 18, 362, 361, 359, 357, 353, 349, 344, 338, 331, 323, 315, 306, 296, 285, 274, 262, 250, 236, 223, 208, 194, 178, 163, 147, 130, 114, 97, 79, 62, 44, 27, 9, 362, 362, 361, 361, 360, 359, 357, 356, 354, 352, 350, 348, 345, 342, 339, 336, 333, 329, 325, 321, 317, 313, 308, 303, 299, 293, 288, 283, 277, 271, 265, 259, 253, 246, 240, 233, 226, 219, 212, 205, 197, 190, 182, 175, 167, 159, 151, 143, 134, 126, 118, 109, 101, 92, 84, 75, 66, 58, 49, 40, 31, 22, 13, 4 ) -}; - -const TMatrixCoeff g_as_DST_MAT_4[TRANSFORM_NUMBER_OF_DIRECTIONS][4][4] = -{ - DEFINE_DST4x4_MATRIX( 7424, 14081, 18893, 21505), - DEFINE_DST4x4_MATRIX( 29, 55, 74, 84) -}; - -#else - -const TMatrixCoeff g_aiT2 [TRANSFORM_NUMBER_OF_DIRECTIONS][2][2] = -{ - DEFINE_DCT2x2_MATRIX( 64), - DEFINE_DCT2x2_MATRIX( 64) -}; - -const TMatrixCoeff g_aiT4 [TRANSFORM_NUMBER_OF_DIRECTIONS][4][4] = -{ - DEFINE_DCT4x4_MATRIX ( 64, 83, 36), - DEFINE_DCT4x4_MATRIX ( 64, 83, 36) -}; - -const TMatrixCoeff g_aiT8 [TRANSFORM_NUMBER_OF_DIRECTIONS][8][8] = -{ - DEFINE_DCT8x8_MATRIX ( 64, 83, 36, 89, 75, 50, 18), - DEFINE_DCT8x8_MATRIX ( 64, 83, 36, 89, 75, 50, 18) -}; - -const TMatrixCoeff g_aiT16[TRANSFORM_NUMBER_OF_DIRECTIONS][16][16] = -{ - DEFINE_DCT16x16_MATRIX( 64, 83, 36, 89, 75, 50, 18, 90, 87, 80, 70, 57, 43, 25, 9), - DEFINE_DCT16x16_MATRIX( 64, 83, 36, 89, 75, 50, 18, 90, 87, 80, 70, 57, 43, 25, 9) -}; - -const TMatrixCoeff g_aiT32[TRANSFORM_NUMBER_OF_DIRECTIONS][32][32] = -{ - DEFINE_DCT32x32_MATRIX( 64, 83, 36, 89, 75, 50, 18, 90, 87, 80, 70, 57, 43, 25, 9, 90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13, 4), - DEFINE_DCT32x32_MATRIX( 64, 83, 36, 89, 75, 50, 18, 90, 87, 80, 70, 57, 43, 25, 9, 90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13, 4) -}; - -const TMatrixCoeff g_aiT64[TRANSFORM_NUMBER_OF_DIRECTIONS][64][64] = -{ - DEFINE_DCT64x64_MATRIX( 256, 334, 139, 355, 301, 201, 71, 360, 346, 319, 280, 230, 171, 105, 35, 362, 358, 351, 341, 327, 311, 291, 268, 243, 216, 186, 155, 122, 88, 53, 18, 362, 361, 359, 357, 353, 349, 344, 338, 331, 323, 315, 306, 296, 285, 274, 262, 250, 236, 223, 208, 194, 178, 163, 147, 130, 114, 97, 79, 62, 44, 27, 9), - DEFINE_DCT64x64_MATRIX( 256, 334, 139, 355, 301, 201, 71, 360, 346, 319, 280, 230, 171, 105, 35, 362, 358, 351, 341, 327, 311, 291, 268, 243, 216, 186, 155, 122, 88, 53, 18, 362, 361, 359, 357, 353, 349, 344, 338, 331, 323, 315, 306, 296, 285, 274, 262, 250, 236, 223, 208, 194, 178, 163, 147, 130, 114, 97, 79, 62, 44, 27, 9) -}; -const TMatrixCoeff g_aiT128[TRANSFORM_NUMBER_OF_DIRECTIONS][128][128] = -{ - DEFINE_DCT128x128_MATRIX( 256, 334, 139, 355, 301, 201, 71, 360, 346, 319, 280, 230, 171, 105, 35, 362, 358, 351, 341, 327, 311, 291, 268, 243, 216, 186, 155, 122, 88, 53, 18, 362, 361, 359, 357, 353, 349, 344, 338, 331, 323, 315, 306, 296, 285, 274, 262, 250, 236, 223, 208, 194, 178, 163, 147, 130, 114, 97, 79, 62, 44, 27, 9, 362, 362, 361, 361, 360, 359, 357, 356, 354, 352, 350, 348, 345, 342, 339, 336, 333, 329, 325, 321, 317, 313, 308, 303, 299, 293, 288, 283, 277, 271, 265, 259, 253, 246, 240, 233, 226, 219, 212, 205, 197, 190, 182, 175, 167, 159, 151, 143, 134, 126, 118, 109, 101, 92, 84, 75, 66, 58, 49, 40, 31, 22, 13, 4 ), - DEFINE_DCT128x128_MATRIX( 256, 334, 139, 355, 301, 201, 71, 360, 346, 319, 280, 230, 171, 105, 35, 362, 358, 351, 341, 327, 311, 291, 268, 243, 216, 186, 155, 122, 88, 53, 18, 362, 361, 359, 357, 353, 349, 344, 338, 331, 323, 315, 306, 296, 285, 274, 262, 250, 236, 223, 208, 194, 178, 163, 147, 130, 114, 97, 79, 62, 44, 27, 9, 362, 362, 361, 361, 360, 359, 357, 356, 354, 352, 350, 348, 345, 342, 339, 336, 333, 329, 325, 321, 317, 313, 308, 303, 299, 293, 288, 283, 277, 271, 265, 259, 253, 246, 240, 233, 226, 219, 212, 205, 197, 190, 182, 175, 167, 159, 151, 143, 134, 126, 118, 109, 101, 92, 84, 75, 66, 58, 49, 40, 31, 22, 13, 4 ) -}; - -#if HEVC_USE_4x4_DSTVII -const TMatrixCoeff g_as_DST_MAT_4[TRANSFORM_NUMBER_OF_DIRECTIONS][4][4] = -{ - DEFINE_DST4x4_MATRIX( 29, 55, 74, 84), - DEFINE_DST4x4_MATRIX( 29, 55, 74, 84) -}; - -#endif -#endif - -#undef DEFINE_DST4x4_MATRIX -#undef DEFINE_DCT4x4_MATRIX -#undef DEFINE_DCT8x8_MATRIX -#undef DEFINE_DCT16x16_MATRIX -#undef DEFINE_DCT32x32_MATRIX -#undef DEFINE_DCT64x64_MATRIX -#undef DEFINE_DCT128x128_MATRIX - -#endif // !JVET_K1000_SIMPLIFIED_EMT //-------------------------------------------------------------------------------------------------- diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 60ed6b395e6c96bd7c6e71a6fb1b60899b106010..5b858635e3378d3ccb9482ed65b55c085ea9b3a9 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -1669,10 +1669,8 @@ SPSNext::SPSNext( SPS& sps ) #if JVET_K0190 , m_LMChroma ( false ) #endif -#if JVET_K1000_SIMPLIFIED_EMT , m_IntraEMT ( false ) , m_InterEMT ( false ) -#endif #if JVET_K_AFFINE , m_Affine ( false ) #if JVET_K0337_AFFINE_6PARA diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 1fee5f5258ff05273eb300cf40514503af4a6c60..8dd3b278658fa00c54c9f322a250cd0bc2888b84 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -820,10 +820,8 @@ private: #if JVET_K0190 bool m_LMChroma; // 17 #endif -#if JVET_K1000_SIMPLIFIED_EMT bool m_IntraEMT; // 18 bool m_InterEMT; // 19 -#endif #if JVET_K_AFFINE bool m_Affine; #if JVET_K0337_AFFINE_6PARA @@ -916,12 +914,10 @@ public: void setUseLMChroma ( bool b ) { m_LMChroma = b; } bool getUseLMChroma () const { return m_LMChroma; } #endif -#if JVET_K1000_SIMPLIFIED_EMT void setUseIntraEMT ( bool b ) { m_IntraEMT = b; } bool getUseIntraEMT () const { return m_IntraEMT; } void setUseInterEMT ( bool b ) { m_InterEMT = b; } bool getUseInterEMT () const { return m_InterEMT; } -#endif //===== additional parameters ===== // qtbt void setCTUSize ( unsigned ctuSize ) { m_CTUSize = ctuSize; } diff --git a/source/Lib/CommonLib/TrQuant.cpp b/source/Lib/CommonLib/TrQuant.cpp index 52235829949eedd056e0b520df558d109b519393..7d73b3fa97150066e9ef3f5bb4b75a06852705a1 100644 --- a/source/Lib/CommonLib/TrQuant.cpp +++ b/source/Lib/CommonLib/TrQuant.cpp @@ -68,7 +68,6 @@ struct coeffGroupRDStats double d64SigCost_0; }; -#if JVET_K1000_SIMPLIFIED_EMT FwdTrans *fastFwdTrans[NUM_TRANS_TYPE][g_numTransformMatrixSizes] = { { fastForwardDCT2_B2, fastForwardDCT2_B4, fastForwardDCT2_B8, fastForwardDCT2_B16, fastForwardDCT2_B32, fastForwardDCT2_B64 }, @@ -82,7 +81,6 @@ InvTrans *fastInvTrans[NUM_TRANS_TYPE][g_numTransformMatrixSizes] = { nullptr, fastInverseDCT8_B4, fastInverseDCT8_B8, fastInverseDCT8_B16, fastInverseDCT8_B32, nullptr }, { nullptr, fastInverseDST7_B4, fastInverseDST7_B8, fastInverseDST7_B16, fastInverseDST7_B32, nullptr }, }; -#endif //! \ingroup CommonLib //! \{ @@ -100,11 +98,7 @@ void xITrMxN( const int bitDepth, const TCoeff *coeff, Pel *residual, size_t str #endif -#if JVET_K1000_SIMPLIFIED_EMT TrQuant::TrQuant() : m_quant( nullptr ) -#else -TrQuant::TrQuant() : m_quant( nullptr ), m_fTr( xTrMxN ), m_fITr( xITrMxN ) -#endif { // allocate temporary buffers m_plTempCoeff = (TCoeff*) xMalloc( TCoeff, MAX_CU_SIZE * MAX_CU_SIZE ); @@ -135,7 +129,6 @@ void TrQuant::copyState( const TrQuant& other ) } #endif -#if JVET_K1000_SIMPLIFIED_EMT #if HEVC_USE_4x4_DSTVII void xTrMxN_EMT( const int bitDepth, const Pel *residual, size_t stride, TCoeff *coeff, int iWidth, int iHeight, bool useDST, const int maxLog2TrDynamicRange, #else @@ -210,13 +203,8 @@ void xTrMxN_EMT( const int bitDepth, const Pel *residual, size_t stride, TCoeff nTrIdxVer = g_aiTrSubsetInter[ucTrIdx >> 1]; } -#if JVET_K1000_SIMPLIFIED_EMT fastFwdTrans[nTrIdxHor][transformWidthIndex](block, tmp, shift_1st, iHeight, 0, iSkipWidth); fastFwdTrans[nTrIdxVer][transformHeightIndex](tmp, coeff, shift_2nd, iWidth, iSkipWidth, iSkipHeight); -#else - fastFwdTrans[nTrIdxHor][transformWidthIndex](block, tmp, shift_1st, iHeight, 0, iSkipWidth, 1); - fastFwdTrans[nTrIdxVer][transformHeightIndex](tmp, coeff, shift_2nd, iWidth, iSkipWidth, iSkipHeight, 1); -#endif } /** MxN inverse transform (2D) @@ -291,13 +279,8 @@ void xITrMxN_EMT( const int bitDepth, const TCoeff *coeff, Pel *residual, size_t nTrIdxVer = g_aiTrSubsetInter[ucTrIdx >> 1]; } -#if JVET_K1000_SIMPLIFIED_EMT fastInvTrans[nTrIdxVer][transformHeightIndex](coeff, tmp, shift_1st, iWidth, uiSkipWidth, uiSkipHeight, clipMinimum, clipMaximum); fastInvTrans[nTrIdxHor][transformWidthIndex](tmp, block, shift_2nd, iHeight, 0, uiSkipWidth, clipMinimum, clipMaximum); -#else - fastInvTrans[nTrIdxVer][transformHeightIndex](coeff, tmp, shift_1st, iWidth, uiSkipWidth, uiSkipHeight, 1, clipMinimum, clipMaximum); - fastInvTrans[nTrIdxHor][transformWidthIndex](tmp, block, shift_2nd, iHeight, 0, uiSkipWidth, 1, clipMinimum, clipMaximum); -#endif for( int y = 0; y < iHeight; y++ ) { @@ -307,218 +290,7 @@ void xITrMxN_EMT( const int bitDepth, const TCoeff *coeff, Pel *residual, size_t } } } -#endif - -#if !JVET_K1000_SIMPLIFIED_EMT -/** MxN forward transform (2D) -* \param bitDepth [in] bit depth -* \param residual [in] residual block -* \param stride [in] stride of residual block -* \param coeff [out] transform coefficients -* \param width [in] width of transform -* \param height [in] height of transform -* \param useDST [in] -* \param maxLog2TrDynamicRange [in] - -*/ -#if HEVC_USE_4x4_DSTVII -void xTrMxN( const int bitDepth, const Pel *residual, size_t stride, TCoeff *coeff, size_t width, size_t height, bool useDST, const int maxLog2TrDynamicRange ) -#else -void xTrMxN( const int bitDepth, const Pel *residual, size_t stride, TCoeff *coeff, size_t width, size_t height, const int maxLog2TrDynamicRange ) -#endif -{ - const int iWidth = (int)width; - const int iHeight = (int)height; - - const int TRANSFORM_MATRIX_SHIFT = g_transformMatrixShift[TRANSFORM_FORWARD]; - - const int shift_1st = (g_aucLog2[iWidth] + bitDepth + TRANSFORM_MATRIX_SHIFT) - maxLog2TrDynamicRange; - const int shift_2nd = g_aucLog2[iHeight] + TRANSFORM_MATRIX_SHIFT; - const int iZeroOutThresh = JVET_C0024_ZERO_OUT_TH; - - uint32_t iSkipWidth = (iWidth > iZeroOutThresh ? iWidth - iZeroOutThresh : 0); - uint32_t iSkipHeight = (iHeight > iZeroOutThresh ? iHeight - iZeroOutThresh : 0); - - CHECK( shift_1st < 0, "Negative shift" ); - CHECK( shift_2nd < 0, "Negative shift" ); - - ALIGN_DATA( MEMORY_ALIGN_DEF_SIZE, TCoeff block[MAX_TU_SIZE * MAX_TU_SIZE] ); - ALIGN_DATA( MEMORY_ALIGN_DEF_SIZE, TCoeff tmp[MAX_TU_SIZE * MAX_TU_SIZE] ); - - for( int y = 0; y < iHeight; y++ ) - { - for( int x = 0; x < iWidth; x++ ) - { - block[( y * iWidth ) + x] = residual[( y * stride ) + x]; - } - } - - { - switch (iWidth) - { - case 2: fastForwardDCT2_B2( block, tmp, shift_1st, iHeight, 0, iSkipWidth, 0 ); break; - case 4: - { -#if HEVC_USE_4x4_DSTVII - if ((iHeight == 4) && useDST) // Check for DCT or DST - { - fastForwardDST7_B4( block, tmp, shift_1st, iHeight, 0, iSkipWidth, 0 ); - } - else -#endif - { - fastForwardDCT2_B4( block, tmp, shift_1st, iHeight, 0, iSkipWidth, 0 ); - } - } - break; - - case 8: fastForwardDCT2_B8 ( block, tmp, shift_1st, iHeight, 0, iSkipWidth, 0 ); break; - case 16: fastForwardDCT2_B16 ( block, tmp, shift_1st, iHeight, 0, iSkipWidth, 0 ); break; - case 32: fastForwardDCT2_B32 ( block, tmp, shift_1st, iHeight, 0, iSkipWidth, 0 ); break; - case 64: fastForwardDCT2_B64 ( block, tmp, shift_1st + COM16_C806_TRANS_PREC, iHeight, 0, iSkipWidth, 0 ); break; - case 128: fastForwardDCT2_B128( block, tmp, shift_1st + COM16_C806_TRANS_PREC, iHeight, 0, iSkipWidth, 0 ); break; - default: - THROW( "Unsupported transformation size" ); break; - } - } - - { - switch (iHeight) - { - case 2: fastForwardDCT2_B2( tmp, coeff, shift_2nd, iWidth, iSkipWidth, iSkipHeight, 0 ); break; - case 4: - { -#if HEVC_USE_4x4_DSTVII - if ((iWidth == 4) && useDST) // Check for DCT or DST - { - fastForwardDST7_B4( tmp, coeff, shift_2nd, iWidth, iSkipWidth, iSkipHeight, 0 ); - } - else -#endif - { - fastForwardDCT2_B4( tmp, coeff, shift_2nd, iWidth, iSkipWidth, iSkipHeight, 0 ); - } - } - break; - - case 8: fastForwardDCT2_B8 ( tmp, coeff, shift_2nd, iWidth, iSkipWidth, iSkipHeight, 0 ); break; - case 16: fastForwardDCT2_B16 ( tmp, coeff, shift_2nd, iWidth, iSkipWidth, iSkipHeight, 0 ); break; - case 32: fastForwardDCT2_B32 ( tmp, coeff, shift_2nd, iWidth, iSkipWidth, iSkipHeight, 0 ); break; - case 64: fastForwardDCT2_B64 ( tmp, coeff, shift_2nd + COM16_C806_TRANS_PREC, iWidth, iSkipWidth, iSkipHeight, 0 ); break; - case 128: fastForwardDCT2_B128( tmp, coeff, shift_2nd + COM16_C806_TRANS_PREC, iWidth, iSkipWidth, iSkipHeight, 0 ); break; - default: - THROW( "Unsupported transformation size" ); break; - } - } -} - - -/** MxN inverse transform (2D) -* \param bitDepth [in] bit depth -* \param coeff [in] transform coefficients -* \param residual [out] residual block -* \param stride [out] stride of the residual block -* \param width [in] width of transform -* \param height [in] height of transform -* \param useDST [in] -* \param maxLog2TrDynamicRange [in] -*/ -#if HEVC_USE_4x4_DSTVII -void xITrMxN( const int bitDepth, const TCoeff *coeff, Pel *residual, size_t stride, size_t width, size_t height, bool useDST, const int maxLog2TrDynamicRange ) -#else -void xITrMxN( const int bitDepth, const TCoeff *coeff, Pel *residual, size_t stride, size_t width, size_t height, const int maxLog2TrDynamicRange ) -#endif -{ - const int TRANSFORM_MATRIX_SHIFT = g_transformMatrixShift[TRANSFORM_INVERSE]; - const int iWidth = (int)width; - const int iHeight = (int)height; - - - int shift_1st = TRANSFORM_MATRIX_SHIFT + 1; //1 has been added to shift_1st at the expense of shift_2nd - int shift_2nd = (TRANSFORM_MATRIX_SHIFT + maxLog2TrDynamicRange - 1) - bitDepth; - const TCoeff clipMinimum = -(1 << maxLog2TrDynamicRange); - const TCoeff clipMaximum = (1 << maxLog2TrDynamicRange) - 1; - - uint32_t uiSkipWidth = ( iWidth > JVET_C0024_ZERO_OUT_TH ? iWidth - JVET_C0024_ZERO_OUT_TH : 0 ); - uint32_t uiSkipHeight = ( iHeight > JVET_C0024_ZERO_OUT_TH ? iHeight - JVET_C0024_ZERO_OUT_TH : 0 ); - - CHECK( shift_1st < 0, "Negative shift" ); - CHECK( shift_2nd < 0, "Negative shift" ); - - ALIGN_DATA( MEMORY_ALIGN_DEF_SIZE, TCoeff block[MAX_TU_SIZE * MAX_TU_SIZE] ); - ALIGN_DATA( MEMORY_ALIGN_DEF_SIZE, TCoeff tmp[MAX_TU_SIZE * MAX_TU_SIZE] ); - - { - switch (iHeight) - { - case 2: fastInverseDCT2_B2( coeff, tmp, shift_1st, iWidth, uiSkipWidth, uiSkipHeight, 0, clipMinimum, clipMaximum ); break; - case 4: - { -#if HEVC_USE_4x4_DSTVII - if ((iWidth == 4) && useDST) // Check for DCT or DST - { - fastInverseDST7_B4( coeff, tmp, shift_1st, iWidth, uiSkipWidth, uiSkipHeight, 0, clipMinimum, clipMaximum ); - } - else -#endif - { - fastInverseDCT2_B4( coeff, tmp, shift_1st, iWidth, uiSkipWidth, uiSkipHeight, 0, clipMinimum, clipMaximum ); - } - } - break; - - case 8: fastInverseDCT2_B8 ( coeff, tmp, shift_1st, iWidth, uiSkipWidth, uiSkipHeight, 0, clipMinimum, clipMaximum ); break; - case 16: fastInverseDCT2_B16 ( coeff, tmp, shift_1st, iWidth, uiSkipWidth, uiSkipHeight, 0, clipMinimum, clipMaximum ); break; - case 32: fastInverseDCT2_B32 ( coeff, tmp, shift_1st, iWidth, uiSkipWidth, uiSkipHeight, 0, clipMinimum, clipMaximum ); break; - case 64: fastInverseDCT2_B64 ( coeff, tmp, shift_1st + COM16_C806_TRANS_PREC, iWidth, uiSkipWidth, uiSkipHeight, 0, clipMinimum, clipMaximum ); break; - case 128: fastInverseDCT2_B128( coeff, tmp, shift_1st + COM16_C806_TRANS_PREC, iWidth, uiSkipWidth, uiSkipHeight, 0, clipMinimum, clipMaximum ); break; - default: - THROW( "Unsupported transformation size" ); break; - } - } - - { - switch (iWidth) - { - case 2: fastInverseDCT2_B2( tmp, block, shift_2nd, iHeight, 0, uiSkipWidth, 0, std::numeric_limits<Pel>::min(), std::numeric_limits<Pel>::max() ); break; - // Clipping here is not in the standard, but is used to protect the "Pel" data type into which the inverse-transformed samples will be copied - case 4: - { -#if HEVC_USE_4x4_DSTVII - if ((iHeight == 4) && useDST) // Check for DCT or DST - { - fastInverseDST7_B4( tmp, block, shift_2nd, iHeight, 0, uiSkipWidth, 0, std::numeric_limits<Pel>::min(), std::numeric_limits<Pel>::max() ); - } - else -#endif - { - fastInverseDCT2_B4( tmp, block, shift_2nd, iHeight, 0, uiSkipWidth, 0, std::numeric_limits<Pel>::min(), std::numeric_limits<Pel>::max() ); - } - } - break; - - case 8: fastInverseDCT2_B8 ( tmp, block, shift_2nd, iHeight, 0, uiSkipWidth, 0, std::numeric_limits<Pel>::min(), std::numeric_limits<Pel>::max() ); break; - case 16: fastInverseDCT2_B16 ( tmp, block, shift_2nd, iHeight, 0, uiSkipWidth, 0, std::numeric_limits<Pel>::min(), std::numeric_limits<Pel>::max() ); break; - case 32: fastInverseDCT2_B32 ( tmp, block, shift_2nd, iHeight, 0, uiSkipWidth, 0, std::numeric_limits<Pel>::min(), std::numeric_limits<Pel>::max() ); break; - case 64: fastInverseDCT2_B64 ( tmp, block, shift_2nd + COM16_C806_TRANS_PREC, iHeight, 0, uiSkipWidth, 0, std::numeric_limits<Pel>::min(), std::numeric_limits<Pel>::max() ); break; - case 128: fastInverseDCT2_B128( tmp, block, shift_2nd + COM16_C806_TRANS_PREC, iHeight, 0, uiSkipWidth, 0, std::numeric_limits<Pel>::min(), std::numeric_limits<Pel>::max() ); break; - default: - THROW( "Unsupported transformation size" ); - break; - } - } - - for (int y = 0; y < iHeight; y++) - { - for (int x = 0; x < iWidth; x++) - { - residual[(y * stride)+x] = Pel(block[(y * width) + x]); - } - } -} - -#endif // !JVET_K1000_SIMPLIFIED_EMT void TrQuant::xDeQuant(const TransformUnit &tu, @@ -699,7 +471,6 @@ void TrQuant::xT( const TransformUnit &tu, const ComponentID &compID, const CPel const bool useDST = TU::useDST( tu, compID ); #endif -#if JVET_K1000_SIMPLIFIED_EMT const unsigned ucMode = getEmtMode ( tu, compID ); const unsigned ucTrIdx = getEmtTrIdx( tu, compID ); @@ -726,16 +497,6 @@ void TrQuant::xT( const TransformUnit &tu, const ComponentID &compID, const CPel , m_rectTUs ); -#else - - { -#if HEVC_USE_4x4_DSTVII - m_fTr ( channelBitDepth, resi.buf, resi.stride, dstCoeff.buf, iWidth, iHeight, useDST, maxLog2TrDynamicRange ); -#else - m_fTr ( channelBitDepth, resi.buf, resi.stride, dstCoeff.buf, iWidth, iHeight, maxLog2TrDynamicRange ); -#endif - } -#endif } /** Wrapper function between HM interface and core NxN inverse transform (2D) @@ -748,7 +509,6 @@ void TrQuant::xIT( const TransformUnit &tu, const ComponentID &compID, const CCo const bool useDST = TU::useDST( tu, compID ); #endif -#if JVET_K1000_SIMPLIFIED_EMT const unsigned ucMode = getEmtMode ( tu, compID ); const unsigned ucTrIdx = getEmtTrIdx( tu, compID ); @@ -778,16 +538,6 @@ void TrQuant::xIT( const TransformUnit &tu, const ComponentID &compID, const CCo #endif #endif -#else - - { -#if HEVC_USE_4x4_DSTVII - m_fITr ( channelBitDepth, pCoeff.buf, pResidual.buf, pResidual.stride, pCoeff.width, pCoeff.height, useDST, maxLog2TrDynamicRange ); -#else - m_fITr ( channelBitDepth, pCoeff.buf, pResidual.buf, pResidual.stride, pCoeff.width, pCoeff.height, maxLog2TrDynamicRange ); -#endif - } -#endif } /** Wrapper function between HM interface and core NxN transform skipping @@ -851,14 +601,9 @@ void TrQuant::xQuant(TransformUnit &tu, const ComponentID &compID, const CCoeffB m_quant->quant( tu, compID, pSrc, uiAbsSum, cQP, ctx ); } -#if JVET_K1000_SIMPLIFIED_EMT uint8_t TrQuant::getEmtTrIdx(TransformUnit tu, const ComponentID compID) { -#if JVET_K1000_SIMPLIFIED_EMT uint8_t ucTrIdx = DCT2_EMT; -#else - uint8_t ucTrIdx = DCT2_HEVC; -#endif if( compID == COMPONENT_Y ) { @@ -911,7 +656,6 @@ uint8_t TrQuant::getEmtMode( TransformUnit tu, const ComponentID compID ) return ucMode; } -#endif void TrQuant::transformNxN(TransformUnit &tu, const ComponentID &compID, const QpParam &cQP, TCoeff &uiAbsSum, const Ctx &ctx) { diff --git a/source/Lib/CommonLib/TrQuant.h b/source/Lib/CommonLib/TrQuant.h index 24045eeed0255a78c9f864e747d9520c10c72ca7..c78e17af83500e0210979a592bff3af6e39a22e8 100644 --- a/source/Lib/CommonLib/TrQuant.h +++ b/source/Lib/CommonLib/TrQuant.h @@ -50,13 +50,8 @@ //! \ingroup CommonLib //! \{ -#if JVET_K1000_SIMPLIFIED_EMT typedef void FwdTrans(const TCoeff*, TCoeff*, int, int, int, int); typedef void InvTrans(const TCoeff*, TCoeff*, int, int, int, int, const TCoeff, const TCoeff); -#else -typedef void FwdTrans(const TCoeff*, TCoeff*, int, int, int, int, int); -typedef void InvTrans(const TCoeff*, TCoeff*, int, int, int, int, int, const TCoeff, const TCoeff); -#endif // ==================================================================================================================== // Class definition @@ -89,10 +84,8 @@ public: const bool rectTUs = false ); -#if JVET_K1000_SIMPLIFIED_EMT uint8_t getEmtTrIdx( TransformUnit tu, const ComponentID compID ); uint8_t getEmtMode ( TransformUnit tu, const ComponentID compID ); -#endif protected: @@ -143,15 +136,6 @@ private: // forward Transform void xT ( const TransformUnit &tu, const ComponentID &compID, const CPelBuf &resi, CoeffBuf &dstCoeff, const int iWidth, const int iHeight ); -#if !JVET_K1000_SIMPLIFIED_EMT -#if HEVC_USE_4x4_DSTVII - void (*m_fTr ) ( const int bitDepth, const Pel *residual, size_t stride, TCoeff *coeff, size_t width, size_t height, bool useDST, const int maxLog2TrDynamicRange ); - void (*m_fITr) ( const int bitDepth, const TCoeff *coeff, Pel *residual, size_t stride, size_t width, size_t height, bool useDST, const int maxLog2TrDynamicRange ); -#else - void (*m_fTr ) ( const int bitDepth, const Pel *residual, size_t stride, TCoeff *coeff, size_t width, size_t height, const int maxLog2TrDynamicRange ); - void (*m_fITr) ( const int bitDepth, const TCoeff *coeff, Pel *residual, size_t stride, size_t width, size_t height, const int maxLog2TrDynamicRange ); -#endif -#endif // skipping Transform void xTransformSkip (const TransformUnit &tu, const ComponentID &compID, const CPelBuf &resi, TCoeff* psCoeff); diff --git a/source/Lib/CommonLib/TrQuant_EMT.cpp b/source/Lib/CommonLib/TrQuant_EMT.cpp index c1b87ba7ac7924ee9d3d6fbd8825ad016a019769..99ec664b4e91f3e92debc46a093ed08e92cca477 100644 --- a/source/Lib/CommonLib/TrQuant_EMT.cpp +++ b/source/Lib/CommonLib/TrQuant_EMT.cpp @@ -48,21 +48,13 @@ // ********************************** DCT-II ********************************** //Fast DCT-II transforms -#if JVET_K1000_SIMPLIFIED_EMT void fastForwardDCT2_B2(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2) -#else -void fastForwardDCT2_B2(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -#endif { int j; int E, O; TCoeff add = (shift > 0) ? (1 << (shift - 1)) : 0; -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr2[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr2[DCT2][0] : g_aiT2[TRANSFORM_FORWARD][0]; -#endif TCoeff *pCoef = dst; const int reducedLine = line - iSkipLine; @@ -90,21 +82,13 @@ void fastForwardDCT2_B2(const TCoeff *src, TCoeff *dst, int shift, int line, int } } -#if JVET_K1000_SIMPLIFIED_EMT void fastInverseDCT2_B2(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, const TCoeff outputMinimum, const TCoeff outputMaximum) -#else -void fastInverseDCT2_B2(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -#endif { int j; int E, O; int add = 1 << (shift - 1); -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr2[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr2[DCT2][0] : g_aiT2[TRANSFORM_INVERSE][0]; -#endif const int reducedLine = line - iSkipLine; for (j = 0; j<reducedLine; j++) @@ -144,21 +128,13 @@ void fastInverseDCT2_B2(const TCoeff *src, TCoeff *dst, int shift, int line, int * \param shift specifies right shift after 1D transform * \param line */ -#if JVET_K1000_SIMPLIFIED_EMT void fastForwardDCT2_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2) -#else -void fastForwardDCT2_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -#endif { int j; TCoeff E[2], O[2]; TCoeff add = (shift > 0) ? (1 << (shift - 1)) : 0; -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr4[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr4[DCT2][0] : g_aiT4[TRANSFORM_FORWARD][0]; -#endif TCoeff *pCoef = dst; const int reducedLine = line - iSkipLine; @@ -197,21 +173,13 @@ void fastForwardDCT2_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int * \param outputMinimum minimum for clipping * \param outputMaximum maximum for clipping */ -#if JVET_K1000_SIMPLIFIED_EMT void fastInverseDCT2_B4( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, const TCoeff outputMinimum, const TCoeff outputMaximum ) -#else -void fastInverseDCT2_B4( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum ) -#endif { int j; int E[2], O[2]; int add = 1 << ( shift - 1 ); -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr4[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr4[DCT2][0] : g_aiT4[TRANSFORM_INVERSE][0]; -#endif const int reducedLine = line - iSkipLine; for( j = 0; j < reducedLine; j++ ) @@ -239,11 +207,7 @@ void fastInverseDCT2_B4( const TCoeff *src, TCoeff *dst, int shift, int line, in template< int uiTrSize > -#if JVET_K1000_SIMPLIFIED_EMT inline void _fastInverseMM( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, const TCoeff outputMinimum, const TCoeff outputMaximum, const TMatrixCoeff* iT ) -#else -inline void _fastInverseMM( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum, const TMatrixCoeff* iT ) -#endif { const int rnd_factor = 1 << (shift - 1); const int reducedLine = line - iSkipLine; @@ -270,11 +234,7 @@ inline void _fastInverseMM( const TCoeff *src, TCoeff *dst, int shift, int line, template< int uiTrSize > -#if JVET_K1000_SIMPLIFIED_EMT inline void _fastForwardMM( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, const TMatrixCoeff* tc ) -#else -inline void _fastForwardMM( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TMatrixCoeff* tc ) -#endif { const int rnd_factor = 1 << (shift - 1); const int reducedLine = line - iSkipLine; @@ -324,22 +284,14 @@ inline void _fastForwardMM( const TCoeff *src, TCoeff *dst, int shift, int line, * \param shift specifies right shift after 1D transform * \param line */ -#if JVET_K1000_SIMPLIFIED_EMT void fastForwardDCT2_B8( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2 ) -#else -void fastForwardDCT2_B8( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use ) -#endif { int j, k; TCoeff E[4], O[4]; TCoeff EE[2], EO[2]; TCoeff add = ( shift > 0 ) ? ( 1 << ( shift - 1 ) ) : 0; -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr8[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr8[DCT2][0] : g_aiT8[TRANSFORM_FORWARD][0]; -#endif TCoeff *pCoef = dst; const int reducedLine = line - iSkipLine; @@ -389,22 +341,14 @@ void fastForwardDCT2_B8( const TCoeff *src, TCoeff *dst, int shift, int line, in * \param outputMinimum minimum for clipping * \param outputMaximum maximum for clipping */ -#if JVET_K1000_SIMPLIFIED_EMT void fastInverseDCT2_B8(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, const TCoeff outputMinimum, const TCoeff outputMaximum) -#else -void fastInverseDCT2_B8(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -#endif { int j, k; int E[4], O[4]; int EE[2], EO[2]; int add = 1 << (shift - 1); -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr8[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr8[DCT2][0] : g_aiT8[TRANSFORM_INVERSE][0]; -#endif const int reducedLine = line - iSkipLine; for( j = 0; j < reducedLine; j++ ) @@ -447,11 +391,7 @@ void fastInverseDCT2_B8(const TCoeff *src, TCoeff *dst, int shift, int line, int * \param shift specifies right shift after 1D transform * \param line */ -#if JVET_K1000_SIMPLIFIED_EMT void fastForwardDCT2_B16(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2) -#else -void fastForwardDCT2_B16(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -#endif { int j, k; TCoeff E [8], O [8]; @@ -459,11 +399,7 @@ void fastForwardDCT2_B16(const TCoeff *src, TCoeff *dst, int shift, int line, in TCoeff EEE[2], EEO[2]; TCoeff add = ( shift > 0 ) ? ( 1 << ( shift - 1 ) ) : 0; -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr16[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr16[DCT2][0] : g_aiT16[TRANSFORM_FORWARD][0]; -#endif TCoeff *pCoef = dst; const int reducedLine = line - iSkipLine; @@ -526,11 +462,7 @@ void fastForwardDCT2_B16(const TCoeff *src, TCoeff *dst, int shift, int line, in * \param outputMinimum minimum for clipping * \param outputMaximum maximum for clipping */ -#if JVET_K1000_SIMPLIFIED_EMT void fastInverseDCT2_B16( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, const TCoeff outputMinimum, const TCoeff outputMaximum ) -#else -void fastInverseDCT2_B16( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum ) -#endif { int j, k; int E [8], O [8]; @@ -538,11 +470,7 @@ void fastInverseDCT2_B16( const TCoeff *src, TCoeff *dst, int shift, int line, i int EEE[2], EEO[2]; int add = 1 << ( shift - 1 ); -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr16[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr16[DCT2][0] : g_aiT16[TRANSFORM_INVERSE][0]; -#endif const int reducedLine = line - iSkipLine; @@ -596,11 +524,7 @@ void fastInverseDCT2_B16( const TCoeff *src, TCoeff *dst, int shift, int line, i * \param shift specifies right shift after 1D transform * \param line */ -#if JVET_K1000_SIMPLIFIED_EMT void fastForwardDCT2_B32( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2 ) -#else -void fastForwardDCT2_B32( const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use ) -#endif { int j, k; TCoeff E [16], O [16]; @@ -609,11 +533,7 @@ void fastForwardDCT2_B32( const TCoeff *src, TCoeff *dst, int shift, int line, i TCoeff EEEE[ 2], EEEO[ 2]; TCoeff add = ( shift > 0 ) ? ( 1 << ( shift - 1 ) ) : 0; -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr32[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr32[DCT2][0] : g_aiT32[TRANSFORM_FORWARD][0]; -#endif TCoeff *pCoef = dst; const int reducedLine = line - iSkipLine; @@ -685,11 +605,7 @@ void fastForwardDCT2_B32( const TCoeff *src, TCoeff *dst, int shift, int line, i * \param outputMinimum minimum for clipping * \param outputMaximum maximum for clipping */ -#if JVET_K1000_SIMPLIFIED_EMT void fastInverseDCT2_B32(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, const TCoeff outputMinimum, const TCoeff outputMaximum) -#else -void fastInverseDCT2_B32(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -#endif { int j, k; @@ -699,11 +615,7 @@ void fastInverseDCT2_B32(const TCoeff *src, TCoeff *dst, int shift, int line, in int EEEE[2], EEEO[2]; int add = 1 << (shift - 1); -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr32[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr32[DCT2][0] : g_aiT32[TRANSFORM_INVERSE][0]; -#endif const int reducedLine = line - iSkipLine; for (j = 0; j<reducedLine; j++) @@ -759,20 +671,12 @@ void fastInverseDCT2_B32(const TCoeff *src, TCoeff *dst, int shift, int line, in } } -#if JVET_K1000_SIMPLIFIED_EMT void fastForwardDCT2_B64(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2) -#else -void fastForwardDCT2_B64(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -#endif { int rnd_factor = 1 << (shift - 1); const int uiTrSize = 64; -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr64[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr64[DCT2][0] : g_aiT64[0][0]; -#endif int j, k; TCoeff E[32], O[32]; @@ -873,19 +777,11 @@ void fastForwardDCT2_B64(const TCoeff *src, TCoeff *dst, int shift, int line, in } } -#if JVET_K1000_SIMPLIFIED_EMT void fastInverseDCT2_B64(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, const TCoeff outputMinimum, const TCoeff outputMaximum) -#else -void fastInverseDCT2_B64(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -#endif { int rnd_factor = 1 << (shift - 1); const int uiTrSize = 64; -#if JVET_K1000_SIMPLIFIED_EMT const TMatrixCoeff *iT = g_aiTr64[DCT2][0]; -#else - const TMatrixCoeff *iT = use ? g_aiTr64[DCT2][0] : g_aiT64[TRANSFORM_INVERSE][0]; -#endif int j, k; TCoeff E[32], O[32]; @@ -965,676 +861,10 @@ void fastInverseDCT2_B64(const TCoeff *src, TCoeff *dst, int shift, int line, in memset(dst, 0, uiTrSize*iSkipLine * sizeof(TCoeff)); } -#if !JVET_K1000_SIMPLIFIED_EMT - -void fastForwardDCT2_B128(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - int j, k; - TCoeff E[64], O[64]; - TCoeff EE[32], EO[32]; - TCoeff EEE[16], EEO[16]; - TCoeff EEEE[8], EEEO[8]; - TCoeff EEEEE[4], EEEEO[4]; - TCoeff EEEEEE[2], EEEEEO[2]; - TCoeff add = 1 << (shift - 1); - - const TMatrixCoeff(*iT)[128] = use ? g_aiTr128[DCT2] : g_aiT128[TRANSFORM_FORWARD]; - - TCoeff* tmp = dst; - for (j = 0; j<line - iSkipLine; j++) - { - /* E and O*/ - for (k = 0;k< 64;k++) - { - E[k] = src[k] + src[127 - k]; - O[k] = src[k] - src[127 - k]; - } - /* EE and EO */ - for (k = 0;k< 32;k++) - { - EE[k] = E[k] + E[63 - k]; - EO[k] = E[k] - E[63 - k]; - } - - /* EEE and EEO */ - for (k = 0;k< 16;k++) - { - EEE[k] = EE[k] + EE[31 - k]; - EEO[k] = EE[k] - EE[31 - k]; - } - - /* EEEE and EEEO */ - for (k = 0; k< 8; k++) - { - EEEE[k] = EEE[k] + EEE[15 - k]; - EEEO[k] = EEE[k] - EEE[15 - k]; - } - - for (k = 0; k< 4; k++) - { - EEEEE[k] = EEEE[k] + EEEE[7 - k]; - EEEEO[k] = EEEE[k] - EEEE[7 - k]; - } - - for (k = 0; k< 2; k++) - { - EEEEEE[k] = EEEEE[k] + EEEEE[3 - k]; - EEEEEO[k] = EEEEE[k] - EEEEE[3 - k]; - } - - //0 - dst[0] = (iT[0][0] * EEEEEE[0] - + iT[0][1] * EEEEEE[1] - + add) >> shift; - dst[64 * line] = (iT[64][0] * EEEEEE[0] - + iT[64][1] * EEEEEE[1] - + add) >> shift; - - //2 - for (k = 32;k<128;k += 64) - { - dst[k*line] = (iT[k][0] * EEEEEO[0] - + iT[k][1] * EEEEEO[1] - + add) >> shift; - } - - //4 - for (k = 16;k<128;k += 32) - { - dst[k*line] = - (iT[k][0] * EEEEO[0] - + iT[k][1] * EEEEO[1] - + iT[k][2] * EEEEO[2] - + iT[k][3] * EEEEO[3] - + add) >> shift; - } - - //8 - for (k = 8;k<128;k += 16) - { - dst[k*line] = - (iT[k][0] * EEEO[0] - + iT[k][1] * EEEO[1] - + iT[k][2] * EEEO[2] - + iT[k][3] * EEEO[3] - + iT[k][4] * EEEO[4] - + iT[k][5] * EEEO[5] - + iT[k][6] * EEEO[6] - + iT[k][7] * EEEO[7] - + add) >> shift; - } - - //16 - for (k = 4;k<128;k += 8) - { - dst[k*line] = - (iT[k][0] * EEO[0] - + iT[k][1] * EEO[1] - + iT[k][2] * EEO[2] - + iT[k][3] * EEO[3] - + iT[k][4] * EEO[4] - + iT[k][5] * EEO[5] - + iT[k][6] * EEO[6] - + iT[k][7] * EEO[7] - + iT[k][8] * EEO[8] - + iT[k][9] * EEO[9] - + iT[k][10] * EEO[10] - + iT[k][11] * EEO[11] - + iT[k][12] * EEO[12] - + iT[k][13] * EEO[13] - + iT[k][14] * EEO[14] - + iT[k][15] * EEO[15] - + add) >> shift; - } - - - //32 - for (k = 2;k<128;k += 4) - { - dst[k*line] = (iT[k][0] * EO[0] - + iT[k][1] * EO[1] - + iT[k][2] * EO[2] - + iT[k][3] * EO[3] - + iT[k][4] * EO[4] - + iT[k][5] * EO[5] - + iT[k][6] * EO[6] - + iT[k][7] * EO[7] - + iT[k][8] * EO[8] - + iT[k][9] * EO[9] - + iT[k][10] * EO[10] - + iT[k][11] * EO[11] - + iT[k][12] * EO[12] - + iT[k][13] * EO[13] - + iT[k][14] * EO[14] - + iT[k][15] * EO[15] - + iT[k][16] * EO[16] - + iT[k][17] * EO[17] - + iT[k][18] * EO[18] - + iT[k][19] * EO[19] - + iT[k][20] * EO[20] - + iT[k][21] * EO[21] - + iT[k][22] * EO[22] - + iT[k][23] * EO[23] - + iT[k][24] * EO[24] - + iT[k][25] * EO[25] - + iT[k][26] * EO[26] - + iT[k][27] * EO[27] - + iT[k][28] * EO[28] - + iT[k][29] * EO[29] - + iT[k][30] * EO[30] - + iT[k][31] * EO[31] - + add) >> shift; - } - - //64 - for (k = 1;k<128;k += 2) - { - dst[k*line] = (iT[k][0] * O[0] - + iT[k][1] * O[1] - + iT[k][2] * O[2] - + iT[k][3] * O[3] - + iT[k][4] * O[4] - + iT[k][5] * O[5] - + iT[k][6] * O[6] - + iT[k][7] * O[7] - + iT[k][8] * O[8] - + iT[k][9] * O[9] - + iT[k][10] * O[10] - + iT[k][11] * O[11] - + iT[k][12] * O[12] - + iT[k][13] * O[13] - + iT[k][14] * O[14] - + iT[k][15] * O[15] - + iT[k][16] * O[16] - + iT[k][17] * O[17] - + iT[k][18] * O[18] - + iT[k][19] * O[19] - + iT[k][20] * O[20] - + iT[k][21] * O[21] - + iT[k][22] * O[22] - + iT[k][23] * O[23] - + iT[k][24] * O[24] - + iT[k][25] * O[25] - + iT[k][26] * O[26] - + iT[k][27] * O[27] - + iT[k][28] * O[28] - + iT[k][29] * O[29] - + iT[k][30] * O[30] - + iT[k][31] * O[31] - - + iT[k][32] * O[32] - + iT[k][33] * O[33] - + iT[k][34] * O[34] - + iT[k][35] * O[35] - + iT[k][36] * O[36] - + iT[k][37] * O[37] - + iT[k][38] * O[38] - + iT[k][39] * O[39] - + iT[k][40] * O[40] - + iT[k][41] * O[41] - + iT[k][42] * O[42] - + iT[k][43] * O[43] - + iT[k][44] * O[44] - + iT[k][45] * O[45] - + iT[k][46] * O[46] - + iT[k][47] * O[47] - + iT[k][48] * O[48] - + iT[k][49] * O[49] - + iT[k][50] * O[50] - + iT[k][51] * O[51] - + iT[k][52] * O[52] - + iT[k][53] * O[53] - + iT[k][54] * O[54] - + iT[k][55] * O[55] - + iT[k][56] * O[56] - + iT[k][57] * O[57] - + iT[k][58] * O[58] - + iT[k][59] * O[59] - + iT[k][60] * O[60] - + iT[k][61] * O[61] - + iT[k][62] * O[62] - + iT[k][63] * O[63] - + add) >> shift; - } - src += 128; - dst++; - } - - const uint32_t uiTrSize = 128; - const int reducedLine = line - iSkipLine; - const int cutoff = uiTrSize - iSkipLine2; - if (iSkipLine) - { - dst = tmp + reducedLine; - for (j = 0; j<cutoff; j++) - { - memset(dst, 0, sizeof(TCoeff)*iSkipLine); - dst += line; - } - } - if (iSkipLine2) - { - dst = tmp + line*cutoff; - memset(dst, 0, sizeof(TCoeff)*line*iSkipLine2); - } -} - -void fastInverseDCT2_B128(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - int j, k; - TCoeff E[64], O[64]; - TCoeff EE[32], EO[32]; - TCoeff EEE[16], EEO[16]; - TCoeff EEEE[8], EEEO[8]; - TCoeff EEEEE[4], EEEEO[4]; - TCoeff EEEEEE[2], EEEEEO[2]; - TCoeff add = 1 << (shift - 1); - - const TMatrixCoeff(*iT)[128] = use ? g_aiTr128[DCT2] : g_aiT128[TRANSFORM_INVERSE]; - - bool c1 = iSkipLine2 >= 96; - bool c2 = iSkipLine2 >= 64; - bool c3 = iSkipLine2 >= 32; - - for (j = 0; j<line - iSkipLine; j++) - { - /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ - if (c1) - { - for (k = 0;k<64;k++) //+2 - { - O[k] = iT[1][k] * src[line] - + iT[3][k] * src[3 * line] - + iT[5][k] * src[5 * line] - + iT[7][k] * src[7 * line] - + iT[9][k] * src[9 * line] - + iT[11][k] * src[11 * line] - + iT[13][k] * src[13 * line] - + iT[15][k] * src[15 * line] - + iT[17][k] * src[17 * line] - + iT[19][k] * src[19 * line] - + iT[21][k] * src[21 * line] - + iT[23][k] * src[23 * line] - + iT[25][k] * src[25 * line] - + iT[27][k] * src[27 * line] - + iT[29][k] * src[29 * line] - + iT[31][k] * src[31 * line] - ; - } - - for (k = 0;k<32;k++) //+4 - { - EO[k] = iT[2][k] * src[2 * line] - + iT[6][k] * src[6 * line] - + iT[10][k] * src[10 * line] - + iT[14][k] * src[14 * line] - + iT[18][k] * src[18 * line] - + iT[22][k] * src[22 * line] - + iT[26][k] * src[26 * line] - + iT[30][k] * src[30 * line] - ; - } - } - else if (c2) - { - for (k = 0;k<64;k++) //+2 - { - O[k] = iT[1][k] * src[line] - + iT[3][k] * src[3 * line] - + iT[5][k] * src[5 * line] - + iT[7][k] * src[7 * line] - + iT[9][k] * src[9 * line] - + iT[11][k] * src[11 * line] - + iT[13][k] * src[13 * line] - + iT[15][k] * src[15 * line] - + iT[17][k] * src[17 * line] - + iT[19][k] * src[19 * line] - + iT[21][k] * src[21 * line] - + iT[23][k] * src[23 * line] - + iT[25][k] * src[25 * line] - + iT[27][k] * src[27 * line] - + iT[29][k] * src[29 * line] - + iT[31][k] * src[31 * line] - + iT[33][k] * src[33 * line] - + iT[35][k] * src[35 * line] - + iT[37][k] * src[37 * line] - + iT[39][k] * src[39 * line] - + iT[41][k] * src[41 * line] - + iT[43][k] * src[43 * line] - + iT[45][k] * src[45 * line] - + iT[47][k] * src[47 * line] - + iT[49][k] * src[49 * line] - + iT[51][k] * src[51 * line] - + iT[53][k] * src[53 * line] - + iT[55][k] * src[55 * line] - + iT[57][k] * src[57 * line] - + iT[59][k] * src[59 * line] - + iT[61][k] * src[61 * line] - + iT[63][k] * src[63 * line] - ; - } - - for (k = 0;k<32;k++) //+4 - { - EO[k] = iT[2][k] * src[2 * line] - + iT[6][k] * src[6 * line] - + iT[10][k] * src[10 * line] - + iT[14][k] * src[14 * line] - + iT[18][k] * src[18 * line] - + iT[22][k] * src[22 * line] - + iT[26][k] * src[26 * line] - + iT[30][k] * src[30 * line] - + iT[34][k] * src[34 * line] - + iT[38][k] * src[38 * line] - + iT[42][k] * src[42 * line] - + iT[46][k] * src[46 * line] - + iT[50][k] * src[50 * line] - + iT[54][k] * src[54 * line] - + iT[58][k] * src[58 * line] - + iT[62][k] * src[62 * line] - ; - } - } - else if (c3) - { - for (k = 0;k<64;k++) //+2 - { - O[k] = iT[1][k] * src[line] - + iT[3][k] * src[3 * line] - + iT[5][k] * src[5 * line] - + iT[7][k] * src[7 * line] - + iT[9][k] * src[9 * line] - + iT[11][k] * src[11 * line] - + iT[13][k] * src[13 * line] - + iT[15][k] * src[15 * line] - + iT[17][k] * src[17 * line] - + iT[19][k] * src[19 * line] - + iT[21][k] * src[21 * line] - + iT[23][k] * src[23 * line] - + iT[25][k] * src[25 * line] - + iT[27][k] * src[27 * line] - + iT[29][k] * src[29 * line] - + iT[31][k] * src[31 * line] - + iT[33][k] * src[33 * line] - + iT[35][k] * src[35 * line] - + iT[37][k] * src[37 * line] - + iT[39][k] * src[39 * line] - + iT[41][k] * src[41 * line] - + iT[43][k] * src[43 * line] - + iT[45][k] * src[45 * line] - + iT[47][k] * src[47 * line] - + iT[49][k] * src[49 * line] - + iT[51][k] * src[51 * line] - + iT[53][k] * src[53 * line] - + iT[55][k] * src[55 * line] - + iT[57][k] * src[57 * line] - + iT[59][k] * src[59 * line] - + iT[61][k] * src[61 * line] - + iT[63][k] * src[63 * line] - + iT[65][k] * src[65 * line] - + iT[67][k] * src[67 * line] - + iT[69][k] * src[69 * line] - + iT[71][k] * src[71 * line] - + iT[73][k] * src[73 * line] - + iT[75][k] * src[75 * line] - + iT[77][k] * src[77 * line] - + iT[79][k] * src[79 * line] - + iT[81][k] * src[81 * line] - + iT[83][k] * src[83 * line] - + iT[85][k] * src[85 * line] - + iT[87][k] * src[87 * line] - + iT[89][k] * src[89 * line] - + iT[91][k] * src[91 * line] - + iT[93][k] * src[93 * line] - + iT[95][k] * src[95 * line] - ; - } - - for (k = 0;k<32;k++) //+4 - { - EO[k] = iT[2][k] * src[2 * line] - + iT[6][k] * src[6 * line] - + iT[10][k] * src[10 * line] - + iT[14][k] * src[14 * line] - + iT[18][k] * src[18 * line] - + iT[22][k] * src[22 * line] - + iT[26][k] * src[26 * line] - + iT[30][k] * src[30 * line] - + iT[34][k] * src[34 * line] - + iT[38][k] * src[38 * line] - + iT[42][k] * src[42 * line] - + iT[46][k] * src[46 * line] - + iT[50][k] * src[50 * line] - + iT[54][k] * src[54 * line] - + iT[58][k] * src[58 * line] - + iT[62][k] * src[62 * line] - + iT[66][k] * src[66 * line] - + iT[70][k] * src[70 * line] - + iT[74][k] * src[74 * line] - + iT[78][k] * src[78 * line] - + iT[82][k] * src[82 * line] - + iT[86][k] * src[86 * line] - + iT[90][k] * src[90 * line] - + iT[94][k] * src[94 * line] - ; - } - } - else - { - for (k = 0;k<64;k++) //+2 - { - O[k] = - iT[1][k] * src[line] - + iT[3][k] * src[3 * line] - + iT[5][k] * src[5 * line] - + iT[7][k] * src[7 * line] - + iT[9][k] * src[9 * line] - + iT[11][k] * src[11 * line] - + iT[13][k] * src[13 * line] - + iT[15][k] * src[15 * line] - + iT[17][k] * src[17 * line] - + iT[19][k] * src[19 * line] - + iT[21][k] * src[21 * line] - + iT[23][k] * src[23 * line] - + iT[25][k] * src[25 * line] - + iT[27][k] * src[27 * line] - + iT[29][k] * src[29 * line] - + iT[31][k] * src[31 * line] - + iT[33][k] * src[33 * line] - + iT[35][k] * src[35 * line] - + iT[37][k] * src[37 * line] - + iT[39][k] * src[39 * line] - + iT[41][k] * src[41 * line] - + iT[43][k] * src[43 * line] - + iT[45][k] * src[45 * line] - + iT[47][k] * src[47 * line] - + iT[49][k] * src[49 * line] - + iT[51][k] * src[51 * line] - + iT[53][k] * src[53 * line] - + iT[55][k] * src[55 * line] - + iT[57][k] * src[57 * line] - + iT[59][k] * src[59 * line] - + iT[61][k] * src[61 * line] - + iT[63][k] * src[63 * line] - + iT[65][k] * src[65 * line] - + iT[67][k] * src[67 * line] - + iT[69][k] * src[69 * line] - + iT[71][k] * src[71 * line] - + iT[73][k] * src[73 * line] - + iT[75][k] * src[75 * line] - + iT[77][k] * src[77 * line] - + iT[79][k] * src[79 * line] - + iT[81][k] * src[81 * line] - + iT[83][k] * src[83 * line] - + iT[85][k] * src[85 * line] - + iT[87][k] * src[87 * line] - + iT[89][k] * src[89 * line] - + iT[91][k] * src[91 * line] - + iT[93][k] * src[93 * line] - + iT[95][k] * src[95 * line] - + iT[97][k] * src[97 * line] - + iT[99][k] * src[99 * line] - + iT[101][k] * src[101 * line] - + iT[103][k] * src[103 * line] - + iT[105][k] * src[105 * line] - + iT[107][k] * src[107 * line] - + iT[109][k] * src[109 * line] - + iT[111][k] * src[111 * line] - + iT[113][k] * src[113 * line] - + iT[115][k] * src[115 * line] - + iT[117][k] * src[117 * line] - + iT[119][k] * src[119 * line] - + iT[121][k] * src[121 * line] - + iT[123][k] * src[123 * line] - + iT[125][k] * src[125 * line] - + iT[127][k] * src[127 * line] - ; - } - - for (k = 0;k<32;k++) //+4 - { - EO[k] = iT[2][k] * src[2 * line] - + iT[6][k] * src[6 * line] - + iT[10][k] * src[10 * line] - + iT[14][k] * src[14 * line] - + iT[18][k] * src[18 * line] - + iT[22][k] * src[22 * line] - + iT[26][k] * src[26 * line] - + iT[30][k] * src[30 * line] - + iT[34][k] * src[34 * line] - + iT[38][k] * src[38 * line] - + iT[42][k] * src[42 * line] - + iT[46][k] * src[46 * line] - + iT[50][k] * src[50 * line] - + iT[54][k] * src[54 * line] - + iT[58][k] * src[58 * line] - + iT[62][k] * src[62 * line] - + iT[66][k] * src[66 * line] - + iT[70][k] * src[70 * line] - + iT[74][k] * src[74 * line] - + iT[78][k] * src[78 * line] - + iT[82][k] * src[82 * line] - + iT[86][k] * src[86 * line] - + iT[90][k] * src[90 * line] - + iT[94][k] * src[94 * line] - + iT[98][k] * src[98 * line] - + iT[102][k] * src[102 * line] - + iT[106][k] * src[106 * line] - + iT[110][k] * src[110 * line] - + iT[114][k] * src[114 * line] - + iT[118][k] * src[118 * line] - + iT[122][k] * src[122 * line] - + iT[126][k] * src[126 * line] - ; - } - } - - for (k = 0;k<16;k++) //+8 - { - EEO[k] = iT[4][k] * src[4 * line] - + iT[12][k] * src[12 * line] - + iT[20][k] * src[20 * line] - + iT[28][k] * src[28 * line] - + iT[36][k] * src[36 * line] - + iT[44][k] * src[44 * line] - + iT[52][k] * src[52 * line] - + iT[60][k] * src[60 * line] - + iT[68][k] * src[68 * line] - + iT[76][k] * src[76 * line] - + iT[84][k] * src[84 * line] - + iT[92][k] * src[92 * line] - + iT[100][k] * src[100 * line] - + iT[108][k] * src[108 * line] - + iT[116][k] * src[116 * line] - + iT[124][k] * src[124 * line] - ; - } - - for (k = 0;k<8;k++) //+16 - { - EEEO[k] = iT[8][k] * src[8 * line] - + iT[24][k] * src[24 * line] - + iT[40][k] * src[40 * line] - + iT[56][k] * src[56 * line] - + iT[72][k] * src[72 * line] - + iT[88][k] * src[88 * line] - + iT[104][k] * src[104 * line] - + iT[120][k] * src[120 * line] - ; - } - - - for (k = 0; k< 4; k++) //+32 - { - EEEEO[k] = iT[16][k] * src[16 * line] - + iT[48][k] * src[48 * line] - + iT[80][k] * src[80 * line] - + iT[112][k] * src[112 * line] - ; - } - - for (k = 0; k< 2; k++) //+64 - { - EEEEEO[k] = iT[32][k] * src[32 * line] - + iT[96][k] * src[96 * line] - ; - } - - EEEEEE[0] = iT[0][0] * src[0] + iT[64][0] * src[64 * line]; - EEEEEE[1] = iT[0][1] * src[0] + iT[64][1] * src[64 * line]; - - /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */ - for (k = 0;k<2;k++) - { - EEEEE[k] = EEEEEE[k] + EEEEEO[k]; - EEEEE[k + 2] = EEEEEE[1 - k] - EEEEEO[1 - k]; - } - - for (k = 0;k<4;k++) - { - EEEE[k] = EEEEE[k] + EEEEO[k]; - EEEE[k + 4] = EEEEE[3 - k] - EEEEO[3 - k]; - } - - for (k = 0;k<8;k++) - { - EEE[k] = EEEE[k] + EEEO[k]; - EEE[k + 8] = EEEE[7 - k] - EEEO[7 - k]; - } - - for (k = 0;k<16;k++) - { - EE[k] = EEE[k] + EEO[k]; - EE[k + 16] = EEE[15 - k] - EEO[15 - k]; - } - - for (k = 0;k<32;k++) - { - E[k] = EE[k] + EO[k]; - E[k + 32] = EE[31 - k] - EO[31 - k]; - } - - for (k = 0;k<64;k++) - { - dst[k] = Clip3(outputMinimum, outputMaximum, (E[k] + O[k] + add) >> shift); - dst[k + 64] = Clip3(outputMinimum, outputMaximum, (E[63 - k] - O[63 - k] + add) >> shift); - } - src++; - dst += 128; - } - - memset(dst, 0, 128 * iSkipLine * sizeof(TCoeff)); -} - -#endif // !JVET_K1000_SIMPLIFIED_EMT // ********************************** DST-VII ********************************** -#if JVET_K1000_SIMPLIFIED_EMT void fastForwardDST7_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2) -#else -void fastForwardDST7_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -#endif { int i; TCoeff rnd_factor = (shift > 0) ? (1 << (shift - 1)) : 0; @@ -1675,11 +905,7 @@ void fastForwardDST7_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int } } -#if JVET_K1000_SIMPLIFIED_EMT void fastInverseDST7_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, const TCoeff outputMinimum, const TCoeff outputMaximum) -#else -void fastInverseDST7_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -#endif { int i; TCoeff c[4]; @@ -1715,7 +941,6 @@ void fastInverseDST7_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int } -#if JVET_K1000_SIMPLIFIED_EMT void fastForwardDST7_B8(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2) { @@ -1749,14 +974,9 @@ void fastInverseDST7_B32(const TCoeff *src, TCoeff *dst, int shift, int line, in _fastInverseMM< 32 >( src, dst, shift, line, iSkipLine, iSkipLine2, outputMinimum, outputMaximum, g_aiTr32[DST7][0] ); } -#endif // ********************************** DCT-VIII ********************************** -#if JVET_K1000_SIMPLIFIED_EMT void fastForwardDCT8_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2) -#else -void fastForwardDCT8_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -#endif { int i; int rnd_factor = 1 << (shift - 1); @@ -1792,11 +1012,7 @@ void fastForwardDCT8_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int } } -#if JVET_K1000_SIMPLIFIED_EMT void fastInverseDCT8_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, const TCoeff outputMinimum, const TCoeff outputMaximum) -#else -void fastInverseDCT8_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -#endif { int i; int rnd_factor = 1 << (shift - 1); @@ -1828,7 +1044,6 @@ void fastInverseDCT8_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int } -#if JVET_K1000_SIMPLIFIED_EMT void fastForwardDCT8_B8(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2) { _fastForwardMM< 8 >( src, dst, shift, line, iSkipLine, iSkipLine2, g_aiTr8[DCT8][0] ); @@ -1860,253 +1075,4 @@ void fastInverseDCT8_B32(const TCoeff *src, TCoeff *dst, int shift, int line, in { _fastInverseMM< 32 >( src, dst, shift, line, iSkipLine, iSkipLine2, outputMinimum, outputMaximum, g_aiTr32[DCT8][0] ); } -#else -void fastForwardDCT8_B8(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 8 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr8[DCT8][0] ); -} - -void fastInverseDCT8_B8(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 8 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr8[DCT8][0] ); -} - - -void fastForwardDCT8_B16(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 16 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr16[DCT8][0] ); -} - -void fastInverseDCT8_B16(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 16 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr16[DCT8][0] ); -} - - -void fastForwardDCT8_B32(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 32 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr32[DCT8][0] ); -} - -void fastInverseDCT8_B32(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 32 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr32[DCT8][0] ); -} - - -void fastForwardDCT8_B64(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 64 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr64[DCT8][0] ); -} -void fastInverseDCT8_B64(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 64 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr64[DCT8][0] ); -} - - -void fastForwardDCT8_B128(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 128 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr128[DCT8][0] ); -} - -void fastInverseDCT8_B128(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 128 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr128[DCT8][0] ); -} -#endif // JVET_K1000_SIMPLIFIED_EMT - -#if !JVET_K1000_SIMPLIFIED_EMT && !JVET_K1000_SIMPLIFIED_EMT - -// ********************************** DCT-V ********************************** -void fastForwardDCT5_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 4 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr4[DCT5][0] ); -} - -void fastInverseDCT5_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 4 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr4[DCT5][0] ); -} - - -void fastForwardDCT5_B8(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 8 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr8[DCT5][0] ); -} - -void fastInverseDCT5_B8(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 8 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr8[DCT5][0] ); -} - - -void fastForwardDCT5_B16(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 16 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr16[DCT5][0] ); -} - -void fastInverseDCT5_B16(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 16 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr16[DCT5][0] ); -} - - -void fastForwardDCT5_B32(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 32 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr32[DCT5][0] ); -} - -void fastInverseDCT5_B32(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 32 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr32[DCT5][0] ); -} - - -void fastForwardDCT5_B64(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 64 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr64[DCT5][0] ); -} - -void fastInverseDCT5_B64(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 64 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr64[DCT5][0] ); -} - - -void fastForwardDCT5_B128(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 128 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr128[DCT5][0] ); -} - -void fastInverseDCT5_B128(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 128 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr128[DCT5][0] ); -} - -// ********************************** DST-I ********************************** -void fastForwardDST1_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - int i; - int rnd_factor = 1 << (shift - 1); - - const TMatrixCoeff *iT = g_aiTr4[DST1][0]; - - int E[2], O[2]; - TCoeff *pCoeff = dst; - const int reducedLine = line - iSkipLine; - for (i = 0; i<reducedLine; i++) - { - /* E and O */ - E[0] = src[0] + src[3]; - O[0] = src[0] - src[3]; - E[1] = src[1] + src[2]; - O[1] = src[1] - src[2]; - - dst[0] = (E[0] * iT[0] + E[1] * iT[1] + rnd_factor) >> shift; - dst[line] = (O[0] * iT[1] + O[1] * iT[0] + rnd_factor) >> shift; - dst[2 * line] = (E[0] * iT[1] - E[1] * iT[0] + rnd_factor) >> shift; - dst[3 * line] = (O[0] * iT[0] - O[1] * iT[1] + rnd_factor) >> shift; - - src += 4; - dst++; - } - if (iSkipLine) - { - dst = pCoeff + reducedLine; - for (i = 0; i<4; i++) - { - memset(dst, 0, sizeof(TCoeff)*iSkipLine); - dst += line; - } - } -} - -void fastInverseDST1_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - int i; - int rnd_factor = 1 << (shift - 1); - - const TMatrixCoeff *iT = g_aiTr4[DST1][0]; - - int E[2], O[2]; - const int reducedLine = line - iSkipLine; - for (i = 0; i<reducedLine; i++) - { - /* E and O */ - E[0] = src[0 * line] + src[3 * line]; - O[0] = src[0 * line] - src[3 * line]; - E[1] = src[1 * line] + src[2 * line]; - O[1] = src[1 * line] - src[2 * line]; - - dst[0] = Clip3(outputMinimum, outputMaximum, (E[0] * iT[0] + E[1] * iT[1] + rnd_factor) >> shift); - dst[1] = Clip3(outputMinimum, outputMaximum, (O[0] * iT[1] + O[1] * iT[0] + rnd_factor) >> shift); - dst[2] = Clip3(outputMinimum, outputMaximum, (E[0] * iT[1] - E[1] * iT[0] + rnd_factor) >> shift); - dst[3] = Clip3(outputMinimum, outputMaximum, (O[0] * iT[0] - O[1] * iT[1] + rnd_factor) >> shift); - - dst += 4; - src++; - } - if (iSkipLine) - { - memset(dst, 0, (iSkipLine << 2) * sizeof(TCoeff)); - } -} - - -void fastForwardDST1_B8(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 8 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr8[DST1][0] ); -} - -void fastInverseDST1_B8(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 8 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr8[DST1][0] ); -} - - -void fastForwardDST1_B16(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 16 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr16[DST1][0] ); -} - -void fastInverseDST1_B16(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 16 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr16[DST1][0] ); -} - - -void fastForwardDST1_B32(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 32 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr32[DST1][0] ); -} - -void fastInverseDST1_B32(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 32 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr32[DST1][0] ); -} - - -void fastForwardDST1_B64(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 64 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr64[DST1][0] ); -} - -void fastInverseDST1_B64(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 64 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr64[DST1][0] ); -} - - -void fastForwardDST1_B128(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use) -{ - _fastForwardMM< 128 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, g_aiTr128[DST1][0] ); -} - -void fastInverseDST1_B128(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum) -{ - _fastInverseMM< 128 >( src, dst, shift, line, iSkipLine, iSkipLine2, use, outputMinimum, outputMaximum, g_aiTr128[DST1][0] ); -} - - -#endif diff --git a/source/Lib/CommonLib/TrQuant_EMT.h b/source/Lib/CommonLib/TrQuant_EMT.h index 8cabc8982d6d08f107df0070283c0f7d3fcabc96..4ed288c603f99f605d3a5cc28ea71a4286638939 100644 --- a/source/Lib/CommonLib/TrQuant_EMT.h +++ b/source/Lib/CommonLib/TrQuant_EMT.h @@ -40,7 +40,6 @@ #include "CommonDef.h" -#if JVET_K1000_SIMPLIFIED_EMT ////DCT-II transforms void fastForwardDCT2_B2 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2); @@ -76,27 +75,5 @@ void fastInverseDCT8_B16 (const TCoeff *src, TCoeff *dst, int shift, int line, i void fastForwardDCT8_B32 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2); void fastInverseDCT8_B32 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, const TCoeff outputMinimum, const TCoeff outputMaximum); -#else - -////DCT-II transforms -void fastForwardDCT2_B2 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use); -void fastInverseDCT2_B2 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum); -void fastForwardDCT2_B4 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use); -void fastInverseDCT2_B4 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum); -void fastForwardDCT2_B8 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use); -void fastInverseDCT2_B8 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum); -void fastForwardDCT2_B16 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use); -void fastInverseDCT2_B16 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum); -void fastForwardDCT2_B32 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use); -void fastInverseDCT2_B32 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum); -void fastForwardDCT2_B64 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use); -void fastInverseDCT2_B64 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum); -void fastForwardDCT2_B128(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use); -void fastInverseDCT2_B128(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum); - -//DST-VII transforms -void fastForwardDST7_B4 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use); -void fastInverseDST7_B4 (const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2, int use, const TCoeff outputMinimum, const TCoeff outputMaximum); -#endif // JVET_K1000_SIMPLIFIED_EMT #endif // __TRQUANT__ diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index baadfe01557fadd3984bc8ce20cf708eab4c55d9..cd9dc05cb4f110763b8b77ecdd4e41f6e72864cc 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -53,7 +53,6 @@ -#define JVET_K1000_SIMPLIFIED_EMT 1 // EMT with only DCT-2, DCT-8 and DST-7 #define JVET_K0371_ALF 1 @@ -404,20 +403,10 @@ enum QuantFlags enum TransType { DCT2 = 0, -#if JVET_K1000_SIMPLIFIED_EMT DCT8 = 1, DST7 = 2, NUM_TRANS_TYPE = 3, DCT2_EMT = 4 -#else - DCT5 = 1, - DCT8 = 2, - DST1 = 3, - DST7 = 4, - NUM_TRANS_TYPE = 5, - DCT2_HEVC = 6, - DCT2_EMT = 7 -#endif }; enum RDPCMMode diff --git a/source/Lib/CommonLib/Unit.cpp b/source/Lib/CommonLib/Unit.cpp index 05eff4c40d068e0679a55b01e5c6d75815b5ed9b..86333927d733210aad01d06e6a2984f2546acbd0 100644 --- a/source/Lib/CommonLib/Unit.cpp +++ b/source/Lib/CommonLib/Unit.cpp @@ -264,9 +264,7 @@ CodingUnit& CodingUnit::operator=( const CodingUnit& other ) qp = other.qp; chromaQpAdj = other.chromaQpAdj; rootCbf = other.rootCbf; -#if JVET_K1000_SIMPLIFIED_EMT emtFlag = other.emtFlag; -#endif #if HEVC_TILES_WPP tileIdx = other.tileIdx; #endif @@ -298,9 +296,7 @@ void CodingUnit::initData() qp = 0; chromaQpAdj = 0; rootCbf = true; -#if JVET_K1000_SIMPLIFIED_EMT emtFlag = 0; -#endif #if HEVC_TILES_WPP tileIdx = 0; #endif @@ -481,9 +477,7 @@ void TransformUnit::initData() #if ENABLE_BMS depth = 0; #endif -#if JVET_K1000_SIMPLIFIED_EMT emtIdx = 0; -#endif } @@ -520,9 +514,7 @@ TransformUnit& TransformUnit::operator=(const TransformUnit& other) #if ENABLE_BMS depth = other.depth; #endif -#if JVET_K1000_SIMPLIFIED_EMT emtIdx = other.emtIdx; -#endif return *this; } @@ -548,9 +540,7 @@ void TransformUnit::copyComponentFrom(const TransformUnit& other, const Componen #endif if( isLuma( i ) ) { -#if JVET_K1000_SIMPLIFIED_EMT emtIdx = other.emtIdx; -#endif } } diff --git a/source/Lib/CommonLib/Unit.h b/source/Lib/CommonLib/Unit.h index 3e453c722c3e1d1257b64d7f532dd4dfb80b3724..2e18f344d6b90408a0c79aec8d42b3c3cdf2e6d7 100644 --- a/source/Lib/CommonLib/Unit.h +++ b/source/Lib/CommonLib/Unit.h @@ -310,9 +310,7 @@ struct CodingUnit : public UnitArea #if HEVC_TILES_WPP uint32_t tileIdx; #endif -#if JVET_K1000_SIMPLIFIED_EMT uint8_t emtFlag; -#endif // needed for fast imv mode decisions int8_t imvNumCand; @@ -412,9 +410,7 @@ struct TransformUnit : public UnitArea #if ENABLE_BMS uint8_t depth; #endif -#if JVET_K1000_SIMPLIFIED_EMT uint8_t emtIdx; -#endif uint8_t cbf [ MAX_NUM_TBLOCKS ]; RDPCMMode rdpcm [ MAX_NUM_TBLOCKS ]; bool transformSkip[ MAX_NUM_TBLOCKS ]; diff --git a/source/Lib/CommonLib/dtrace_blockstatistics.cpp b/source/Lib/CommonLib/dtrace_blockstatistics.cpp index 2d4b045d4a7728e3408e7bf37a54a6208d4255c2..32ef7304b5e10921c94e1da23a99a92ecde1ba1a 100644 --- a/source/Lib/CommonLib/dtrace_blockstatistics.cpp +++ b/source/Lib/CommonLib/dtrace_blockstatistics.cpp @@ -311,7 +311,7 @@ void writeAllData(const CodingStructure& cs, const UnitArea& ctuArea) DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::SkipFlag), cu.skip); } -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM if (!(!((cs.sps->getSpsNext().getUseIntraEMT() && CU::isIntra(cu)) || (cs.sps->getSpsNext().getUseInterEMT() && CU::isInter(cu))) || isChroma(cu.chType))) { DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::EMTFlag), cu.emtFlag); @@ -334,7 +334,7 @@ void writeAllData(const CodingStructure& cs, const UnitArea& ctuArea) DTRACE_BLOCK_SCALAR_CHROMA(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::TransQuantBypassFlag_Chroma), cu.transQuantBypass); } -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM if (!(!((cs.sps->getSpsNext().getUseIntraEMT() && CU::isIntra(cu)) || (cs.sps->getSpsNext().getUseInterEMT() && CU::isInter(cu))) || isChroma(cu.chType))) { DTRACE_BLOCK_SCALAR_CHROMA(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::EMTFlag_Chroma), cu.emtFlag); @@ -811,7 +811,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea) if (tu.Y().valid()) { DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_CODED, tu, GetBlockStatisticName(BlockStatistic::Cbf_Y), tu.cbf[COMPONENT_Y]); -#if HM_EMT_NSST_AS_IN_JEM && JVET_K1000_SIMPLIFIED_EMT +#if HM_EMT_NSST_AS_IN_JEM if (!(!tu.cu->cs->pps->getUseTransformSkip() || tu.cu->transQuantBypass || !TU::hasTransformSkipFlag(*tu.cs, tu.blocks[COMPONENT_Y]) || (isLuma(COMPONENT_Y) && tu.cu->emtFlag))) #else if (!(!tu.cu->cs->pps->getUseTransformSkip() || tu.cu->transQuantBypass || !TU::hasTransformSkipFlag(*tu.cs, tu.blocks[COMPONENT_Y]))) @@ -824,7 +824,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea) { DTRACE_BLOCK_SCALAR_CHROMA(g_trace_ctx, D_BLOCK_STATISTICS_CODED, tu, GetBlockStatisticName(BlockStatistic::Cbf_Cb), tu.cbf[COMPONENT_Cb]); DTRACE_BLOCK_SCALAR_CHROMA(g_trace_ctx, D_BLOCK_STATISTICS_CODED, tu, GetBlockStatisticName(BlockStatistic::Cbf_Cr), tu.cbf[COMPONENT_Cr]); -#if HM_EMT_NSST_AS_IN_JEM && JVET_K1000_SIMPLIFIED_EMT +#if HM_EMT_NSST_AS_IN_JEM if (!(!tu.cu->cs->pps->getUseTransformSkip() || tu.cu->transQuantBypass || !TU::hasTransformSkipFlag(*tu.cs, tu.blocks[COMPONENT_Cb]) || (isLuma(COMPONENT_Cb) && tu.cu->emtFlag))) #else if (!(!tu.cu->cs->pps->getUseTransformSkip() || tu.cu->transQuantBypass || !TU::hasTransformSkipFlag(*tu.cs, tu.blocks[COMPONENT_Cb]))) @@ -832,7 +832,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea) { DTRACE_BLOCK_SCALAR_CHROMA(g_trace_ctx, D_BLOCK_STATISTICS_CODED, tu, GetBlockStatisticName(BlockStatistic::TransformSkipFlag_Cb), tu.transformSkip[COMPONENT_Cb]); } -#if HM_EMT_NSST_AS_IN_JEM && JVET_K1000_SIMPLIFIED_EMT +#if HM_EMT_NSST_AS_IN_JEM if (!(!tu.cu->cs->pps->getUseTransformSkip() || tu.cu->transQuantBypass || !TU::hasTransformSkipFlag(*tu.cs, tu.blocks[COMPONENT_Cr]) || (isLuma(COMPONENT_Cr) && tu.cu->emtFlag))) #else if (!(!tu.cu->cs->pps->getUseTransformSkip() || tu.cu->transQuantBypass || !TU::hasTransformSkipFlag(*tu.cs, tu.blocks[COMPONENT_Cr]))) @@ -843,7 +843,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea) } } } -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM if (!(!((cs.sps->getSpsNext().getUseIntraEMT() && CU::isIntra(cu)) || (cs.sps->getSpsNext().getUseInterEMT() && CU::isInter(cu))) || isChroma(cu.chType))) { if( isLuma( ChannelType( chType ) ) ) diff --git a/source/Lib/CommonLib/dtrace_blockstatistics.h b/source/Lib/CommonLib/dtrace_blockstatistics.h index 99d39d801fb5051250603f109b738f7455d7c1aa..2567fcc5e1b97690d6ea6bba07c8e1ab48968556 100644 --- a/source/Lib/CommonLib/dtrace_blockstatistics.h +++ b/source/Lib/CommonLib/dtrace_blockstatistics.h @@ -62,9 +62,7 @@ enum class BlockStatistic { QP, SplitSeries, TransQuantBypassFlag, -#if JVET_K1000_SIMPLIFIED_EMT EMTFlag, -#endif TransformSkipFlag_Y, TransformSkipFlag_Cb, TransformSkipFlag_Cr, @@ -115,9 +113,7 @@ enum class BlockStatistic { QP_Chroma, SplitSeries_Chroma, TransQuantBypassFlag_Chroma, -#if JVET_K1000_SIMPLIFIED_EMT EMTFlag_Chroma, // this is called flag, though the type is UChar ?! -#endif // intra IPCM_Chroma, @@ -180,9 +176,7 @@ static const std::map<BlockStatistic, std::tuple<std::string, BlockStatisticType { BlockStatistic::AffineType, std::tuple<std::string, BlockStatisticType, std::string>{"AffineType", BlockStatisticType::Flag, ""} }, #endif #endif -#if JVET_K1000_SIMPLIFIED_EMT { BlockStatistic::EMTFlag, std::tuple<std::string, BlockStatisticType, std::string>{"EMTFlag", BlockStatisticType::Flag, ""}}, -#endif // for dual tree { BlockStatistic::PartSize_Chroma, std::tuple<std::string, BlockStatisticType, std::string>{"PartSize_Chroma", BlockStatisticType::Integer, "[0, " + std::to_string(NUMBER_OF_PART_SIZES) + "]"}}, @@ -194,9 +188,7 @@ static const std::map<BlockStatistic, std::tuple<std::string, BlockStatisticType { BlockStatistic::QP_Chroma, std::tuple<std::string, BlockStatisticType, std::string>{"QP_Chroma", BlockStatisticType::Integer, "[0, 51]"}}, { BlockStatistic::SplitSeries_Chroma, std::tuple<std::string, BlockStatisticType, std::string>{"SplitSeries_Chroma", BlockStatisticType::Integer, "[0, " + std::to_string(std::numeric_limits<SplitSeries>::max()) + "]"}}, { BlockStatistic::TransQuantBypassFlag_Chroma, std::tuple<std::string, BlockStatisticType, std::string>{"TransQuantBypassFlag_Chroma", BlockStatisticType::Flag, ""}}, -#if JVET_K1000_SIMPLIFIED_EMT { BlockStatistic::EMTFlag_Chroma, std::tuple<std::string, BlockStatisticType, std::string>{"EMTFlag_Chroma", BlockStatisticType::Integer, "[0, 10]"}}, // todo: actual limits? -#endif { BlockStatistic::IPCM_Chroma, std::tuple<std::string, BlockStatisticType, std::string>{"IPCM_Chroma", BlockStatisticType::Flag, ""}}, }; diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp index 1dcf48986f954fc8702a585e37f273192e2eb751..1d218fc5ddb5394d0ed449ceb5a8ba0f6e11fbf6 100644 --- a/source/Lib/DecoderLib/CABACReader.cpp +++ b/source/Lib/DecoderLib/CABACReader.cpp @@ -1046,12 +1046,12 @@ void CABACReader::cu_residual( CodingUnit& cu, Partitioner &partitioner, CUCtx& transform_tree( *cu.cs, partitioner, cuCtx, chromaCbfs ); -#if JVET_K1000_SIMPLIFIED_EMT && !HM_EMT_NSST_AS_IN_JEM +#if !HM_EMT_NSST_AS_IN_JEM cu_emt_pertu_idx( cu ); #endif } -#if JVET_K1000_SIMPLIFIED_EMT && !HM_EMT_NSST_AS_IN_JEM +#if !HM_EMT_NSST_AS_IN_JEM void CABACReader::cu_emt_pertu_idx( CodingUnit& cu ) { bool anyCbf = false, anyNonTs = false; @@ -1529,7 +1529,7 @@ void CABACReader::transform_tree( CodingStructure &cs, Partitioner &partitioner, if( split ) { { -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM if( trDepth == 0 ) emt_cu_flag( cu ); #endif @@ -1644,7 +1644,7 @@ void CABACReader::transform_tree( CodingStructure &cs, Partitioner &partitioner, #endif } -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM #if ENABLE_BMS if( trDepth == 0 && TU::getCbfAtDepth( tu, COMPONENT_Y, 0 ) ) emt_cu_flag( cu ); #else @@ -1881,7 +1881,7 @@ void CABACReader::transform_unit_qtbt( TransformUnit& tu, CUCtx& cuCtx, ChromaCb if( tu.cbf[0] ) { -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM emt_cu_flag ( cu ); #endif residual_coding( tu, COMPONENT_Y ); @@ -1969,9 +1969,7 @@ void CABACReader::cu_chroma_qp_offset( CodingUnit& cu ) void CABACReader::residual_coding( TransformUnit& tu, ComponentID compID ) { -#if ENABLE_TRACING || HEVC_USE_SIGN_HIDING || JVET_K1000_SIMPLIFIED_EMT const CodingUnit& cu = *tu.cu; -#endif DTRACE( g_trace_ctx, D_SYNTAX, "residual_coding() etype=%d pos=(%d,%d) size=%dx%d predMode=%d\n", tu.blocks[compID].compID, tu.blocks[compID].x, tu.blocks[compID].y, tu.blocks[compID].width, tu.blocks[compID].height, cu.predMode ); // parse transform skip and explicit rdpcm mode @@ -2008,9 +2006,7 @@ void CABACReader::residual_coding( TransformUnit& tu, ComponentID compID ) #else unsigned& GRStats = m_BinDecoder.getCtx().getGRAdaptStats( TU::getGolombRiceStatisticsIndex( tu, compID ) ); #endif -#if JVET_K1000_SIMPLIFIED_EMT unsigned numSig = 0; -#endif // parse last coeff position cctx.setScanPosLast( last_sig_coeff( cctx ) ); @@ -2023,10 +2019,8 @@ void CABACReader::residual_coding( TransformUnit& tu, ComponentID compID ) cctx.setGoRiceStats( GRStats ); #endif -#if JVET_K1000_SIMPLIFIED_EMT bool useEmt = ( cu.cs->sps->getSpsNext().getUseIntraEMT() && cu.predMode == MODE_INTRA ) || ( cu.cs->sps->getSpsNext().getUseInterEMT() && cu.predMode != MODE_INTRA ); useEmt = useEmt && isLuma(compID); -#endif for( int subSetId = ( cctx.scanPosLast() >> cctx.log2CGSize() ); subSetId >= 0; subSetId--) { @@ -2036,13 +2030,11 @@ void CABACReader::residual_coding( TransformUnit& tu, ComponentID compID ) #else residual_coding_subblock( cctx, coeff ); #endif -#if JVET_K1000_SIMPLIFIED_EMT if (useEmt) { numSig += cctx.emtNumSigCoeff(); cctx.setEmtNumSigCoeff( 0 ); } -#endif } #if JVET_K0072 @@ -2050,7 +2042,7 @@ void CABACReader::residual_coding( TransformUnit& tu, ComponentID compID ) GRStats = cctx.currGoRiceStats(); #endif -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM if( useEmt && !tu.transformSkip[compID] && compID == COMPONENT_Y && tu.cu->emtFlag ) { if( CU::isIntra( *tu.cu ) ) @@ -2077,7 +2069,7 @@ void CABACReader::residual_coding( TransformUnit& tu, ComponentID compID ) void CABACReader::transform_skip_flag( TransformUnit& tu, ComponentID compID ) { -#if HM_EMT_NSST_AS_IN_JEM && JVET_K1000_SIMPLIFIED_EMT +#if HM_EMT_NSST_AS_IN_JEM if( !tu.cu->cs->pps->getUseTransformSkip() || tu.cu->transQuantBypass || !TU::hasTransformSkipFlag( *tu.cs, tu.blocks[compID] ) || ( isLuma( compID ) && tu.cu->emtFlag ) ) #else if( !tu.cu->cs->pps->getUseTransformSkip() || tu.cu->transQuantBypass || !TU::hasTransformSkipFlag( *tu.cs, tu.blocks[compID] ) ) @@ -2093,7 +2085,6 @@ void CABACReader::transform_skip_flag( TransformUnit& tu, ComponentID compID ) tu.transformSkip[compID] = tskip; } -#if JVET_K1000_SIMPLIFIED_EMT void CABACReader::emt_tu_index( TransformUnit& tu ) { int maxSizeEmtIntra, maxSizeEmtInter; @@ -2175,7 +2166,6 @@ void CABACReader::emt_cu_flag( CodingUnit& cu ) DTRACE( g_trace_ctx, D_SYNTAX, "emt_cu_flag() etype=%d pos=(%d,%d) emtCuFlag=%d\n", COMPONENT_Y, cu.lx(), cu.ly(), ( int ) cu.emtFlag ); } } -#endif void CABACReader::explicit_rdpcm_mode( TransformUnit& tu, ComponentID compID ) @@ -2419,9 +2409,7 @@ void CABACReader::residual_coding_subblock( CoeffCodingContext& cctx, TCoeff* co coeff[ sigBlkPos[k] ] = ( sumAbs & 1 ? -AbsCoeff : AbsCoeff ); } #endif -#if JVET_K1000_SIMPLIFIED_EMT cctx.setEmtNumSigCoeff( numNonZero ); -#endif } #else @@ -2634,9 +2622,7 @@ void CABACReader::residual_coding_subblock( CoeffCodingContext& cctx, TCoeff* co coeff[ sigBlkPos[k] ] = ( sumAbs & 1 ? -AbsCoeff : AbsCoeff ); } #endif -#if JVET_K1000_SIMPLIFIED_EMT cctx.setEmtNumSigCoeff( numNonZero ); -#endif } } #endif diff --git a/source/Lib/DecoderLib/CABACReader.h b/source/Lib/DecoderLib/CABACReader.h index 517753bd500d80f940f507bbf47f4663636d1bc0..5df0525b7321fd47d9c33b3d78c7a7536dd984e2 100644 --- a/source/Lib/DecoderLib/CABACReader.h +++ b/source/Lib/DecoderLib/CABACReader.h @@ -138,17 +138,15 @@ public: #endif void cu_qp_delta ( CodingUnit& cu, int predQP, int8_t& qp ); void cu_chroma_qp_offset ( CodingUnit& cu ); -#if JVET_K1000_SIMPLIFIED_EMT && !HM_EMT_NSST_AS_IN_JEM +#if !HM_EMT_NSST_AS_IN_JEM void cu_emt_pertu_idx ( CodingUnit& cu ); #endif // residual coding (clause 7.3.8.11) void residual_coding ( TransformUnit& tu, ComponentID compID ); void transform_skip_flag ( TransformUnit& tu, ComponentID compID ); -#if JVET_K1000_SIMPLIFIED_EMT void emt_tu_index ( TransformUnit& tu ); void emt_cu_flag ( CodingUnit& cu ); -#endif void explicit_rdpcm_mode ( TransformUnit& tu, ComponentID compID ); int last_sig_coeff ( CoeffCodingContext& cctx ); #if JVET_K0072 diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 581c220619ed64c348a8a439ae68a869e06acd67..5c6d9c8fa81d4b27994fc3c59bb489873c345904 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -816,10 +816,8 @@ void HLSyntaxReader::parseSPSNext( SPSNext& spsNext, const bool usePCM ) #if JVET_K0190 READ_FLAG( symbol, "lm_chroma_enabled_flag" ); spsNext.setUseLMChroma ( symbol != 0 ); #endif -#if JVET_K1000_SIMPLIFIED_EMT READ_FLAG( symbol, "emt_intra_enabled_flag" ); spsNext.setUseIntraEMT ( symbol != 0 ); READ_FLAG( symbol, "emt_inter_enabled_flag" ); spsNext.setUseInterEMT ( symbol != 0 ); -#endif #if JVET_K_AFFINE READ_FLAG( symbol, "affine_flag" ); spsNext.setUseAffine ( symbol != 0 ); #if JVET_K0337_AFFINE_6PARA diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp index d8b7a601c6449c1849af790cfb2e6b9f81043635..0e0258fc37c222e12a549b52b8f3b489505c6709 100644 --- a/source/Lib/EncoderLib/CABACWriter.cpp +++ b/source/Lib/EncoderLib/CABACWriter.cpp @@ -1034,12 +1034,12 @@ void CABACWriter::cu_residual( const CodingUnit& cu, Partitioner& partitioner, C ChromaCbfs chromaCbfs; transform_tree( *cu.cs, partitioner, cuCtx, chromaCbfs ); -#if JVET_K1000_SIMPLIFIED_EMT && !HM_EMT_NSST_AS_IN_JEM +#if !HM_EMT_NSST_AS_IN_JEM cu_emt_pertu_idx( cu ); #endif } -#if JVET_K1000_SIMPLIFIED_EMT && !HM_EMT_NSST_AS_IN_JEM +#if !HM_EMT_NSST_AS_IN_JEM void CABACWriter::cu_emt_pertu_idx( const CodingUnit& cu ) { bool anyCbf = false, anyNonTs = false; @@ -1570,7 +1570,7 @@ void CABACWriter::transform_tree( const CodingStructure& cs, Partitioner& partit chromaCbfs.Cb = TU::getCbfAtDepth( tu, COMPONENT_Cb, trDepth ); chromaCbfs.Cr = TU::getCbfAtDepth( tu, COMPONENT_Cr, trDepth ); } -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM if( trDepth == 0 ) emt_cu_flag( cu ); #endif @@ -1628,7 +1628,7 @@ void CABACWriter::transform_tree( const CodingStructure& cs, Partitioner& partit } } -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM #if ENABLE_BMS if( trDepth == 0 && TU::getCbfAtDepth( tu, COMPONENT_Y, 0 ) ) emt_cu_flag( cu ); #else @@ -1882,7 +1882,7 @@ void CABACWriter::transform_unit_qtbt( const TransformUnit& tu, CUCtx& cuCtx, Ch if( tu.cbf[0] ) { -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM emt_cu_flag( cu ); #endif residual_coding( tu, COMPONENT_Y ); @@ -1969,9 +1969,7 @@ void CABACWriter::cu_chroma_qp_offset( const CodingUnit& cu ) void CABACWriter::residual_coding( const TransformUnit& tu, ComponentID compID ) { -#if ENABLE_TRACING || HEVC_USE_SIGN_HIDING || JVET_K1000_SIMPLIFIED_EMT const CodingUnit& cu = *tu.cu; -#endif DTRACE( g_trace_ctx, D_SYNTAX, "residual_coding() etype=%d pos=(%d,%d) size=%dx%d predMode=%d\n", tu.blocks[compID].compID, tu.blocks[compID].x, tu.blocks[compID].y, tu.blocks[compID].width, tu.blocks[compID].height, cu.predMode ); // code transform skip and explicit rdpcm mode @@ -2007,9 +2005,7 @@ void CABACWriter::residual_coding( const TransformUnit& tu, ComponentID compID ) #else unsigned& GRStats = m_BinEncoder.getCtx().getGRAdaptStats( TU::getGolombRiceStatisticsIndex( tu, compID ) ); #endif -#if JVET_K1000_SIMPLIFIED_EMT unsigned numSig = 0; -#endif // determine and set last coeff position and sig group flags int scanPosLast = -1; @@ -2036,10 +2032,8 @@ void CABACWriter::residual_coding( const TransformUnit& tu, ComponentID compID ) #else cctx.setGoRiceStats( GRStats ); #endif -#if JVET_K1000_SIMPLIFIED_EMT bool useEmt = ( cu.cs->sps->getSpsNext().getUseIntraEMT() && cu.predMode == MODE_INTRA ) || ( cu.cs->sps->getSpsNext().getUseInterEMT() && cu.predMode != MODE_INTRA ); useEmt = useEmt && isLuma(compID); -#endif for( int subSetId = ( cctx.scanPosLast() >> cctx.log2CGSize() ); subSetId >= 0; subSetId--) { @@ -2050,13 +2044,11 @@ void CABACWriter::residual_coding( const TransformUnit& tu, ComponentID compID ) residual_coding_subblock( cctx, coeff ); #endif -#if JVET_K1000_SIMPLIFIED_EMT if (useEmt) { numSig += cctx.emtNumSigCoeff(); cctx.setEmtNumSigCoeff( 0 ); } -#endif } #if JVET_K0072 @@ -2064,7 +2056,7 @@ void CABACWriter::residual_coding( const TransformUnit& tu, ComponentID compID ) GRStats = cctx.currGoRiceStats(); #endif -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM if( useEmt && !tu.transformSkip[compID] && compID == COMPONENT_Y && tu.cu->emtFlag ) { if( CU::isIntra( *tu.cu ) ) @@ -2089,7 +2081,7 @@ void CABACWriter::residual_coding( const TransformUnit& tu, ComponentID compID ) void CABACWriter::transform_skip_flag( const TransformUnit& tu, ComponentID compID ) { -#if HM_EMT_NSST_AS_IN_JEM && JVET_K1000_SIMPLIFIED_EMT +#if HM_EMT_NSST_AS_IN_JEM if( !tu.cu->cs->pps->getUseTransformSkip() || tu.cu->transQuantBypass || !TU::hasTransformSkipFlag( *tu.cs, tu.blocks[compID] ) || ( isLuma( compID ) && tu.cu->emtFlag ) ) #else if( !tu.cu->cs->pps->getUseTransformSkip() || tu.cu->transQuantBypass || !TU::hasTransformSkipFlag( *tu.cs, tu.blocks[compID] ) ) @@ -2102,7 +2094,6 @@ void CABACWriter::transform_skip_flag( const TransformUnit& tu, ComponentID comp DTRACE( g_trace_ctx, D_SYNTAX, "transform_skip_flag() etype=%d pos=(%d,%d) trSkip=%d\n", compID, tu.blocks[compID].x, tu.blocks[compID].y, (int)tu.transformSkip[compID] ); } -#if JVET_K1000_SIMPLIFIED_EMT void CABACWriter::emt_tu_index( const TransformUnit& tu ) { int maxSizeEmtIntra, maxSizeEmtInter; @@ -2172,7 +2163,6 @@ void CABACWriter::emt_cu_flag( const CodingUnit& cu ) DTRACE( g_trace_ctx, D_SYNTAX, "emt_cu_flag() etype=%d pos=(%d,%d) emtCuFlag=%d\n", COMPONENT_Y, cu.lx(), cu.ly(), ( int ) cu.emtFlag ); } } -#endif @@ -2377,9 +2367,7 @@ void CABACWriter::residual_coding_subblock( CoeffCodingContext& cctx, const TCoe #else m_BinEncoder.encodeBinsEP( signPattern, numNonZero ); #endif -#if JVET_K1000_SIMPLIFIED_EMT cctx.setEmtNumSigCoeff(numNonZero); -#endif } #else diff --git a/source/Lib/EncoderLib/CABACWriter.h b/source/Lib/EncoderLib/CABACWriter.h index a8bd194ac2b286a2bcbca829fd5e90e6c87a9310..871af751eb38be1eaacf6b00f72d650af2f8ffdd 100644 --- a/source/Lib/EncoderLib/CABACWriter.h +++ b/source/Lib/EncoderLib/CABACWriter.h @@ -164,17 +164,15 @@ public: #endif void cu_qp_delta ( const CodingUnit& cu, int predQP, const int8_t qp ); void cu_chroma_qp_offset ( const CodingUnit& cu ); -#if JVET_K1000_SIMPLIFIED_EMT && !HM_EMT_NSST_AS_IN_JEM +#if !HM_EMT_NSST_AS_IN_JEM void cu_emt_pertu_idx ( const CodingUnit& cu ); #endif // residual coding (clause 7.3.8.11) void residual_coding ( const TransformUnit& tu, ComponentID compID ); void transform_skip_flag ( const TransformUnit& tu, ComponentID compID ); -#if JVET_K1000_SIMPLIFIED_EMT void emt_tu_index ( const TransformUnit& tu ); void emt_cu_flag ( const CodingUnit& cu ); -#endif void explicit_rdpcm_mode ( const TransformUnit& tu, ComponentID compID ); void last_sig_coeff ( CoeffCodingContext& cctx ); #if JVET_K0072 diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index 469c860271145e3d992f14dd39c35db53933e03e..8e5671644052777083669c43c5e64aeb30d4d7a3 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -187,12 +187,10 @@ protected: #if JVET_K0190 int m_LMChroma; #endif -#if JVET_K1000_SIMPLIFIED_EMT int m_IntraEMT; int m_InterEMT; int m_FastIntraEMT; int m_FastInterEMT; -#endif bool m_LargeCTU; #if JVET_K0346 int m_SubPuMvpMode; @@ -661,7 +659,6 @@ public: bool getUseAltDQPCoding () const { return m_AltDQPCoding; } #endif -#if JVET_K1000_SIMPLIFIED_EMT void setFastIntraEMT ( bool b ) { m_FastIntraEMT = b; } bool getFastIntraEMT () const { return m_FastIntraEMT; } void setFastInterEMT ( bool b ) { m_FastInterEMT = b; } @@ -670,7 +667,6 @@ public: bool getIntraEMT () const { return m_IntraEMT; } void setInterEMT ( bool b ) { m_InterEMT = b; } bool getInterEMT () const { return m_InterEMT; } -#endif diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp index 2a4af3ff363a48d7c6d9511b66c49c502c7e1a90..1bc5b7f42e5c6d88c70cc873928dd58d35db2aa9 100644 --- a/source/Lib/EncoderLib/EncCu.cpp +++ b/source/Lib/EncoderLib/EncCu.cpp @@ -1132,37 +1132,26 @@ void EncCu::xCheckModeSplit(CodingStructure *&tempCS, CodingStructure *&bestCS, void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &partitioner, const EncTestMode& encTestMode ) { -#if JVET_K1000_SIMPLIFIED_EMT double bestInterCost = m_modeCtrl->getBestInterCost(); double costSize2Nx2NemtFirstPass = m_modeCtrl->getEmtSize2Nx2NFirstPassCost(); double costSizeNxNemtFirstPass = MAX_DOUBLE; bool skipSecondEmtPass = m_modeCtrl->getSkipSecondEMTPass(); const SPS &sps = *tempCS->sps; -#endif const PPS &pps = *tempCS->pps; const CodingUnit *bestCU = bestCS->getCU( partitioner.chType ); -#if JVET_K1000_SIMPLIFIED_EMT const int maxSizeEMT = pps.pcv->noRQT ? EMT_INTRA_MAX_CU_WITH_QTBT : EMT_INTRA_MAX_CU; -#endif -#if JVET_K1000_SIMPLIFIED_EMT #if HM_EMT_NSST_AS_IN_JEM uint8_t considerEmtSecondPass = ( sps.getSpsNext().getUseIntraEMT() && isLuma( partitioner.chType ) && partitioner.currArea().lwidth() <= maxSizeEMT && partitioner.currArea().lheight() <= maxSizeEMT ) ? 1 : 0; #else uint8_t considerEmtSecondPass = ( sps.getSpsNext().getUseIntraEMT() && isLuma( partitioner.chType ) && partitioner.currArea().lwidth() <= maxSizeEMT && partitioner.currArea().lheight() <= maxSizeEMT && nsstIdx == 0 ) ? 1 : 0; -#endif #endif Distortion interHad = m_modeCtrl->getInterHad(); -#if JVET_K1000_SIMPLIFIED_EMT for( uint8_t emtCuFlag = 0; emtCuFlag <= considerEmtSecondPass; emtCuFlag++ ) -#else - for( uint8_t numPasses = 0; numPasses < 1; numPasses++ ) -#endif { -#if JVET_K1000_SIMPLIFIED_EMT //Possible early EMT tests interruptions #if !JVET_K0220_ENC_CTRL //1) saveLoadTag code for EMT @@ -1179,7 +1168,6 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC { continue; } -#endif //3) if interHad is 0, only try further modes if some intra mode was already better than inter if( m_pcEncCfg->getUsePbIntraFast() && !tempCS->slice->isIntra() && bestCU && CU::isInter( *bestCS->getCU( partitioner.chType ) ) && interHad == 0 ) { @@ -1202,9 +1190,7 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC cu.chromaQpAdj = cu.transQuantBypass ? 0 : m_cuChromaQpOffsetIdxPlus1; cu.qp = encTestMode.qp; //cu.ipcm = false; -#if JVET_K1000_SIMPLIFIED_EMT cu.emtFlag = emtCuFlag; -#endif CU::addPUs( cu ); @@ -1277,10 +1263,8 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC xCheckDQP( *tempCS, partitioner ); -#if JVET_K1000_SIMPLIFIED_EMT // we save the cost of the modes for the first EMT pass if( !emtCuFlag ) static_cast< double& >( cu.partSize == SIZE_2Nx2N ? costSize2Nx2NemtFirstPass : costSizeNxNemtFirstPass ) = tempCS->cost; -#endif #if WCG_EXT DTRACE_MODE_COST( *tempCS, m_pcRdCost->getLambda( true ) ); @@ -1290,7 +1274,6 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC xCheckBestMode( tempCS, bestCS, partitioner, encTestMode ); -#if JVET_K1000_SIMPLIFIED_EMT //now we check whether the second pass of SIZE_2Nx2N and the whole Intra SIZE_NxN should be skipped or not #if JVET_K0220_ENC_CTRL if( !emtCuFlag && !tempCS->slice->isIntra() && bestCU && bestCU->predMode != MODE_INTRA && cu.partSize == SIZE_2Nx2N && m_pcEncCfg->getFastInterEMT() ) @@ -1307,7 +1290,6 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC } } -#endif } //for emtCuFlag } @@ -1671,9 +1653,7 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *& #if JVET_K0357_AMVR , NULL #endif -#if JVET_K1000_SIMPLIFIED_EMT , 1 -#endif , uiNoResidualPass == 0 ? &candHasNoResidual[uiMergeCand] : NULL ); if( m_pcEncCfg->getUseFastDecisionForMerge() && !bestIsSkip ) @@ -1778,9 +1758,7 @@ void EncCu::xCheckRDCostAffineMerge2Nx2N( CodingStructure *&tempCS, CodingStruct #if JVET_K0357_AMVR , NULL #endif -#if JVET_K1000_SIMPLIFIED_EMT , 1 -#endif , &hasNoResidual); if( ! (encTestMode.lossless || hasNoResidual) ) @@ -1793,9 +1771,7 @@ void EncCu::xCheckRDCostAffineMerge2Nx2N( CodingStructure *&tempCS, CodingStruct #if JVET_K0357_AMVR , NULL #endif -#if JVET_K1000_SIMPLIFIED_EMT , 1 -#endif , &hasNoResidual); } } @@ -1833,9 +1809,7 @@ void EncCu::xCheckRDCostInter( CodingStructure *&tempCS, CodingStructure *&bestC #if JVET_K0357_AMVR , m_pImvTempCS ? m_pImvTempCS[wIdx][encTestMode.partSize] : NULL #endif -#if JVET_K1000_SIMPLIFIED_EMT , 1 -#endif , 0 ); @@ -1905,9 +1879,7 @@ bool EncCu::xCheckRDCostInterIMV( CodingStructure *&tempCS, CodingStructure *&be } cu.imv = iIMV > 1 ? 2 : 1; -#if JVET_K1000_SIMPLIFIED_EMT cu.emtFlag = false; -#endif if( pcCUInfo2Reuse != nullptr ) @@ -1944,9 +1916,7 @@ bool EncCu::xCheckRDCostInterIMV( CodingStructure *&tempCS, CodingStructure *&be #if JVET_K0357_AMVR , NULL #endif -#if JVET_K1000_SIMPLIFIED_EMT , true -#endif , 0 ); @@ -1958,9 +1928,7 @@ void EncCu::xEncodeInterResidual( CodingStructure *&tempCS, CodingStructure *&be #if JVET_K0357_AMVR , CodingStructure* imvCS #endif -#if JVET_K1000_SIMPLIFIED_EMT , int emtMode -#endif , bool* bestHasNonResi ) { @@ -1971,7 +1939,6 @@ void EncCu::xEncodeInterResidual( CodingStructure *&tempCS, CodingStructure *&be CodingUnit* cu = tempCS->getCU( partitioner.chType ); double bestCostInternal = MAX_DOUBLE; -#if JVET_K1000_SIMPLIFIED_EMT double bestCost = bestCS->cost; const SPS& sps = *tempCS->sps; const int maxSizeEMT = tempCS->pcv->noRQT ? EMT_INTER_MAX_CU_WITH_QTBT : EMT_INTER_MAX_CU; @@ -1988,9 +1955,7 @@ void EncCu::xEncodeInterResidual( CodingStructure *&tempCS, CodingStructure *&be } for( int curEmtMode = minEMTMode; curEmtMode <= maxEMTMode; curEmtMode++ ) -#endif { -#if JVET_K1000_SIMPLIFIED_EMT if( reloadCU ) { if( bestCost == bestCS->cost ) //The first EMT pass didn't become the bestCS, so we clear the TUs generated @@ -2020,11 +1985,8 @@ void EncCu::xEncodeInterResidual( CodingStructure *&tempCS, CodingStructure *&be } reloadCU = true; // enable cu reloading -#endif cu->skip = false; -#if JVET_K1000_SIMPLIFIED_EMT cu->emtFlag = curEmtMode; -#endif const bool skipResidual = residualPass == 1; m_pcInterSearch->encodeResAndCalcRdInterCU( *tempCS, partitioner, skipResidual ); @@ -2034,9 +1996,7 @@ void EncCu::xEncodeInterResidual( CodingStructure *&tempCS, CodingStructure *&be xCheckDQP( *tempCS, partitioner ); -#if JVET_K1000_SIMPLIFIED_EMT double emtFirstPassCost = tempCS->cost; -#endif #if JVET_K0357_AMVR if( imvCS && (tempCS->cost < imvCS->cost) ) { @@ -2060,7 +2020,6 @@ void EncCu::xEncodeInterResidual( CodingStructure *&tempCS, CodingStructure *&be #endif xCheckBestMode( tempCS, bestCS, partitioner, encTestMode ); -#if JVET_K1000_SIMPLIFIED_EMT //now we check whether the second pass should be skipped or not if( !curEmtMode && maxEMTMode ) { @@ -2074,7 +2033,6 @@ void EncCu::xEncodeInterResidual( CodingStructure *&tempCS, CodingStructure *&be maxEMTMode = 0; // do not test EMT } } -#endif } //end emt loop } diff --git a/source/Lib/EncoderLib/EncCu.h b/source/Lib/EncoderLib/EncCu.h index 101a62b582b961f3a1fc883fcfbdf683ef8117a7..221f1a8af29819e816f6ce3545fe9050b3e98dc3 100644 --- a/source/Lib/EncoderLib/EncCu.h +++ b/source/Lib/EncoderLib/EncCu.h @@ -204,9 +204,7 @@ protected: #if JVET_K0357_AMVR , CodingStructure* imvCS = NULL #endif -#if JVET_K1000_SIMPLIFIED_EMT , int emtMode = 1 -#endif , bool* bestHasNonResi = NULL ); #if REUSE_CU_RESULTS diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index ef8faf8eee0fc38bf8167918713f44e32e61a35f..d29afcba0ec7a00ecd83cd65f1ae124f83a3ceb7 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -913,10 +913,8 @@ void EncLib::xInitSPS(SPS &sps) #if ENABLE_WPP_PARALLELISM sps.getSpsNext().setUseNextDQP ( m_AltDQPCoding ); #endif -#if JVET_K1000_SIMPLIFIED_EMT sps.getSpsNext().setUseIntraEMT ( m_IntraEMT ); sps.getSpsNext().setUseInterEMT ( m_InterEMT ); -#endif #if JVET_K0157 sps.getSpsNext().setUseCompositeRef ( m_compositeRefEnabled ); #endif diff --git a/source/Lib/EncoderLib/EncModeCtrl.cpp b/source/Lib/EncoderLib/EncModeCtrl.cpp index fe31700e99eb2ae6fe31e32b6a8bba3110584602..8bd35331fb0aa4ba9d4d52c16a8c37fa76bcbcc7 100644 --- a/source/Lib/EncoderLib/EncModeCtrl.cpp +++ b/source/Lib/EncoderLib/EncModeCtrl.cpp @@ -1858,10 +1858,8 @@ bool EncModeCtrlMTnoRQT::tryMode( const EncTestMode& encTestmode, const CodingSt { } -#if JVET_K1000_SIMPLIFIED_EMT sls.emtCuFlag = bestCU->emtFlag; sls.emtTuIndex = bestCU->firstTU->emtIdx; //since this is the QTBT path, there is only one TU -#endif sls.tag = LOAD_ENC_INFO; CHECK( sls.partIdx != cuECtx.partIdx, "partidx is not consistent" ); @@ -1901,7 +1899,6 @@ bool EncModeCtrlMTnoRQT::useModeResult( const EncTestMode& encTestmode, CodingSt { cuECtx.set( BEST_TRIV_SPLIT_COST, tempCS->cost ); } -#if JVET_K1000_SIMPLIFIED_EMT else if( encTestmode.type == ETM_INTRA && encTestmode.partSize == SIZE_2Nx2N ) { const CodingUnit cu = *tempCS->getCU( partitioner.chType ); @@ -1911,7 +1908,6 @@ bool EncModeCtrlMTnoRQT::useModeResult( const EncTestMode& encTestmode, CodingSt cuECtx.bestEmtSize2Nx2N1stPass = tempCS->cost; } } -#endif #if JVET_K0357_AMVR if( m_pcEncCfg->getIMV4PelFast() && m_pcEncCfg->getIMV() && encTestmode.type == ETM_INTER_ME ) diff --git a/source/Lib/EncoderLib/EncModeCtrl.h b/source/Lib/EncoderLib/EncModeCtrl.h index 12fd159c5f840d80c6ceae961b95d7b776c32409..0c4e0eae1dd5dca9f63a393581ff48b959e508f3 100644 --- a/source/Lib/EncoderLib/EncModeCtrl.h +++ b/source/Lib/EncoderLib/EncModeCtrl.h @@ -189,12 +189,10 @@ struct ComprCUCtx , extraFeatures ( ) , extraFeaturesd( ) , bestInterCost ( MAX_DOUBLE ) -#if JVET_K1000_SIMPLIFIED_EMT , bestEmtSize2Nx2N1stPass ( MAX_DOUBLE ) , skipSecondEMTPass ( false ) -#endif #if DISTORTION_TYPE_BUGFIX , interHad (std::numeric_limits<Distortion>::max()) #else @@ -227,10 +225,8 @@ struct ComprCUCtx static_vector<int64_t, 30> extraFeatures; static_vector<double, 30> extraFeaturesd; double bestInterCost; -#if JVET_K1000_SIMPLIFIED_EMT double bestEmtSize2Nx2N1stPass; bool skipSecondEMTPass; -#endif Distortion interHad; #if ENABLE_SPLIT_PARALLELISM bool isLevelSplitParallel; @@ -314,11 +310,9 @@ public: double getBestInterCost () const { return m_ComprCUCtxList.back().bestInterCost; } Distortion getInterHad () const { return m_ComprCUCtxList.back().interHad; } void enforceInterHad ( Distortion had ) { m_ComprCUCtxList.back().interHad = had; } -#if JVET_K1000_SIMPLIFIED_EMT double getEmtSize2Nx2NFirstPassCost () const { return m_ComprCUCtxList.back().bestEmtSize2Nx2N1stPass; } bool getSkipSecondEMTPass () const { return m_ComprCUCtxList.back().skipSecondEMTPass; } void setSkipSecondEMTPass ( bool b ) { m_ComprCUCtxList.back().skipSecondEMTPass = b; } -#endif protected: void xExtractFeatures ( const EncTestMode encTestmode, CodingStructure& cs ); diff --git a/source/Lib/EncoderLib/InterSearch.cpp b/source/Lib/EncoderLib/InterSearch.cpp index a8e602c8d97aade1779d9dd748ae1b33d4224780..fdd0543b42ea11261e2dc997df3683c0dd80cf4c 100644 --- a/source/Lib/EncoderLib/InterSearch.cpp +++ b/source/Lib/EncoderLib/InterSearch.cpp @@ -4521,9 +4521,7 @@ void InterSearch::xEstimateInterResidualQT(CodingStructure &cs, Partitioner &par #if ENABLE_BMS tu.depth = currDepth; #endif -#if JVET_K1000_SIMPLIFIED_EMT tu.emtIdx = 0; -#endif double minCost [MAX_NUM_TBLOCKS]; bool checkTransformSkip [MAX_NUM_TBLOCKS]; @@ -4558,12 +4556,10 @@ void InterSearch::xEstimateInterResidualQT(CodingStructure &cs, Partitioner &par } checkTransformSkip[compID] = pps.getUseTransformSkip() && TU::hasTransformSkipFlag( *tu.cs, tu.blocks[compID] ) && !cs.isLossless; -#if JVET_K1000_SIMPLIFIED_EMT if( isLuma(compID) ) { checkTransformSkip[compID] &= !tu.cu->emtFlag; } -#endif const bool isCrossCPredictionAvailable = TU::hasCrossCompPredInfo( tu, compID ); @@ -4577,12 +4573,8 @@ void InterSearch::xEstimateInterResidualQT(CodingStructure &cs, Partitioner &par } const int crossCPredictionModesToTest = preCalcAlpha != 0 ? 2 : 1; -#if JVET_K1000_SIMPLIFIED_EMT const int numEmtTransformCandidates = isLuma(compID) && tu.cu->emtFlag && sps.getSpsNext().getUseInterEMT() ? 4 : 1; const int numTransformCandidates = checkTransformSkip[compID] ? ( numEmtTransformCandidates + 1 ) : numEmtTransformCandidates; -#else - const int numTransformCandidates = checkTransformSkip[compID] ? 2 : 1; -#endif int lastTransformModeIndex = numTransformCandidates - 1; //lastTransformModeIndex is the mode for transformSkip (if transformSkip is active) const bool isOneMode = crossCPredictionModesToTest == 1 && numTransformCandidates == 1; @@ -4601,9 +4593,7 @@ void InterSearch::xEstimateInterResidualQT(CodingStructure &cs, Partitioner &par m_CABACEstimator->getCtx() = ctxStart; m_CABACEstimator->resetBits(); -#if JVET_K1000_SIMPLIFIED_EMT if( isLuma( compID ) ) tu.emtIdx = transformMode; -#endif tu.transformSkip[compID] = checkTransformSkip[compID] && transformMode == lastTransformModeIndex; tu.compAlpha[compID] = bUseCrossCPrediction ? preCalcAlpha : 0; @@ -4878,12 +4868,10 @@ void InterSearch::xEstimateInterResidualQT(CodingStructure &cs, Partitioner &par ); csSplit->cost = m_pcRdCost->calcRdCost( csSplit->fracBits, csSplit->dist ); -#if JVET_K1000_SIMPLIFIED_EMT if( csFull && csSplit->cost >= csFull->cost && m_pcEncCfg->getFastInterEMT() ) { break; } -#endif } while( partitioner.nextPart( *csSplit ) ); partitioner.exitCurrSplit(); @@ -4891,12 +4879,8 @@ void InterSearch::xEstimateInterResidualQT(CodingStructure &cs, Partitioner &par unsigned anyCbfSet = 0; unsigned compCbf[3] = { 0, 0, 0 }; -#if JVET_K1000_SIMPLIFIED_EMT bool isSplit = bCheckFull ? false : true; if( !bCheckFull || ( csSplit->cost < csFull->cost && m_pcEncCfg->getFastInterEMT() ) || !m_pcEncCfg->getFastInterEMT() ) -#else - if( !bCheckFull ) -#endif { for( auto &currTU : csSplit->traverseTUs( currArea, partitioner.chType ) ) { @@ -4943,17 +4927,11 @@ void InterSearch::xEstimateInterResidualQT(CodingStructure &cs, Partitioner &par { cs.useSubStructure( *csSplit, partitioner.chType, currArea, false, false, false, true ); cs.cost = csSplit->cost; -#if JVET_K1000_SIMPLIFIED_EMT isSplit = true; -#endif } } -#if JVET_K1000_SIMPLIFIED_EMT if( ( !isSplit && m_pcEncCfg->getFastInterEMT() ) || ( !m_pcEncCfg->getFastInterEMT() && !( !bCheckFull || ( anyCbfSet && csSplit->cost < csFull->cost ) ) ) ) -#else - if( !( !bCheckFull || ( anyCbfSet && csSplit->cost < csFull->cost ) ) ) -#endif { CHECK( !bCheckFull, "Error!" ); cs.useSubStructure( *csFull, partitioner.chType, currArea, false, false, false, true ); diff --git a/source/Lib/EncoderLib/IntraSearch.cpp b/source/Lib/EncoderLib/IntraSearch.cpp index eb8519e79dbe930bd7cc2d13f507cce82b8e21ce..8d7e81d727b5f6f2b6e9b893f94fcad73e5be9d8 100644 --- a/source/Lib/EncoderLib/IntraSearch.cpp +++ b/source/Lib/EncoderLib/IntraSearch.cpp @@ -296,7 +296,6 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner ) uint32_t extraModes = 0; // add two extra modes, which would be used after uiMode <= DC_IDX is removed for cu.nsstIdx == 3 -#if JVET_K1000_SIMPLIFIED_EMT const int width = partitioner.currArea().lwidth(); const int height = partitioner.currArea().lheight(); @@ -331,7 +330,6 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner ) } #if !JVET_K0220_ENC_CTRL NSSTLoadFlag &= !(m_pcEncCfg->getNSST() && m_pcEncCfg->getUseSaveLoadEncInfo() && (LOAD_ENC_INFO == slsCtrl->getSaveLoadTag(cu))); -#endif #endif static_vector<uint32_t, FAST_UDI_MAX_RDMODE_NUM> uiHadModeList; @@ -339,9 +337,7 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner ) static_vector<double, FAST_UDI_MAX_RDMODE_NUM> CandHadList; auto &pu = *cu.firstPU; -#if JVET_K1000_SIMPLIFIED_EMT int puIndex = 0; -#endif { CandHadList.clear(); CandCostList.clear(); @@ -372,9 +368,7 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner ) #endif -#if JVET_K1000_SIMPLIFIED_EMT if( emtUsageFlag != 2 ) -#endif { // this should always be true CHECK( !pu.Y().valid(), "PU is not valid" ); @@ -528,16 +522,13 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner ) uiRdModeList.push_back( i ); } } -#if JVET_K1000_SIMPLIFIED_EMT if( emtUsageFlag == 1 ) { // Store the modes to be checked with RD m_savedNumRdModes[puIndex] = numModesForFullRD; std::copy_n( uiRdModeList.begin(), numModesForFullRD, m_savedRdModeList[puIndex] ); } -#endif } -#if JVET_K1000_SIMPLIFIED_EMT else //emtUsage = 2 (here we potentially reduce the number of modes that will be full-RD checked) { if( isAllIntra && m_pcEncCfg->getFastIntraEMT() ) @@ -579,7 +570,6 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner ) std::copy_n( m_savedRdModeList[puIndex], m_savedNumRdModes[puIndex], uiRdModeList.begin() ); } } -#endif CHECK( numModesForFullRD != uiRdModeList.size(), "Inconsistent state!" ); @@ -587,11 +577,7 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner ) // after this point, don't use numModesForFullRD // PBINTRA fast -#if JVET_K1000_SIMPLIFIED_EMT if( m_pcEncCfg->getUsePbIntraFast() && !cs.slice->isIntra() && cu.partSize == SIZE_2Nx2N && uiRdModeList.size() < numModesAvailable && emtUsageFlag != 2 ) -#else - if( m_pcEncCfg->getUsePbIntraFast() && !cs.slice->isIntra() && cu.partSize == SIZE_2Nx2N && uiRdModeList.size() < numModesAvailable ) -#endif { if( CandHadList.size() < 3 || CandHadList[2] > cs.interHad * PBINTRA_RATIO ) { @@ -650,12 +636,10 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner ) xRecurIntraCodingLumaQT( *csTemp, partitioner ); -#if JVET_K1000_SIMPLIFIED_EMT if( emtUsageFlag == 1 && m_pcEncCfg->getFastIntraEMT() ) { m_modeCostStore[puIndex][uiMode] = csTemp->cost; //cs.cost; } -#endif DTRACE( g_trace_ctx, D_INTRA_COST, "IntraCost T %f (%d) \n", csTemp->cost, uiOrgMode ); @@ -672,12 +656,10 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner ) #endif uiBestPUMode = uiOrgMode; -#if JVET_K1000_SIMPLIFIED_EMT if( ( emtUsageFlag == 1 ) && m_pcEncCfg->getFastIntraEMT() ) { m_bestModeCostStore[puIndex] = csBest->cost; //cs.cost; } -#endif } #if ENABLE_RQT_INTRA_SPEEDUP_MOD else if( csTemp->cost < dSecondBestPUCost ) @@ -967,7 +949,7 @@ void IntraSearch::xEncSubdivCbfQT(CodingStructure &cs, Partitioner &partitioner, { const UnitArea &currArea = partitioner.currArea(); TransformUnit &currTU = *cs.getTU( currArea.blocks[partitioner.chType], partitioner.chType ); -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM CodingUnit &currCU = *currTU.cu; #endif #if ENABLE_BMS @@ -1021,7 +1003,7 @@ void IntraSearch::xEncSubdivCbfQT(CodingStructure &cs, Partitioner &partitioner, #if ENABLE_BMS if (subdiv) { -#if JVET_K1000_SIMPLIFIED_EMT && HM_EMT_NSST_AS_IN_JEM +#if HM_EMT_NSST_AS_IN_JEM if( currDepth == 0 && bLuma ) m_CABACEstimator->emt_cu_flag( currCU ); #endif @@ -1044,7 +1026,7 @@ void IntraSearch::xEncSubdivCbfQT(CodingStructure &cs, Partitioner &partitioner, else #endif { -#if HM_EMT_NSST_AS_IN_JEM && JVET_K1000_SIMPLIFIED_EMT +#if HM_EMT_NSST_AS_IN_JEM #if ENABLE_BMS if( currDepth == 0 && bLuma && TU::getCbfAtDepth( currTU, COMPONENT_Y, 0 ) ) m_CABACEstimator->emt_cu_flag( currCU ); #else @@ -1174,9 +1156,7 @@ void IntraSearch::xIntraCodingTUBlock(TransformUnit &tu, const ComponentID &comp const bool bUseCrossCPrediction = pps.getPpsRangeExtension().getCrossComponentPredictionEnabledFlag() && isChroma( compID ) && PU::isChromaIntraModeCrossCheckMode( pu ) && checkCrossCPrediction; const bool ccUseRecoResi = m_pcEncCfg->getUseReconBasedCrossCPredictionEstimate(); -#if JVET_K1000_SIMPLIFIED_EMT const uint8_t transformIndex = tu.cu->emtFlag && compID == COMPONENT_Y ? tu.emtIdx : DCT2_EMT ; -#endif //===== init availability pattern ===== PelBuf sharedPredTS( m_pSharedPredTransformSkip[compID], area ); @@ -1252,12 +1232,7 @@ void IntraSearch::xIntraCodingTUBlock(TransformUnit &tu, const ComponentID &comp m_pcTrQuant->transformNxN(tu, compID, cQP, uiAbsSum, m_CABACEstimator->getCtx()); -#if JVET_K1000_SIMPLIFIED_EMT -#if JVET_K1000_SIMPLIFIED_EMT if( transformIndex != DCT2_EMT && ( !tu.transformSkip[COMPONENT_Y] ) ) //this can only be true if compID is luma -#else - if( transformIndex != DCT2_EMT && transformIndex != DCT2_HEVC && ( !tu.transformSkip[COMPONENT_Y] ) ) //this can only be true if compID is luma -#endif { *numSig = 0; TCoeff* coeffBuffer = tu.getCoeffs(compID).buf; @@ -1278,7 +1253,6 @@ void IntraSearch::xIntraCodingTUBlock(TransformUnit &tu, const ComponentID &comp return; } } -#endif DTRACE( g_trace_ctx, D_TU_ABS_SUM, "%d: comp=%d, abssum=%d\n", DTRACE_GET_COUNTER( g_trace_ctx, D_TU_ABS_SUM ), compID, uiAbsSum ); @@ -1346,14 +1320,8 @@ void IntraSearch::xRecurIntraCodingLumaQT( CodingStructure &cs, Partitioner &par uint64_t singleFracBits = 0; bool checkTransformSkip = pps.getUseTransformSkip(); int bestModeId[MAX_NUM_COMPONENT] = {0, 0, 0}; -#if JVET_K1000_SIMPLIFIED_EMT uint8_t nNumTransformCands = cu.emtFlag ? 4 : 1; //4 is the number of transforms of emt -#else - uint8_t nNumTransformCands = 1; -#endif -#if JVET_K1000_SIMPLIFIED_EMT bool isAllIntra = m_pcEncCfg->getIntraPeriod() == 1; -#endif uint8_t numTransformIndexCands = nNumTransformCands; @@ -1387,9 +1355,7 @@ void IntraSearch::xRecurIntraCodingLumaQT( CodingStructure &cs, Partitioner &par checkTransformSkip &= TU::hasTransformSkipFlag( *tu.cs, tu.Y() ); checkTransformSkip &= !cu.transQuantBypass; -#if JVET_K1000_SIMPLIFIED_EMT checkTransformSkip &= !cu.emtFlag; -#endif CHECK( !tu.Y().valid(), "Invalid TU" ); @@ -1421,9 +1387,7 @@ void IntraSearch::xRecurIntraCodingLumaQT( CodingStructure &cs, Partitioner &par tmpTU = &saveCS.addTU(currArea, partitioner.chType); } -#if JVET_K1000_SIMPLIFIED_EMT bool cbfBestMode = false; -#endif for( int modeId = firstCheckId; modeId <= lastCheckId; modeId++ ) @@ -1437,12 +1401,9 @@ void IntraSearch::xRecurIntraCodingLumaQT( CodingStructure &cs, Partitioner &par } } -#if JVET_K1000_SIMPLIFIED_EMT uint8_t transformIndex = modeId; -#endif -#if JVET_K1000_SIMPLIFIED_EMT if( ( transformIndex < lastCheckId ) || ( ( transformIndex == lastCheckId ) && !checkTransformSkip ) ) //we avoid this if the mode is transformSkip { // Skip checking other transform candidates if zero CBF is encountered and it is the best transform so far @@ -1458,7 +1419,6 @@ void IntraSearch::xRecurIntraCodingLumaQT( CodingStructure &cs, Partitioner &par } #endif } -#endif if ((modeId != firstCheckId) && isNotOnlyOneMode) { @@ -1477,12 +1437,10 @@ void IntraSearch::xRecurIntraCodingLumaQT( CodingStructure &cs, Partitioner &par default0Save1Load2 = 2; } -#if JVET_K1000_SIMPLIFIED_EMT if (cu.emtFlag) { tu.emtIdx = transformIndex; } -#endif if( !checkTransformSkip ) { tu.transformSkip[COMPONENT_Y] = false; @@ -1496,20 +1454,12 @@ void IntraSearch::xRecurIntraCodingLumaQT( CodingStructure &cs, Partitioner &par //----- determine rate and r-d cost ----- //the condition (transformIndex != DCT2_EMT) seems to be irrelevant, since DCT2_EMT=7 and the highest value of transformIndex is 4 -#if JVET_K1000_SIMPLIFIED_EMT #if ENABLE_BMS if( ( modeId == lastCheckId && checkTransformSkip && !TU::getCbfAtDepth( tu, COMPONENT_Y, currDepth ) ) || ( tu.emtIdx > 0 && ( checkTransformSkip ? transformIndex != lastCheckId : true ) && tu.emtIdx != DCT2_EMT && numSig <= g_EmtSigNumThr ) ) #else if( ( modeId == lastCheckId && checkTransformSkip && !TU::getCbf( tu, COMPONENT_Y ) ) || ( tu.emtIdx > 0 && ( checkTransformSkip ? transformIndex != lastCheckId : true ) && tu.emtIdx != DCT2_EMT && numSig <= g_EmtSigNumThr ) ) -#endif -#else -#if ENABLE_BMS - if( ( modeId == lastCheckId && checkTransformSkip && !TU::getCbfAtDepth( tu, COMPONENT_Y, currDepth ) ) ) -#else - if( ( modeId == lastCheckId && checkTransformSkip && !TU::getCbf( tu, COMPONENT_Y ) ) ) -#endif #endif { //In order not to code TS flag when cbf is zero, the case for TS with cbf being zero is forbidden. @@ -1528,13 +1478,11 @@ void IntraSearch::xRecurIntraCodingLumaQT( CodingStructure &cs, Partitioner &par singleFracBits = singleTmpFracBits; bestModeId[COMPONENT_Y] = modeId; -#if JVET_K1000_SIMPLIFIED_EMT #if ENABLE_BMS cbfBestMode = TU::getCbfAtDepth( tu, COMPONENT_Y, currDepth ); #else cbfBestMode = TU::getCbf( tu, COMPONENT_Y ); #endif -#endif if( bestModeId[COMPONENT_Y] != lastCheckId ) diff --git a/source/Lib/EncoderLib/IntraSearch.h b/source/Lib/EncoderLib/IntraSearch.h index 90e9fd2636eee2320fba6cef72ede5b9eaae2ac0..df9b32895d6863179d67cc04b63516f5ba0b15d3 100644 --- a/source/Lib/EncoderLib/IntraSearch.h +++ b/source/Lib/EncoderLib/IntraSearch.h @@ -77,13 +77,11 @@ private: CodingStructure **m_pSaveCS; -#if JVET_K1000_SIMPLIFIED_EMT //cost variables for the EMT algorithm and new modes list double m_bestModeCostStore[4]; // RD cost of the best mode for each PU using DCT2 double m_modeCostStore [4][NUM_LUMA_MODE]; // RD cost of each mode for each PU using DCT2 uint32_t m_savedRdModeList [4][NUM_LUMA_MODE], m_savedNumRdModes[4]; -#endif protected: // interface to option EncCfg* m_pcEncCfg; diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 9a63d03636d2bf261dc7842fd32118a446ce8f31..64386a010c4c510afd96f4f88495189994779735 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -556,10 +556,8 @@ void HLSWriter::codeSPSNext( const SPSNext& spsNext, const bool usePCM ) #if JVET_K0190 WRITE_FLAG( spsNext.getUseLMChroma() ? 1 : 0, "lm_chroma_enabled_flag" ); #endif -#if JVET_K1000_SIMPLIFIED_EMT WRITE_FLAG( spsNext.getUseIntraEMT() ? 1 : 0, "emt_intra_enabled_flag" ); WRITE_FLAG( spsNext.getUseInterEMT() ? 1 : 0, "emt_inter_enabled_flag" ); -#endif #if JVET_K_AFFINE WRITE_FLAG( spsNext.getUseAffine() ? 1 : 0, "affine_flag" ); #if JVET_K0337_AFFINE_6PARA