Changeset 56 in 3DVCSoftware for trunk/source/Lib/TLibCommon/TComTrQuant.cpp


Ignore:
Timestamp:
11 May 2012, 21:20:17 (12 years ago)
Author:
hschwarz
Message:

updated trunk (move to HM6.1)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/Lib/TLibCommon/TComTrQuant.cpp

    r5 r56  
    22 * License, included below. This software may be subject to other third party
    33 * and contributor rights, including patent rights, and no such rights are
    4  * granted under this license.
     4 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2011, ISO/IEC
     6 * Copyright (c) 2010-2012, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    1515 *    this list of conditions and the following disclaimer in the documentation
    1616 *    and/or other materials provided with the distribution.
    17  *  * Neither the name of the ISO/IEC nor the names of its contributors may
     17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
    1818 *    be used to endorse or promote products derived from this software without
    1919 *    specific prior written permission.
     
    3232 */
    3333
    34 
    35 
    3634/** \file     TComTrQuant.cpp
    3735    \brief    transform and quantization class
     
    4543#include "ContextTables.h"
    4644
     45typedef struct
     46{
     47  Int    iNNZbeforePos0;
     48  Double d64CodedLevelandDist; // distortion and level cost only
     49  Double d64UncodedDist;    // all zero coded block distortion
     50  Double d64SigCost;
     51  Double d64SigCost_0;
     52} coeffGroupRDStats;
     53
     54//! \ingroup TLibCommon
     55//! \{
     56
    4757// ====================================================================================================================
    4858// Constants
     
    5161#define RDOQ_CHROMA                 1           ///< use of RDOQ in chroma
    5262
    53 #define DQ_BITS                     6
    54 #define Q_BITS_8                    16
    55 #define SIGN_BITS                   1
    56 
    5763// ====================================================================================================================
    5864// Tables
     
    6066
    6167// RDOQ parameter
    62 Int entropyBits[128]=
    63 {
    64   895,    943,    994,   1048,   1105,   1165,   1228,   1294,
    65   1364,   1439,   1517,   1599,   1686,   1778,   1875,   1978,
    66   2086,   2200,   2321,   2448,   2583,   2725,   2876,   3034,
    67   3202,   3380,   3568,   3767,   3977,   4199,   4435,   4684,
    68   4948,   5228,   5525,   5840,   6173,   6527,   6903,   7303,
    69   7727,   8178,   8658,   9169,   9714,  10294,  10914,  11575,
    70   12282,  13038,  13849,  14717,  15650,  16653,  17734,  18899,
    71   20159,  21523,  23005,  24617,  26378,  28306,  30426,  32768,
    72   32768,  35232,  37696,  40159,  42623,  45087,  47551,  50015,
    73   52479,  54942,  57406,  59870,  62334,  64798,  67262,  69725,
    74   72189,  74653,  77117,  79581,  82044,  84508,  86972,  89436,
    75   91900,  94363,  96827,  99291, 101755, 104219, 106683, 109146,
    76   111610, 114074, 116538, 119002, 121465, 123929, 126393, 128857,
    77   131321, 133785, 136248, 138712, 141176, 143640, 146104, 148568,
    78   151031, 153495, 155959, 158423, 160887, 163351, 165814, 168278,
    79   170742, 173207, 175669, 178134, 180598, 183061, 185525, 187989
    80 };
    81 
    82 static const Int estErr4x4[6][4][4]=
    83 {
    84   {
    85     {25600, 27040, 25600, 27040},
    86     {27040, 25600, 27040, 25600},
    87     {25600, 27040, 25600, 27040},
    88     {27040, 25600, 27040, 25600}
    89   },
    90   {
    91     {30976, 31360, 30976, 31360},
    92     {31360, 32400, 31360, 32400},
    93     {30976, 31360, 30976, 31360},
    94     {31360, 32400, 31360, 32400}
    95   },
    96   {
    97     {43264, 40960, 43264, 40960},
    98     {40960, 40000, 40960, 40000},
    99     {43264, 40960, 43264, 40960},
    100     {40960, 40000, 40960, 40000}
    101   },
    102   {
    103     {50176, 51840, 50176, 51840},
    104     {51840, 52900, 51840, 52900},
    105     {50176, 51840, 50176, 51840},
    106     {51840, 52900, 51840, 52900}
    107   },
    108   {
    109     {65536, 64000, 65536, 64000},
    110     {64000, 62500, 64000, 62500},
    111     {65536, 64000, 65536, 64000},
    112     {64000, 62500, 64000, 62500}
    113   },
    114   {
    115     {82944, 84640, 82944, 84640},
    116     {84640, 84100, 84640, 84100},
    117     {82944, 84640, 82944, 84640},
    118     {84640, 84100, 84640, 84100}
    119   }
    120 };
    121 
    122 static const Int estErr8x8[6][8][8]={
    123   {
    124     {6553600, 6677056, 6400000, 6677056, 6553600, 6677056, 6400000, 6677056},
    125     {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
    126     {6400000, 6658560, 6553600, 6658560, 6400000, 6658560, 6553600, 6658560},
    127     {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
    128     {6553600, 6677056, 6400000, 6677056, 6553600, 6677056, 6400000, 6677056},
    129     {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
    130     {6400000, 6658560, 6553600, 6658560, 6400000, 6658560, 6553600, 6658560},
    131     {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201}
    132   },
    133   {
    134     {7929856, 8156736, 8028160, 8156736, 7929856, 8156736, 8028160, 8156736},
    135     {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
    136     {8028160, 7814560, 7840000, 7814560, 8028160, 7814560, 7840000, 7814560},
    137     {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
    138     {7929856, 8156736, 8028160, 8156736, 7929856, 8156736, 8028160, 8156736},
    139     {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
    140     {8028160, 7814560, 7840000, 7814560, 8028160, 7814560, 7840000, 7814560},
    141     {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770}
    142   },
    143   {
    144     {11075584, 10653696, 11151360, 10653696, 11075584, 10653696, 11151360, 10653696},
    145     {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
    146     {11151360, 11109160, 11289600, 11109160, 11151360, 11109160, 11289600, 11109160},
    147     {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
    148     {11075584, 10653696, 11151360, 10653696, 11075584, 10653696, 11151360, 10653696},
    149     {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
    150     {11151360, 11109160, 11289600, 11109160, 11151360, 11109160, 11289600, 11109160},
    151     {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652}
    152   },
    153   {
    154     {12845056, 12503296, 12544000, 12503296, 12845056, 12503296, 12544000, 12503296},
    155     {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
    156     {12544000, 12588840, 12960000, 12588840, 12544000, 12588840, 12960000, 12588840},
    157     {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
    158     {12845056, 12503296, 12544000, 12503296, 12845056, 12503296, 12544000, 12503296},
    159     {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
    160     {12544000, 12588840, 12960000, 12588840, 12544000, 12588840, 12960000, 12588840},
    161     {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156}
    162   },
    163   {
    164     {16777216, 16646400, 16384000, 16646400, 16777216, 16646400, 16384000, 16646400},
    165     {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
    166     {16384000, 16692640, 16646400, 16692640, 16384000, 16692640, 16646400, 16692640},
    167     {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
    168     {16777216, 16646400, 16384000, 16646400, 16777216, 16646400, 16384000, 16646400},
    169     {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
    170     {16384000, 16692640, 16646400, 16692640, 16384000, 16692640, 16646400, 16692640},
    171     {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116}
    172   },
    173   {
    174     {21233664, 21381376, 21667840, 21381376, 21233664, 21381376, 21667840, 21381376},
    175     {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
    176     {21667840, 21374440, 21529600, 21374440, 21667840, 21374440, 21529600, 21374440},
    177     {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
    178     {21233664, 21381376, 21667840, 21381376, 21233664, 21381376, 21667840, 21381376},
    179     {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
    180     {21667840, 21374440, 21529600, 21374440, 21667840, 21374440, 21529600, 21374440},
    181     {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376}
    182   }
    183 };
    184 
    185 #if QC_MOD_LCEC
    186 #if CAVLC_COEF_LRG_BLK
    187   static const int VLClength[14][128] = {
    188 #else
    189   static const int VLClength[13][128] = {
    190 #endif
    191     { 1, 2, 3, 4, 5, 6, 7, 9, 9,11,11,11,11,13,13,13,13,13,13,13,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19},
    192     { 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,10,10,10,10,12,12,12,12,12,12,12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18},
    193     { 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,11,11,11,11,11,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17},
    194     { 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16},
    195     { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13},
    196     { 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63,64,64,65,65},
    197     { 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30,31,31,31,31,32,32,32,32,33,33,33,33,34,34,34,34},
    198     { 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19},
    199     { 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    200     { 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13},
    201     { 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,15},
    202 
    203     { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
    204     { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}
    205 #if CAVLC_COEF_LRG_BLK
    206     ,{ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12}
    207 #endif
    208   };
    209 #endif
    210 static const Int estErr16x16[6] = { 25329, 30580, 42563, 49296, 64244, 82293 };
    211 static const Int estErr32x32[6] = { 25351, 30674, 42843, 49687, 64898, 82136 };
    21268
    21369// ====================================================================================================================
     
    21975}
    22076
    221 Void QpParam::initOffsetParam( Int iStartQP, Int iEndQP )
    222 {
    223   Int iDefaultOffset;
    224   Int iDefaultOffset_LTR;
    225  
    226   Int iPer;
    227  
    228   for (Int iQP = iStartQP; iQP <= iEndQP; iQP++)
    229   {
    230     for (UInt uiSliceType = 0; uiSliceType < 3; uiSliceType++)
    231     {
    232       Int k =  (iQP + 6*g_uiBitIncrement)/6;
    233 #if FULL_NBIT
    234       k += g_uiBitDepth - 8;
    235 #endif
    236      
    237       Bool bLowPass = (uiSliceType == 0);
    238       iDefaultOffset = (bLowPass? 10922 : 5462);
    239      
    240       bLowPass = (uiSliceType == 0);
    241       iDefaultOffset_LTR = (bLowPass? 170 : 86);
    242      
    243       iPer = QP_BITS + k - QOFFSET_BITS;
    244       m_aiAdd2x2[iQP][uiSliceType] = iDefaultOffset << iPer;
    245       m_aiAdd4x4[iQP][uiSliceType] = iDefaultOffset << iPer;
    246      
    247       iPer = QP_BITS + 1 + k - QOFFSET_BITS;
    248       m_aiAdd8x8[iQP][uiSliceType] = iDefaultOffset << iPer;
    249      
    250       iPer = ECore16Shift + k - QOFFSET_BITS_LTR;
    251       m_aiAdd16x16[iQP][uiSliceType] = iDefaultOffset_LTR << iPer;
    252      
    253       iPer = ECore32Shift + k - QOFFSET_BITS_LTR;
    254       m_aiAdd32x32[iQP][uiSliceType] = iDefaultOffset_LTR << iPer;
    255     }
    256   }
    257 }
    258 
    25977// ====================================================================================================================
    26078// TComTrQuant class member functions
     
    26684 
    26785  // allocate temporary buffers
    268   m_plTempCoeff  = new Long[ MAX_CU_SIZE*MAX_CU_SIZE ];
     86  m_plTempCoeff  = new Int[ MAX_CU_SIZE*MAX_CU_SIZE ];
    26987 
    27088  // allocate bit estimation class  (for RDOQ)
    27189  m_pcEstBitsSbac = new estBitsSbacStruct;
     90  initScalingList();
    27291}
    27392
     
    282101 
    283102  // delete bit estimation class
    284   if ( m_pcEstBitsSbac ) delete m_pcEstBitsSbac;
    285 }
    286 
     103  if ( m_pcEstBitsSbac )
     104  {
     105    delete m_pcEstBitsSbac;
     106  }
     107  destroyScalingList();
     108}
     109
     110#if ADAPTIVE_QP_SELECTION
     111Void TComTrQuant::storeSliceQpNext(TComSlice* pcSlice)
     112{
     113  Int qpBase = pcSlice->getSliceQpBase();
     114  Int sliceQpused = pcSlice->getSliceQp();
     115  Int sliceQpnext;
     116  Double alpha = qpBase < 17 ? 0.5 : 1;
     117 
     118  Int cnt=0;
     119  for(int u=1; u<=LEVEL_RANGE; u++)
     120  {
     121    cnt += m_sliceNsamples[u] ;
     122  }
     123
     124  if( !m_bUseRDOQ )
     125  {
     126    sliceQpused = qpBase;
     127    alpha = 0.5;
     128  }
     129
     130  if( cnt > 120 )
     131  {
     132    Double sum = 0;
     133    Int k = 0;
     134    for(Int u=1; u<LEVEL_RANGE; u++)
     135    {
     136      sum += u*m_sliceSumC[u];
     137      k += u*u*m_sliceNsamples[u];
     138    }
     139
     140    Int v;
     141    Double q[MAX_QP+1] ;
     142    for(v=0; v<=MAX_QP; v++)
     143    {
     144      q[v] = (Double)(g_invQuantScales[v%6] * (1<<(v/6)))/64 ;
     145    }
     146
     147    Double qnext = sum/k * q[sliceQpused] / (1<<ARL_C_PRECISION);
     148
     149    for(v=0; v<MAX_QP; v++)
     150    {
     151      if(qnext < alpha * q[v] + (1 - alpha) * q[v+1] )
     152      {
     153        break;
     154      }
     155    }
     156    sliceQpnext = Clip3(sliceQpused - 3, sliceQpused + 3, v);
     157  }
     158  else
     159  {
     160    sliceQpnext = sliceQpused;
     161  }
     162
     163  m_qpDelta[qpBase] = sliceQpnext - qpBase;
     164}
     165
     166Void TComTrQuant::initSliceQpDelta()
     167{
     168  for(Int qp=0; qp<=MAX_QP; qp++)
     169  {
     170    m_qpDelta[qp] = qp < 17 ? 0 : 1;
     171  }
     172}
     173
     174Void TComTrQuant::clearSliceARLCnt()
     175{
     176  memset(m_sliceSumC, 0, sizeof(Double)*(LEVEL_RANGE+1));
     177  memset(m_sliceNsamples, 0, sizeof(Int)*(LEVEL_RANGE+1));
     178}
     179#endif
     180
     181
     182#if H0736_AVC_STYLE_QP_RANGE
     183/** Set qP for Quantization.
     184 * \param qpy QPy
     185 * \param bLowpass
     186 * \param eSliceType
     187 * \param eTxtType
     188 * \param qpBdOffset
     189 * \param chromaQPOffset
     190 *
     191 * return void 
     192 */
     193Void TComTrQuant::setQPforQuant( Int qpy, Bool bLowpass, SliceType eSliceType, TextType eTxtType, Int qpBdOffset, Int chromaQPOffset)
     194{
     195  Int qpScaled;
     196
     197  if(eTxtType == TEXT_LUMA)
     198  {
     199    qpScaled = qpy + qpBdOffset;
     200  }
     201  else
     202  {
     203    qpScaled = Clip3( -qpBdOffset, 51, qpy + chromaQPOffset );
     204
     205    if(qpScaled < 0)
     206    {
     207      qpScaled = qpScaled + qpBdOffset;
     208    }
     209    else
     210    {
     211      qpScaled = g_aucChromaScale[ Clip3(0, 51, qpScaled) ] + qpBdOffset;
     212    }
     213  }
     214  m_cQP.setQpParam( qpScaled, bLowpass, eSliceType );
     215}
     216#else
    287217/// Including Chroma QP Parameter setting
    288 Void TComTrQuant::setQPforQuant( Int iQP, Bool bLowpass, SliceType eSliceType, TextType eTxtType)
    289 {
    290   iQP = Max( Min( iQP, 51 ), 0 );
     218Void TComTrQuant::setQPforQuant( Int iQP, Bool bLowpass, SliceType eSliceType, TextType eTxtType, Int Shift)
     219{
     220  iQP = Clip3( MIN_QP, MAX_QP, iQP + Shift );
    291221 
    292222  if(eTxtType != TEXT_LUMA) //Chroma
     
    295225  }
    296226 
    297   m_cQP.setQpParam( iQP, bLowpass, eSliceType, m_bEnc );
    298 }
    299 
    300 #if E243_CORE_TRANSFORMS
     227  m_cQP.setQpParam( iQP, bLowpass, eSliceType );
     228}
     229#endif
    301230
    302231#if MATRIX_MULT
     
    308237 *  \param uiMode is Intra Prediction mode used in Mode-Dependent DCT/DST only
    309238 */
    310 #if INTRA_DST_TYPE_7
    311 void xTr(Pel *block, Long *coeff, UInt uiStride, UInt uiTrSize, UInt uiMode)
    312 #else
    313 void xTr(Pel *block, Long *coeff, UInt uiStride, UInt uiTrSize)
    314 #endif
     239void xTr(Pel *block, Int *coeff, UInt uiStride, UInt uiTrSize, UInt uiMode)
    315240{
    316241  Int i,j,k,iSum;
     
    335260    iT = g_aiT32[0];
    336261  }
    337   else{
     262  else
     263  {
    338264    assert(0);
    339265  }
     
    351277  /* Horizontal transform */
    352278
    353 #if INTRA_DST_TYPE_7
    354279  if (uiTrSize==4)
    355280  {
     
    359284    }
    360285  }
    361 #endif
    362286  for (i=0; i<uiTrSize; i++)
    363287  {
     
    372296    }
    373297  }
    374 /* Vertical transform */
    375 #if INTRA_DST_TYPE_7
     298 
     299  /* Vertical transform */
    376300  if (uiTrSize==4)
    377301  {
     
    385309    }
    386310  }
    387  #endif
    388311  for (i=0; i<uiTrSize; i++)
    389312  {                 
     
    397320      coeff[i*uiTrSize+j] = (iSum + add_2nd)>>shift_2nd;
    398321    }
    399   } 
     322  }
    400323}
    401324
     
    407330 *  \param uiMode is Intra Prediction mode used in Mode-Dependent DCT/DST only
    408331 */
    409 #if INTRA_DST_TYPE_7
    410 void xITr(Long *coeff, Pel *block, UInt uiStride, UInt uiTrSize, UInt uiMode)
    411 #else
    412 void xITr(Long *coeff, Pel *block, UInt uiStride, UInt uiTrSize)
    413 #endif
     332void xITr(Int *coeff, Pel *block, UInt uiStride, UInt uiTrSize, UInt uiMode)
    414333{
    415334  int i,j,k,iSum;
    416335  Int tmp[32*32];
    417336  const short *iT;
    418   UInt uiLog2TrSize = g_aucConvertToBit[ uiTrSize ] + 2;
     337 
    419338  if (uiTrSize==4)
    420339  {
     
    433352    iT = g_aiT32[0];
    434353  }
    435   else{
     354  else
     355  {
    436356    assert(0);
    437357  }
     358 
    438359  int shift_1st = SHIFT_INV_1ST;
    439360  int add_1st = 1<<(shift_1st-1); 
     
    444365#endif
    445366  int add_2nd = 1<<(shift_2nd-1);
    446 #if INTRA_DST_TYPE_7
    447367  if (uiTrSize==4)
    448368  {
     
    452372    }
    453373  }
    454 #endif
     374 
    455375  /* Horizontal transform */
    456376  for (i=0; i<uiTrSize; i++)
     
    463383        iSum += iT[k*uiTrSize+i]*coeff[k*uiTrSize+j];
    464384      }
    465       tmp[i*uiTrSize+j] = (iSum + add_1st)>>shift_1st;
     385      tmp[i*uiTrSize+j] = Clip3(-32768, 32767, (iSum + add_1st)>>shift_1st); // Clipping is normative
    466386    }
    467387  }   
    468 #if INTRA_DST_TYPE_7
     388 
    469389  if (uiTrSize==4)
    470390  {
     
    478398    }
    479399  }
    480 #endif
     400 
    481401  /* Vertical transform */
    482402  for (i=0; i<uiTrSize; i++)
     
    489409        iSum += iT[k*uiTrSize+j]*tmp[i*uiTrSize+k];
    490410      }
    491       block[i*uiStride+j] = (iSum + add_2nd)>>shift_2nd;
     411      block[i*uiStride+j] = Clip3(-32768, 32767, (iSum + add_2nd)>>shift_2nd); // Clipping is non-normative
    492412    }
    493413  }
     
    497417
    498418/** 4x4 forward transform implemented using partial butterfly structure (1D)
    499  *  \param block input data (residual)
    500  *  \param coeff output data (transform coefficients)
     419 *  \param src  input data (residual)
     420 *  \param dst  output data (transform coefficients)
    501421 *  \param shift specifies right shift after 1D transform
    502422 */
    503 void partialButterfly4(short block[4][4],short coeff[4][4],int shift)
     423#if !UNIFIED_TRANSFORM
     424void partialButterfly4(short src[4][4],short dst[4][4],int shift)
    504425{
    505426  int j; 
     
    510431  {   
    511432    /* E and O */
    512     E[0] = block[j][0] + block[j][3];
    513     O[0] = block[j][0] - block[j][3];
    514     E[1] = block[j][1] + block[j][2];
    515     O[1] = block[j][1] - block[j][2];
    516 
    517     coeff[0][j] = (g_aiT4[0][0]*E[0] + g_aiT4[0][1]*E[1] + add)>>shift;
    518     coeff[2][j] = (g_aiT4[2][0]*E[0] + g_aiT4[2][1]*E[1] + add)>>shift;
    519     coeff[1][j] = (g_aiT4[1][0]*O[0] + g_aiT4[1][1]*O[1] + add)>>shift;
    520     coeff[3][j] = (g_aiT4[3][0]*O[0] + g_aiT4[3][1]*O[1] + add)>>shift;
    521   }
    522 }
    523 
    524 #if INTRA_DST_TYPE_7
     433    E[0] = src[j][0] + src[j][3];
     434    O[0] = src[j][0] - src[j][3];
     435    E[1] = src[j][1] + src[j][2];
     436    O[1] = src[j][1] - src[j][2];
     437
     438    dst[0][j] = (g_aiT4[0][0]*E[0] + g_aiT4[0][1]*E[1] + add)>>shift;
     439    dst[2][j] = (g_aiT4[2][0]*E[0] + g_aiT4[2][1]*E[1] + add)>>shift;
     440    dst[1][j] = (g_aiT4[1][0]*O[0] + g_aiT4[1][1]*O[1] + add)>>shift;
     441    dst[3][j] = (g_aiT4[3][0]*O[0] + g_aiT4[3][1]*O[1] + add)>>shift;
     442  }
     443}
     444#endif
     445
     446void partialButterfly4(short *src,short *dst,int shift, int line)
     447{
     448  int j; 
     449  int E[2],O[2];
     450  int add = 1<<(shift-1);
     451
     452  for (j=0; j<line; j++)
     453  {   
     454    /* E and O */
     455    E[0] = src[0] + src[3];
     456    O[0] = src[0] - src[3];
     457    E[1] = src[1] + src[2];
     458    O[1] = src[1] - src[2];
     459
     460    dst[0] = (g_aiT4[0][0]*E[0] + g_aiT4[0][1]*E[1] + add)>>shift;
     461    dst[2*line] = (g_aiT4[2][0]*E[0] + g_aiT4[2][1]*E[1] + add)>>shift;
     462    dst[line] = (g_aiT4[1][0]*O[0] + g_aiT4[1][1]*O[1] + add)>>shift;
     463    dst[3*line] = (g_aiT4[3][0]*O[0] + g_aiT4[3][1]*O[1] + add)>>shift;
     464
     465    src += 4;
     466    dst ++;
     467  }
     468}
     469
    525470// Fast DST Algorithm. Full matrix multiplication for DST and Fast DST algorithm
    526471// give identical results
     472#if UNIFIED_TRANSFORM
     473void fastForwardDst(short *block,short *coeff,int shift)  // input block, output coeff
     474#else
    527475void fastForwardDst(short block[4][4],short coeff[4][4],int shift)  // input block, output coeff
     476#endif
    528477{
    529478  int i, c[4];
     
    532481  {
    533482    // Intermediate Variables
     483#if UNIFIED_TRANSFORM
     484    c[0] = block[4*i+0] + block[4*i+3];
     485    c[1] = block[4*i+1] + block[4*i+3];
     486    c[2] = block[4*i+0] - block[4*i+1];
     487    c[3] = 74* block[4*i+2];
     488
     489    coeff[   i] =  ( 29 * c[0] + 55 * c[1]         + c[3]               + rnd_factor ) >> shift;
     490    coeff[ 4+i] =  ( 74 * (block[4*i+0]+ block[4*i+1] - block[4*i+3])   + rnd_factor ) >> shift;
     491    coeff[ 8+i] =  ( 29 * c[2] + 55 * c[0]         - c[3]               + rnd_factor ) >> shift;
     492    coeff[12+i] =  ( 55 * c[2] - 29 * c[1]         + c[3]               + rnd_factor ) >> shift;
     493#else
    534494    c[0] = block[i][0] + block[i][3];
    535495    c[1] = block[i][1] + block[i][3];
     
    541501    coeff[2][i] =  ( 29 * c[2] + 55 * c[0]         - c[3]               + rnd_factor ) >> shift;
    542502    coeff[3][i] =  ( 55 * c[2] - 29 * c[1]         + c[3]               + rnd_factor ) >> shift;
    543   }
    544 }
     503#endif
     504  }
     505}
     506
     507#if UNIFIED_TRANSFORM
     508void fastInverseDst(short *tmp,short *block,int shift)  // input tmp, output block
     509#else
    545510void fastInverseDst(short tmp[4][4],short block[4][4],int shift)  // input tmp, output block
     511#endif
    546512{
    547513  int i, c[4];
     
    550516  { 
    551517    // Intermediate Variables
     518#if UNIFIED_TRANSFORM
     519    c[0] = tmp[  i] + tmp[ 8+i];
     520    c[1] = tmp[8+i] + tmp[12+i];
     521    c[2] = tmp[  i] - tmp[12+i];
     522    c[3] = 74* tmp[4+i];
     523
     524    block[4*i+0] = Clip3( -32768, 32767, ( 29 * c[0] + 55 * c[1]     + c[3]               + rnd_factor ) >> shift );
     525    block[4*i+1] = Clip3( -32768, 32767, ( 55 * c[2] - 29 * c[1]     + c[3]               + rnd_factor ) >> shift );
     526    block[4*i+2] = Clip3( -32768, 32767, ( 74 * (tmp[i] - tmp[8+i]  + tmp[12+i])      + rnd_factor ) >> shift );
     527    block[4*i+3] = Clip3( -32768, 32767, ( 55 * c[0] + 29 * c[2]     - c[3]               + rnd_factor ) >> shift );
     528#else
    552529    c[0] = tmp[0][i] + tmp[2][i];
    553530    c[1] = tmp[2][i] + tmp[3][i];
     
    555532    c[3] = 74* tmp[1][i];
    556533
    557     block[i][0] =  ( 29 * c[0] + 55 * c[1]     + c[3]               + rnd_factor ) >> shift;
    558     block[i][1] =  ( 55 * c[2] - 29 * c[1]     + c[3]               + rnd_factor ) >> shift;
    559     block[i][2] =  ( 74 * (tmp[0][i] - tmp[2][i]  + tmp[3][i])      + rnd_factor ) >> shift;
    560     block[i][3] =  ( 55 * c[0] + 29 * c[2]     - c[3]               + rnd_factor ) >> shift;
    561   }
    562 }
    563 #endif
     534    block[i][0] = Clip3( -32768, 32767, ( 29 * c[0] + 55 * c[1]     + c[3]               + rnd_factor ) >> shift );
     535    block[i][1] = Clip3( -32768, 32767, ( 55 * c[2] - 29 * c[1]     + c[3]               + rnd_factor ) >> shift );
     536    block[i][2] = Clip3( -32768, 32767, ( 74 * (tmp[0][i] - tmp[2][i]  + tmp[3][i])      + rnd_factor ) >> shift );
     537    block[i][3] = Clip3( -32768, 32767, ( 55 * c[0] + 29 * c[2]     - c[3]               + rnd_factor ) >> shift );
     538#endif
     539  }
     540}
     541#if !UNIFIED_TRANSFORM
    564542/** 4x4 forward transform (2D)
    565543 *  \param block input data (residual)
     
    567545 *  \param uiMode is Intra Prediction mode used in Mode-Dependent DCT/DST only
    568546 */
    569 #if INTRA_DST_TYPE_7
    570547void xTr4(short block[4][4],short coeff[4][4],UInt uiMode)
    571 #else
    572 void xTr4(short block[4][4],short coeff[4][4])
    573 #endif
    574548{
    575549#if FULL_NBIT
     
    580554  int shift_2nd = 8;                    // log2(4) + 6
    581555  short tmp[4][4];
    582 #if INTRA_DST_TYPE_7
     556#if LOGI_INTRA_NAME_3MPM
     557  if (uiMode != REG_DCT && (!uiMode || (uiMode>=2 && uiMode <= 25)))    // Check for DCT or DST
     558#else
    583559  if (uiMode != REG_DCT && g_aucDCTDSTMode_Hor[uiMode])// Check for DCT or DST
     560#endif
    584561  {
    585562    fastForwardDst(block,tmp,shift_1st); // Forward DST BY FAST ALGORITHM, block input, tmp output
     
    589566    partialButterfly4(block,tmp,shift_1st);
    590567  }
    591 #else
    592   partialButterfly4(block,tmp,shift_1st);
    593 #endif
    594 
    595 #if INTRA_DST_TYPE_7
     568
     569#if LOGI_INTRA_NAME_3MPM
     570  if (uiMode != REG_DCT && (!uiMode || (uiMode>=11 && uiMode <= 34)))    // Check for DCT or DST
     571#else
    596572  if (uiMode != REG_DCT && g_aucDCTDSTMode_Vert[uiMode] )   // Check for DCT or DST
     573#endif
    597574  {
    598575    fastForwardDst(tmp,coeff,shift_2nd); // Forward DST BY FAST ALGORITHM, tmp input, coeff output
     
    602579    partialButterfly4(tmp,coeff,shift_2nd);
    603580  }   
    604 #else
    605   partialButterfly4(tmp,coeff,shift_2nd);
    606 #endif
    607581}
    608582
    609583/** 4x4 inverse transform implemented using partial butterfly structure (1D)
    610  *  \param coeff input data (transform coefficients)
    611  *  \param block output data (residual)
     584 *  \param src  input data (transform coefficients)
     585 *  \param dst  output data (residual)
    612586 *  \param shift specifies right shift after 1D transform
    613587 */
    614 void partialButterflyInverse4(short tmp[4][4],short block[4][4],int shift)
     588void partialButterflyInverse4(short src[4][4],short dst[4][4],int shift)
    615589{
    616590  int j;   
     
    621595  {   
    622596    /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */   
    623     O[0] = g_aiT4[1][0]*tmp[1][j] + g_aiT4[3][0]*tmp[3][j];
    624     O[1] = g_aiT4[1][1]*tmp[1][j] + g_aiT4[3][1]*tmp[3][j];
    625     E[0] = g_aiT4[0][0]*tmp[0][j] + g_aiT4[2][0]*tmp[2][j];
    626     E[1] = g_aiT4[0][1]*tmp[0][j] + g_aiT4[2][1]*tmp[2][j];
     597    O[0] = g_aiT4[1][0]*src[1][j] + g_aiT4[3][0]*src[3][j];
     598    O[1] = g_aiT4[1][1]*src[1][j] + g_aiT4[3][1]*src[3][j];
     599    E[0] = g_aiT4[0][0]*src[0][j] + g_aiT4[2][0]*src[2][j];
     600    E[1] = g_aiT4[0][1]*src[0][j] + g_aiT4[2][1]*src[2][j];
    627601   
    628     /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
    629     block[j][0] = (E[0] + O[0] + add)>>shift;
    630     block[j][1] = (E[1] + O[1] + add)>>shift;
    631     block[j][2] = (E[1] - O[1] + add)>>shift;
    632     block[j][3] = (E[0] - O[0] + add)>>shift;
    633   }
    634 }
    635 
     602    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
     603    dst[j][0] = Clip3( -32768, 32767, (E[0] + O[0] + add)>>shift );
     604    dst[j][1] = Clip3( -32768, 32767, (E[1] + O[1] + add)>>shift );
     605    dst[j][2] = Clip3( -32768, 32767, (E[1] - O[1] + add)>>shift );
     606    dst[j][3] = Clip3( -32768, 32767, (E[0] - O[0] + add)>>shift );
     607  }
     608}
     609#endif
     610
     611void partialButterflyInverse4(short *src,short *dst,int shift, int line)
     612{
     613  int j;   
     614  int E[2],O[2];
     615  int add = 1<<(shift-1);
     616
     617  for (j=0; j<line; j++)
     618  {   
     619    /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */   
     620    O[0] = g_aiT4[1][0]*src[line] + g_aiT4[3][0]*src[3*line];
     621    O[1] = g_aiT4[1][1]*src[line] + g_aiT4[3][1]*src[3*line];
     622    E[0] = g_aiT4[0][0]*src[0] + g_aiT4[2][0]*src[2*line];
     623    E[1] = g_aiT4[0][1]*src[0] + g_aiT4[2][1]*src[2*line];
     624
     625    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
     626    dst[0] = Clip3( -32768, 32767, (E[0] + O[0] + add)>>shift );
     627    dst[1] = Clip3( -32768, 32767, (E[1] + O[1] + add)>>shift );
     628    dst[2] = Clip3( -32768, 32767, (E[1] - O[1] + add)>>shift );
     629    dst[3] = Clip3( -32768, 32767, (E[0] - O[0] + add)>>shift );
     630           
     631    src   ++;
     632    dst += 4;
     633  }
     634}
     635
     636#if !UNIFIED_TRANSFORM
    636637/** 4x4 inverse transform (2D)
    637638 *  \param coeff input data (transform coefficients)
     
    639640 *  \param uiMode is Intra Prediction mode used in Mode-Dependent DCT/DST only
    640641 */
    641 #if INTRA_DST_TYPE_7
    642642void xITr4(short coeff[4][4],short block[4][4], UInt uiMode)
    643 #else
    644 void xITr4(short coeff[4][4],short block[4][4])
    645 #endif
    646643{
    647644  int shift_1st = SHIFT_INV_1ST;
     
    653650  short tmp[4][4];
    654651 
    655 #if INTRA_DST_TYPE_7
     652#if LOGI_INTRA_NAME_3MPM
     653  if (uiMode != REG_DCT && (!uiMode || (uiMode>=11 && uiMode <= 34)))    // Check for DCT or DST
     654#else
    656655  if (uiMode != REG_DCT && g_aucDCTDSTMode_Vert[uiMode] )    // Check for DCT or DST
     656#endif
    657657  {
    658658    fastInverseDst(coeff,tmp,shift_1st);    // Inverse DST by FAST Algorithm, coeff input, tmp output
     
    662662    partialButterflyInverse4(coeff,tmp,shift_1st);   
    663663  }
    664 #else
    665   partialButterflyInverse4(coeff,tmp,shift_1st);
    666 #endif
    667 #if INTRA_DST_TYPE_7
     664#if LOGI_INTRA_NAME_3MPM
     665  if (uiMode != REG_DCT && (!uiMode || (uiMode>=2 && uiMode <= 25)))    // Check for DCT or DST
     666#else
    668667  if (uiMode != REG_DCT && g_aucDCTDSTMode_Hor[uiMode] )    // Check for DCT or DST
     668#endif
    669669  {
    670670    fastInverseDst(tmp,block,shift_2nd); // Inverse DST by FAST Algorithm, tmp input, coeff output
     
    674674    partialButterflyInverse4(tmp,block,shift_2nd);
    675675  }   
    676 #else
    677    partialButterflyInverse4(tmp,block,shift_2nd);
    678 #endif
    679676}
    680677
    681678/** 8x8 forward transform implemented using partial butterfly structure (1D)
    682  *  \param block input data (residual)
    683  *  \param coeff output data (transform coefficients)
     679 *  \param src  input data (residual)
     680 *  \param dst  output data (transform coefficients)
    684681 *  \param shift specifies right shift after 1D transform
    685682 */
    686 void partialButterfly8(short block[8][8],short coeff[8][8],int shift)
     683void partialButterfly8(short src[8][8],short dst[8][8],int shift)
    687684{
    688685  int j,k; 
     
    696693    for (k=0;k<4;k++)
    697694    {
    698       E[k] = block[j][k] + block[j][7-k];
    699       O[k] = block[j][k] - block[j][7-k];
     695      E[k] = src[j][k] + src[j][7-k];
     696      O[k] = src[j][k] - src[j][7-k];
    700697    }   
    701698    /* EE and EO */
     
    705702    EO[1] = E[1] - E[2];
    706703
    707     coeff[0][j] = (g_aiT8[0][0]*EE[0] + g_aiT8[0][1]*EE[1] + add)>>shift;
    708     coeff[4][j] = (g_aiT8[4][0]*EE[0] + g_aiT8[4][1]*EE[1] + add)>>shift;
    709     coeff[2][j] = (g_aiT8[2][0]*EO[0] + g_aiT8[2][1]*EO[1] + add)>>shift;
    710     coeff[6][j] = (g_aiT8[6][0]*EO[0] + g_aiT8[6][1]*EO[1] + add)>>shift;
    711 
    712     coeff[1][j] = (g_aiT8[1][0]*O[0] + g_aiT8[1][1]*O[1] + g_aiT8[1][2]*O[2] + g_aiT8[1][3]*O[3] + add)>>shift;
    713     coeff[3][j] = (g_aiT8[3][0]*O[0] + g_aiT8[3][1]*O[1] + g_aiT8[3][2]*O[2] + g_aiT8[3][3]*O[3] + add)>>shift;
    714     coeff[5][j] = (g_aiT8[5][0]*O[0] + g_aiT8[5][1]*O[1] + g_aiT8[5][2]*O[2] + g_aiT8[5][3]*O[3] + add)>>shift;
    715     coeff[7][j] = (g_aiT8[7][0]*O[0] + g_aiT8[7][1]*O[1] + g_aiT8[7][2]*O[2] + g_aiT8[7][3]*O[3] + add)>>shift;
    716   }
    717 }
    718 
     704    dst[0][j] = (g_aiT8[0][0]*EE[0] + g_aiT8[0][1]*EE[1] + add)>>shift;
     705    dst[4][j] = (g_aiT8[4][0]*EE[0] + g_aiT8[4][1]*EE[1] + add)>>shift;
     706    dst[2][j] = (g_aiT8[2][0]*EO[0] + g_aiT8[2][1]*EO[1] + add)>>shift;
     707    dst[6][j] = (g_aiT8[6][0]*EO[0] + g_aiT8[6][1]*EO[1] + add)>>shift;
     708
     709    dst[1][j] = (g_aiT8[1][0]*O[0] + g_aiT8[1][1]*O[1] + g_aiT8[1][2]*O[2] + g_aiT8[1][3]*O[3] + add)>>shift;
     710    dst[3][j] = (g_aiT8[3][0]*O[0] + g_aiT8[3][1]*O[1] + g_aiT8[3][2]*O[2] + g_aiT8[3][3]*O[3] + add)>>shift;
     711    dst[5][j] = (g_aiT8[5][0]*O[0] + g_aiT8[5][1]*O[1] + g_aiT8[5][2]*O[2] + g_aiT8[5][3]*O[3] + add)>>shift;
     712    dst[7][j] = (g_aiT8[7][0]*O[0] + g_aiT8[7][1]*O[1] + g_aiT8[7][2]*O[2] + g_aiT8[7][3]*O[3] + add)>>shift;
     713  }
     714}
     715#endif
     716
     717void partialButterfly8(short *src,short *dst,int shift, int line)
     718{
     719  int j,k; 
     720  int E[4],O[4];
     721  int EE[2],EO[2];
     722  int add = 1<<(shift-1);
     723
     724  for (j=0; j<line; j++)
     725  { 
     726    /* E and O*/
     727    for (k=0;k<4;k++)
     728    {
     729      E[k] = src[k] + src[7-k];
     730      O[k] = src[k] - src[7-k];
     731    }   
     732    /* EE and EO */
     733    EE[0] = E[0] + E[3];   
     734    EO[0] = E[0] - E[3];
     735    EE[1] = E[1] + E[2];
     736    EO[1] = E[1] - E[2];
     737
     738    dst[0] = (g_aiT8[0][0]*EE[0] + g_aiT8[0][1]*EE[1] + add)>>shift;
     739    dst[4*line] = (g_aiT8[4][0]*EE[0] + g_aiT8[4][1]*EE[1] + add)>>shift;
     740    dst[2*line] = (g_aiT8[2][0]*EO[0] + g_aiT8[2][1]*EO[1] + add)>>shift;
     741    dst[6*line] = (g_aiT8[6][0]*EO[0] + g_aiT8[6][1]*EO[1] + add)>>shift;
     742
     743    dst[line] = (g_aiT8[1][0]*O[0] + g_aiT8[1][1]*O[1] + g_aiT8[1][2]*O[2] + g_aiT8[1][3]*O[3] + add)>>shift;
     744    dst[3*line] = (g_aiT8[3][0]*O[0] + g_aiT8[3][1]*O[1] + g_aiT8[3][2]*O[2] + g_aiT8[3][3]*O[3] + add)>>shift;
     745    dst[5*line] = (g_aiT8[5][0]*O[0] + g_aiT8[5][1]*O[1] + g_aiT8[5][2]*O[2] + g_aiT8[5][3]*O[3] + add)>>shift;
     746    dst[7*line] = (g_aiT8[7][0]*O[0] + g_aiT8[7][1]*O[1] + g_aiT8[7][2]*O[2] + g_aiT8[7][3]*O[3] + add)>>shift;
     747
     748    src += 8;
     749    dst ++;
     750  }
     751}
     752
     753#if !UNIFIED_TRANSFORM
    719754/** 8x8 forward transform (2D)
    720755 *  \param block input data (residual)
     
    736771
    737772/** 8x8 inverse transform implemented using partial butterfly structure (1D)
    738  *  \param coeff input data (transform coefficients)
    739  *  \param block output data (residual)
     773 *  \param src  input data (transform coefficients)
     774 *  \param dst  output data (residual)
    740775 *  \param shift specifies right shift after 1D transform
    741776 */
    742 void partialButterflyInverse8(short tmp[8][8],short block[8][8],int shift)
     777void partialButterflyInverse8(short src[8][8],short dst[8][8],int shift)
    743778{
    744779  int j,k;   
     
    752787    for (k=0;k<4;k++)
    753788    {
    754       O[k] = g_aiT8[ 1][k]*tmp[ 1][j] + g_aiT8[ 3][k]*tmp[ 3][j] + g_aiT8[ 5][k]*tmp[ 5][j] + g_aiT8[ 7][k]*tmp[ 7][j];
     789      O[k] = g_aiT8[ 1][k]*src[ 1][j] + g_aiT8[ 3][k]*src[ 3][j] + g_aiT8[ 5][k]*src[ 5][j] + g_aiT8[ 7][k]*src[ 7][j];
    755790    }
    756791   
    757     EO[0] = g_aiT8[2][0]*tmp[2][j] + g_aiT8[6][0]*tmp[6][j];
    758     EO[1] = g_aiT8[2][1]*tmp[2][j] + g_aiT8[6][1]*tmp[6][j];
    759     EE[0] = g_aiT8[0][0]*tmp[0][j] + g_aiT8[4][0]*tmp[4][j];
    760     EE[1] = g_aiT8[0][1]*tmp[0][j] + g_aiT8[4][1]*tmp[4][j];
     792    EO[0] = g_aiT8[2][0]*src[2][j] + g_aiT8[6][0]*src[6][j];
     793    EO[1] = g_aiT8[2][1]*src[2][j] + g_aiT8[6][1]*src[6][j];
     794    EE[0] = g_aiT8[0][0]*src[0][j] + g_aiT8[4][0]*src[4][j];
     795    EE[1] = g_aiT8[0][1]*src[0][j] + g_aiT8[4][1]*src[4][j];
    761796
    762797    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
     
    767802    for (k=0;k<4;k++)
    768803    {
    769       block[j][k] = (E[k] + O[k] + add)>>shift;
    770       block[j][k+4] = (E[3-k] - O[3-k] + add)>>shift;
     804      dst[j][k]   = Clip3( -32768, 32767, (E[k] + O[k] + add)>>shift );
     805      dst[j][k+4] = Clip3( -32768, 32767, (E[3-k] - O[3-k] + add)>>shift );
    771806    }       
    772807  }
    773808}
    774 
     809#endif
     810
     811void partialButterflyInverse8(short *src,short *dst,int shift, int line)
     812{
     813  int j,k;   
     814  int E[4],O[4];
     815  int EE[2],EO[2];
     816  int add = 1<<(shift-1);
     817
     818  for (j=0; j<line; j++)
     819  {   
     820    /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
     821    for (k=0;k<4;k++)
     822    {
     823      O[k] = g_aiT8[ 1][k]*src[line] + g_aiT8[ 3][k]*src[3*line] + g_aiT8[ 5][k]*src[5*line] + g_aiT8[ 7][k]*src[7*line];
     824    }
     825
     826    EO[0] = g_aiT8[2][0]*src[ 2*line ] + g_aiT8[6][0]*src[ 6*line ];
     827    EO[1] = g_aiT8[2][1]*src[ 2*line ] + g_aiT8[6][1]*src[ 6*line ];
     828    EE[0] = g_aiT8[0][0]*src[ 0      ] + g_aiT8[4][0]*src[ 4*line ];
     829    EE[1] = g_aiT8[0][1]*src[ 0      ] + g_aiT8[4][1]*src[ 4*line ];
     830
     831    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
     832    E[0] = EE[0] + EO[0];
     833    E[3] = EE[0] - EO[0];
     834    E[1] = EE[1] + EO[1];
     835    E[2] = EE[1] - EO[1];
     836    for (k=0;k<4;k++)
     837    {
     838      dst[ k   ] = Clip3( -32768, 32767, (E[k] + O[k] + add)>>shift );
     839      dst[ k+4 ] = Clip3( -32768, 32767, (E[3-k] - O[3-k] + add)>>shift );
     840    }   
     841    src ++;
     842    dst += 8;
     843  }
     844}
     845
     846#if !UNIFIED_TRANSFORM
    775847/** 8x8 inverse transform (2D)
    776848 *  \param coeff input data (transform coefficients)
     
    792864
    793865/** 16x16 forward transform implemented using partial butterfly structure (1D)
    794  *  \param block input data (residual)
    795  *  \param coeff output data (transform coefficients)
     866 *  \param src  input data (residual)
     867 *  \param dst  output data (transform coefficients)
    796868 *  \param shift specifies right shift after 1D transform
    797869 */
    798 void partialButterfly16(short block[16][16],short coeff[16][16],int shift)
     870void partialButterfly16(short src[16][16],short dst[16][16],int shift)
    799871{
    800872  int j,k;
     
    809881    for (k=0;k<8;k++)
    810882    {
    811       E[k] = block[j][k] + block[j][15-k];
    812       O[k] = block[j][k] - block[j][15-k];
     883      E[k] = src[j][k] + src[j][15-k];
     884      O[k] = src[j][k] - src[j][15-k];
    813885    }
    814886    /* EE and EO */
     
    824896    EEO[1] = EE[1] - EE[2];
    825897
    826     coeff[ 0][j] = (g_aiT16[ 0][0]*EEE[0] + g_aiT16[ 0][1]*EEE[1] + add)>>shift;       
    827     coeff[ 8][j] = (g_aiT16[ 8][0]*EEE[0] + g_aiT16[ 8][1]*EEE[1] + add)>>shift;   
    828     coeff[ 4][j] = (g_aiT16[ 4][0]*EEO[0] + g_aiT16[ 4][1]*EEO[1] + add)>>shift;       
    829     coeff[12][j] = (g_aiT16[12][0]*EEO[0] + g_aiT16[12][1]*EEO[1] + add)>>shift;
     898    dst[ 0][j] = (g_aiT16[ 0][0]*EEE[0] + g_aiT16[ 0][1]*EEE[1] + add)>>shift;       
     899    dst[ 8][j] = (g_aiT16[ 8][0]*EEE[0] + g_aiT16[ 8][1]*EEE[1] + add)>>shift;   
     900    dst[ 4][j] = (g_aiT16[ 4][0]*EEO[0] + g_aiT16[ 4][1]*EEO[1] + add)>>shift;       
     901    dst[12][j] = (g_aiT16[12][0]*EEO[0] + g_aiT16[12][1]*EEO[1] + add)>>shift;
    830902
    831903    for (k=2;k<16;k+=4)
    832904    {
    833       coeff[k][j] = (g_aiT16[k][0]*EO[0] + g_aiT16[k][1]*EO[1] + g_aiT16[k][2]*EO[2] + g_aiT16[k][3]*EO[3] + add)>>shift;     
     905      dst[k][j] = (g_aiT16[k][0]*EO[0] + g_aiT16[k][1]*EO[1] + g_aiT16[k][2]*EO[2] + g_aiT16[k][3]*EO[3] + add)>>shift;     
    834906    }
    835907   
    836908    for (k=1;k<16;k+=2)
    837909    {
    838       coeff[k][j] = (g_aiT16[k][0]*O[0] + g_aiT16[k][1]*O[1] + g_aiT16[k][2]*O[2] + g_aiT16[k][3]*O[3] +
     910      dst[k][j] = (g_aiT16[k][0]*O[0] + g_aiT16[k][1]*O[1] + g_aiT16[k][2]*O[2] + g_aiT16[k][3]*O[3] +
    839911                     g_aiT16[k][4]*O[4] + g_aiT16[k][5]*O[5] + g_aiT16[k][6]*O[6] + g_aiT16[k][7]*O[7] + add)>>shift;
    840912    }
     
    842914  }
    843915}
    844 
     916#endif
     917
     918void partialButterfly16(short *src,short *dst,int shift, int line)
     919{
     920  int j,k;
     921  int E[8],O[8];
     922  int EE[4],EO[4];
     923  int EEE[2],EEO[2];
     924  int add = 1<<(shift-1);
     925
     926  for (j=0; j<line; j++)
     927  {   
     928    /* E and O*/
     929    for (k=0;k<8;k++)
     930    {
     931      E[k] = src[k] + src[15-k];
     932      O[k] = src[k] - src[15-k];
     933    }
     934    /* EE and EO */
     935    for (k=0;k<4;k++)
     936    {
     937      EE[k] = E[k] + E[7-k];
     938      EO[k] = E[k] - E[7-k];
     939    }
     940    /* EEE and EEO */
     941    EEE[0] = EE[0] + EE[3];   
     942    EEO[0] = EE[0] - EE[3];
     943    EEE[1] = EE[1] + EE[2];
     944    EEO[1] = EE[1] - EE[2];
     945
     946    dst[ 0      ] = (g_aiT16[ 0][0]*EEE[0] + g_aiT16[ 0][1]*EEE[1] + add)>>shift;       
     947    dst[ 8*line ] = (g_aiT16[ 8][0]*EEE[0] + g_aiT16[ 8][1]*EEE[1] + add)>>shift;   
     948    dst[ 4*line ] = (g_aiT16[ 4][0]*EEO[0] + g_aiT16[ 4][1]*EEO[1] + add)>>shift;       
     949    dst[ 12*line] = (g_aiT16[12][0]*EEO[0] + g_aiT16[12][1]*EEO[1] + add)>>shift;
     950
     951    for (k=2;k<16;k+=4)
     952    {
     953      dst[ k*line ] = (g_aiT16[k][0]*EO[0] + g_aiT16[k][1]*EO[1] + g_aiT16[k][2]*EO[2] + g_aiT16[k][3]*EO[3] + add)>>shift;     
     954    }
     955
     956    for (k=1;k<16;k+=2)
     957    {
     958      dst[ k*line ] = (g_aiT16[k][0]*O[0] + g_aiT16[k][1]*O[1] + g_aiT16[k][2]*O[2] + g_aiT16[k][3]*O[3] +
     959        g_aiT16[k][4]*O[4] + g_aiT16[k][5]*O[5] + g_aiT16[k][6]*O[6] + g_aiT16[k][7]*O[7] + add)>>shift;
     960    }
     961
     962    src += 16;
     963    dst ++;
     964
     965  }
     966}
     967
     968#if !UNIFIED_TRANSFORM
    845969/** 16x16 forward transform (2D)
    846970 *  \param block input data (residual)
     
    862986
    863987/** 16x16 inverse transform implemented using partial butterfly structure (1D)
    864  *  \param coeff input data (transform coefficients)
    865  *  \param block output data (residual)
     988 *  \param src  input data (transform coefficients)
     989 *  \param dst  output data (residual)
    866990 *  \param shift specifies right shift after 1D transform
    867991 */
    868 void partialButterflyInverse16(short tmp[16][16],short block[16][16],int shift)
     992void partialButterflyInverse16(short src[16][16],short dst[16][16],int shift)
    869993{
    870994  int j,k; 
     
    8791003    for (k=0;k<8;k++)
    8801004    {
    881       O[k] = g_aiT16[ 1][k]*tmp[ 1][j] + g_aiT16[ 3][k]*tmp[ 3][j] + g_aiT16[ 5][k]*tmp[ 5][j] + g_aiT16[ 7][k]*tmp[ 7][j] +
    882              g_aiT16[ 9][k]*tmp[ 9][j] + g_aiT16[11][k]*tmp[11][j] + g_aiT16[13][k]*tmp[13][j] + g_aiT16[15][k]*tmp[15][j];
     1005      O[k] = g_aiT16[ 1][k]*src[ 1][j] + g_aiT16[ 3][k]*src[ 3][j] + g_aiT16[ 5][k]*src[ 5][j] + g_aiT16[ 7][k]*src[ 7][j] +
     1006             g_aiT16[ 9][k]*src[ 9][j] + g_aiT16[11][k]*src[11][j] + g_aiT16[13][k]*src[13][j] + g_aiT16[15][k]*src[15][j];
    8831007    }
    8841008    for (k=0;k<4;k++)
    8851009    {
    886       EO[k] = g_aiT16[ 2][k]*tmp[ 2][j] + g_aiT16[ 6][k]*tmp[ 6][j] + g_aiT16[10][k]*tmp[10][j] + g_aiT16[14][k]*tmp[14][j];
    887     }
    888     EEO[0] = g_aiT16[4][0]*tmp[4][j] + g_aiT16[12][0]*tmp[12][j];
    889     EEE[0] = g_aiT16[0][0]*tmp[0][j] + g_aiT16[ 8][0]*tmp[ 8][j];
    890     EEO[1] = g_aiT16[4][1]*tmp[4][j] + g_aiT16[12][1]*tmp[12][j];
    891     EEE[1] = g_aiT16[0][1]*tmp[0][j] + g_aiT16[ 8][1]*tmp[ 8][j];
     1010      EO[k] = g_aiT16[ 2][k]*src[ 2][j] + g_aiT16[ 6][k]*src[ 6][j] + g_aiT16[10][k]*src[10][j] + g_aiT16[14][k]*src[14][j];
     1011    }
     1012    EEO[0] = g_aiT16[4][0]*src[4][j] + g_aiT16[12][0]*src[12][j];
     1013    EEE[0] = g_aiT16[0][0]*src[0][j] + g_aiT16[ 8][0]*src[ 8][j];
     1014    EEO[1] = g_aiT16[4][1]*src[4][j] + g_aiT16[12][1]*src[12][j];
     1015    EEE[1] = g_aiT16[0][1]*src[0][j] + g_aiT16[ 8][1]*src[ 8][j];
    8921016
    8931017    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
     
    9041028    for (k=0;k<8;k++)
    9051029    {
    906       block[j][k] = (E[k] + O[k] + add)>>shift;
    907       block[j][k+8] = (E[7-k] - O[7-k] + add)>>shift;
     1030      dst[j][k]   = Clip3( -32768, 32767, (E[k] + O[k] + add)>>shift );
     1031      dst[j][k+8] = Clip3( -32768, 32767, (E[7-k] - O[7-k] + add)>>shift );
    9081032    }       
    9091033  }
    9101034}
    911 
     1035#endif
     1036
     1037void partialButterflyInverse16(short *src,short *dst,int shift, int line)
     1038{
     1039  int j,k; 
     1040  int E[8],O[8];
     1041  int EE[4],EO[4];
     1042  int EEE[2],EEO[2];
     1043  int add = 1<<(shift-1);
     1044
     1045  for (j=0; j<line; j++)
     1046  {   
     1047    /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
     1048    for (k=0;k<8;k++)
     1049    {
     1050      O[k] = g_aiT16[ 1][k]*src[ line] + g_aiT16[ 3][k]*src[ 3*line] + g_aiT16[ 5][k]*src[ 5*line] + g_aiT16[ 7][k]*src[ 7*line] +
     1051        g_aiT16[ 9][k]*src[ 9*line] + g_aiT16[11][k]*src[11*line] + g_aiT16[13][k]*src[13*line] + g_aiT16[15][k]*src[15*line];
     1052    }
     1053    for (k=0;k<4;k++)
     1054    {
     1055      EO[k] = g_aiT16[ 2][k]*src[ 2*line] + g_aiT16[ 6][k]*src[ 6*line] + g_aiT16[10][k]*src[10*line] + g_aiT16[14][k]*src[14*line];
     1056    }
     1057    EEO[0] = g_aiT16[4][0]*src[ 4*line ] + g_aiT16[12][0]*src[ 12*line ];
     1058    EEE[0] = g_aiT16[0][0]*src[ 0      ] + g_aiT16[ 8][0]*src[ 8*line  ];
     1059    EEO[1] = g_aiT16[4][1]*src[ 4*line ] + g_aiT16[12][1]*src[ 12*line ];
     1060    EEE[1] = g_aiT16[0][1]*src[ 0      ] + g_aiT16[ 8][1]*src[ 8*line  ];
     1061
     1062    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
     1063    for (k=0;k<2;k++)
     1064    {
     1065      EE[k] = EEE[k] + EEO[k];
     1066      EE[k+2] = EEE[1-k] - EEO[1-k];
     1067    }   
     1068    for (k=0;k<4;k++)
     1069    {
     1070      E[k] = EE[k] + EO[k];
     1071      E[k+4] = EE[3-k] - EO[3-k];
     1072    }   
     1073    for (k=0;k<8;k++)
     1074    {
     1075      dst[k]   = Clip3( -32768, 32767, (E[k] + O[k] + add)>>shift );
     1076      dst[k+8] = Clip3( -32768, 32767, (E[7-k] - O[7-k] + add)>>shift );
     1077    }   
     1078    src ++;
     1079    dst += 16;
     1080  }
     1081}
     1082
     1083#if !UNIFIED_TRANSFORM
    9121084/** 16x16 inverse transform (2D)
    9131085 *  \param coeff input data (transform coefficients)
     
    9291101
    9301102/** 32x32 forward transform implemented using partial butterfly structure (1D)
    931  *  \param block input data (residual)
    932  *  \param coeff output data (transform coefficients)
     1103 *  \param src  input data (residual)
     1104 *  \param dst  output data (transform coefficients)
    9331105 *  \param shift specifies right shift after 1D transform
    9341106 */
    935 void partialButterfly32(short block[32][32],short coeff[32][32],int shift)
     1107void partialButterfly32(short src[32][32],short dst[32][32],int shift)
    9361108{
    9371109  int j,k;
     
    9471119    for (k=0;k<16;k++)
    9481120    {
    949       E[k] = block[j][k] + block[j][31-k];
    950       O[k] = block[j][k] - block[j][31-k];
     1121      E[k] = src[j][k] + src[j][31-k];
     1122      O[k] = src[j][k] - src[j][31-k];
    9511123    }
    9521124    /* EE and EO */
     
    9681140    EEEO[1] = EEE[1] - EEE[2];
    9691141
    970     coeff[ 0][j] = (g_aiT32[ 0][0]*EEEE[0] + g_aiT32[ 0][1]*EEEE[1] + add)>>shift;
    971     coeff[16][j] = (g_aiT32[16][0]*EEEE[0] + g_aiT32[16][1]*EEEE[1] + add)>>shift;
    972     coeff[ 8][j] = (g_aiT32[ 8][0]*EEEO[0] + g_aiT32[ 8][1]*EEEO[1] + add)>>shift;
    973     coeff[24][j] = (g_aiT32[24][0]*EEEO[0] + g_aiT32[24][1]*EEEO[1] + add)>>shift;
     1142    dst[ 0][j] = (g_aiT32[ 0][0]*EEEE[0] + g_aiT32[ 0][1]*EEEE[1] + add)>>shift;
     1143    dst[16][j] = (g_aiT32[16][0]*EEEE[0] + g_aiT32[16][1]*EEEE[1] + add)>>shift;
     1144    dst[ 8][j] = (g_aiT32[ 8][0]*EEEO[0] + g_aiT32[ 8][1]*EEEO[1] + add)>>shift;
     1145    dst[24][j] = (g_aiT32[24][0]*EEEO[0] + g_aiT32[24][1]*EEEO[1] + add)>>shift;
    9741146    for (k=4;k<32;k+=8)
    9751147    {
    976       coeff[k][j] = (g_aiT32[k][0]*EEO[0] + g_aiT32[k][1]*EEO[1] + g_aiT32[k][2]*EEO[2] + g_aiT32[k][3]*EEO[3] + add)>>shift;
     1148      dst[k][j] = (g_aiT32[k][0]*EEO[0] + g_aiT32[k][1]*EEO[1] + g_aiT32[k][2]*EEO[2] + g_aiT32[k][3]*EEO[3] + add)>>shift;
    9771149    }       
    9781150    for (k=2;k<32;k+=4)
    9791151    {
    980       coeff[k][j] = (g_aiT32[k][0]*EO[0] + g_aiT32[k][1]*EO[1] + g_aiT32[k][2]*EO[2] + g_aiT32[k][3]*EO[3] +
     1152      dst[k][j] = (g_aiT32[k][0]*EO[0] + g_aiT32[k][1]*EO[1] + g_aiT32[k][2]*EO[2] + g_aiT32[k][3]*EO[3] +
    9811153                     g_aiT32[k][4]*EO[4] + g_aiT32[k][5]*EO[5] + g_aiT32[k][6]*EO[6] + g_aiT32[k][7]*EO[7] + add)>>shift;
    9821154    }       
    9831155    for (k=1;k<32;k+=2)
    9841156    {
    985       coeff[k][j] = (g_aiT32[k][ 0]*O[ 0] + g_aiT32[k][ 1]*O[ 1] + g_aiT32[k][ 2]*O[ 2] + g_aiT32[k][ 3]*O[ 3] +
     1157      dst[k][j] = (g_aiT32[k][ 0]*O[ 0] + g_aiT32[k][ 1]*O[ 1] + g_aiT32[k][ 2]*O[ 2] + g_aiT32[k][ 3]*O[ 3] +
    9861158                     g_aiT32[k][ 4]*O[ 4] + g_aiT32[k][ 5]*O[ 5] + g_aiT32[k][ 6]*O[ 6] + g_aiT32[k][ 7]*O[ 7] +
    9871159                     g_aiT32[k][ 8]*O[ 8] + g_aiT32[k][ 9]*O[ 9] + g_aiT32[k][10]*O[10] + g_aiT32[k][11]*O[11] +
     
    9901162  }
    9911163}
    992 
     1164#endif
     1165
     1166void partialButterfly32(short *src,short *dst,int shift, int line)
     1167{
     1168  int j,k;
     1169  int E[16],O[16];
     1170  int EE[8],EO[8];
     1171  int EEE[4],EEO[4];
     1172  int EEEE[2],EEEO[2];
     1173  int add = 1<<(shift-1);
     1174
     1175  for (j=0; j<line; j++)
     1176  {   
     1177    /* E and O*/
     1178    for (k=0;k<16;k++)
     1179    {
     1180      E[k] = src[k] + src[31-k];
     1181      O[k] = src[k] - src[31-k];
     1182    }
     1183    /* EE and EO */
     1184    for (k=0;k<8;k++)
     1185    {
     1186      EE[k] = E[k] + E[15-k];
     1187      EO[k] = E[k] - E[15-k];
     1188    }
     1189    /* EEE and EEO */
     1190    for (k=0;k<4;k++)
     1191    {
     1192      EEE[k] = EE[k] + EE[7-k];
     1193      EEO[k] = EE[k] - EE[7-k];
     1194    }
     1195    /* EEEE and EEEO */
     1196    EEEE[0] = EEE[0] + EEE[3];   
     1197    EEEO[0] = EEE[0] - EEE[3];
     1198    EEEE[1] = EEE[1] + EEE[2];
     1199    EEEO[1] = EEE[1] - EEE[2];
     1200
     1201    dst[ 0       ] = (g_aiT32[ 0][0]*EEEE[0] + g_aiT32[ 0][1]*EEEE[1] + add)>>shift;
     1202    dst[ 16*line ] = (g_aiT32[16][0]*EEEE[0] + g_aiT32[16][1]*EEEE[1] + add)>>shift;
     1203    dst[ 8*line  ] = (g_aiT32[ 8][0]*EEEO[0] + g_aiT32[ 8][1]*EEEO[1] + add)>>shift;
     1204    dst[ 24*line ] = (g_aiT32[24][0]*EEEO[0] + g_aiT32[24][1]*EEEO[1] + add)>>shift;
     1205    for (k=4;k<32;k+=8)
     1206    {
     1207      dst[ k*line ] = (g_aiT32[k][0]*EEO[0] + g_aiT32[k][1]*EEO[1] + g_aiT32[k][2]*EEO[2] + g_aiT32[k][3]*EEO[3] + add)>>shift;
     1208    }       
     1209    for (k=2;k<32;k+=4)
     1210    {
     1211      dst[ k*line ] = (g_aiT32[k][0]*EO[0] + g_aiT32[k][1]*EO[1] + g_aiT32[k][2]*EO[2] + g_aiT32[k][3]*EO[3] +
     1212        g_aiT32[k][4]*EO[4] + g_aiT32[k][5]*EO[5] + g_aiT32[k][6]*EO[6] + g_aiT32[k][7]*EO[7] + add)>>shift;
     1213    }       
     1214    for (k=1;k<32;k+=2)
     1215    {
     1216      dst[ k*line ] = (g_aiT32[k][ 0]*O[ 0] + g_aiT32[k][ 1]*O[ 1] + g_aiT32[k][ 2]*O[ 2] + g_aiT32[k][ 3]*O[ 3] +
     1217        g_aiT32[k][ 4]*O[ 4] + g_aiT32[k][ 5]*O[ 5] + g_aiT32[k][ 6]*O[ 6] + g_aiT32[k][ 7]*O[ 7] +
     1218        g_aiT32[k][ 8]*O[ 8] + g_aiT32[k][ 9]*O[ 9] + g_aiT32[k][10]*O[10] + g_aiT32[k][11]*O[11] +
     1219        g_aiT32[k][12]*O[12] + g_aiT32[k][13]*O[13] + g_aiT32[k][14]*O[14] + g_aiT32[k][15]*O[15] + add)>>shift;
     1220    }
     1221    src += 32;
     1222    dst ++;
     1223  }
     1224}
     1225
     1226#if !UNIFIED_TRANSFORM
    9931227/** 32x32 forward transform (2D)
    9941228 *  \param block input data (residual)
     
    10101244
    10111245/** 32x32 inverse transform implemented using partial butterfly structure (1D)
    1012  *  \param coeff input data (transform coefficients)
    1013  *  \param block output data (residual)
     1246 *  \param src  input data (transform coefficients)
     1247 *  \param dst  output data (residual)
    10141248 *  \param shift specifies right shift after 1D transform
    10151249 */
    1016 void partialButterflyInverse32(short tmp[32][32],short block[32][32],int shift)
     1250void partialButterflyInverse32(short src[32][32],short dst[32][32],int shift)
    10171251{
    10181252  int j,k; 
     
    10281262    for (k=0;k<16;k++)
    10291263    {
    1030       O[k] = g_aiT32[ 1][k]*tmp[ 1][j] + g_aiT32[ 3][k]*tmp[ 3][j] + g_aiT32[ 5][k]*tmp[ 5][j] + g_aiT32[ 7][k]*tmp[ 7][j] +
    1031              g_aiT32[ 9][k]*tmp[ 9][j] + g_aiT32[11][k]*tmp[11][j] + g_aiT32[13][k]*tmp[13][j] + g_aiT32[15][k]*tmp[15][j] +
    1032              g_aiT32[17][k]*tmp[17][j] + g_aiT32[19][k]*tmp[19][j] + g_aiT32[21][k]*tmp[21][j] + g_aiT32[23][k]*tmp[23][j] +
    1033              g_aiT32[25][k]*tmp[25][j] + g_aiT32[27][k]*tmp[27][j] + g_aiT32[29][k]*tmp[29][j] + g_aiT32[31][k]*tmp[31][j];
     1264      O[k] = g_aiT32[ 1][k]*src[ 1][j] + g_aiT32[ 3][k]*src[ 3][j] + g_aiT32[ 5][k]*src[ 5][j] + g_aiT32[ 7][k]*src[ 7][j] +
     1265             g_aiT32[ 9][k]*src[ 9][j] + g_aiT32[11][k]*src[11][j] + g_aiT32[13][k]*src[13][j] + g_aiT32[15][k]*src[15][j] +
     1266             g_aiT32[17][k]*src[17][j] + g_aiT32[19][k]*src[19][j] + g_aiT32[21][k]*src[21][j] + g_aiT32[23][k]*src[23][j] +
     1267             g_aiT32[25][k]*src[25][j] + g_aiT32[27][k]*src[27][j] + g_aiT32[29][k]*src[29][j] + g_aiT32[31][k]*src[31][j];
    10341268    }
    10351269    for (k=0;k<8;k++)
    10361270    {
    1037       EO[k] = g_aiT32[ 2][k]*tmp[ 2][j] + g_aiT32[ 6][k]*tmp[ 6][j] + g_aiT32[10][k]*tmp[10][j] + g_aiT32[14][k]*tmp[14][j] +
    1038               g_aiT32[18][k]*tmp[18][j] + g_aiT32[22][k]*tmp[22][j] + g_aiT32[26][k]*tmp[26][j] + g_aiT32[30][k]*tmp[30][j];
     1271      EO[k] = g_aiT32[ 2][k]*src[ 2][j] + g_aiT32[ 6][k]*src[ 6][j] + g_aiT32[10][k]*src[10][j] + g_aiT32[14][k]*src[14][j] +
     1272              g_aiT32[18][k]*src[18][j] + g_aiT32[22][k]*src[22][j] + g_aiT32[26][k]*src[26][j] + g_aiT32[30][k]*src[30][j];
    10391273    }
    10401274    for (k=0;k<4;k++)
    10411275    {
    1042       EEO[k] = g_aiT32[4][k]*tmp[4][j] + g_aiT32[12][k]*tmp[12][j] + g_aiT32[20][k]*tmp[20][j] + g_aiT32[28][k]*tmp[28][j];
    1043     }
    1044     EEEO[0] = g_aiT32[8][0]*tmp[8][j] + g_aiT32[24][0]*tmp[24][j];
    1045     EEEO[1] = g_aiT32[8][1]*tmp[8][j] + g_aiT32[24][1]*tmp[24][j];
    1046     EEEE[0] = g_aiT32[0][0]*tmp[0][j] + g_aiT32[16][0]*tmp[16][j];   
    1047     EEEE[1] = g_aiT32[0][1]*tmp[0][j] + g_aiT32[16][1]*tmp[16][j];
     1276      EEO[k] = g_aiT32[4][k]*src[4][j] + g_aiT32[12][k]*src[12][j] + g_aiT32[20][k]*src[20][j] + g_aiT32[28][k]*src[28][j];
     1277    }
     1278    EEEO[0] = g_aiT32[8][0]*src[8][j] + g_aiT32[24][0]*src[24][j];
     1279    EEEO[1] = g_aiT32[8][1]*src[8][j] + g_aiT32[24][1]*src[24][j];
     1280    EEEE[0] = g_aiT32[0][0]*src[0][j] + g_aiT32[16][0]*src[16][j];   
     1281    EEEE[1] = g_aiT32[0][1]*src[0][j] + g_aiT32[16][1]*src[16][j];
    10481282
    10491283    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
     
    10641298    for (k=0;k<16;k++)
    10651299    {
    1066       block[j][k] = (E[k] + O[k] + add)>>shift;
    1067       block[j][k+16] = (E[15-k] - O[15-k] + add)>>shift;
     1300      dst[j][k]    = Clip3( -32768, 32767, (E[k] + O[k] + add)>>shift );
     1301      dst[j][k+16] = Clip3( -32768, 32767, (E[15-k] - O[15-k] + add)>>shift );
    10681302    }       
    10691303  }
    10701304}
    1071 
     1305#endif
     1306
     1307void partialButterflyInverse32(short *src,short *dst,int shift, int line)
     1308{
     1309  int j,k; 
     1310  int E[16],O[16];
     1311  int EE[8],EO[8];
     1312  int EEE[4],EEO[4];
     1313  int EEEE[2],EEEO[2];
     1314  int add = 1<<(shift-1);
     1315
     1316  for (j=0; j<line; j++)
     1317  {   
     1318    /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
     1319    for (k=0;k<16;k++)
     1320    {
     1321      O[k] = g_aiT32[ 1][k]*src[ line  ] + g_aiT32[ 3][k]*src[ 3*line  ] + g_aiT32[ 5][k]*src[ 5*line  ] + g_aiT32[ 7][k]*src[ 7*line  ] +
     1322        g_aiT32[ 9][k]*src[ 9*line  ] + g_aiT32[11][k]*src[ 11*line ] + g_aiT32[13][k]*src[ 13*line ] + g_aiT32[15][k]*src[ 15*line ] +
     1323        g_aiT32[17][k]*src[ 17*line ] + g_aiT32[19][k]*src[ 19*line ] + g_aiT32[21][k]*src[ 21*line ] + g_aiT32[23][k]*src[ 23*line ] +
     1324        g_aiT32[25][k]*src[ 25*line ] + g_aiT32[27][k]*src[ 27*line ] + g_aiT32[29][k]*src[ 29*line ] + g_aiT32[31][k]*src[ 31*line ];
     1325    }
     1326    for (k=0;k<8;k++)
     1327    {
     1328      EO[k] = g_aiT32[ 2][k]*src[ 2*line  ] + g_aiT32[ 6][k]*src[ 6*line  ] + g_aiT32[10][k]*src[ 10*line ] + g_aiT32[14][k]*src[ 14*line ] +
     1329        g_aiT32[18][k]*src[ 18*line ] + g_aiT32[22][k]*src[ 22*line ] + g_aiT32[26][k]*src[ 26*line ] + g_aiT32[30][k]*src[ 30*line ];
     1330    }
     1331    for (k=0;k<4;k++)
     1332    {
     1333      EEO[k] = g_aiT32[4][k]*src[ 4*line ] + g_aiT32[12][k]*src[ 12*line ] + g_aiT32[20][k]*src[ 20*line ] + g_aiT32[28][k]*src[ 28*line ];
     1334    }
     1335    EEEO[0] = g_aiT32[8][0]*src[ 8*line ] + g_aiT32[24][0]*src[ 24*line ];
     1336    EEEO[1] = g_aiT32[8][1]*src[ 8*line ] + g_aiT32[24][1]*src[ 24*line ];
     1337    EEEE[0] = g_aiT32[0][0]*src[ 0      ] + g_aiT32[16][0]*src[ 16*line ];   
     1338    EEEE[1] = g_aiT32[0][1]*src[ 0      ] + g_aiT32[16][1]*src[ 16*line ];
     1339
     1340    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
     1341    EEE[0] = EEEE[0] + EEEO[0];
     1342    EEE[3] = EEEE[0] - EEEO[0];
     1343    EEE[1] = EEEE[1] + EEEO[1];
     1344    EEE[2] = EEEE[1] - EEEO[1];   
     1345    for (k=0;k<4;k++)
     1346    {
     1347      EE[k] = EEE[k] + EEO[k];
     1348      EE[k+4] = EEE[3-k] - EEO[3-k];
     1349    }   
     1350    for (k=0;k<8;k++)
     1351    {
     1352      E[k] = EE[k] + EO[k];
     1353      E[k+8] = EE[7-k] - EO[7-k];
     1354    }   
     1355    for (k=0;k<16;k++)
     1356    {
     1357      dst[k]    = Clip3( -32768, 32767, (E[k] + O[k] + add)>>shift );
     1358      dst[k+16] = Clip3( -32768, 32767, (E[15-k] - O[15-k] + add)>>shift );
     1359    }
     1360    src ++;
     1361    dst += 32;
     1362  }
     1363}
     1364
     1365#if !UNIFIED_TRANSFORM
    10721366/** 32x32 inverse transform (2D)
    10731367 *  \param coeff input data (transform coefficients)
     
    10871381  partialButterflyInverse32(tmp,block,shift_2nd);
    10881382}
     1383#endif
     1384
     1385/** MxN forward transform (2D)
     1386*  \param block input data (residual)
     1387*  \param coeff output data (transform coefficients)
     1388*  \param iWidth input data (width of transform)
     1389*  \param iHeight input data (height of transform)
     1390*/
     1391#if UNIFIED_TRANSFORM
     1392void xTrMxN(short *block,short *coeff, int iWidth, int iHeight, UInt uiMode)
     1393#else
     1394void xTrMxN(short *block,short *coeff, int iWidth, int iHeight)
     1395#endif
     1396{
     1397#if FULL_NBIT
     1398  int shift_1st = g_aucConvertToBit[iWidth]  + 1 + g_uiBitDepth - 8; // log2(iWidth) - 1 + g_uiBitDepth - 8
     1399#else
     1400  int shift_1st = g_aucConvertToBit[iWidth]  + 1 + g_uiBitIncrement; // log2(iWidth) - 1 + g_uiBitIncrement
     1401#endif
     1402  int shift_2nd = g_aucConvertToBit[iHeight]  + 8;                   // log2(iHeight) + 6
     1403
     1404  short tmp[ 64 * 64 ];
     1405
     1406  if( iWidth == 16 && iHeight == 4)
     1407  {
     1408    partialButterfly16( block, tmp, shift_1st, iHeight );
     1409    partialButterfly4( tmp, coeff, shift_2nd, iWidth );
     1410  }
     1411  else if( iWidth == 32 && iHeight == 8 )
     1412  {
     1413    partialButterfly32( block, tmp, shift_1st, iHeight );
     1414    partialButterfly8( tmp, coeff, shift_2nd, iWidth );
     1415  }
     1416  else if( iWidth == 4 && iHeight == 16)
     1417  {
     1418    partialButterfly4( block, tmp, shift_1st, iHeight );
     1419    partialButterfly16( tmp, coeff, shift_2nd, iWidth );
     1420  }
     1421  else if( iWidth == 8 && iHeight == 32 )
     1422  {
     1423    partialButterfly8( block, tmp, shift_1st, iHeight );
     1424    partialButterfly32( tmp, coeff, shift_2nd, iWidth );
     1425  }
     1426#if UNIFIED_TRANSFORM
     1427  else if( iWidth == 4 && iHeight == 4)
     1428  {
     1429#if LOGI_INTRA_NAME_3MPM
     1430    if (uiMode != REG_DCT && (!uiMode || (uiMode>=2 && uiMode <= 25)))    // Check for DCT or DST
     1431#else
     1432    if (uiMode != REG_DCT && g_aucDCTDSTMode_Hor[uiMode])// Check for DCT or DST
     1433#endif
     1434    {
     1435      fastForwardDst(block,tmp,shift_1st); // Forward DST BY FAST ALGORITHM, block input, tmp output
     1436    }
     1437    else 
     1438    {
     1439      partialButterfly4(block, tmp, shift_1st, iHeight);
     1440    }
     1441#if LOGI_INTRA_NAME_3MPM
     1442    if (uiMode != REG_DCT && (!uiMode || (uiMode>=11 && uiMode <= 34)))    // Check for DCT or DST
     1443#else
     1444    if (uiMode != REG_DCT && g_aucDCTDSTMode_Vert[uiMode] )   // Check for DCT or DST
     1445#endif
     1446    {
     1447      fastForwardDst(tmp,coeff,shift_2nd); // Forward DST BY FAST ALGORITHM, tmp input, coeff output
     1448    }
     1449    else 
     1450    {
     1451      partialButterfly4(tmp, coeff, shift_2nd, iWidth);
     1452    }   
     1453  }
     1454  else if( iWidth == 8 && iHeight == 8)
     1455  {
     1456    partialButterfly8( block, tmp, shift_1st, iHeight );
     1457    partialButterfly8( tmp, coeff, shift_2nd, iWidth );
     1458  }
     1459  else if( iWidth == 16 && iHeight == 16)
     1460  {
     1461    partialButterfly16( block, tmp, shift_1st, iHeight );
     1462    partialButterfly16( tmp, coeff, shift_2nd, iWidth );
     1463  }
     1464  else if( iWidth == 32 && iHeight == 32)
     1465  {
     1466    partialButterfly32( block, tmp, shift_1st, iHeight );
     1467    partialButterfly32( tmp, coeff, shift_2nd, iWidth );
     1468  }
     1469#endif
     1470}
     1471/** MxN inverse transform (2D)
     1472*  \param coeff input data (transform coefficients)
     1473*  \param block output data (residual)
     1474*  \param iWidth input data (width of transform)
     1475*  \param iHeight input data (height of transform)
     1476*/
     1477#if UNIFIED_TRANSFORM
     1478void xITrMxN(short *coeff,short *block, int iWidth, int iHeight, UInt uiMode)
     1479#else
     1480void xITrMxN(short *coeff,short *block, int iWidth, int iHeight)
     1481#endif
     1482{
     1483  int shift_1st = SHIFT_INV_1ST;
     1484#if FULL_NBIT
     1485  int shift_2nd = SHIFT_INV_2ND - ((short)g_uiBitDepth - 8);
     1486#else
     1487  int shift_2nd = SHIFT_INV_2ND - g_uiBitIncrement;
     1488#endif
     1489
     1490  short tmp[ 64*64];
     1491  if( iWidth == 16 && iHeight == 4)
     1492  {
     1493    partialButterflyInverse4(coeff,tmp,shift_1st,iWidth);
     1494    partialButterflyInverse16(tmp,block,shift_2nd,iHeight);
     1495  }
     1496  else if( iWidth == 32 && iHeight == 8)
     1497  {
     1498    partialButterflyInverse8(coeff,tmp,shift_1st,iWidth);
     1499    partialButterflyInverse32(tmp,block,shift_2nd,iHeight);
     1500  }
     1501  else if( iWidth == 4 && iHeight == 16)
     1502  {
     1503    partialButterflyInverse16(coeff,tmp,shift_1st,iWidth);
     1504    partialButterflyInverse4(tmp,block,shift_2nd,iHeight);
     1505  }
     1506  else if( iWidth == 8 && iHeight == 32)
     1507  {
     1508    partialButterflyInverse32(coeff,tmp,shift_1st,iWidth);
     1509    partialButterflyInverse8(tmp,block,shift_2nd,iHeight);
     1510  }
     1511#if UNIFIED_TRANSFORM
     1512  else if( iWidth == 4 && iHeight == 4)
     1513  {
     1514#if LOGI_INTRA_NAME_3MPM
     1515    if (uiMode != REG_DCT && (!uiMode || (uiMode>=11 && uiMode <= 34)))    // Check for DCT or DST
     1516#else
     1517    if (uiMode != REG_DCT && g_aucDCTDSTMode_Vert[uiMode] )    // Check for DCT or DST
     1518#endif
     1519    {
     1520      fastInverseDst(coeff,tmp,shift_1st);    // Inverse DST by FAST Algorithm, coeff input, tmp output
     1521    }
     1522    else
     1523    {
     1524      partialButterflyInverse4(coeff,tmp,shift_1st,iWidth);   
     1525    }
     1526#if LOGI_INTRA_NAME_3MPM
     1527    if (uiMode != REG_DCT && (!uiMode || (uiMode>=2 && uiMode <= 25)))    // Check for DCT or DST
     1528#else
     1529    if (uiMode != REG_DCT && g_aucDCTDSTMode_Hor[uiMode] )    // Check for DCT or DST
     1530#endif
     1531    {
     1532      fastInverseDst(tmp,block,shift_2nd); // Inverse DST by FAST Algorithm, tmp input, coeff output
     1533    }
     1534    else
     1535    {
     1536      partialButterflyInverse4(tmp,block,shift_2nd,iHeight);
     1537    }   
     1538  }
     1539  else if( iWidth == 8 && iHeight == 8)
     1540  {
     1541    partialButterflyInverse8(coeff,tmp,shift_1st,iWidth);
     1542    partialButterflyInverse8(tmp,block,shift_2nd,iHeight);
     1543  }
     1544  else if( iWidth == 16 && iHeight == 16)
     1545  {
     1546    partialButterflyInverse16(coeff,tmp,shift_1st,iWidth);
     1547    partialButterflyInverse16(tmp,block,shift_2nd,iHeight);
     1548  }
     1549  else if( iWidth == 32 && iHeight == 32)
     1550  {
     1551    partialButterflyInverse32(coeff,tmp,shift_1st,iWidth);
     1552    partialButterflyInverse32(tmp,block,shift_2nd,iHeight);
     1553  }
     1554#endif
     1555}
     1556
    10891557#endif //MATRIX_MULT
    1090 #else //E243_CORE_TRANSFORMS
    1091 
    1092 Void TComTrQuant::xT32( Pel* pSrc, UInt uiStride, Long* pDes )
    1093 {
    1094   Int x, y;
    1095   Long aaiTemp[32][32];
    1096  
    1097   Long A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27, A28, A29, A30, A31;
    1098   Long B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15, B20, B21, B22, B23, B24, B25, B26, B27;
    1099   Long C0, C1, C2, C3, C4, C5, C6, C7, C10, C11, C12, C13, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25, C26, C27, C28, C29, C30, C31;
    1100   Long D0, D1, D2, D3, D5, D6, D8, D9, D10, D11, D12, D13, D14, D15, D18, D19, D20, D21, D26, D27, D28, D29;
    1101   Long E4, E5, E6, E7, E9, E10, E13, E14, E16, E17, E18, E19, E20, E21, E22, E23, E24, E25, E26, E27, E28, E29, E30, E31;
    1102   Long F8, F9, F10, F11, F12, F13, F14, F15, F17, F18, F21, F22, F25, F26, F29, F30;
    1103   Long G16, G17, G18, G19, G20, G21, G22, G23, G24, G25, G26, G27, G28, G29, G30, G31;
    1104 #ifdef TRANS_PRECISION_EXT
    1105   Int uiBitDepthIncrease=g_iShift32x32-g_uiBitIncrement;
    1106   Int offset = (uiBitDepthIncrease==0)? 0:(1<<(uiBitDepthIncrease-1));
    1107 #endif
    1108   //--Butterfly
    1109   for( y=0 ; y<32 ; y++ )
    1110   {
    1111 #ifdef TRANS_PRECISION_EXT
    1112     A0  = (pSrc[0] + pSrc[31])<<uiBitDepthIncrease;
    1113     A31 = (pSrc[0] - pSrc[31])<<uiBitDepthIncrease;
    1114     A1  = (pSrc[1] + pSrc[30])<<uiBitDepthIncrease;
    1115     A30 = (pSrc[1] - pSrc[30])<<uiBitDepthIncrease;
    1116     A2  = (pSrc[2] + pSrc[29])<<uiBitDepthIncrease;
    1117     A29 = (pSrc[2] - pSrc[29])<<uiBitDepthIncrease;
    1118     A3  = (pSrc[3] + pSrc[28])<<uiBitDepthIncrease;
    1119     A28 = (pSrc[3] - pSrc[28])<<uiBitDepthIncrease;
    1120     A4  = (pSrc[4] + pSrc[27])<<uiBitDepthIncrease;
    1121     A27 = (pSrc[4] - pSrc[27])<<uiBitDepthIncrease;
    1122     A5  = (pSrc[5] + pSrc[26])<<uiBitDepthIncrease;
    1123     A26 = (pSrc[5] - pSrc[26])<<uiBitDepthIncrease;
    1124     A6  = (pSrc[6] + pSrc[25])<<uiBitDepthIncrease;
    1125     A25 = (pSrc[6] - pSrc[25])<<uiBitDepthIncrease;
    1126     A7  = (pSrc[7] + pSrc[24])<<uiBitDepthIncrease;
    1127     A24 = (pSrc[7] - pSrc[24])<<uiBitDepthIncrease;
    1128     A8  = (pSrc[8] + pSrc[23])<<uiBitDepthIncrease;
    1129     A23 = (pSrc[8] - pSrc[23])<<uiBitDepthIncrease;
    1130     A9  = (pSrc[9] + pSrc[22])<<uiBitDepthIncrease;
    1131     A22 = (pSrc[9] - pSrc[22])<<uiBitDepthIncrease;
    1132     A10 = (pSrc[10] + pSrc[21])<<uiBitDepthIncrease;
    1133     A21 = (pSrc[10] - pSrc[21])<<uiBitDepthIncrease;
    1134     A11 = (pSrc[11] + pSrc[20])<<uiBitDepthIncrease;
    1135     A20 = (pSrc[11] - pSrc[20])<<uiBitDepthIncrease;
    1136     A12 = (pSrc[12] + pSrc[19])<<uiBitDepthIncrease;
    1137     A19 = (pSrc[12] - pSrc[19])<<uiBitDepthIncrease;
    1138     A13 = (pSrc[13] + pSrc[18])<<uiBitDepthIncrease;
    1139     A18 = (pSrc[13] - pSrc[18])<<uiBitDepthIncrease;
    1140     A14 = (pSrc[14] + pSrc[17])<<uiBitDepthIncrease;
    1141     A17 = (pSrc[14] - pSrc[17])<<uiBitDepthIncrease;
    1142     A15 = (pSrc[15] + pSrc[16])<<uiBitDepthIncrease;
    1143     A16 = (pSrc[15] - pSrc[16])<<uiBitDepthIncrease;
    1144 #else
    1145     A0 = pSrc[0] + pSrc[31];
    1146     A31 = pSrc[0] - pSrc[31];
    1147     A1 = pSrc[1] + pSrc[30];
    1148     A30 = pSrc[1] - pSrc[30];
    1149     A2 = pSrc[2] + pSrc[29];
    1150     A29 = pSrc[2] - pSrc[29];
    1151     A3 = pSrc[3] + pSrc[28];
    1152     A28 = pSrc[3] - pSrc[28];
    1153     A4 = pSrc[4] + pSrc[27];
    1154     A27 = pSrc[4] - pSrc[27];
    1155     A5 = pSrc[5] + pSrc[26];
    1156     A26 = pSrc[5] - pSrc[26];
    1157     A6 = pSrc[6] + pSrc[25];
    1158     A25 = pSrc[6] - pSrc[25];
    1159     A7 = pSrc[7] + pSrc[24];
    1160     A24 = pSrc[7] - pSrc[24];
    1161     A8 = pSrc[8] + pSrc[23];
    1162     A23 = pSrc[8] - pSrc[23];
    1163     A9 = pSrc[9] + pSrc[22];
    1164     A22 = pSrc[9] - pSrc[22];
    1165     A10 = pSrc[10] + pSrc[21];
    1166     A21 = pSrc[10] - pSrc[21];
    1167     A11 = pSrc[11] + pSrc[20];
    1168     A20 = pSrc[11] - pSrc[20];
    1169     A12 = pSrc[12] + pSrc[19];
    1170     A19 = pSrc[12] - pSrc[19];
    1171     A13 = pSrc[13] + pSrc[18];
    1172     A18 = pSrc[13] - pSrc[18];
    1173     A14 = pSrc[14] + pSrc[17];
    1174     A17 = pSrc[14] - pSrc[17];
    1175     A15 = pSrc[15] + pSrc[16];
    1176     A16 = pSrc[15] - pSrc[16];
    1177 #endif
    1178     B0 = A0 + A15;
    1179     B15 = A0 - A15;
    1180     B1 = A1 + A14;
    1181     B14 = A1 - A14;
    1182     B2 = A2 + A13;
    1183     B13 = A2 - A13;
    1184     B3 = A3 + A12;
    1185     B12 = A3 - A12;
    1186     B4 = A4 + A11;
    1187     B11 = A4 - A11;
    1188     B5 = A5 + A10;
    1189     B10 = A5 - A10;
    1190     B6 = A6 + A9;
    1191     B9 = A6 - A9;
    1192     B7 = A7 + A8;
    1193     B8 = A7 - A8;
    1194     B20 = xTrRound( 181 * ( A27 - A20 ) , DenShift32);
    1195     B27 = xTrRound( 181 * ( A27 + A20 ) , DenShift32);
    1196     B21 = xTrRound( 181 * ( A26 - A21 ) , DenShift32);
    1197     B26 = xTrRound( 181 * ( A26 + A21 ) , DenShift32);
    1198     B22 = xTrRound( 181 * ( A25 - A22 ) , DenShift32);
    1199     B25 = xTrRound( 181 * ( A25 + A22 ) , DenShift32);
    1200     B23 = xTrRound( 181 * ( A24 - A23 ) , DenShift32);
    1201     B24 = xTrRound( 181 * ( A24 + A23 ) , DenShift32);;
     1558
     1559#if MULTIBITS_DATA_HIDING
     1560// To minimize the distortion only. No rate is considered.
     1561Void TComTrQuant::signBitHidingHDQ( TComDataCU* pcCU, TCoeff* pQCoef, TCoeff* pCoef, UInt const *scan, Int* deltaU, Int width, Int height )
     1562{
     1563  Int tsig = pcCU->getSlice()->getPPS()->getTSIG() ;
     1564  Int lastCG = -1;
     1565  Int absSum = 0 ;
     1566  Int n ;
     1567
     1568  for( Int subSet = (width*height-1) >> LOG2_SCAN_SET_SIZE; subSet >= 0; subSet-- )
     1569  {
     1570    Int  subPos     = subSet << LOG2_SCAN_SET_SIZE;
     1571    Int  firstNZPosInCG=SCAN_SET_SIZE , lastNZPosInCG=-1 ;
     1572    absSum = 0 ;
     1573
     1574    for(n = SCAN_SET_SIZE-1; n >= 0; --n )
     1575    {
     1576      if( pQCoef[ scan[ n + subPos ]] )
     1577      {
     1578        lastNZPosInCG = n;
     1579        break;
     1580      }
     1581    }
     1582
     1583    for(n = 0; n <SCAN_SET_SIZE; n++ )
     1584    {
     1585      if( pQCoef[ scan[ n + subPos ]] )
     1586      {
     1587        firstNZPosInCG = n;
     1588        break;
     1589      }
     1590    }
     1591
     1592    for(n = firstNZPosInCG; n <=lastNZPosInCG; n++ )
     1593    {
     1594      absSum += pQCoef[ scan[ n + subPos ]];
     1595    }
     1596
     1597    if(lastNZPosInCG>=0 && lastCG==-1)
     1598    {
     1599      lastCG = 1 ;
     1600    }
    12021601   
    1203     C0 = B0 + B7;
    1204     C7 = B0 - B7;
    1205     C1 = B1 + B6;
    1206     C6 = B1 - B6;
    1207     C2 = B2 + B5;
    1208     C5 = B2 - B5;
    1209     C3 = B3 + B4;
    1210     C4 = B3 - B4;
    1211     C10 = xTrRound( 181 * ( B13 - B10 ) , DenShift32);
    1212     C13 = xTrRound( 181 * ( B13 + B10 ) , DenShift32);
    1213     C11 = xTrRound( 181 * ( B12 - B11 ) , DenShift32);
    1214     C12 = xTrRound( 181 * ( B12 + B11 ) , DenShift32);
    1215     C16 = A16 + B23;
    1216     C23 = A16 - B23;
    1217     C24 = A31 - B24;
    1218     C31 = A31 + B24;
    1219     C17 = A17 + B22;
    1220     C22 = A17 - B22;
    1221     C25 = A30 - B25;
    1222     C30 = A30 + B25;
    1223     C18 = A18 + B21;
    1224     C21 = A18 - B21;
    1225     C26 = A29 - B26;
    1226     C29 = A29 + B26;
    1227     C19 = A19 + B20;
    1228     C20 = A19 - B20;
    1229     C27 = A28 - B27;
    1230     C28 = A28 + B27;
    1231    
    1232     D0 = C0 + C3;
    1233     D3 = C0 - C3;
    1234     D8 = B8 + C11;
    1235     D11 = B8 - C11;
    1236     D12 = B15 - C12;
    1237     D15 = B15 + C12;
    1238     D1 = C1 + C2;
    1239     D2 = C1 - C2;
    1240     D9 = B9 + C10;
    1241     D10 = B9 - C10;
    1242     D13 = B14 - C13;
    1243     D14 = B14 + C13;
    1244     D5 = xTrRound( 181 * ( C6 - C5 ) , DenShift32);
    1245     D6 = xTrRound( 181 * ( C6 + C5 ) , DenShift32);
    1246     D18 = xTrRound( 97 * C29 - 236 * C18 , DenShift32);
    1247     D20 = xTrRound(  - 236 * C27 - 97 * C20 , DenShift32);
    1248     D26 = xTrRound(  - 236 * C21 + 97 * C26 , DenShift32);
    1249     D28 = xTrRound( 97 * C19 + 236 * C28 , DenShift32);
    1250     D19 = xTrRound( 97 * C28 - 236 * C19 , DenShift32);
    1251     D21 = xTrRound(  - 236 * C26 - 97 * C21 , DenShift32);
    1252     D27 = xTrRound(  - 236 * C20 + 97 * C27 , DenShift32);
    1253     D29 = xTrRound( 97 * C18 + 236 * C29 , DenShift32);;
    1254    
    1255     aaiTemp[0][y] = xTrRound( 181 * ( D0 + D1 ) , DenShift32);
    1256     aaiTemp[16][y] = xTrRound( 181 * ( D0 - D1 ) , DenShift32);
    1257     aaiTemp[8][y] = xTrRound( 236 * D3 + 97 * D2 , DenShift32);
    1258     aaiTemp[24][y] = xTrRound( 97 * D3 - 236 * D2 , DenShift32);
    1259     E4 = C4 + D5;
    1260     E5 = C4 - D5;
    1261     E6 = C7 - D6;
    1262     E7 = C7 + D6;
    1263     E9 = xTrRound( 97 * D14 - 236 * D9 , DenShift32);
    1264     E10 = xTrRound(  - 236 * D13 - 97 * D10 , DenShift32);
    1265     E13 = xTrRound( 97 * D13 - 236 * D10 , DenShift32);
    1266     E14 = xTrRound( 236 * D14 + 97 * D9 , DenShift32);
    1267     E16 = C16 + D19;
    1268     E19 = C16 - D19;
    1269     E20 = C23 - D20;
    1270     E23 = C23 + D20;
    1271     E24 = C24 + D27;
    1272     E27 = C24 - D27;
    1273     E28 = C31 - D28;
    1274     E31 = C31 + D28;
    1275     E17 = C17 + D18;
    1276     E18 = C17 - D18;
    1277     E21 = C22 - D21;
    1278     E22 = C22 + D21;
    1279     E25 = C25 + D26;
    1280     E26 = C25 - D26;
    1281     E29 = C30 - D29;
    1282     E30 = C30 + D29;
    1283    
    1284     aaiTemp[4][y] = xTrRound( 49 * E4 + 251 * E7 , DenShift32);
    1285     aaiTemp[20][y] = xTrRound( 212 * E5 + 142 * E6 , DenShift32);
    1286     aaiTemp[12][y] = xTrRound( 212 * E6 - 142 * E5 , DenShift32);
    1287     aaiTemp[28][y] = xTrRound( 49 * E7 - 251 * E4 , DenShift32);
    1288     F8 = D8 + E9;
    1289     F9 = D8 - E9;
    1290     F10 = D11 - E10;
    1291     F11 = D11 + E10;
    1292     F12 = D12 + E13;
    1293     F13 = D12 - E13;
    1294     F14 = D15 - E14;
    1295     F15 = D15 + E14;
    1296     F17 = xTrRound( 49 * E30 - 251 * E17 , DenShift32);
    1297     F18 = xTrRound(  - 251 * E29 - 49 * E18 , DenShift32);
    1298     F21 = xTrRound( 212 * E26 - 142 * E21 , DenShift32);
    1299     F22 = xTrRound(  - 142 * E25 - 212 * E22 , DenShift32);
    1300     F25 = xTrRound( 212 * E25 - 142 * E22 , DenShift32);
    1301     F26 = xTrRound( 142 * E26 + 212 * E21 , DenShift32);
    1302     F29 = xTrRound( 49 * E29 - 251 * E18 , DenShift32);
    1303     F30 = xTrRound( 251 * E30 + 49 * E17 , DenShift32);;
    1304    
    1305     aaiTemp[2][y] = xTrRound( 25 * F8 + 254 * F15 , DenShift32);
    1306     aaiTemp[18][y] = xTrRound( 197 * F9 + 162 * F14 , DenShift32);
    1307     aaiTemp[10][y] = xTrRound( 120 * F10 + 225 * F13 , DenShift32);
    1308     aaiTemp[26][y] = xTrRound( 244 * F11 + 74 * F12 , DenShift32);
    1309     aaiTemp[6][y] = xTrRound( 244 * F12 - 74 * F11 , DenShift32);
    1310     aaiTemp[22][y] = xTrRound( 120 * F13 - 225 * F10 , DenShift32);
    1311     aaiTemp[14][y] = xTrRound( 197 * F14 - 162 * F9 , DenShift32);
    1312     aaiTemp[30][y] = xTrRound( 25 * F15 - 254 * F8 , DenShift32);
    1313     G16 = E16 + F17;
    1314     G17 = E16 - F17;
    1315     G18 = E19 - F18;
    1316     G19 = E19 + F18;
    1317     G20 = E20 + F21;
    1318     G21 = E20 - F21;
    1319     G22 = E23 - F22;
    1320     G23 = E23 + F22;
    1321     G24 = E24 + F25;
    1322     G25 = E24 - F25;
    1323     G26 = E27 - F26;
    1324     G27 = E27 + F26;
    1325     G28 = E28 + F29;
    1326     G29 = E28 - F29;
    1327     G30 = E31 - F30;
    1328     G31 = E31 + F30;
    1329    
    1330     aaiTemp[1][y] = xTrRound( 12 * G16 + 255 * G31 , DenShift32);
    1331     aaiTemp[17][y] = xTrRound( 189 * G17 + 171 * G30 , DenShift32);
    1332     aaiTemp[9][y] = xTrRound( 109 * G18 + 231 * G29 , DenShift32);
    1333     aaiTemp[25][y] = xTrRound( 241 * G19 + 86 * G28 , DenShift32);
    1334     aaiTemp[5][y] = xTrRound( 62 * G20 + 248 * G27 , DenShift32);
    1335     aaiTemp[21][y] = xTrRound( 219 * G21 + 131 * G26 , DenShift32);
    1336     aaiTemp[13][y] = xTrRound( 152 * G22 + 205 * G25 , DenShift32);
    1337     aaiTemp[29][y] = xTrRound( 253 * G23 + 37 * G24 , DenShift32);
    1338     aaiTemp[3][y] = xTrRound( 253 * G24 - 37 * G23 , DenShift32);
    1339     aaiTemp[19][y] = xTrRound( 152 * G25 - 205 * G22 , DenShift32);
    1340     aaiTemp[11][y] = xTrRound( 219 * G26 - 131 * G21 , DenShift32);
    1341     aaiTemp[27][y] = xTrRound( 62 * G27 - 248 * G20 , DenShift32);
    1342     aaiTemp[7][y] = xTrRound( 241 * G28 - 86 * G19 , DenShift32);
    1343     aaiTemp[23][y] = xTrRound( 109 * G29 - 231 * G18 , DenShift32);
    1344     aaiTemp[15][y] = xTrRound( 189 * G30 - 171 * G17 , DenShift32);
    1345     aaiTemp[31][y] = xTrRound( 12 * G31 - 255 * G16 , DenShift32);
    1346    
    1347     pSrc += uiStride;
    1348   }
    1349  
    1350   for( x=0 ; x<32 ; x++, pDes++ )
    1351   {
    1352     A0 = aaiTemp[x][0] + aaiTemp[x][31];
    1353     A31 = aaiTemp[x][0] - aaiTemp[x][31];
    1354     A1 = aaiTemp[x][1] + aaiTemp[x][30];
    1355     A30 = aaiTemp[x][1] - aaiTemp[x][30];
    1356     A2 = aaiTemp[x][2] + aaiTemp[x][29];
    1357     A29 = aaiTemp[x][2] - aaiTemp[x][29];
    1358     A3 = aaiTemp[x][3] + aaiTemp[x][28];
    1359     A28 = aaiTemp[x][3] - aaiTemp[x][28];
    1360     A4 = aaiTemp[x][4] + aaiTemp[x][27];
    1361     A27 = aaiTemp[x][4] - aaiTemp[x][27];
    1362     A5 = aaiTemp[x][5] + aaiTemp[x][26];
    1363     A26 = aaiTemp[x][5] - aaiTemp[x][26];
    1364     A6 = aaiTemp[x][6] + aaiTemp[x][25];
    1365     A25 = aaiTemp[x][6] - aaiTemp[x][25];
    1366     A7 = aaiTemp[x][7] + aaiTemp[x][24];
    1367     A24 = aaiTemp[x][7] - aaiTemp[x][24];
    1368     A8 = aaiTemp[x][8] + aaiTemp[x][23];
    1369     A23 = aaiTemp[x][8] - aaiTemp[x][23];
    1370     A9 = aaiTemp[x][9] + aaiTemp[x][22];
    1371     A22 = aaiTemp[x][9] - aaiTemp[x][22];
    1372     A10 = aaiTemp[x][10] + aaiTemp[x][21];
    1373     A21 = aaiTemp[x][10] - aaiTemp[x][21];
    1374     A11 = aaiTemp[x][11] + aaiTemp[x][20];
    1375     A20 = aaiTemp[x][11] - aaiTemp[x][20];
    1376     A12 = aaiTemp[x][12] + aaiTemp[x][19];
    1377     A19 = aaiTemp[x][12] - aaiTemp[x][19];
    1378     A13 = aaiTemp[x][13] + aaiTemp[x][18];
    1379     A18 = aaiTemp[x][13] - aaiTemp[x][18];
    1380     A14 = aaiTemp[x][14] + aaiTemp[x][17];
    1381     A17 = aaiTemp[x][14] - aaiTemp[x][17];
    1382     A15 = aaiTemp[x][15] + aaiTemp[x][16];
    1383     A16 = aaiTemp[x][15] - aaiTemp[x][16];
    1384    
    1385     B0 = A0 + A15;
    1386     B15 = A0 - A15;
    1387     B1 = A1 + A14;
    1388     B14 = A1 - A14;
    1389     B2 = A2 + A13;
    1390     B13 = A2 - A13;
    1391     B3 = A3 + A12;
    1392     B12 = A3 - A12;
    1393     B4 = A4 + A11;
    1394     B11 = A4 - A11;
    1395     B5 = A5 + A10;
    1396     B10 = A5 - A10;
    1397     B6 = A6 + A9;
    1398     B9 = A6 - A9;
    1399     B7 = A7 + A8;
    1400     B8 = A7 - A8;
    1401     B20 = xTrRound( 181 * ( A27 - A20 ) , DenShift32);
    1402     B27 = xTrRound( 181 * ( A27 + A20 ) , DenShift32);
    1403     B21 = xTrRound( 181 * ( A26 - A21 ) , DenShift32);
    1404     B26 = xTrRound( 181 * ( A26 + A21 ) , DenShift32);
    1405     B22 = xTrRound( 181 * ( A25 - A22 ) , DenShift32);
    1406     B25 = xTrRound( 181 * ( A25 + A22 ) , DenShift32);
    1407     B23 = xTrRound( 181 * ( A24 - A23 ) , DenShift32);
    1408     B24 = xTrRound( 181 * ( A24 + A23 ) , DenShift32);;
    1409    
    1410     C0 = B0 + B7;
    1411     C7 = B0 - B7;
    1412     C1 = B1 + B6;
    1413     C6 = B1 - B6;
    1414     C2 = B2 + B5;
    1415     C5 = B2 - B5;
    1416     C3 = B3 + B4;
    1417     C4 = B3 - B4;
    1418     C10 = xTrRound( 181 * ( B13 - B10 ) , DenShift32);
    1419     C13 = xTrRound( 181 * ( B13 + B10 ) , DenShift32);
    1420     C11 = xTrRound( 181 * ( B12 - B11 ) , DenShift32);
    1421     C12 = xTrRound( 181 * ( B12 + B11 ) , DenShift32);
    1422     C16 = A16 + B23;
    1423     C23 = A16 - B23;
    1424     C24 = A31 - B24;
    1425     C31 = A31 + B24;
    1426     C17 = A17 + B22;
    1427     C22 = A17 - B22;
    1428     C25 = A30 - B25;
    1429     C30 = A30 + B25;
    1430     C18 = A18 + B21;
    1431     C21 = A18 - B21;
    1432     C26 = A29 - B26;
    1433     C29 = A29 + B26;
    1434     C19 = A19 + B20;
    1435     C20 = A19 - B20;
    1436     C27 = A28 - B27;
    1437     C28 = A28 + B27;
    1438    
    1439     D0 = C0 + C3;
    1440     D3 = C0 - C3;
    1441     D8 = B8 + C11;
    1442     D11 = B8 - C11;
    1443     D12 = B15 - C12;
    1444     D15 = B15 + C12;
    1445     D1 = C1 + C2;
    1446     D2 = C1 - C2;
    1447     D9 = B9 + C10;
    1448     D10 = B9 - C10;
    1449     D13 = B14 - C13;
    1450     D14 = B14 + C13;
    1451     D5 = xTrRound( 181 * ( C6 - C5 ) , DenShift32);
    1452     D6 = xTrRound( 181 * ( C6 + C5 ) , DenShift32);
    1453     D18 = xTrRound( 97 * C29 - 236 * C18 , DenShift32);
    1454     D20 = xTrRound(  - 236 * C27 - 97 * C20 , DenShift32);
    1455     D26 = xTrRound(  - 236 * C21 + 97 * C26 , DenShift32);
    1456     D28 = xTrRound( 97 * C19 + 236 * C28 , DenShift32);
    1457     D19 = xTrRound( 97 * C28 - 236 * C19 , DenShift32);
    1458     D21 = xTrRound(  - 236 * C26 - 97 * C21 , DenShift32);
    1459     D27 = xTrRound(  - 236 * C20 + 97 * C27 , DenShift32);
    1460     D29 = xTrRound( 97 * C18 + 236 * C29 , DenShift32);;
    1461    
    1462     pDes[0] = xTrRound( 181 * ( D0 + D1 ) , DenShift32);
    1463     pDes[512] = xTrRound( 181 * ( D0 - D1 ) , DenShift32);
    1464     pDes[256] = xTrRound( 236 * D3 + 97 * D2 , DenShift32);
    1465     pDes[768] = xTrRound( 97 * D3 - 236 * D2 , DenShift32);
    1466 #ifdef TRANS_PRECISION_EXT
    1467     pDes[0]   = (pDes[0]  +offset)>>uiBitDepthIncrease;
    1468     pDes[512] = (pDes[512]+offset)>>uiBitDepthIncrease;
    1469     pDes[256] = (pDes[256]+offset)>>uiBitDepthIncrease;
    1470     pDes[768] = (pDes[768]+offset)>>uiBitDepthIncrease;
    1471 #endif
    1472     E4 = C4 + D5;
    1473     E5 = C4 - D5;
    1474     E6 = C7 - D6;
    1475     E7 = C7 + D6;
    1476     E9 = xTrRound( 97 * D14 - 236 * D9 , DenShift32);
    1477     E10 = xTrRound(  - 236 * D13 - 97 * D10 , DenShift32);
    1478     E13 = xTrRound( 97 * D13 - 236 * D10 , DenShift32);
    1479     E14 = xTrRound( 236 * D14 + 97 * D9 , DenShift32);
    1480     E16 = C16 + D19;
    1481     E19 = C16 - D19;
    1482     E20 = C23 - D20;
    1483     E23 = C23 + D20;
    1484     E24 = C24 + D27;
    1485     E27 = C24 - D27;
    1486     E28 = C31 - D28;
    1487     E31 = C31 + D28;
    1488     E17 = C17 + D18;
    1489     E18 = C17 - D18;
    1490     E21 = C22 - D21;
    1491     E22 = C22 + D21;
    1492     E25 = C25 + D26;
    1493     E26 = C25 - D26;
    1494     E29 = C30 - D29;
    1495     E30 = C30 + D29;
    1496    
    1497     pDes[128] = xTrRound( 49 * E4 + 251 * E7 , DenShift32);
    1498     pDes[640] = xTrRound( 212 * E5 + 142 * E6 , DenShift32);
    1499     pDes[384] = xTrRound( 212 * E6 - 142 * E5 , DenShift32);
    1500     pDes[896] = xTrRound( 49 * E7 - 251 * E4 , DenShift32);
    1501 #ifdef TRANS_PRECISION_EXT
    1502     pDes[128] = (pDes[128]+offset)>>uiBitDepthIncrease;
    1503     pDes[640] = (pDes[640]+offset)>>uiBitDepthIncrease;
    1504     pDes[384] = (pDes[384]+offset)>>uiBitDepthIncrease;
    1505     pDes[896] = (pDes[896]+offset)>>uiBitDepthIncrease;
    1506 #endif
    1507     F8 = D8 + E9;
    1508     F9 = D8 - E9;
    1509     F10 = D11 - E10;
    1510     F11 = D11 + E10;
    1511     F12 = D12 + E13;
    1512     F13 = D12 - E13;
    1513     F14 = D15 - E14;
    1514     F15 = D15 + E14;
    1515     F17 = xTrRound( 49 * E30 - 251 * E17 , DenShift32);
    1516     F18 = xTrRound(  - 251 * E29 - 49 * E18 , DenShift32);
    1517     F21 = xTrRound( 212 * E26 - 142 * E21 , DenShift32);
    1518     F22 = xTrRound(  - 142 * E25 - 212 * E22 , DenShift32);
    1519     F25 = xTrRound( 212 * E25 - 142 * E22 , DenShift32);
    1520     F26 = xTrRound( 142 * E26 + 212 * E21 , DenShift32);
    1521     F29 = xTrRound( 49 * E29 - 251 * E18 , DenShift32);
    1522     F30 = xTrRound( 251 * E30 + 49 * E17 , DenShift32);;
    1523    
    1524     pDes[64] = xTrRound( 25 * F8 + 254 * F15 , DenShift32);
    1525     pDes[576] = xTrRound( 197 * F9 + 162 * F14 , DenShift32);
    1526     pDes[320] = xTrRound( 120 * F10 + 225 * F13 , DenShift32);
    1527     pDes[832] = xTrRound( 244 * F11 + 74 * F12 , DenShift32);
    1528     pDes[192] = xTrRound( 244 * F12 - 74 * F11 , DenShift32);
    1529     pDes[704] = xTrRound( 120 * F13 - 225 * F10 , DenShift32);
    1530     pDes[448] = xTrRound( 197 * F14 - 162 * F9 , DenShift32);
    1531     pDes[960] = xTrRound( 25 * F15 - 254 * F8 , DenShift32);
    1532 #ifdef TRANS_PRECISION_EXT
    1533     pDes[64]  = (pDes[64] +offset)>>uiBitDepthIncrease;
    1534     pDes[576] = (pDes[576]+offset)>>uiBitDepthIncrease;
    1535     pDes[320] = (pDes[320]+offset)>>uiBitDepthIncrease;
    1536     pDes[832] = (pDes[832]+offset)>>uiBitDepthIncrease;
    1537     pDes[192] = (pDes[192]+offset)>>uiBitDepthIncrease;
    1538     pDes[704] = (pDes[704]+offset)>>uiBitDepthIncrease;
    1539     pDes[448] = (pDes[448]+offset)>>uiBitDepthIncrease;
    1540     pDes[960] = (pDes[960]+offset)>>uiBitDepthIncrease;
    1541 #endif
    1542     G16 = E16 + F17;
    1543     G17 = E16 - F17;
    1544     G18 = E19 - F18;
    1545     G19 = E19 + F18;
    1546     G20 = E20 + F21;
    1547     G21 = E20 - F21;
    1548     G22 = E23 - F22;
    1549     G23 = E23 + F22;
    1550     G24 = E24 + F25;
    1551     G25 = E24 - F25;
    1552     G26 = E27 - F26;
    1553     G27 = E27 + F26;
    1554     G28 = E28 + F29;
    1555     G29 = E28 - F29;
    1556     G30 = E31 - F30;
    1557     G31 = E31 + F30;
    1558    
    1559     pDes[32] = xTrRound( 12 * G16 + 255 * G31 , DenShift32);
    1560     pDes[544] = xTrRound( 189 * G17 + 171 * G30 , DenShift32);
    1561     pDes[288] = xTrRound( 109 * G18 + 231 * G29 , DenShift32);
    1562     pDes[800] = xTrRound( 241 * G19 + 86 * G28 , DenShift32);
    1563     pDes[160] = xTrRound( 62 * G20 + 248 * G27 , DenShift32);
    1564     pDes[672] = xTrRound( 219 * G21 + 131 * G26 , DenShift32);
    1565     pDes[416] = xTrRound( 152 * G22 + 205 * G25 , DenShift32);
    1566     pDes[928] = xTrRound( 253 * G23 + 37 * G24 , DenShift32);
    1567     pDes[96] = xTrRound( 253 * G24 - 37 * G23 , DenShift32);
    1568     pDes[608] = xTrRound( 152 * G25 - 205 * G22 , DenShift32);
    1569     pDes[352] = xTrRound( 219 * G26 - 131 * G21 , DenShift32);
    1570     pDes[864] = xTrRound( 62 * G27 - 248 * G20 , DenShift32);
    1571     pDes[224] = xTrRound( 241 * G28 - 86 * G19 , DenShift32);
    1572     pDes[736] = xTrRound( 109 * G29 - 231 * G18 , DenShift32);
    1573     pDes[480] = xTrRound( 189 * G30 - 171 * G17 , DenShift32);
    1574     pDes[992] = xTrRound( 12 * G31 - 255 * G16 , DenShift32);
    1575 #ifdef TRANS_PRECISION_EXT
    1576     pDes[32]  = (pDes[32] +offset)>>uiBitDepthIncrease;
    1577     pDes[544] = (pDes[544]+offset)>>uiBitDepthIncrease;
    1578     pDes[288] = (pDes[288]+offset)>>uiBitDepthIncrease;
    1579     pDes[800] = (pDes[800]+offset)>>uiBitDepthIncrease;
    1580     pDes[160] = (pDes[160]+offset)>>uiBitDepthIncrease;
    1581     pDes[672] = (pDes[672]+offset)>>uiBitDepthIncrease;
    1582     pDes[416] = (pDes[416]+offset)>>uiBitDepthIncrease;
    1583     pDes[928] = (pDes[928]+offset)>>uiBitDepthIncrease;
    1584     pDes[96]  = (pDes[96] +offset)>>uiBitDepthIncrease;
    1585     pDes[608] = (pDes[608]+offset)>>uiBitDepthIncrease;
    1586     pDes[352] = (pDes[352]+offset)>>uiBitDepthIncrease;
    1587     pDes[864] = (pDes[864]+offset)>>uiBitDepthIncrease;
    1588     pDes[224] = (pDes[224]+offset)>>uiBitDepthIncrease;
    1589     pDes[736] = (pDes[736]+offset)>>uiBitDepthIncrease;
    1590     pDes[480] = (pDes[480]+offset)>>uiBitDepthIncrease;
    1591     pDes[992] = (pDes[992]+offset)>>uiBitDepthIncrease;
    1592 #endif
    1593   }
    1594 }
    1595 
    1596 Void TComTrQuant::xT16( Pel* pSrc, UInt uiStride, Long* pDes )
    1597 {
    1598   Int x, y;
    1599  
    1600   Long aaiTemp[16][16];
    1601   Long B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15;
    1602   Long C0, C1, C2, C3, C4, C5, C6, C7, C10, C11, C12, C13;
    1603   Long D0, D1, D2, D3, D5, D6, D8, D9, D10, D11, D12, D13, D14, D15;
    1604   Long E4, E5, E6, E7, E9, E10, E13, E14;
    1605   Long F8, F9, F10, F11, F12, F13, F14, F15;
    1606 #ifdef TRANS_PRECISION_EXT
    1607   Int uiBitDepthIncrease=g_iShift16x16-g_uiBitIncrement;
    1608   Int offset = (uiBitDepthIncrease==0)? 0:(1<<(uiBitDepthIncrease-1));
    1609 #endif
    1610  
    1611   //--Butterfly
    1612   for( y=0 ; y<16 ; y++ )
    1613   {
    1614 #ifdef TRANS_PRECISION_EXT
    1615     B0  = (pSrc[0] + pSrc[15])<<uiBitDepthIncrease;
    1616     B15 = (pSrc[0] - pSrc[15])<<uiBitDepthIncrease;
    1617     B1  = (pSrc[1] + pSrc[14])<<uiBitDepthIncrease;
    1618     B14 = (pSrc[1] - pSrc[14])<<uiBitDepthIncrease;
    1619     B2  = (pSrc[2] + pSrc[13])<<uiBitDepthIncrease;
    1620     B13 = (pSrc[2] - pSrc[13])<<uiBitDepthIncrease;
    1621     B3  = (pSrc[3] + pSrc[12])<<uiBitDepthIncrease;
    1622     B12 = (pSrc[3] - pSrc[12])<<uiBitDepthIncrease;
    1623     B4  = (pSrc[4] + pSrc[11])<<uiBitDepthIncrease;
    1624     B11 = (pSrc[4] - pSrc[11])<<uiBitDepthIncrease;
    1625     B5  = (pSrc[5] + pSrc[10])<<uiBitDepthIncrease;
    1626     B10 = (pSrc[5] - pSrc[10])<<uiBitDepthIncrease;
    1627     B6  = (pSrc[6] + pSrc[9])<<uiBitDepthIncrease;
    1628     B9  = (pSrc[6] - pSrc[9])<<uiBitDepthIncrease;
    1629     B7  = (pSrc[7] + pSrc[8])<<uiBitDepthIncrease;
    1630     B8  = (pSrc[7] - pSrc[8])<<uiBitDepthIncrease;
    1631 #else
    1632     B0 = pSrc[0] + pSrc[15];
    1633     B15 = pSrc[0] - pSrc[15];
    1634     B1 = pSrc[1] + pSrc[14];
    1635     B14 = pSrc[1] - pSrc[14];
    1636     B2 = pSrc[2] + pSrc[13];
    1637     B13 = pSrc[2] - pSrc[13];
    1638     B3 = pSrc[3] + pSrc[12];
    1639     B12 = pSrc[3] - pSrc[12];
    1640     B4 = pSrc[4] + pSrc[11];
    1641     B11 = pSrc[4] - pSrc[11];
    1642     B5 = pSrc[5] + pSrc[10];
    1643     B10 = pSrc[5] - pSrc[10];
    1644     B6 = pSrc[6] + pSrc[9];
    1645     B9 = pSrc[6] - pSrc[9];
    1646     B7 = pSrc[7] + pSrc[8];
    1647     B8 = pSrc[7] - pSrc[8];
    1648 #endif
    1649     C0 = B0 + B7;
    1650     C7 = B0 - B7;
    1651     C1 = B1 + B6;
    1652     C6 = B1 - B6;
    1653     C2 = B2 + B5;
    1654     C5 = B2 - B5;
    1655     C3 = B3 + B4;
    1656     C4 = B3 - B4;
    1657     C10 = xTrRound( 45 * ( B13 - B10 ) , DenShift16);
    1658     C13 = xTrRound( 45 * ( B13 + B10 ) , DenShift16);
    1659     C11 = xTrRound( 45 * ( B12 - B11 ) , DenShift16);
    1660     C12 = xTrRound( 45 * ( B12 + B11 ) , DenShift16);
    1661    
    1662     D0 = C0 + C3;
    1663     D3 = C0 - C3;
    1664     D8 = B8 + C11;
    1665     D11 = B8 - C11;
    1666     D12 = B15 - C12;
    1667     D15 = B15 + C12;
    1668     D1 = C1 + C2;
    1669     D2 = C1 - C2;
    1670     D9 = B9 + C10;
    1671     D10 = B9 - C10;
    1672     D13 = B14 - C13;
    1673     D14 = B14 + C13;
    1674     D5 = xTrRound( 45 * ( C6 - C5 ) , DenShift16);
    1675     D6 = xTrRound( 45 * ( C6 + C5 ) , DenShift16);
    1676    
    1677     aaiTemp[0][y] = xTrRound( 45 * ( D0 + D1 ) , DenShift16);
    1678     aaiTemp[8][y] = xTrRound( 45 * ( D0 - D1 ) , DenShift16);
    1679     aaiTemp[4][y] = xTrRound( 59 * D3 + 24 * D2 , DenShift16);
    1680     aaiTemp[12][y] = xTrRound( 24 * D3 - 59 * D2 , DenShift16);
    1681     E4 = C4 + D5;
    1682     E5 = C4 - D5;
    1683     E6 = C7 - D6;
    1684     E7 = C7 + D6;
    1685     E9 = xTrRound( 24 * D14 - 59 * D9 , DenShift16);
    1686     E10 = xTrRound(  -59 * D13 - 24 * D10 , DenShift16);
    1687     E13 = xTrRound( 24 * D13 - 59 * D10 , DenShift16);
    1688     E14 = xTrRound( 59 * D14 + 24 * D9 , DenShift16);
    1689    
    1690     aaiTemp[2][y] = xTrRound( 12 * E4 + 62 * E7 , DenShift16);
    1691     aaiTemp[10][y] = xTrRound( 53 * E5 + 35 * E6 , DenShift16);
    1692     aaiTemp[6][y] = xTrRound( 53 * E6 - 35 * E5 , DenShift16);
    1693     aaiTemp[14][y] = xTrRound( 12 * E7 - 62 * E4 , DenShift16);
    1694     F8 = D8 + E9;
    1695     F9 = D8 - E9;
    1696     F10 = D11 - E10;
    1697     F11 = D11 + E10;
    1698     F12 = D12 + E13;
    1699     F13 = D12 - E13;
    1700     F14 = D15 - E14;
    1701     F15 = D15 + E14;
    1702    
    1703     aaiTemp[1][y] = xTrRound( 6 * F8 + 63 * F15 , DenShift16);
    1704     aaiTemp[9][y] = xTrRound( 49 * F9 + 40 * F14 , DenShift16);
    1705     aaiTemp[5][y] = xTrRound( 30 * F10 + 56 * F13 , DenShift16);
    1706     aaiTemp[13][y] = xTrRound( 61 * F11 + 18 * F12 , DenShift16);
    1707     aaiTemp[3][y] = xTrRound( 61 * F12 - 18 * F11 , DenShift16);
    1708     aaiTemp[11][y] = xTrRound( 30 * F13 - 56 * F10 , DenShift16);
    1709     aaiTemp[7][y] = xTrRound( 49 * F14 - 40 * F9 , DenShift16);
    1710     aaiTemp[15][y] = xTrRound( 6 * F15 - 63 * F8 , DenShift16);
    1711    
    1712     pSrc += uiStride;
    1713   }
    1714  
    1715   for( x=0 ; x<16 ; x++, pDes++ )
    1716   {
    1717     B0 = aaiTemp[x][0] + aaiTemp[x][15];
    1718     B15 = aaiTemp[x][0] - aaiTemp[x][15];
    1719     B1 = aaiTemp[x][1] + aaiTemp[x][14];
    1720     B14 = aaiTemp[x][1] - aaiTemp[x][14];
    1721     B2 = aaiTemp[x][2] + aaiTemp[x][13];
    1722     B13 = aaiTemp[x][2] - aaiTemp[x][13];
    1723     B3 = aaiTemp[x][3] + aaiTemp[x][12];
    1724     B12 = aaiTemp[x][3] - aaiTemp[x][12];
    1725     B4 = aaiTemp[x][4] + aaiTemp[x][11];
    1726     B11 = aaiTemp[x][4] - aaiTemp[x][11];
    1727     B5 = aaiTemp[x][5] + aaiTemp[x][10];
    1728     B10 = aaiTemp[x][5] - aaiTemp[x][10];
    1729     B6 = aaiTemp[x][6] + aaiTemp[x][9];
    1730     B9 = aaiTemp[x][6] - aaiTemp[x][9];
    1731     B7 = aaiTemp[x][7] + aaiTemp[x][8];
    1732     B8 = aaiTemp[x][7] - aaiTemp[x][8];
    1733    
    1734     C0 = B0 + B7;
    1735     C7 = B0 - B7;
    1736     C1 = B1 + B6;
    1737     C6 = B1 - B6;
    1738     C2 = B2 + B5;
    1739     C5 = B2 - B5;
    1740     C3 = B3 + B4;
    1741     C4 = B3 - B4;
    1742     C10 = xTrRound( 45 * ( B13 - B10 ) , DenShift16);
    1743     C13 = xTrRound( 45 * ( B13 + B10 ) , DenShift16);
    1744     C11 = xTrRound( 45 * ( B12 - B11 ) , DenShift16);
    1745     C12 = xTrRound( 45 * ( B12 + B11 ) , DenShift16);
    1746    
    1747     D0 = C0 + C3;
    1748     D3 = C0 - C3;
    1749     D8 = B8 + C11;
    1750     D11 = B8 - C11;
    1751     D12 = B15 - C12;
    1752     D15 = B15 + C12;
    1753     D1 = C1 + C2;
    1754     D2 = C1 - C2;
    1755     D9 = B9 + C10;
    1756     D10 = B9 - C10;
    1757     D13 = B14 - C13;
    1758     D14 = B14 + C13;
    1759     D5 = xTrRound( 45 * ( C6 - C5 ) , DenShift16);
    1760     D6 = xTrRound( 45 * ( C6 + C5 ) , DenShift16);
    1761    
    1762     pDes[0] = xTrRound( 45 * ( D0 + D1 ) , DenShift16);
    1763     pDes[128] = xTrRound( 45 * ( D0 - D1 ) , DenShift16);
    1764     pDes[64] = xTrRound( 59 * D3 + 24 * D2 , DenShift16);
    1765     pDes[192] = xTrRound( 24 * D3 - 59 * D2 , DenShift16);
    1766 #ifdef TRANS_PRECISION_EXT
    1767     pDes[0  ] = (pDes[0  ]+offset)>>uiBitDepthIncrease;
    1768     pDes[128] = (pDes[128]+offset)>>uiBitDepthIncrease;
    1769     pDes[64 ] = (pDes[64 ]+offset)>>uiBitDepthIncrease;
    1770     pDes[192] = (pDes[192]+offset)>>uiBitDepthIncrease;
    1771 #endif
    1772     E4 = C4 + D5;
    1773     E5 = C4 - D5;
    1774     E6 = C7 - D6;
    1775     E7 = C7 + D6;
    1776     E9 = xTrRound( 24 * D14 - 59 * D9 , DenShift16);
    1777     E10 = xTrRound(  -59 * D13 - 24 * D10 , DenShift16);
    1778     E13 = xTrRound( 24 * D13 - 59 * D10 , DenShift16);
    1779     E14 = xTrRound( 59 * D14 + 24 * D9 , DenShift16);
    1780    
    1781     pDes[32] = xTrRound( 12 * E4 + 62 * E7 , DenShift16);
    1782     pDes[160] = xTrRound( 53 * E5 + 35 * E6 , DenShift16);
    1783     pDes[96] = xTrRound( 53 * E6 - 35 * E5 , DenShift16);
    1784     pDes[224] = xTrRound( 12 * E7 - 62 * E4 , DenShift16);
    1785 #ifdef TRANS_PRECISION_EXT
    1786     pDes[32]  = (pDes[32] +offset)>>uiBitDepthIncrease;
    1787     pDes[160] = (pDes[160]+offset)>>uiBitDepthIncrease;
    1788     pDes[96]  = (pDes[96] +offset)>>uiBitDepthIncrease;
    1789     pDes[224] = (pDes[224]+offset)>>uiBitDepthIncrease;
    1790 #endif
    1791     F8 = D8 + E9;
    1792     F9 = D8 - E9;
    1793     F10 = D11 - E10;
    1794     F11 = D11 + E10;
    1795     F12 = D12 + E13;
    1796     F13 = D12 - E13;
    1797     F14 = D15 - E14;
    1798     F15 = D15 + E14;
    1799    
    1800     pDes[16] = xTrRound( 6 * F8 + 63 * F15 , DenShift16);
    1801     pDes[144] = xTrRound( 49 * F9 + 40 * F14 , DenShift16);
    1802     pDes[80] = xTrRound( 30 * F10 + 56 * F13 , DenShift16);
    1803     pDes[208] = xTrRound( 61 * F11 + 18 * F12 , DenShift16);
    1804     pDes[48] = xTrRound( 61 * F12 - 18 * F11 , DenShift16);
    1805     pDes[176] = xTrRound( 30 * F13 - 56 * F10 , DenShift16);
    1806     pDes[112] = xTrRound( 49 * F14 - 40 * F9 , DenShift16);
    1807     pDes[240] = xTrRound( 6 * F15 - 63 * F8 , DenShift16);
    1808 #ifdef TRANS_PRECISION_EXT
    1809     pDes[16]  = (pDes[16] +offset)>>uiBitDepthIncrease;
    1810     pDes[144] = (pDes[144]+offset)>>uiBitDepthIncrease;
    1811     pDes[80]  = (pDes[80] +offset)>>uiBitDepthIncrease;
    1812     pDes[208] = (pDes[208]+offset)>>uiBitDepthIncrease;
    1813     pDes[48]  = (pDes[48] +offset)>>uiBitDepthIncrease;
    1814     pDes[176] = (pDes[176]+offset)>>uiBitDepthIncrease;
    1815     pDes[112] = (pDes[112]+offset)>>uiBitDepthIncrease;
    1816     pDes[240] = (pDes[240]+offset)>>uiBitDepthIncrease;
    1817 #endif
    1818   }
    1819 }
    1820 #endif //E243_CORE_TRANSFORMS
    1821 
    1822 #if QC_MOD_LCEC_RDOQ
    1823 UInt TComTrQuant::xCountVlcBits(UInt uiTableNumber, UInt uiCodeNumber)
    1824 {
    1825   UInt uiLength = 0;
    1826   UInt uiCode = 0;
    1827 
    1828   if ( uiCodeNumber < 128 )
    1829   {
    1830     uiLength=VLClength[uiTableNumber][uiCodeNumber];
    1831   }
    1832   else
    1833   {
    1834     if ( uiTableNumber < 10 )
    1835     {
    1836       if ( uiTableNumber < 5 )
     1602    if( lastNZPosInCG-firstNZPosInCG>=tsig )
     1603    {
     1604      UInt signbit = (pQCoef[scan[subPos+firstNZPosInCG]]>0?0:1) ;
     1605      if( signbit!=(absSum&0x1) )  //compare signbit with sum_parity
    18371606      {
    1838         uiCode = uiCodeNumber - (6 * (1 << uiTableNumber)) + (1 << uiTableNumber);
    1839         uiLength = ( 6 - uiTableNumber ) + 1 + 2 * xLeadingZeros(uiCode);
    1840       }
    1841       else if ( uiTableNumber < 8 )
    1842       {
    1843         uiLength = 1 + (uiTableNumber - 4) + (uiCodeNumber >> (uiTableNumber - 4));
    1844       }
    1845       else if ( uiTableNumber == 9 )
    1846       {
    1847         uiLength = 5 + ((uiCodeNumber + 5) >> 4);
    1848       }
    1849     }
    1850     else
    1851     {
    1852       if ( uiTableNumber == 10 )
    1853       {
    1854         uiCode = uiCodeNumber + 1;
    1855         uiLength = 1 + 2 * xLeadingZeros(uiCode);
    1856       }
    1857 #if CAVLC_COEF_LRG_BLK
    1858       else if (uiTableNumber == 12)
    1859       {
    1860         uiLength = 7+(uiCodeNumber>>6);
    1861       }
    1862       else if(uiTableNumber == 13)
    1863       {
    1864         uiLength = 5+(uiCodeNumber>>4);
    1865       }
    1866 #endif
    1867     }
    1868   }
    1869   return uiLength;
    1870 }
    1871 
    1872 
    1873 #if CAVLC_COEF_LRG_BLK
    1874 Int TComTrQuant::bitCountRDOQ(Int coeff, Int pos, Int nTab, Int lastCoeffFlag,Int levelMode,Int run, Int maxrun, Int vlc_adaptive, Int N,
    1875                               UInt uiTr1, Int iSum_big_coef, Int iBlockType, TComDataCU* pcCU, const UInt **pLumaRunTr1)
    1876 #else
    1877 Int TComTrQuant::bitCountRDOQ(Int coeff, Int pos, Int nTab, Int lastCoeffFlag,Int levelMode,Int run, Int maxrun, Int vlc_adaptive, Int N,
    1878                               UInt uiTr1, Int iSum_big_coef, Int iBlockType, TComDataCU* pcCU)
    1879 #endif
    1880 {
    1881   UInt cn, n, level, lev;
    1882   Int vlc,x,cx,vlcNum,bits;
    1883   static const int vlcTable4[3] = {2,2,2};             // Y4x4I,Y4x4P,Y4x4B,
    1884 
    1885   Int sign = coeff < 0 ? 1 : 0;
    1886 
    1887   if ( N==4 )
    1888   {
    1889     n = Max(0, nTab - 2);
    1890   }
    1891   else
    1892   {
    1893     n = nTab;
    1894   }
    1895 
    1896   UInt uiModZeroCoding = 0;
    1897   const UInt *uiVlcTableTemp;
    1898 
    1899 #if CAVLC_COEF_LRG_BLK
    1900   uiModZeroCoding = (m_uiRDOQOffset==1 || N>8)? 1:0;
    1901   int tmprun = Min(maxrun,28);
    1902 
    1903   if( N<=8 )
    1904   {
    1905     uiVlcTableTemp = (nTab==2 || nTab==5)? g_auiVlcTable8x8Intra:g_auiVlcTable8x8Inter;
    1906   }
    1907   else
    1908   {
    1909     uiVlcTableTemp = (nTab==5)? g_auiVlcTable16x16Intra:g_auiVlcTable16x16Inter;
    1910   }
    1911 #else
    1912   if( nTab == 2 || nTab == 5 ){
    1913     uiVlcTableTemp = g_auiVlcTable8x8Intra;
    1914   }
    1915   else
    1916   {
    1917     uiVlcTableTemp = g_auiVlcTable8x8Inter;
    1918   }
    1919 #endif
    1920 
    1921   level = abs(coeff);
    1922   lev = (level == 1) ? 0 : 1;
    1923 
    1924   if ( level )
    1925   {
    1926     if ( lastCoeffFlag == 1 )
    1927     {     
    1928       x = pos + (level == 1 ? 0 : N * N);
    1929       if( N == 4 )
    1930       {
    1931         cx = m_uiLPTableE4[(n << 5) + x];
    1932         vlcNum = vlcTable4[n];
    1933       }
    1934       else{
    1935 #if CAVLC_COEF_LRG_BLK
    1936         cx = xLastLevelInd(lev, pos, N);
    1937 #else
    1938         cx = m_uiLPTableE8[(n << 7) + x];
    1939 #endif
    1940         vlcNum = g_auiLastPosVlcNum[n][Min(16,m_uiLastPosVlcIndex[n])];
    1941       }
    1942       bits=xCountVlcBits( vlcNum, cx );
    1943 
    1944       if ( level > 1 )
    1945       {
    1946         bits += xCountVlcBits( 0, 2 * (level - 2) + sign );
    1947       }
    1948       else
    1949       {
    1950         bits++;
    1951       }
    1952 
    1953     }
    1954     else{ // Level !=0  && lastCoeffFlag==0
    1955 
    1956       if ( !levelMode ){   
    1957 #if CAVLC_COEF_LRG_BLK
    1958           if(nTab == 2 || nTab == 5)
     1607        Int minCostInc = MAX_INT,  minPos =-1, finalChange=0, curCost=MAX_INT, curChange=0;
     1608       
     1609        for( n = (lastCG==1?lastNZPosInCG:SCAN_SET_SIZE-1) ; n >= 0; --n )
     1610        {
     1611          UInt blkPos   = scan[ n+subPos ];
     1612          if(pQCoef[ blkPos ] != 0 )
    19591613          {
    1960             cn = xRunLevelInd(lev, run, maxrun, pLumaRunTr1[uiTr1][tmprun]);
     1614            if(deltaU[blkPos]>0)
     1615            {
     1616              curCost = - deltaU[blkPos];
     1617              curChange=1 ;
     1618            }
     1619            else
     1620            {
     1621              //curChange =-1;
     1622              if(n==firstNZPosInCG && abs(pQCoef[blkPos])==1)
     1623              {
     1624                curCost=MAX_INT ;
     1625              }
     1626              else
     1627              {
     1628                curCost = deltaU[blkPos];
     1629                curChange =-1;
     1630              }
     1631            }
    19611632          }
    19621633          else
    19631634          {
    1964             cn = xRunLevelIndInter(lev, run, maxrun);
    1965           }
    1966           vlc = uiVlcTableTemp[tmprun];
    1967 #else
    1968         if ( N == 4 ){
    1969           // 4x4
    1970           if ( nTab == 2 ){
    1971             cn = xRunLevelInd(lev, run, maxrun, g_auiLumaRunTr14x4[uiTr1][maxrun]);
    1972           }
    1973           else{
    1974 #if RUNLEVEL_TABLE_CUT
    1975             cn = xRunLevelIndInter(lev, run, maxrun);
    1976 #else
    1977             cn = g_auiLumaRun8x8[maxrun][lev][run];
    1978 #endif
    1979           }
    1980           vlc = uiVlcTableTemp[maxrun];
    1981         }
    1982         else {
    1983           // 8x8
    1984           if(nTab == 2 || nTab == 5)
    1985           {
    1986             cn = xRunLevelInd(lev, run, maxrun, g_auiLumaRunTr18x8[uiTr1][Min(maxrun,28)]);
    1987           }
    1988           else
    1989           {
    1990 #if RUNLEVEL_TABLE_CUT
    1991             cn = xRunLevelIndInter(lev, run, maxrun);
    1992 #else
    1993             cn = g_auiLumaRun8x8[Min(maxrun,28)][lev][run];
    1994 #endif
    1995           }
    1996           vlc = uiVlcTableTemp[Min(maxrun,28)];
    1997         }
    1998 #endif
    1999         bits = xCountVlcBits( vlc, cn );
    2000         if ( level > 1 ){
    2001           bits += xCountVlcBits( 0, 2 * (level - 2) + sign );
    2002         }
    2003         else{
    2004           bits++;
    2005         }
    2006 
    2007       }
    2008       else{ // Level !=0  && lastCoeffFlag==0 && levelMode
    2009         bits = (xCountVlcBits( vlc_adaptive, level ) + 1);
    2010       }
    2011     }
    2012   }
    2013   else{
    2014 
    2015     if (levelMode){
    2016       bits=xCountVlcBits( vlc_adaptive, level );
    2017     }
    2018     else{                       
    2019       if ( pos == 0 && lastCoeffFlag == 0){ 
    2020 
    2021 #if CAVLC_COEF_LRG_BLK
    2022         vlc = uiVlcTableTemp[tmprun];
    2023         if(nTab == 2 || nTab == 5)
    2024         {
    2025           cn = xRunLevelInd(0, run + 1, maxrun, pLumaRunTr1[uiTr1][tmprun]);
    2026         }
    2027         else
    2028         {
    2029           cn = xRunLevelIndInter(0, run + 1, maxrun);
    2030         }
    2031 #else
    2032         if ( N == 4 ){
    2033           // 4x4
    2034           vlc = uiVlcTableTemp[maxrun];
    2035           if ( nTab == 2 ){
    2036             cn = xRunLevelInd(0, run + 1, maxrun, g_auiLumaRunTr14x4[uiTr1][maxrun]);
    2037           }
    2038           else{
    2039 #if RUNLEVEL_TABLE_CUT
    2040             cn = xRunLevelIndInter(0, run+1, maxrun);
    2041 #else
    2042             cn = g_auiLumaRun8x8[maxrun][0][run + 1];
    2043 #endif
    2044           }
    2045         }
    2046         else{
    2047           // 8x8
    2048           vlc = uiVlcTableTemp[Min(maxrun, 28)];
    2049           if(nTab == 2 || nTab == 5){
    2050             cn = xRunLevelInd(0, run + 1, maxrun, g_auiLumaRunTr18x8[uiTr1][Min(maxrun, 28)]);
    2051           }
    2052           else{
    2053 #if RUNLEVEL_TABLE_CUT
    2054             cn = xRunLevelIndInter(0, run+1, maxrun);
    2055 #else
    2056             cn = g_auiLumaRun8x8[Min(maxrun, 28)][0][run + 1];
    2057 #endif
    2058           }
    2059         }
    2060 #endif
    2061         bits=xCountVlcBits( vlc, cn );
    2062       }
    2063       else{
    2064         bits = 0;
    2065 
    2066         if ( pos > 0 && uiModZeroCoding == 1 ){
    2067 
    2068           Int iSum_big_coefTemp, levelModeTemp, maxrunTemp;
    2069           UInt uiTr1Temp;
    2070 
    2071           if ( lastCoeffFlag == 0 ){
    2072 
    2073 #if CAVLC_COEF_LRG_BLK
    2074             vlc = uiVlcTableTemp[tmprun];
    2075             if(nTab == 2 || nTab == 5)
     1635            if(n<firstNZPosInCG)
    20761636            {
    2077               cn = xRunLevelInd(0, run + 1, maxrun, pLumaRunTr1[uiTr1][tmprun]);
     1637              UInt thisSignBit = (pCoef[blkPos]>=0?0:1);
     1638              if(thisSignBit != signbit )
     1639              {
     1640                curCost = MAX_INT;
     1641              }
     1642              else
     1643              {
     1644                curCost = - (deltaU[blkPos])  ;
     1645                curChange = 1 ;
     1646              }
    20781647            }
    20791648            else
    20801649            {
    2081               cn = xRunLevelIndInter(0, run + 1, maxrun);
    2082             }
    2083 #else
    2084             if ( N == 4 ){
    2085               // 4x4
    2086               vlc = uiVlcTableTemp[maxrun];
    2087               if ( nTab == 2 ){
    2088                 cn = xRunLevelInd(0, run + 1, maxrun, g_auiLumaRunTr14x4[uiTr1][maxrun]);
    2089               }
    2090               else{
    2091 #if RUNLEVEL_TABLE_CUT
    2092                 cn = xRunLevelIndInter(0, run+1, maxrun);
    2093 #else
    2094                 cn = g_auiLumaRun8x8[maxrun][0][run + 1];
    2095 #endif
    2096               }
    2097             }
    2098             else{
    2099               // 8x8
    2100               vlc = uiVlcTableTemp[Min(maxrun, 28)];
    2101               if(nTab == 2 || nTab == 5){
    2102                 cn = xRunLevelInd(0, run + 1, maxrun, g_auiLumaRunTr18x8[uiTr1][Min(maxrun, 28)]);
    2103               }
    2104               else{
    2105 #if RUNLEVEL_TABLE_CUT
    2106                 cn = xRunLevelIndInter(0, run+1, maxrun);
    2107 #else
    2108                 cn = g_auiLumaRun8x8[Min(maxrun,28)][0][run + 1];
    2109 #endif
    2110               }
    2111             }
    2112 #endif
    2113           }
    2114           else{
    2115 
    2116             x = (pos - 1);
    2117             if( N == 4 )
    2118             {
    2119               cn = m_uiLPTableE4[(n << 5) + x];
    2120               vlc = vlcTable4[n];
    2121             }
    2122             else{
    2123 #if CAVLC_COEF_LRG_BLK
    2124               cn = xLastLevelInd(lev, pos, N);
    2125 #else
    2126               cn = m_uiLPTableE8[(n << 7) + x];
    2127 #endif
    2128               vlc = g_auiLastPosVlcNum[n][Min(16, m_uiLastPosVlcIndex[n])];
     1650              curCost = - (deltaU[blkPos])  ;
     1651              curChange = 1 ;
    21291652            }
    21301653          }
    2131           bits+=xCountVlcBits( vlc, cn );
    2132 
    2133           // Next coeff is 1 with run=0
    2134 
    2135           iSum_big_coefTemp = iSum_big_coef;
    2136           levelModeTemp = levelMode;
    2137           Int switch_thr[10] = {49,49,0,49,49,0,49,49,49,49};
    2138 
    2139           if ( N > 4 ){
    2140             if ( level > 1 ){
    2141               iSum_big_coefTemp += level;
    2142               if ((N * N - pos - 1) > switch_thr[iBlockType] || iSum_big_coefTemp > 2) levelModeTemp = 1;
    2143             }
     1654
     1655          if( curCost<minCostInc)
     1656          {
     1657            minCostInc = curCost ;
     1658            finalChange = curChange ;
     1659            minPos = blkPos ;
    21441660          }
    2145           else{
    2146             if ( level > 1 ) levelModeTemp = 1;
    2147           }
    2148 
    2149           if ( levelModeTemp == 1 ){
    2150             bits-=xCountVlcBits( vlc_adaptive, 1);
    2151           }
    2152           else{
    2153             maxrunTemp = pos - 1;
    2154             uiTr1Temp = uiTr1;
    2155 
    2156             if ( uiTr1Temp > 0 && level < 2 ){
    2157               uiTr1Temp++;
    2158               uiTr1Temp = Min(MAX_TR1, uiTr1Temp);
    2159             }
    2160             else{
    2161               uiTr1Temp=0;
    2162             }
    2163 
    2164 #if CAVLC_COEF_LRG_BLK
    2165             vlc = uiVlcTableTemp[Min(maxrunTemp,28)];
    2166             if(nTab == 2 || nTab == 5)
    2167             {
    2168               cn = xRunLevelInd(0, 0, maxrunTemp, pLumaRunTr1[uiTr1Temp][Min(maxrunTemp,28)]);
    2169             }
    2170             else
    2171             {
    2172               cn = xRunLevelIndInter(0, 0, maxrunTemp);
    2173             }
    2174 #else
    2175             if ( N == 4 ){
    2176               // 4x4
    2177               vlc = uiVlcTableTemp[maxrunTemp];
    2178               if ( nTab == 2 ){
    2179                 cn = xRunLevelInd(0, 0, maxrunTemp, g_auiLumaRunTr14x4[uiTr1Temp][maxrunTemp]);
    2180               }
    2181               else{
    2182 #if RUNLEVEL_TABLE_CUT
    2183                 cn = xRunLevelIndInter(0, 0, maxrunTemp);
    2184 #else
    2185                 cn = g_auiLumaRun8x8[maxrunTemp][0][0];
    2186 #endif
    2187               }
    2188             }
    2189             else{
    2190               // 8x8
    2191               vlc = uiVlcTableTemp[Min(maxrunTemp,28)];
    2192               if(nTab == 2 || nTab == 5){
    2193                 cn = xRunLevelInd(0, 0, maxrunTemp, g_auiLumaRunTr18x8[uiTr1Temp][Min(maxrunTemp,28)]);
    2194               }
    2195               else{
    2196 #if RUNLEVEL_TABLE_CUT
    2197                 cn = xRunLevelIndInter(0, 0, maxrunTemp);
    2198 #else
    2199                 cn = g_auiLumaRun8x8[Min(maxrunTemp,28)][0][0];
    2200 #endif
    2201               }
    2202             }
    2203 #endif
    2204             bits -= xCountVlcBits( vlc, cn );
    2205           }
    2206         } // if ( pos > 0 && uiModZeroCoding == 1 ){
    2207 
    2208       }
    2209     }
    2210   }
    2211   return bits;
    2212 }
    2213 
    2214 Int TComTrQuant::xCodeCoeffCountBitsLast(TCoeff* scoeff, levelDataStruct* levelData, Int nTab, UInt N)
    2215 {
    2216   Int i, prevCoeffInd, lastPosMin, iRate;
    2217   Int done,last_pos;
    2218 #if CAVLC_COEF_LRG_BLK
    2219   Int run_done, maxrun,run, bitsLast[1024], bitsRun[1024], bitsLastPrev;
    2220   quantLevelStruct quantCoeffInfo[1024];
    2221 #else
    2222   Int run_done, maxrun,run, bitsLast[256], bitsRun[256], bitsLastPrev;
    2223   quantLevelStruct quantCoeffInfo[256];
    2224 #endif
    2225   UInt last_pos_init, bitsLevel, sign, lev, cn, vlc, uiBitShift=15, uiNoCoeff=N*N, absLevel;
    2226   Int n;
    2227   double lagrMin, lagr, lagrPrev;
    2228   UInt uiLumaRunNoTr14x4[15]={2, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2};
    2229   UInt uiLumaRunNoTr18x8[29]={2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 13};
    2230 
    2231 
    2232   if ( N == 4 ){
    2233     n = Max(0, nTab - 2);
     1661        } //CG loop
     1662
     1663        if(pQCoef[minPos] == 32767 || pQCoef[minPos] == -32768)
     1664        {
     1665          finalChange = -1;
     1666        }
     1667
     1668        if(pCoef[minPos]>=0)
     1669        {
     1670          pQCoef[minPos] += finalChange ;
     1671        }
     1672        else
     1673        {
     1674          pQCoef[minPos] -= finalChange ;
     1675        } 
     1676      } // Hide
     1677    }
     1678    if(lastCG==1)
     1679    {
     1680      lastCG=0 ;
     1681    }
     1682  } // TU loop
     1683
     1684  return;
     1685}
     1686#endif
     1687
     1688Void TComTrQuant::xQuant( TComDataCU* pcCU,
     1689                          Int*        pSrc,
     1690                          TCoeff*     pDes,
     1691#if ADAPTIVE_QP_SELECTION
     1692                          Int*&       pArlDes,
     1693#endif
     1694                          Int         iWidth,
     1695                          Int         iHeight,
     1696                          UInt&       uiAcSum,
     1697                          TextType    eTType,
     1698                          UInt        uiAbsPartIdx )
     1699{
     1700  Int*   piCoef    = pSrc;
     1701  TCoeff* piQCoef   = pDes;
     1702#if ADAPTIVE_QP_SELECTION
     1703  Int*   piArlCCoef = pArlDes;
     1704#endif
     1705  Int   iAdd = 0;
     1706 
     1707  if ( m_bUseRDOQ && (eTType == TEXT_LUMA || RDOQ_CHROMA) )
     1708  {
     1709#if ADAPTIVE_QP_SELECTION
     1710    xRateDistOptQuant( pcCU, piCoef, pDes, pArlDes, iWidth, iHeight, uiAcSum, eTType, uiAbsPartIdx );
     1711#else
     1712    xRateDistOptQuant( pcCU, piCoef, pDes, iWidth, iHeight, uiAcSum, eTType, uiAbsPartIdx );
     1713#endif
    22341714  }
    22351715  else
    22361716  {
    2237     n = nTab;
    2238   }
    2239 
    2240   /* Do the last coefficient first */
    2241   i = uiNoCoeff - 1;
    2242   done = 0;
    2243 
    2244   while ( !done && i >= 0 )
    2245   {
    2246     if (scoeff[i])
    2247     {
    2248       done = 1;
     1717#if MULTIBITS_DATA_HIDING
     1718    const UInt   log2BlockSize   = g_aucConvertToBit[ iWidth ] + 2;
     1719
     1720    UInt scanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, iWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
     1721    if (scanIdx == SCAN_ZIGZAG)
     1722    {
     1723      scanIdx = SCAN_DIAG;
     1724    }
     1725
     1726    if (iWidth != iHeight)
     1727    {
     1728      scanIdx = SCAN_DIAG;
     1729    }
     1730
     1731    const UInt * scan;
     1732    if (iWidth == iHeight)
     1733    {
     1734      scan = g_auiSigLastScan[ scanIdx ][ log2BlockSize - 1 ];
    22491735    }
    22501736    else
    22511737    {
    2252       i--;
    2253     }
    2254   }
    2255   if (i == -1)
    2256   {
    2257     return(-1);
    2258   }
    2259 
    2260   last_pos = last_pos_init = i;
    2261   prevCoeffInd = i;
    2262 
    2263   i--;
    2264 
    2265   if ( i >= 0 ){
    2266 
    2267     /* Go into run mode */
    2268     run_done = 0;
    2269     while ( !run_done )
    2270     {
    2271       maxrun = i;
    2272 
    2273       run = 0;
    2274       done = 0;
    2275       while ( !done )
     1738      scan = g_sigScanNSQT[ log2BlockSize - 2 ];
     1739    }
     1740
     1741    Int deltaU[32*32] ;
     1742#endif
     1743
     1744#if ADAPTIVE_QP_SELECTION
     1745    QpParam cQpBase;
     1746    Int iQpBase = pcCU->getSlice()->getSliceQpBase();
     1747
     1748#if H0736_AVC_STYLE_QP_RANGE
     1749    Int qpScaled;
     1750    Int qpBDOffset = (eTType == TEXT_LUMA)? pcCU->getSlice()->getSPS()->getQpBDOffsetY() : pcCU->getSlice()->getSPS()->getQpBDOffsetC();
     1751
     1752    if(eTType == TEXT_LUMA)
     1753    {
     1754      qpScaled = iQpBase + qpBDOffset;
     1755    }
     1756    else
     1757    {
     1758      qpScaled = Clip3( -qpBDOffset, 51, iQpBase);
     1759
     1760      if(qpScaled < 0)
    22761761      {
    2277         if ( !scoeff[i] )
    2278         {
    2279           run++;
    2280         }
    2281         else
    2282         {
    2283           quantCoeffInfo[prevCoeffInd].run=run;
    2284           quantCoeffInfo[prevCoeffInd].maxrun=maxrun;
    2285           quantCoeffInfo[prevCoeffInd].nextLev=(abs(scoeff[i]) == 1) ? 0 : 1;
    2286           quantCoeffInfo[prevCoeffInd].nexLevelVal=scoeff[i];
    2287 
    2288           prevCoeffInd = i;
    2289 
    2290           run = 0;
    2291           done = 1;
    2292         }
    2293         if (i == 0)
    2294         {
    2295           quantCoeffInfo[prevCoeffInd].run=run;
    2296           quantCoeffInfo[prevCoeffInd].maxrun=maxrun;
    2297           quantCoeffInfo[prevCoeffInd].nextLev=0;
    2298           quantCoeffInfo[prevCoeffInd].nexLevelVal=0;
    2299 
    2300           done = 1;
    2301           run_done = 1;
    2302         }
    2303         i--;
    2304       }
    2305     }
    2306   }
    2307 
    2308 #if CAVLC_COEF_LRG_BLK
    2309   const UInt *vlcTableIntra = (N<=8)? g_auiVlcTable8x8Intra:g_auiVlcTable16x16Intra;
    2310   const UInt *vlcTableInter = (N<=8)? g_auiVlcTable8x8Inter:g_auiVlcTable16x16Inter;
    2311   const UInt *pLumaRunTr1 = (N==4)? uiLumaRunNoTr14x4:uiLumaRunNoTr18x8;
    2312 #endif
    2313   for (i = last_pos_init; i >= 0; i--){
    2314 
    2315     if (scoeff[i]){
    2316 
    2317       bitsLast[i] = bitsRun[i] = 0;
    2318 
    2319       last_pos = i;
    2320       {
    2321         int x,cx,vlcNum;
    2322         int vlcTable[3] = {2,2,2};
    2323 
    2324         bitsLevel=0;
    2325         absLevel = abs(scoeff[i]);
    2326         sign = (scoeff[i] < 0) ? 1 : 0;
    2327         lev = (absLevel == 1) ? 0 : 1;
    2328 
    2329         if (absLevel > 1)
    2330         {
    2331           bitsLevel=xCountVlcBits( 0, 2*(absLevel-2)+sign );
    2332         }
    2333         else
    2334         {
    2335           bitsLevel++;
    2336         }
    2337 
    2338         x = uiNoCoeff*lev + last_pos;
    2339 
    2340         if ( uiNoCoeff == 16 ){
    2341           cx = m_uiLPTableE4[n * 32 + x];
    2342           vlcNum = vlcTable[n];
    2343         }
    2344         else {
    2345 #if CAVLC_COEF_LRG_BLK
    2346           cx = xLastLevelInd(lev, last_pos, N);
    2347 #else
    2348           cx = m_uiLPTableE8[n * 128 + x];
    2349 #endif
    2350           vlcNum = g_auiLastPosVlcNum[n][Min(16,m_uiLastPosVlcIndex[n])];
    2351         }
    2352         bitsLast[i]=bitsLevel + xCountVlcBits( vlcNum, cx);
    2353       }
    2354 
    2355       bitsRun[i]=0;
    2356 
    2357       if ( i > 0 )
    2358       {
    2359         bitsLevel = 0;
    2360         if ( quantCoeffInfo[i].nexLevelVal != 0 ){
    2361           absLevel = abs(quantCoeffInfo[i].nexLevelVal);
    2362           sign = (quantCoeffInfo[i].nexLevelVal < 0) ? 1 : 0;
    2363           lev = (absLevel == 1) ? 0 : 1;
    2364 
    2365           if (absLevel > 1)
    2366           {
    2367             bitsLevel = xCountVlcBits( 0, 2 * (absLevel - 2) + sign );
    2368           }
    2369           else
    2370           {
    2371             bitsLevel++;
    2372           }
    2373         }
    2374 
    2375         bitsRun[i] = bitsLevel;
    2376         run = quantCoeffInfo[i].run;
    2377         maxrun = quantCoeffInfo[i].maxrun;
    2378 
    2379 #if CAVLC_COEF_LRG_BLK
    2380         Int tmprun = Min(maxrun,28);
    2381         if(nTab == 2 || nTab == 5)
    2382         {
    2383           vlc = vlcTableIntra[tmprun];
    2384           cn = xRunLevelInd(quantCoeffInfo[i].nextLev, run, maxrun, pLumaRunTr1[tmprun]);
    2385         }
    2386         else
    2387         {
    2388           vlc = vlcTableInter[tmprun];
    2389           cn = xRunLevelIndInter(quantCoeffInfo[i].nextLev, run, maxrun);
    2390         }
    2391         bitsRun[i] += xCountVlcBits( vlc, cn );
    2392 #else
    2393         if ( uiNoCoeff == 16 )
    2394         {
    2395           if ( nTab == 2 ){
    2396             vlc = g_auiVlcTable8x8Intra[maxrun];       
    2397             cn = xRunLevelInd(quantCoeffInfo[i].nextLev, run, maxrun, uiLumaRunNoTr14x4[maxrun]);
    2398           }
    2399           else{
    2400             vlc = g_auiVlcTable8x8Inter[maxrun];           
    2401 #if RUNLEVEL_TABLE_CUT
    2402             cn = xRunLevelIndInter(quantCoeffInfo[i].nextLev, run, maxrun);
    2403 #else
    2404             cn = g_auiLumaRun8x8[maxrun][quantCoeffInfo[i].nextLev][run];
    2405 #endif
    2406           }
    2407           bitsRun[i] += xCountVlcBits( vlc, cn );
    2408         }
    2409         else
    2410         {
    2411           if(nTab == 2 || nTab == 5){
    2412             vlc = g_auiVlcTable8x8Intra[Min(maxrun,28)];         
    2413             cn = xRunLevelInd(quantCoeffInfo[i].nextLev, run, maxrun, uiLumaRunNoTr18x8[min(maxrun,28)]);
    2414           }
    2415           else{
    2416             vlc = g_auiVlcTable8x8Inter[Min(maxrun,28)];           
    2417 #if RUNLEVEL_TABLE_CUT
    2418             cn = xRunLevelIndInter(quantCoeffInfo[i].nextLev, run, maxrun);
    2419 #else
    2420             cn = g_auiLumaRun8x8[min(maxrun,28)][quantCoeffInfo[i].nextLev][run];
    2421 #endif
    2422           }
    2423           bitsRun[i] += xCountVlcBits( vlc, cn );
    2424         }
    2425 #endif
    2426       }
    2427     }
    2428   }
    2429 
    2430   lagrMin=0; lastPosMin=-1;
    2431   for (i=0; i<uiNoCoeff; i++){
    2432     if ( scoeff[i] != 0 ){
    2433       lagrMin += levelData[i].errLevel[0];
    2434     }
    2435   }
    2436 
    2437   UInt first=1;
    2438 
    2439   bitsLastPrev=0; lagrPrev=lagrMin;
    2440   for (i=0; i<uiNoCoeff; i++){
    2441     if (scoeff[i]){
    2442       iRate = (bitsRun[i] + bitsLast[i] - bitsLastPrev) << uiBitShift;
    2443       lagr = lagrPrev-levelData[i].errLevel[0] + levelData[i].errLevel[levelData[i].quantInd] + m_dLambda*iRate;
    2444       bitsLastPrev = bitsLast[i];
    2445       lagrPrev = lagr;
    2446 
    2447       if ( lagr < lagrMin || abs(scoeff[i]) > 1 || first == 1){
    2448         lagrMin = lagr;
    2449         lastPosMin =i;
    2450         first = 0;
    2451       }
    2452     }
    2453   }
    2454 
    2455   return(lastPosMin);
    2456 }   
    2457 #else
    2458 #if QC_MOD_LCEC
    2459 Int TComTrQuant::bitCount_LCEC(Int k,Int pos,Int nTab, Int lpflag,Int levelMode,Int run, Int maxrun, Int vlc_adaptive, Int N, UInt uiTr1)
    2460 #else
    2461 Int TComTrQuant::bitCount_LCEC(Int k,Int pos,Int n,Int lpflag,Int levelMode,Int run,Int maxrun,Int vlc_adaptive,Int N)
    2462 #endif
    2463 {
    2464   UInt cn;
    2465   int vlc,x,cx,vlcNum,bits,temp;
    2466 #if QC_MOD_LCEC == 0
    2467   static const int vlctable_8x8[28] = {8,0,0,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6};
    2468   static const int vlcTable8[8] = {10,10,3,3,3,4,4,4}; // U,V,Y8x8I,Y8x8P,Y8x8B,Y16x16I,Y16x16P,Y16x16B
    2469 #endif
    2470   static const int vlcTable4[3] = {2,2,2};             // Y4x4I,Y4x4P,Y4x4B,
    2471 #if QC_MOD_LCEC == 0
    2472   static const int VLClength[11][128] =
    2473   {
    2474     { 1, 2, 3, 4, 5, 6, 7, 9, 9,11,11,11,11,13,13,13,13,13,13,13,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19},
    2475     { 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,10,10,10,10,12,12,12,12,12,12,12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18},
    2476     { 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,11,11,11,11,11,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17},
    2477     { 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16},
    2478     { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13},
    2479     { 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63,64,64,65,65},
    2480     { 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30,31,31,31,31,32,32,32,32,33,33,33,33,34,34,34,34},
    2481     { 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19},
    2482     { 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    2483     { 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13},
    2484     { 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,15}
    2485   };
    2486 #endif
    2487   int sign = k<0 ? 1 : 0;
    2488  
    2489   k = abs(k);
    2490 #if QC_MOD_LCEC
    2491   Int n;
    2492   Int lev = (k>1 ? 1 : 0);
    2493   if (N==4)
    2494     n=max(0,nTab-2);
    2495   else
    2496     n=nTab;
    2497 #endif
    2498   if (N != 4 && N!= 8)
    2499   {
    2500     FATAL_ERROR_0("unsupported block size in bitCount_LCEC()" , -1 );
    2501   }
    2502   if (k)
    2503   {
    2504     if (lpflag==1)
    2505     {                       
    2506       x = pos + (k==1 ? 0 : N*N);
    2507       if (N==8)
    2508       {
    2509         cx = m_uiLPTableE8[n*128+x];
    2510 #if QC_MOD_LCEC
    2511         vlcNum = g_auiLastPosVlcNum[n][Min(16,m_uiLastPosVlcIndex[n])];
    2512 #else
    2513         vlcNum = vlcTable8[n];
    2514 #endif
    2515       }
    2516       else // (N==4)
    2517       {
    2518         cx = m_uiLPTableE4[n*32+x];
    2519         vlcNum = vlcTable4[n];
    2520       }
    2521       bits = VLClength[vlcNum][cx];
    2522       if (k>1)
    2523       {
    2524         temp = 2*(k-2)+sign;
    2525         if(temp > 127)
    2526           temp = 127;
    2527         bits += VLClength[0][temp];
    2528       }
    2529       else
    2530         bits += 1;                                     
    2531     }
    2532     else
    2533     {
    2534       if (!levelMode)
    2535       {                                                   
    2536 #if QC_MOD_LCEC
    2537         const UInt *p_auiLumaRunTr1 = g_auiLumaRunTr14x4[uiTr1];
    2538         UInt ui_maxrun = maxrun;
    2539         if (N==8)
    2540         {
    2541           p_auiLumaRunTr1 = g_auiLumaRunTr18x8[uiTr1];
    2542           ui_maxrun =min(maxrun,28);
    2543         }
    2544         if(nTab == 2 || nTab == 5)
    2545         {
    2546           cn = xRunLevelInd(lev, run, maxrun, p_auiLumaRunTr1[ui_maxrun]);
    2547           vlc = g_auiVlcTable8x8Intra[ui_maxrun];
    2548         }
    2549         else
    2550         {
    2551           cn = g_auiLumaRun8x8[ui_maxrun][lev][run];
    2552           vlc = g_auiVlcTable8x8Inter[ui_maxrun];
    2553         }
    2554 #else                                     
    2555         if (maxrun > 27)
    2556         {
    2557           cn = g_auiLumaRun8x8[28][k>1 ? 1 : 0][run];
    2558         }
    2559         else
    2560         {
    2561           cn = g_auiLumaRun8x8[maxrun][k>1 ? 1 : 0][run];
    2562         }
    2563         vlc = (maxrun>27) ? 3 : vlctable_8x8[maxrun];
    2564 #endif
    2565         bits = VLClength[vlc][cn];
    2566         if (k>1)
    2567         {
    2568           temp = 2*(k-2)+sign;
    2569           if(temp > 127)
    2570             temp = 127;
    2571           bits += VLClength[0][temp];
    2572         }
    2573         else
    2574           bits += 1; 
    2575        
     1762        qpScaled = qpScaled +  qpBDOffset;
    25761763      }
    25771764      else
    25781765      {
    2579         if(k > 127)
    2580           k = 127;
    2581         bits = VLClength[vlc_adaptive][k] + 1;
    2582       }
    2583     }
    2584   }
    2585   else
    2586   {
    2587     if (levelMode)
    2588       bits = VLClength[vlc_adaptive][k];
    2589     else
    2590     {                       
    2591       if (pos==0 && lpflag==0)
    2592       { 
    2593 #if QC_MOD_LCEC
    2594         const UInt *p_auiLumaRunTr1 = g_auiLumaRunTr14x4[uiTr1];
    2595         UInt ui_maxrun = maxrun;
    2596         if (N==8)
    2597         {
    2598            p_auiLumaRunTr1 = g_auiLumaRunTr18x8[uiTr1];
    2599            ui_maxrun =min(maxrun,28);
    2600         }
    2601         if(nTab == 2 || nTab == 5)
    2602         {
    2603           cn = xRunLevelInd(0, run+1, maxrun, p_auiLumaRunTr1[ui_maxrun]);
    2604           vlc = g_auiVlcTable8x8Intra[ui_maxrun];
    2605         }
    2606         else
    2607         {
    2608           cn = g_auiLumaRun8x8[ui_maxrun][0][run+1];
    2609           vlc = g_auiVlcTable8x8Inter[ui_maxrun];
    2610         }
    2611 #else   
    2612         if (maxrun > 27)
    2613         {
    2614           cn = g_auiLumaRun8x8[28][0][run+1];
    2615         }
    2616         else
    2617         {
    2618           cn = g_auiLumaRun8x8[maxrun][0][run+1];
    2619         }
    2620         vlc = (maxrun>27) ? 3 : vlctable_8x8[maxrun];
    2621 #endif
    2622         bits = VLClength[vlc][cn];
    2623       }
    2624       else
    2625         bits = 0;
    2626     }
    2627   }
    2628   return bits;
    2629 }
    2630 #endif
    2631 #if QC_MOD_LCEC_RDOQ
    2632 static levelDataStruct slevelData  [ MAX_CU_SIZE*MAX_CU_SIZE ];
    2633 Void TComTrQuant::xRateDistOptQuant_LCEC(TComDataCU* pcCU, Long* pSrcCoeff, TCoeff*& pDstCoeff, UInt uiWidth, UInt uiHeight, UInt& uiAbsSum, TextType eTType,
    2634                                          UInt uiAbsPartIdx )
    2635 {
    2636   Int     i, j;
    2637   Int     iShift = 0;
    2638   Int     qp_rem, q_bits;
    2639   Double  err, lagr, lagrMin;
    2640   Double  normFact = 0.0;
    2641   Double  OneOverNormFact = 0.0;
    2642   Double  fTemp = 0.0;
    2643   Int     iQuantCoeff;
     1766        qpScaled = g_aucChromaScale[ Clip3(0, 51, qpScaled) ] + qpBDOffset;
     1767      }
     1768    }
     1769    cQpBase.setQpParam(qpScaled, false, pcCU->getSlice()->getSliceType());
     1770#else
     1771    if(eTType != TEXT_LUMA)
     1772    {
     1773      iQpBase = g_aucChromaScale[iQpBase];
     1774    }
     1775    cQpBase.setQpParam(iQpBase, false, pcCU->getSlice()->getSliceType());
     1776#endif
     1777#endif
     1778
     1779    Bool bNonSqureFlag = ( iWidth != iHeight );
     1780    UInt dir           = SCALING_LIST_SQT;
     1781    if( bNonSqureFlag )
     1782    {
     1783      dir = ( iWidth < iHeight )?  SCALING_LIST_VER: SCALING_LIST_HOR;
     1784      UInt uiWidthBit  = g_aucConvertToBit[ iWidth ] + 2;
     1785      UInt uiHeightBit = g_aucConvertToBit[ iHeight ] + 2;
     1786      iWidth  = 1 << ( ( uiWidthBit + uiHeightBit) >> 1 );
     1787      iHeight = iWidth;
     1788    }   
     1789
     1790    UInt uiLog2TrSize = g_aucConvertToBit[ iWidth ] + 2;
     1791    Int scalingListType = (pcCU->isIntra(uiAbsPartIdx) ? 0 : 3) + g_eTTable[(Int)eTType];
     1792    assert(scalingListType < 6);
     1793    Int *piQuantCoeff = 0;
     1794    piQuantCoeff = getQuantCoeff(scalingListType,m_cQP.m_iRem,uiLog2TrSize-2, dir);
     1795
     1796#if FULL_NBIT
     1797    UInt uiBitDepth = g_uiBitDepth;
     1798#else
     1799    UInt uiBitDepth = g_uiBitDepth + g_uiBitIncrement;
     1800#endif
     1801    UInt iTransformShift = MAX_TR_DYNAMIC_RANGE - uiBitDepth - uiLog2TrSize;  // Represents scaling through forward transform
     1802    Int iQBits = QUANT_SHIFT + m_cQP.m_iPer + iTransformShift;                // Right shift of non-RDOQ quantizer;  level = (coeff*uiQ + offset)>>q_bits
     1803
     1804    iAdd = (pcCU->getSlice()->getSliceType()==I_SLICE ? 171 : 85) << (iQBits-9);
     1805
     1806#if ADAPTIVE_QP_SELECTION
     1807    iQBits = QUANT_SHIFT + cQpBase.m_iPer + iTransformShift;
     1808    iAdd = (pcCU->getSlice()->getSliceType()==I_SLICE ? 171 : 85) << (iQBits-9);
     1809    Int iQBitsC = QUANT_SHIFT + cQpBase.m_iPer + iTransformShift - ARL_C_PRECISION; 
     1810    Int iAddC   = 1 << (iQBitsC-1);
     1811#endif
     1812
     1813#if MULTIBITS_DATA_HIDING
     1814    Int qBits8 = iQBits-8;
     1815#endif
     1816    for( Int n = 0; n < iWidth*iHeight; n++ )
     1817    {
     1818      Int iLevel;
     1819      Int  iSign;
     1820      UInt uiBlockPos = n;
     1821      iLevel  = piCoef[uiBlockPos];
     1822      iSign   = (iLevel < 0 ? -1: 1);     
     1823
     1824#if ADAPTIVE_QP_SELECTION
     1825      Int64 tmpLevel = (Int64)abs(iLevel) * piQuantCoeff[uiBlockPos];
     1826      if( m_bUseAdaptQpSelect )
     1827      {
     1828        piArlCCoef[uiBlockPos] = (Int)((tmpLevel + iAddC ) >> iQBitsC);
     1829      }
     1830      iLevel = (Int)((tmpLevel + iAdd ) >> iQBits);
     1831#if MULTIBITS_DATA_HIDING
     1832      deltaU[uiBlockPos] = (Int)((tmpLevel - (iLevel<<iQBits) )>> qBits8);
     1833#endif
     1834#else
     1835      iLevel = ((Int64)abs(iLevel) * piQuantCoeff[uiBlockPos] + iAdd ) >> iQBits;
     1836#if MULTIBITS_DATA_HIDING
     1837      deltaU[uiBlockPos] = (Int)( ((Int64)abs(iLevel) * piQuantCoeff[uiBlockPos] - (iLevel<<iQBits) )>> qBits8 );
     1838#endif
     1839#endif
     1840      uiAcSum += iLevel;
     1841      iLevel *= iSign;       
     1842      piQCoef[uiBlockPos] = Clip3( -32768, 32767, iLevel );
     1843    } // for n
     1844#if MULTIBITS_DATA_HIDING
     1845    if( pcCU->getSlice()->getPPS()->getSignHideFlag() )
     1846    {
     1847      if(uiAcSum>=2)
     1848      {
     1849        signBitHidingHDQ( pcCU, piQCoef, piCoef, scan, deltaU, iWidth, iHeight ) ;
     1850      }
     1851    }
     1852#endif
     1853  } //if RDOQ
     1854  //return;
     1855
     1856}
     1857
     1858Void TComTrQuant::xDeQuant( const TCoeff* pSrc, Int* pDes, Int iWidth, Int iHeight, Int scalingListType )
     1859{
    26441860 
    2645 #if E243_CORE_TRANSFORMS
    2646   Int     iShiftQBits, iSign, iRate, lastPosMin, iBlockType;
    2647   UInt    uiBitShift = SCALE_BITS, uiScanPos, levelInd;
    2648   Int     levelBest, iLevel;
    2649 #else
    2650   Bool    bExt8x8Flag = false;
    2651   Int     iShiftQBits, iSign, iRate, lastPosMin, iBlockType;
    2652   UInt    uiBitShift = 15, uiScanPos, levelInd;
    2653   Int     levelBest, iLevel, iAdd;
    2654 #endif
    2655 
    2656   levelDataStruct* levelData = &slevelData[0];
    2657 
    2658   Int     iPos, iScanning;
    2659 
    2660 #if CAVLC_COEF_LRG_BLK
    2661   static TCoeff sQuantCoeff[1024];
    2662 #else
    2663   static TCoeff sQuantCoeff[256];
    2664 #endif
    2665 
    2666   qp_rem    = m_cQP.m_iRem;
    2667   q_bits    = m_cQP.m_iBits;
    2668 
    2669   UInt noCoeff=(uiWidth < 8 ? 16 : 64);
    2670 #if CAVLC_COEF_LRG_BLK
    2671   UInt maxBlSize = (eTType==TEXT_LUMA)? 32:8;
    2672   UInt uiBlSize = Min(uiWidth,maxBlSize);
    2673   noCoeff = uiBlSize*uiBlSize;
    2674 #endif
    2675 
    2676 #if E243_CORE_TRANSFORMS
    2677   UInt uiLog2TrSize = g_aucConvertToBit[ uiWidth ] + 2;
    2678   UInt uiQ = g_auiQ[m_cQP.rem()];
     1861  const TCoeff* piQCoef   = pSrc;
     1862  Int*   piCoef    = pDes;
     1863  UInt dir          = SCALING_LIST_SQT;
     1864  if( iWidth != iHeight )
     1865  {
     1866    dir          = ( iWidth < iHeight )? SCALING_LIST_VER: SCALING_LIST_HOR;
     1867    UInt uiWidthBit  = g_aucConvertToBit[ iWidth ]  + 2;
     1868    UInt uiHeightBit = g_aucConvertToBit[ iHeight ] + 2;
     1869    iWidth  = 1 << ( ( uiWidthBit + uiHeightBit) >> 1 );
     1870    iHeight = iWidth;
     1871  }   
     1872
     1873  if ( iWidth > (Int)m_uiMaxTrSize )
     1874  {
     1875    iWidth  = m_uiMaxTrSize;
     1876    iHeight = m_uiMaxTrSize;
     1877  }
     1878 
     1879  Int iShift,iAdd,iCoeffQ;
     1880  UInt uiLog2TrSize = g_aucConvertToBit[ iWidth ] + 2;
    26791881
    26801882#if FULL_NBIT
     
    26831885  UInt uiBitDepth = g_uiBitDepth + g_uiBitIncrement;
    26841886#endif
    2685   Int iTransformShift = MAX_TR_DYNAMIC_RANGE - uiBitDepth - uiLog2TrSize;  // Represents scaling through forward transform
    2686   double dErrScale = (double)(1<<uiBitShift);                              // Compensate for scaling of bitcount in Lagrange cost function
    2687   dErrScale = dErrScale*pow(2.0,-2.0*iTransformShift);                     // Compensate for scaling through forward transform
    2688   dErrScale = dErrScale/(double)(uiQ*uiQ);                                 // Compensate for qp-dependent multiplier applied before calculating the Lagrange cost function
    2689   dErrScale = dErrScale/(double)(1<<(2*g_uiBitIncrement));                   // Compensate for Lagrange multiplier that is tuned towards 8-bit input
    2690 
    2691   q_bits = QUANT_SHIFT + m_cQP.m_iPer + iTransformShift;                   // Right shift of non-RDOQ quantizer;  level = (coeff*uiQ + offset)>>q_bits
    2692 
    2693   iShift = uiLog2TrSize;
    2694   if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V)
    2695   {
    2696     iBlockType = eTType-2;
    2697   }
    2698   else
    2699   {
    2700     iBlockType = (uiWidth < 16 ? 2 : 5) + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() );
    2701   }
    2702 #else
    2703   if ( uiWidth == 4 && uiHeight == 4 )
    2704   {
    2705     normFact = pow(2., (2 * DQ_BITS + 19));
    2706     if ( g_uiBitIncrement ) normFact *= 1 << (2 * g_uiBitIncrement);
    2707     m_puiQuantMtx = &g_aiQuantCoef  [m_cQP.m_iRem][0];
    2708     iShift = 2;
    2709     iAdd = m_cQP.m_iAdd4x4;
    2710 
    2711     if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V)
    2712       iBlockType = eTType-2;
    2713     else
    2714       iBlockType = 2 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() );
    2715   }
    2716   else
    2717     if ( uiWidth == 8 && uiHeight == 8 )
    2718     {
    2719       q_bits++;
    2720       normFact = pow(2., (2 * Q_BITS_8 + 9));
    2721       if ( g_uiBitIncrement ) normFact *= 1<<(2*g_uiBitIncrement);
    2722       m_puiQuantMtx = &g_aiQuantCoef64[m_cQP.m_iRem][0];
    2723       iShift = 3;
    2724       iAdd = m_cQP.m_iAdd8x8;
    2725 
    2726       if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V)
    2727         iBlockType = eTType-2;
    2728       else
    2729         iBlockType = 2 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() );
    2730     }
    2731     else
    2732       if ( uiWidth == 16 && uiHeight == 16 )
    2733       {
    2734         q_bits = ECore16Shift + m_cQP.per();
    2735         normFact = pow(2., 21);
    2736         if ( g_uiBitIncrement ) normFact *= 1 << (2 * g_uiBitIncrement);
    2737         fTemp = estErr16x16[qp_rem] / normFact;
    2738 
    2739         m_puiQuantMtx = ( &g_aiQuantCoef256[m_cQP.m_iRem][0] );
    2740         iShift = 4;
    2741         iAdd = m_cQP.m_iAdd16x16;
    2742         bExt8x8Flag = true;
    2743 
    2744         if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V)
    2745           iBlockType = eTType-2;
    2746         else
    2747           iBlockType = 5 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() );
    2748       }
    2749       else
    2750         if ( uiWidth == 32 && uiHeight == 32 )
    2751         {
    2752           q_bits = ECore32Shift + m_cQP.per();
    2753           normFact = pow(2., 21);
    2754           if ( g_uiBitIncrement ) normFact *= 1<<(2*g_uiBitIncrement);
    2755           fTemp = estErr32x32[qp_rem]/normFact;
    2756 
    2757           m_puiQuantMtx = ( &g_aiQuantCoef1024[m_cQP.m_iRem][0] );
    2758           iShift = 5;
    2759           iAdd = m_cQP.m_iAdd32x32;
    2760           bExt8x8Flag = true;
    2761 
    2762           if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V)
    2763             iBlockType = eTType-2;
    2764           else
    2765             iBlockType = 5 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() );
    2766         }
    2767         else
    2768         {
    2769           iBlockType =0;
    2770 
    2771           assert(0);
    2772         }
    2773 #endif //E243_CORE_TRANSFORMS
    2774         memset(&pDstCoeff[0],0,uiWidth*uiHeight*sizeof(TCoeff));
    2775 
    2776         iShiftQBits = (1 <<( q_bits - 1));
    2777 
    2778 
    2779 #if QC_MDCS
    2780 #if CAVLC_COEF_LRG_BLK
    2781         UInt uiLog2BlkSize = g_aucConvertToBit[ pcCU->isIntra( uiAbsPartIdx ) ? uiWidth : uiBlSize   ] + 2;
    2782 #else
    2783         UInt uiLog2BlkSize = g_aucConvertToBit[ pcCU->isIntra( uiAbsPartIdx ) ? uiWidth : Min(8,uiWidth)    ] + 2;
    2784 #endif
    2785         const UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
    2786 #else
    2787         const UInt* pucScan;
    2788         if( !pcCU->isIntra(uiAbsPartIdx )){
    2789 #if CAVLC_COEF_LRG_BLK
    2790           pucScan = g_auiFrameScanXY[ g_aucConvertToBit[ uiBlSize ] + 1];
    2791 #else
    2792           pucScan = g_auiFrameScanXY[ g_aucConvertToBit[ Min(uiWidth, 8) ] + 1];
    2793 #endif
    2794         }
    2795         else{
    2796           pucScan = g_auiFrameScanXY[ g_aucConvertToBit[ uiWidth ] + 1];
    2797         }
    2798 #endif //QC_MDCS
    2799 
    2800 
    2801 
    2802         OneOverNormFact = 1.0 / normFact;
    2803 
    2804         UInt uiShift_local = iShift;
    2805         UInt uiRes_local = (uiWidth - 1);
    2806         UInt uiWidth_local = uiShift_local;
    2807 
    2808 #if CAVLC_COEF_LRG_BLK
    2809         if(!pcCU->isIntra(uiAbsPartIdx) && uiWidth > maxBlSize)
    2810         {
    2811           uiShift_local = g_aucConvertToBit[ maxBlSize ] + 2;;
    2812           uiRes_local = maxBlSize - 1;
    2813         }
    2814 #else
    2815         if( !pcCU->isIntra(uiAbsPartIdx) && uiWidth >= 16 )
    2816         {
    2817           uiShift_local = 3;
    2818           uiRes_local = 7;
    2819         }
    2820 #endif
    2821 
    2822         Int iAddRDOQ = 0;
    2823 #if E243_CORE_TRANSFORMS
    2824         /* Code below is consistent with JCTVC-E243 but could preferably be replaced with iAddRDOQ = 171 << (q_bits-9); */
    2825         if (q_bits>=15)
    2826         {
    2827           iAddRDOQ = (uiWidth<16 ? 10922 : 10880) << (q_bits-15);
    2828         }
    2829         else
    2830         {
    2831           iAddRDOQ = (uiWidth<16 ? 10922 : 10880) >> (15-q_bits);
    2832         }
    2833 #else
    2834         {
    2835           UInt uiSliceType = 0;
    2836 
    2837           Int iQP=pcCU->getSlice()->getSliceQp();
    2838           if( eTType != TEXT_LUMA ) //Chroma
    2839           {
    2840             iQP  = g_aucChromaScale[ iQP ];
    2841           }
    2842 
    2843           Int iDefaultOffset;
    2844           Int iDefaultOffset_LTR;
    2845           Int iPer;
    2846           Int k =  (iQP + 6 * g_uiBitIncrement) / 6;
    2847 #if FULL_NBIT
    2848           k += g_uiBitDepth - 8;
    2849 #endif
    2850           Bool bLowPass = (uiSliceType == 0);
    2851           iDefaultOffset = (bLowPass ? 10922 : 5462);
    2852 
    2853           bLowPass = (uiSliceType == 0);
    2854           iDefaultOffset_LTR = (bLowPass? 170 : 86);
    2855 
    2856           if ( uiWidth == 4 && uiWidth == 4 ){
    2857             iPer = QP_BITS + k - QOFFSET_BITS;
    2858             iAddRDOQ = iDefaultOffset << iPer;
    2859           }
    2860           else if ( uiWidth == 8 && uiWidth == 8){
    2861             iPer = QP_BITS + k + 1 - QOFFSET_BITS;
    2862             iAddRDOQ = iDefaultOffset << iPer;
    2863           }
    2864           else if ( uiWidth == 16 && uiHeight == 16 ){
    2865             iPer = ECore16Shift + k - QOFFSET_BITS_LTR;
    2866             iAddRDOQ = iDefaultOffset_LTR << iPer;
    2867           }
    2868           else if ( uiWidth == 32 && uiHeight == 32 ){
    2869             iPer = ECore32Shift + k - QOFFSET_BITS_LTR;
    2870             iAddRDOQ = iDefaultOffset_LTR << iPer;
    2871           }
    2872         }
    2873 #endif
    2874         if (m_uiRDOQOffset==1)
    2875           iAddRDOQ=iShiftQBits;
    2876 
    2877         for (iScanning=noCoeff-1; iScanning>=0; iScanning--)
    2878         {
    2879 #if QC_MDCS
    2880           iPos = g_auiSigLastScan[uiScanIdx][uiLog2BlkSize-1][iScanning];
    2881 #else
    2882           iPos = pucScan[iScanning];
    2883 #endif //QC_MDCS
    2884           j = iPos >> uiShift_local;
    2885           i = iPos &  uiRes_local;
    2886           iPos = (j << uiWidth_local) + i;
    2887 
    2888           levelDataStruct *psLevelData = &levelData[iScanning];
    2889 #if E243_CORE_TRANSFORMS
    2890           psLevelData->levelDouble = abs(pSrcCoeff[iPos]) * uiQ;         
    2891           iQuantCoeff = (Int)((psLevelData->levelDouble + iAddRDOQ) >> q_bits);
    2892 
    2893           psLevelData->levelQ   = (Long)( psLevelData->levelDouble >> q_bits );
    2894           psLevelData->lowerInt = ( ( psLevelData->levelDouble - (psLevelData->levelQ << q_bits) ) < iShiftQBits ) ? true : false;
    2895 
    2896           iSign = pSrcCoeff[iPos] < 0 ? -1 : 1;
    2897           sQuantCoeff[iScanning] = iQuantCoeff*iSign;
    2898 
    2899           fTemp = dErrScale;
    2900 #else
    2901           psLevelData->levelDouble = abs( pSrcCoeff[iPos] * (Long) m_puiQuantMtx[iPos]);
    2902           iQuantCoeff=(Int)((psLevelData->levelDouble +iAddRDOQ) >> q_bits);
    2903 
    2904           psLevelData->levelQ   = ( psLevelData->levelDouble >> q_bits );
    2905           psLevelData->lowerInt = ( ( psLevelData->levelDouble - (psLevelData->levelQ << q_bits) ) < iShiftQBits ) ? true : false;
    2906 
    2907           iSign = pSrcCoeff[iPos] < 0 ? -1 : 1;
    2908           sQuantCoeff[iScanning] = iQuantCoeff*iSign;
    2909 
    2910           if      ( uiWidth == 4 ) fTemp = estErr4x4[qp_rem][i][j] * OneOverNormFact;
    2911           else if ( uiWidth == 8 ) fTemp = estErr8x8[qp_rem][i][j] * OneOverNormFact;
    2912 #endif
    2913           psLevelData->level[0] = 0;
    2914           err = (Double)(psLevelData->levelDouble);
    2915           psLevelData->errLevel[0] = err * err * fTemp;
    2916 
    2917           if ( !psLevelData->levelQ )
    2918           {
    2919             if ( psLevelData->lowerInt )
    2920             {
    2921               psLevelData->noLevels = 1;
    2922             }
    2923             else
    2924             {
    2925               psLevelData->level[1] = 1;
    2926               psLevelData->noLevels = 2;
    2927             }
    2928             if (iQuantCoeff==0)
    2929               psLevelData->quantInd=0;
    2930             else
    2931               psLevelData->quantInd=1;
    2932 
    2933           }
    2934           else if ( psLevelData->lowerInt )
    2935           {
    2936             psLevelData->level[1] = psLevelData->levelQ;
    2937             psLevelData->noLevels = 2;
    2938 
    2939             if ( psLevelData->levelQ > 1 ){
    2940               psLevelData->noLevels++;
    2941               psLevelData->level[2] = 1;
    2942             }
    2943 
    2944             psLevelData->quantInd = 1;
    2945           }
    2946           else
    2947           {
    2948             psLevelData->level[1] = psLevelData->levelQ;
    2949             psLevelData->level[2] = psLevelData->levelQ + 1;
    2950             psLevelData->noLevels = 3;
    2951 
    2952             if ( psLevelData->levelQ > 1 ){
    2953               psLevelData->noLevels++;
    2954               psLevelData->level[3] = 1;
    2955             }
    2956             if ( iQuantCoeff == psLevelData->level[1] )
    2957               psLevelData->quantInd = 1;
    2958             else
    2959               psLevelData->quantInd = 2;
    2960           }
    2961 
    2962           for ( levelInd = 1; levelInd < psLevelData->noLevels; levelInd++ ){
    2963             err = (Double)((psLevelData->level[levelInd] << q_bits) - psLevelData->levelDouble);
    2964             psLevelData->errLevel[levelInd] = err * err * fTemp;
    2965             psLevelData->level[levelInd] *= iSign;
    2966           }
    2967         }
    2968 
    2969 #if CAVLC_COEF_LRG_BLK==0
    2970         UInt uiNum;
    2971         if ( uiWidth == 4 )
    2972           uiNum = 4;
    2973         else
    2974           uiNum = 8;
    2975 #endif
    2976 
    2977         // Last Position
    2978 #if CAVLC_COEF_LRG_BLK
    2979         lastPosMin = xCodeCoeffCountBitsLast(sQuantCoeff, levelData, iBlockType, uiBlSize);
    2980 #else
    2981         lastPosMin = xCodeCoeffCountBitsLast(sQuantCoeff, levelData, iBlockType, uiNum);
    2982 #endif
    2983         memset(&sQuantCoeff[lastPosMin+1],0,sizeof(TCoeff) * (noCoeff - (lastPosMin + 1)));
    2984 
    2985 
    2986         Int  iLpFlag = 1;
    2987         Int  iLevelMode = 0;
    2988         Int  iRun = 0;
    2989         Int  iVlc_adaptive = 0;
    2990         Int  iMaxrun = 0;
    2991         Int  iSum_big_coef = 0;
    2992 
    2993 
    2994         UInt uiTr1=0;
    2995         UInt absBestLevel;
    2996 
    2997         Int atable[5] = {4,6,14,28,0xfffffff};
    2998         Int switch_thr[10] = {49,49,0,49,49,0,49,49,49,49};
    2999 
    3000         Int levelIndBest, iRateMin=0, levelStart;
    3001         Double lagrCoded=0, lagrNotCoded=0;
    3002 #if CAVLC_COEF_LRG_BLK
    3003         const UInt **pLumaRunTr1 = (uiWidth==4)? g_pLumaRunTr14x4:g_pLumaRunTr18x8;
    3004         UInt coeffBlkSize = (uiWidth==4)? 4:(noCoeff==64)? 8:(noCoeff==256)? 16:32;
    3005 #endif
    3006 
    3007         for (iScanning = lastPosMin; iScanning>=0; iScanning--){
    3008           uiScanPos = iScanning;
    3009           levelStart = (iScanning == lastPosMin) ? 1 : 0;
    3010 
    3011           sQuantCoeff[uiScanPos] = levelBest = 0;
    3012           levelDataStruct *psLevelData = &levelData[uiScanPos];
    3013           if ( psLevelData->noLevels >1 || iScanning == 0 ){
    3014 
    3015             lagrMin = 0; iRateMin = 0;
    3016             for (levelInd = levelStart; levelInd < psLevelData->noLevels; levelInd++){
    3017 
    3018               lagr = psLevelData->errLevel[levelInd];
    3019               iLevel=psLevelData->level[levelInd];
    3020 
    3021 #if CAVLC_COEF_LRG_BLK
    3022               iRate = bitCountRDOQ(iLevel,uiScanPos,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,
    3023                 coeffBlkSize,uiTr1, iSum_big_coef, iBlockType, pcCU, pLumaRunTr1)<<uiBitShift;
    3024 #else
    3025               if ( uiWidth == 4 ){
    3026                 iRate = bitCountRDOQ(iLevel,uiScanPos,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,4,uiTr1,
    3027                   iSum_big_coef,iBlockType, pcCU)<<uiBitShift;
    3028               }
    3029               else{
    3030                 iRate = bitCountRDOQ(iLevel,uiScanPos,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,8,uiTr1,
    3031                   iSum_big_coef, iBlockType, pcCU) << uiBitShift;
    3032               }
    3033 #endif
    3034               lagr += m_dLambda * iRate;
    3035 
    3036               if ( lagr < lagrMin || levelInd == levelStart){
    3037                 lagrMin = lagr;
    3038                 iRateMin = iRate;
    3039                 levelBest = iLevel;
    3040                 levelIndBest = levelInd;
    3041               }
    3042             }
    3043           }
    3044 
    3045           if ( levelBest != 0 ){
    3046             lagrCoded += lagrMin;
    3047             lagrNotCoded += psLevelData->errLevel[0];
    3048           }
    3049           if ( uiScanPos == 0 && levelBest == 0 ){
    3050             lagrCoded += m_dLambda * iRateMin;
    3051           }
    3052 
    3053           sQuantCoeff[uiScanPos] = levelBest;
    3054 
    3055           absBestLevel = abs(levelBest);
    3056           if ( levelBest != 0 ){ 
    3057 
    3058             if ( uiWidth > 4 ){
    3059               if ( !iLpFlag && absBestLevel > 1 ){
    3060                 iSum_big_coef += absBestLevel;
    3061                 if ((noCoeff - uiScanPos - 1) > switch_thr[iBlockType] || iSum_big_coef > 2) iLevelMode = 1;
    3062               }
    3063             }
    3064             else{
    3065               if ( absBestLevel > 1 ) iLevelMode = 1;
    3066             }
    3067 
    3068             if ( iLpFlag == 1 )
    3069             {
    3070               uiTr1 = (absBestLevel > 1) ? 0 : 1;
    3071             }
    3072             else
    3073             {
    3074               if ( uiTr1 == 0 || absBestLevel >= 2 )
    3075               {
    3076                 uiTr1 = 0;
    3077               }
    3078               else if ( uiTr1 < MAX_TR1 )
    3079               {
    3080                 uiTr1++;
    3081               }
    3082             }
    3083             iMaxrun = iScanning - 1;
    3084             iLpFlag = 0;
    3085             iRun = 0;
    3086             if ( iLevelMode && (absBestLevel > atable[iVlc_adaptive])) iVlc_adaptive++;       
    3087           }
    3088           else
    3089           {
    3090             iRun += 1;         
    3091           }
    3092         }
    3093 
    3094         if (lastPosMin >= 0 && lagrCoded > lagrNotCoded){
    3095           for (iScanning = lastPosMin; iScanning>=0; iScanning--){
    3096             sQuantCoeff[iScanning] = 0;
    3097           }
    3098         }
    3099 
    3100 #if CAVLC_COEF_LRG_BLK
    3101         if ((!pcCU->isIntra(uiAbsPartIdx) && uiWidth > maxBlSize))
    3102         {
    3103           for (iScanning=noCoeff-1; iScanning>=0; iScanning--)
    3104           {
    3105 #if QC_MDCS
    3106             iPos = g_auiSigLastScan[uiScanIdx][uiLog2BlkSize-1][iScanning];
    3107 #else
    3108             iPos = pucScan[iScanning];
    3109 #endif //QC_MDCS
    3110             j = iPos >>  (g_aucConvertToBit[ maxBlSize ] + 2);
    3111             i = iPos & (maxBlSize-1);
    3112             iPos = (j<<(g_aucConvertToBit[ uiWidth ] + 2))+i;
    3113             pDstCoeff[iPos] = sQuantCoeff[iScanning];
    3114             uiAbsSum += abs(sQuantCoeff[iScanning]);
    3115           }
    3116         }
    3117 #else
    3118         if ((!pcCU->isIntra(uiAbsPartIdx) && uiWidth >= 16))
    3119         {
    3120           for (iScanning = noCoeff - 1; iScanning >= 0; iScanning--)
    3121           {
    3122 #if QC_MDCS
    3123             iPos = g_auiSigLastScan[uiScanIdx][uiLog2BlkSize-1][iScanning];
    3124 #else
    3125             iPos = pucScan[iScanning];
    3126 #endif //QC_MDCS
    3127             j = iPos >> 3;
    3128             i = iPos & 0x7;
    3129             iPos = uiWidth * j + i;
    3130             pDstCoeff[iPos] = sQuantCoeff[iScanning];
    3131             uiAbsSum += abs(sQuantCoeff[iScanning]);
    3132           }
    3133         }
    3134 #endif
    3135         else
    3136         {
    3137           for (iScanning = noCoeff - 1; iScanning >= 0; iScanning--)
    3138           {
    3139 #if QC_MDCS
    3140             iPos = g_auiSigLastScan[uiScanIdx][uiLog2BlkSize-1][iScanning];
    3141 #else
    3142             iPos = pucScan[iScanning];
    3143 #endif //QC_MDCS
    3144             pDstCoeff[iPos] = sQuantCoeff[iScanning];
    3145             uiAbsSum += abs(sQuantCoeff[iScanning]);
    3146           }
    3147         }
    3148 }
    3149 #else
    3150 Void TComTrQuant::xRateDistOptQuant_LCEC             ( TComDataCU*                     pcCU,
    3151                                                       Long*                           plSrcCoeff,
    3152                                                       TCoeff*&                        piDstCoeff,
    3153                                                       UInt                            uiWidth,
    3154                                                       UInt                            uiHeight,
    3155                                                       UInt&                           uiAbsSum,
    3156                                                       TextType                        eTType,
    3157                                                       UInt                            uiAbsPartIdx )
    3158 {
    3159   Int iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,iSum_big_coef,iSign;
    3160   Int atable[5] = {4,6,14,28,0xfffffff};
    3161   Int switch_thr[8] = {49,49,0,49,49,0,49,49};
    3162  
    3163   const UInt* pucScan;
    3164   UInt* piQuantCoef = NULL;
    3165   UInt uiBlkPos,uiPosY,uiPosX,uiLog2BlkSize,uiConvBit,uiLevel,uiMaxLevel,uiMinLevel,uiAbsLevel,uiBestAbsLevel,uiBitShift;
    3166   Int iScanning,iQpRem,iBlockType,iRate;
    3167   Int  iQBits      = m_cQP.m_iBits;
    3168   Int64 lLevelDouble;
    3169   Double dErr,dTemp=0,dNormFactor,rd64UncodedCost,rd64CodedCost,dCurrCost;
    3170  
    3171   uiBitShift = 15;
    3172   iQpRem = m_cQP.m_iRem;
    3173  
    3174   Bool bExt8x8Flag = false;
    3175   uiLog2BlkSize = g_aucConvertToBit[ uiWidth ] + 2;
    3176   uiConvBit = g_aucConvertToBit[ uiWidth ];
    3177  
    3178 #if QC_MDCS
    3179   const UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
    3180 #endif //QC_MDCS
    3181  
    3182   if (uiWidth == 4)
    3183   {
    3184 #if QC_MOD_LCEC
    3185     if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V)
    3186       iBlockType = eTType-2;
    3187     else
    3188       iBlockType = 2 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() );
    3189 #else
    3190     iBlockType = 0 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() );
    3191 #endif
    3192     iQBits = m_cQP.m_iBits;                 
    3193     dNormFactor = pow(2., (2*DQ_BITS+19));
    3194     if ( g_uiBitIncrement ) dNormFactor *= 1<<(2*g_uiBitIncrement);
    3195     piQuantCoef = ( g_aiQuantCoef[m_cQP.rem()] );
    3196   }
    3197   else if (uiWidth == 8)
    3198   {
    3199     if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V)
    3200       iBlockType = eTType-2;
    3201     else
    3202       iBlockType = 2 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() );
    3203     iQBits = m_cQP.m_iBits + 1;                 
    3204     dNormFactor = pow(2., (2*Q_BITS_8+9));
    3205     if ( g_uiBitIncrement ) dNormFactor *= 1<<(2*g_uiBitIncrement);
    3206     piQuantCoef = ( g_aiQuantCoef64[m_cQP.rem()] );
    3207   }
    3208   else
    3209   {
    3210     if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V)
    3211       iBlockType = eTType-2;
    3212     else
    3213       iBlockType = 5 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() );
    3214    
    3215     if(!pcCU->isIntra(uiAbsPartIdx))
    3216     {
    3217       uiLog2BlkSize = g_aucConvertToBit[ 8 ] + 2;
    3218       uiConvBit = g_aucConvertToBit[ 8 ];
    3219     }
    3220     dNormFactor = pow(2., 21);
    3221     if ( g_uiBitIncrement ) dNormFactor *= 1<<(2*g_uiBitIncrement);
    3222    
    3223     bExt8x8Flag = true;
    3224    
    3225     if ( uiWidth == 16)
    3226     {
    3227       piQuantCoef = ( g_aiQuantCoef256[m_cQP.rem()] );
    3228       iQBits = ECore16Shift + m_cQP.per();     
    3229       dTemp = estErr16x16[iQpRem]/dNormFactor;
    3230     }
    3231     else if ( uiWidth == 32)
    3232     {
    3233       piQuantCoef = ( g_aiQuantCoef1024[m_cQP.rem()] );
    3234       iQBits = ECore32Shift + m_cQP.per();
    3235       dTemp = estErr32x32[iQpRem]/dNormFactor;
    3236     }
    3237     else
    3238     {
    3239       assert(0);
    3240     }
    3241     memset(&piDstCoeff[0],0,uiWidth*uiHeight*sizeof(TCoeff));
    3242   }
    3243  
    3244   pucScan = g_auiFrameScanXY [ uiConvBit + 1 ];
    3245  
    3246   iLpFlag = 1;  // shawn note: last position flag
    3247   iLevelMode = 0;
    3248   iRun = 0;
    3249   iVlc_adaptive = 0;
    3250   iMaxrun = 0;
    3251   iSum_big_coef = 0;
    3252 #if QC_MOD_LCEC
    3253   UInt uiTr1=0;
    3254 #endif
    3255  
    3256   for (iScanning=(uiWidth<8 ? 15 : 63); iScanning>=0; iScanning--)
    3257   {           
    3258 #if QC_MDCS
    3259     uiBlkPos = g_auiSigLastScan[uiScanIdx][uiLog2BlkSize-1][iScanning];
    3260 #else
    3261     uiBlkPos = pucScan[iScanning];
    3262 #endif //QC_MDCS
    3263     uiPosY   = uiBlkPos >> uiLog2BlkSize;
    3264     uiPosX   = uiBlkPos - ( uiPosY << uiLog2BlkSize );
    3265    
    3266     if (uiWidth==4)
    3267       dTemp = estErr4x4[ iQpRem ][ uiPosX ][ uiPosY ] / dNormFactor;
    3268     else if(uiWidth==8)
    3269       dTemp = estErr8x8[ iQpRem ][ uiPosX ][ uiPosY ] / dNormFactor;
    3270     else if(!pcCU->isIntra(uiAbsPartIdx))
    3271       uiBlkPos = uiWidth*uiPosY+uiPosX;
    3272    
    3273     lLevelDouble = abs(plSrcCoeff[uiBlkPos]);
    3274    
    3275     lLevelDouble = lLevelDouble * (Int64) ( uiWidth == 64? piQuantCoef[m_cQP.rem()]: piQuantCoef[uiBlkPos] );
    3276    
    3277     iSign = plSrcCoeff[uiBlkPos]<0 ? -1 : 1;
    3278    
    3279    
    3280     uiLevel = (UInt)(lLevelDouble  >> iQBits);     
    3281     uiMaxLevel = uiLevel + 1;
    3282     uiMinLevel = Max(1,(Int)uiLevel - 2);
    3283    
    3284     uiBestAbsLevel = 0;
    3285 #if QC_MOD_LCEC
    3286     if (uiWidth==4)
    3287       iRate = bitCount_LCEC(0,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,4,uiTr1)<<uiBitShift;
    3288     else
    3289       iRate = bitCount_LCEC(0,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,8,uiTr1)<<uiBitShift;
    3290 #else
    3291     if (uiWidth==4)
    3292       iRate = bitCount_LCEC(0,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,4)<<uiBitShift;
    3293     else
    3294       iRate = bitCount_LCEC(0,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,8)<<uiBitShift;
    3295 #endif
    3296    
    3297     dErr = Double( lLevelDouble );
    3298     rd64UncodedCost = dErr * dErr * dTemp;
    3299     rd64CodedCost   = rd64UncodedCost + xGetICost( iRate );
    3300     for(uiAbsLevel = uiMinLevel; uiAbsLevel <= uiMaxLevel ; uiAbsLevel++ )
    3301     {
    3302 #if QC_MOD_LCEC
    3303       if (uiWidth==4)
    3304         iRate = bitCount_LCEC(iSign*uiAbsLevel,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,4,uiTr1)<<uiBitShift;
    3305       else
    3306         iRate = bitCount_LCEC(iSign*uiAbsLevel,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,8,uiTr1)<<uiBitShift;
    3307 #else
    3308       if (uiWidth==4)
    3309         iRate = bitCount_LCEC(iSign*uiAbsLevel,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,4)<<uiBitShift;
    3310       else
    3311         iRate = bitCount_LCEC(iSign*uiAbsLevel,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,8)<<uiBitShift;
    3312 #endif
    3313       dErr = Double( lLevelDouble  - (((Int64)uiAbsLevel) << iQBits ) );
    3314       rd64UncodedCost = dErr * dErr * dTemp;
    3315       dCurrCost = rd64UncodedCost + xGetICost( iRate );
    3316       if( dCurrCost < rd64CodedCost )
    3317       {         
    3318         uiBestAbsLevel  = uiAbsLevel;
    3319         rd64CodedCost   = dCurrCost;
    3320       }
    3321     }
    3322    
    3323    
    3324     if (uiBestAbsLevel)
    3325     {                 
    3326       if (uiWidth>4)
    3327       {
    3328         if (!iLpFlag && uiBestAbsLevel > 1)
    3329         {
    3330           iSum_big_coef += uiBestAbsLevel;
    3331           if ((63-iScanning) > switch_thr[iBlockType] || iSum_big_coef > 2)
    3332             iLevelMode = 1;
    3333         }
    3334       }
    3335       else
    3336       {
    3337         if (uiBestAbsLevel>1)
    3338           iLevelMode = 1;
    3339       }
    3340 #if QC_MOD_LCEC
    3341       if (iLpFlag==1){
    3342         if (uiBestAbsLevel>1){
    3343           uiTr1=0;
    3344         }
    3345         else{
    3346           uiTr1=1;
    3347         }
    3348       }
    3349       else{
    3350         if (uiTr1>0 && uiBestAbsLevel<2){
    3351           uiTr1++;
    3352           uiTr1=Min(MAX_TR1,uiTr1);
    3353         }
    3354         else{
    3355           uiTr1=0;
    3356         }
    3357       }
    3358 #endif
    3359       iMaxrun = iScanning-1;
    3360       iLpFlag = 0;
    3361       iRun = 0;
    3362       if (iLevelMode && (uiBestAbsLevel > atable[iVlc_adaptive]))
    3363         iVlc_adaptive++;                   
    3364     }
    3365     else
    3366     {
    3367       iRun += 1;         
    3368     }
    3369    
    3370     uiAbsSum += uiBestAbsLevel;
    3371     piDstCoeff[uiBlkPos] = iSign*uiBestAbsLevel;
    3372   } // for uiScanning
    3373 }
    3374 #endif
    3375 
    3376 Void TComTrQuant::xQuantLTR  (TComDataCU* pcCU, Long* pSrc, TCoeff*& pDes, Int iWidth, Int iHeight, UInt& uiAcSum, TextType eTType, UInt uiAbsPartIdx )
    3377 {
    3378   Long*   piCoef    = pSrc;
    3379   TCoeff* piQCoef   = pDes;
    3380   Int   iAdd = 0;
    3381  
    3382 #if E243_CORE_TRANSFORMS
    3383   if ( m_bUseRDOQ && (eTType == TEXT_LUMA || RDOQ_CHROMA) )
    3384   {
    3385     if ( m_iSymbolMode == 0)
    3386       xRateDistOptQuant_LCEC(pcCU, piCoef, pDes, iWidth, iHeight, uiAcSum, eTType, uiAbsPartIdx );
    3387     else
    3388       xRateDistOptQuant( pcCU, piCoef, pDes, iWidth, iHeight, uiAcSum, eTType, uiAbsPartIdx );
    3389   }
    3390   else
    3391   {
    3392     const UInt*  pucScan;
    3393     UInt uiConvBit = g_aucConvertToBit[ iWidth ];
    3394     pucScan        = g_auiFrameScanXY [ uiConvBit + 1 ];
    3395 
    3396     UInt uiLog2TrSize = g_aucConvertToBit[ iWidth ] + 2;
    3397     UInt uiQ = g_auiQ[m_cQP.rem()];
    3398 
    3399 #if FULL_NBIT
    3400     UInt uiBitDepth = g_uiBitDepth;
    3401 #else
    3402     UInt uiBitDepth = g_uiBitDepth + g_uiBitIncrement;
    3403 #endif
    3404     UInt iTransformShift = MAX_TR_DYNAMIC_RANGE - uiBitDepth - uiLog2TrSize;  // Represents scaling through forward transform
    3405     Int iQBits = QUANT_SHIFT + m_cQP.m_iPer + iTransformShift;                // Right shift of non-RDOQ quantizer;  level = (coeff*uiQ + offset)>>q_bits
    3406 
    3407     iAdd = (pcCU->getSlice()->getSliceType()==I_SLICE ? 171 : 85) << (iQBits-9);
    3408 
    3409     for( Int n = 0; n < iWidth*iHeight; n++ )
    3410     {
    3411       Long iLevel;
    3412       Int  iSign;
    3413       UInt uiBlockPos = pucScan[n];
    3414       iLevel  = (Long) piCoef[uiBlockPos];
    3415       iSign   = (iLevel < 0 ? -1: 1);     
    3416 
    3417       iLevel = (abs(iLevel) * uiQ + iAdd ) >> iQBits;
    3418 #if CAVLC_COEF_LRG_BLK
    3419       if (m_iSymbolMode == 0 && n>=64 && eTType != TEXT_LUMA)
    3420       {
    3421         iLevel = 0;
    3422       }
    3423 #else
    3424       if (m_iSymbolMode == 0 && iWidth>8)
    3425       {
    3426         /* Two methods of limiting number of encoded coefficients to 8x8 for intra and inter respectively */
    3427         if (pcCU->isIntra( uiAbsPartIdx ))
    3428         {
    3429           if(n>=64) iLevel = 0;
    3430         }
    3431         else
    3432         {
    3433           if ((uiBlockPos%iWidth)>=8 || (uiBlockPos/iWidth)>=8) iLevel = 0;
    3434         }
    3435       }
    3436 #endif
    3437       uiAcSum += iLevel;
    3438       iLevel *= iSign;       
    3439       piQCoef[uiBlockPos] = iLevel;
    3440     } // for n
    3441   } //if RDOQ
    3442   //return;
    3443 
    3444 #else //E243_CORE_TRANSFORMS
    3445 
    3446   UInt* piQuantCoef = NULL;
    3447   Int   iNewBits    = 0;
    3448   switch(iWidth)
    3449   {
    3450     case 2:
    3451     {
    3452       m_puiQuantMtx = &g_aiQuantCoef4[m_cQP.m_iRem];
    3453       xQuant2x2(piCoef, piQCoef, uiAcSum );
    3454       return;
    3455     }
    3456     case 4:
    3457     {
    3458       m_puiQuantMtx = &g_aiQuantCoef[m_cQP.m_iRem][0];
    3459       xQuant4x4(pcCU, piCoef, piQCoef, uiAcSum, eTType, uiAbsPartIdx );
    3460       return;
    3461     }
    3462     case 8:
    3463     {
    3464       m_puiQuantMtx = &g_aiQuantCoef64[m_cQP.m_iRem][0];
    3465       xQuant8x8(pcCU, piCoef, piQCoef, uiAcSum, eTType, uiAbsPartIdx );
    3466       return;
    3467     }
    3468     case 16:
    3469     {
    3470       piQuantCoef = ( g_aiQuantCoef256[m_cQP.rem()] );
    3471       iNewBits = ECore16Shift + m_cQP.per();
    3472       iAdd = m_cQP.m_iAdd16x16;
    3473       break;
    3474     }
    3475     case 32:
    3476     {
    3477       piQuantCoef = ( g_aiQuantCoef1024[m_cQP.rem()] );
    3478       iNewBits = ECore32Shift + m_cQP.per();
    3479       iAdd = m_cQP.m_iAdd32x32;
    3480       break;
    3481     }
    3482     default:
    3483       assert(0);
    3484       break;
    3485   }
    3486  
    3487   if ( m_bUseRDOQ && (eTType == TEXT_LUMA || RDOQ_CHROMA) )
    3488   {
    3489     if ( m_iSymbolMode == 0)
    3490       xRateDistOptQuant_LCEC(pcCU, piCoef, pDes, iWidth, iHeight, uiAcSum, eTType, uiAbsPartIdx );
    3491     else
    3492       xRateDistOptQuant( pcCU, piCoef, pDes, iWidth, iHeight, uiAcSum, eTType, uiAbsPartIdx );
    3493   }
    3494   else
    3495   {
    3496     UInt uiAcSum_init = uiAcSum;
    3497     for( Int n = 0; n < iWidth*iHeight; n++ )
    3498     {
    3499       Long iLevel;
    3500       Int  iSign;
    3501       iLevel  = (Long) piCoef[n];
    3502       iSign   = (iLevel < 0 ? -1: 1);
    3503       if ( iWidth == 64 ) iLevel = abs( iLevel ) * piQuantCoef[m_cQP.rem()];
    3504       else                iLevel = abs( iLevel ) * piQuantCoef[n];
    3505      
    3506       if (!pcCU->isIntra( uiAbsPartIdx ) && (m_iSymbolMode == 0) && ((n%iWidth)>=8 || (n/iWidth)>=8))
    3507         iLevel = 0;
    3508       else
    3509         iLevel = ( iLevel + iAdd ) >> iNewBits;
    3510      
    3511       if( 0 != iLevel )
    3512       {
    3513         uiAcSum += iLevel;
    3514         iLevel    *= iSign;
    3515         piQCoef[n] = iLevel;
    3516       }
    3517       else
    3518       {
    3519         piQCoef[n] = 0;
    3520       }
    3521     }
    3522    
    3523     const UInt*  pucScan;
    3524     if(pcCU->isIntra( uiAbsPartIdx ) && m_iSymbolMode == 0 && iWidth >= 16)
    3525     {
    3526       UInt uiConvBit = g_aucConvertToBit[ iWidth ];
    3527       pucScan        = g_auiFrameScanXY [ uiConvBit + 1 ];
    3528 #if CAVLC_COEF_LRG_BLK
    3529       UInt noCoeff = (eTType == TEXT_LUMA)? (iWidth*iHeight):64;
    3530 
    3531       for( Int n = noCoeff; n < iWidth*iHeight; n++ )
    3532       {
    3533         piQCoef[ pucScan[ n ] ] = 0;
    3534       }
    3535       uiAcSum = uiAcSum_init;
    3536       for( Int n = 0; n < noCoeff; n++ )
    3537       {
    3538         uiAcSum += abs(piQCoef[ pucScan[ n ] ]);
    3539       }
    3540 #else
    3541       for( Int n = 64; n < iWidth*iHeight; n++ )
    3542       {
    3543         piQCoef[ pucScan[ n ] ] = 0;
    3544       }
    3545      
    3546       uiAcSum = uiAcSum_init;
    3547      
    3548       for( Int n = 0; n < 64; n++ )
    3549       {
    3550         uiAcSum += abs(piQCoef[ pucScan[ n ] ]);
    3551       }
    3552 #endif
    3553     }
    3554   }
    3555 #endif
    3556 }
    3557 
    3558 Void TComTrQuant::xDeQuantLTR( TCoeff* pSrc, Long*& pDes, Int iWidth, Int iHeight )
    3559 {
    3560  
    3561   TCoeff* piQCoef   = pSrc;
    3562   Long*   piCoef    = pDes;
    3563  
    3564   if ( iWidth > (Int)m_uiMaxTrSize )
    3565   {
    3566     iWidth  = m_uiMaxTrSize;
    3567     iHeight = m_uiMaxTrSize;
    3568   }
    3569  
    3570 #if E243_CORE_TRANSFORMS
    3571   Int iShift,iAdd,iCoeffQ;
    3572   UInt uiQ;
    3573   UInt uiLog2TrSize = g_aucConvertToBit[ iWidth ] + 2;
    3574 
    3575 #if FULL_NBIT
    3576   UInt uiBitDepth = g_uiBitDepth;
    3577 #else
    3578   UInt uiBitDepth = g_uiBitDepth + g_uiBitIncrement;
    3579 #endif
    35801887  UInt iTransformShift = MAX_TR_DYNAMIC_RANGE - uiBitDepth - uiLog2TrSize;
    35811888  iShift = QUANT_IQUANT_SHIFT - QUANT_SHIFT - iTransformShift;
    3582   iAdd = 1 << (iShift-1);
    3583   uiQ = g_auiIQ[m_cQP.m_iRem];
    3584 
    3585   for( Int n = 0; n < iWidth*iHeight; n++ )
    3586   {
    3587     iCoeffQ = ((piQCoef[n]*(Int)uiQ << m_cQP.m_iPer)+iAdd)>>iShift;
    3588     piCoef[n] = Clip3(-32768,32767,iCoeffQ);
    3589   }
    3590 #else
    3591   UInt* piDeQuantCoef = NULL;
    3592   switch(iWidth)
    3593   {
    3594     case 2:
    3595     {
    3596       xDeQuant2x2( piQCoef, piCoef );
    3597       return;
    3598     }
    3599     case 4:
    3600     {
    3601       xDeQuant4x4( piQCoef, piCoef );
    3602       return;
    3603     }
    3604     case 8:
    3605     {
    3606       xDeQuant8x8( piQCoef, piCoef );
    3607       return;
    3608     }
    3609     case 16:
    3610     {
    3611       piDeQuantCoef = ( g_aiDeQuantCoef256[m_cQP.rem()] );
    3612       break;
    3613     }
    3614     case 32:
    3615     {
    3616       piDeQuantCoef = ( g_aiDeQuantCoef1024[m_cQP.rem()] );
    3617       break;
    3618     }
    3619     case 64:
    3620     {
    3621       piDeQuantCoef = ( g_aiDeQuantCoef4096 ); // To save the memory for g_aiDeQuantCoef4096
    3622       break;
    3623     }
    3624   }
    3625  
    3626   Int iLevel;
    3627   Int iDeScale;
    3628  
    3629   for( Int n = 0; n < iWidth*iHeight; n++ )
    3630   {
    3631     iLevel  = piQCoef[n];
    3632    
    3633     if( 0 != iLevel )
    3634     {
    3635       if ( iWidth == 64 ) iDeScale = piDeQuantCoef[m_cQP.rem()];
    3636       else                iDeScale = piDeQuantCoef[n];
    3637       piCoef[n] = (Long) (iLevel*iDeScale) << m_cQP.per();
     1889
     1890#if DEQUANT_CLIPPING
     1891  TCoeff clipQCoef;
     1892  const Int bitRange = min( 15, ( Int )( 12 + uiLog2TrSize + uiBitDepth - m_cQP.m_iPer) );
     1893  const Int levelLimit = 1 << bitRange;
     1894#endif
     1895
     1896  if(getUseScalingList())
     1897  {
     1898    iShift += 4;
     1899    if(iShift > m_cQP.m_iPer)
     1900    {
     1901      iAdd = 1 << (iShift - m_cQP.m_iPer - 1);
    36381902    }
    36391903    else
    36401904    {
    3641       piCoef [n] = 0;
    3642     }
    3643   }
    3644 #endif
    3645 }
    3646 #if !E243_CORE_TRANSFORMS
    3647 Void TComTrQuant::xIT16( Long* pSrc, Pel* pDes, UInt uiStride )
    3648 {
    3649   Int x, y;
    3650   Long aaiTemp[16][16];
    3651  
    3652   Long B0, B1, B2, B3, B4, B5, B6, B7, B10, B11, B12, B13;
    3653   Long C0, C1, C2, C3, C5, C6, C8, C9, C10, C11, C12, C13, C14, C15;
    3654   Long D0, D1, D2, D3, D4, D5, D6, D7, D9, D10, D13, D14;
    3655   Long E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15;
    3656   Long F8, F9, F10, F11, F12, F13, F14, F15;
    3657  
    3658   UInt uiStride2  = uiStride<<1;
    3659   UInt uiStride3  = uiStride2  + uiStride;
    3660   UInt uiStride4  = uiStride3  + uiStride;
    3661   UInt uiStride5  = uiStride4  + uiStride;
    3662   UInt uiStride6  = uiStride5  + uiStride;
    3663   UInt uiStride7  = uiStride6  + uiStride;
    3664   UInt uiStride8  = uiStride7  + uiStride;
    3665   UInt uiStride9  = uiStride8  + uiStride;
    3666   UInt uiStride10 = uiStride9  + uiStride;
    3667   UInt uiStride11 = uiStride10 + uiStride;
    3668   UInt uiStride12 = uiStride11 + uiStride;
    3669   UInt uiStride13 = uiStride12 + uiStride;
    3670   UInt uiStride14 = uiStride13 + uiStride;
    3671   UInt uiStride15 = uiStride14 + uiStride;
    3672 #ifdef TRANS_PRECISION_EXT
    3673 #if FULL_NBIT
    3674   Int uiBitDepthIncrease=g_iShift16x16-g_uiBitIncrement-g_uiBitDepth+8;
    3675 #else
    3676   Int uiBitDepthIncrease=g_iShift16x16-g_uiBitIncrement;
    3677 #endif
    3678   Int offset = (uiBitDepthIncrease==0)? 0:(1<<(uiBitDepthIncrease-1));
    3679 #endif
    3680   //--Butterfly
    3681   for( y=0 ; y<16 ; y++ )
    3682   {
    3683 #ifdef TRANS_PRECISION_EXT
    3684     Long     ai0[16];
    3685     ai0[0] =  pSrc[0]<<uiBitDepthIncrease;
    3686     ai0[1] =  pSrc[1]<<uiBitDepthIncrease;
    3687     ai0[2] =  pSrc[2]<<uiBitDepthIncrease;
    3688     ai0[3] =  pSrc[3]<<uiBitDepthIncrease;
    3689     ai0[4] =  pSrc[4]<<uiBitDepthIncrease;
    3690     ai0[5] =  pSrc[5]<<uiBitDepthIncrease;
    3691     ai0[6] =  pSrc[6]<<uiBitDepthIncrease;
    3692     ai0[7] =  pSrc[7]<<uiBitDepthIncrease;
    3693     ai0[8 ] =  pSrc[8 ]<<uiBitDepthIncrease;
    3694     ai0[9 ] =  pSrc[9 ]<<uiBitDepthIncrease;
    3695     ai0[10] =  pSrc[10]<<uiBitDepthIncrease;
    3696     ai0[11] =  pSrc[11]<<uiBitDepthIncrease;
    3697     ai0[12] =  pSrc[12]<<uiBitDepthIncrease;
    3698     ai0[13] =  pSrc[13]<<uiBitDepthIncrease;
    3699     ai0[14] =  pSrc[14]<<uiBitDepthIncrease;
    3700     ai0[15] =  pSrc[15]<<uiBitDepthIncrease;
    3701     F8 = xTrRound( 6 * ai0[1] - 63 * ai0[15] , DenShift16);
    3702     F9 = xTrRound( 49 * ai0[9] - 40 * ai0[7] , DenShift16);
    3703     F10 = xTrRound( 30 * ai0[5] - 56 * ai0[11] , DenShift16);
    3704     F11 = xTrRound( 61 * ai0[13] - 18 * ai0[3] , DenShift16);
    3705     F12 = xTrRound( 61 * ai0[3] + 18 * ai0[13] , DenShift16);
    3706     F13 = xTrRound( 30 * ai0[11] + 56 * ai0[5] , DenShift16);
    3707     F14 = xTrRound( 49 * ai0[7] + 40 * ai0[9] , DenShift16);
    3708     F15 = xTrRound( 6 * ai0[15] + 63 * ai0[1] , DenShift16);
    3709    
    3710     E4 = xTrRound( 12 * ai0[2] - 62 * ai0[14] , DenShift16);
    3711     E5 = xTrRound( 53 * ai0[10] - 35 * ai0[6] , DenShift16);
    3712     E6 = xTrRound( 53 * ai0[6] + 35 * ai0[10] , DenShift16);
    3713     E7 = xTrRound( 12 * ai0[14] + 62 * ai0[2] , DenShift16);
    3714 #else
    3715     F8 = xTrRound( 6 * pSrc[1] - 63 * pSrc[15] , DenShift16);
    3716     F9 = xTrRound( 49 * pSrc[9] - 40 * pSrc[7] , DenShift16);
    3717     F10 = xTrRound( 30 * pSrc[5] - 56 * pSrc[11] , DenShift16);
    3718     F11 = xTrRound( 61 * pSrc[13] - 18 * pSrc[3] , DenShift16);
    3719     F12 = xTrRound( 61 * pSrc[3] + 18 * pSrc[13] , DenShift16);
    3720     F13 = xTrRound( 30 * pSrc[11] + 56 * pSrc[5] , DenShift16);
    3721     F14 = xTrRound( 49 * pSrc[7] + 40 * pSrc[9] , DenShift16);
    3722     F15 = xTrRound( 6 * pSrc[15] + 63 * pSrc[1] , DenShift16);
    3723    
    3724     E4 = xTrRound( 12 * pSrc[2] - 62 * pSrc[14] , DenShift16);
    3725     E5 = xTrRound( 53 * pSrc[10] - 35 * pSrc[6] , DenShift16);
    3726     E6 = xTrRound( 53 * pSrc[6] + 35 * pSrc[10] , DenShift16);
    3727     E7 = xTrRound( 12 * pSrc[14] + 62 * pSrc[2] , DenShift16);
    3728 #endif
    3729     E8 = F8 + F9;
    3730     E9 = F8 - F9;
    3731     E10 = F11 - F10;
    3732     E11 = F11 + F10;
    3733     E12 = F12 + F13;
    3734     E13 = F12 - F13;
    3735     E14 = F15 - F14;
    3736     E15 = F15 + F14;
    3737 #ifdef TRANS_PRECISION_EXT
    3738     D0 = xTrRound( 45 * ( ai0[0] + ai0[8] ) , DenShift16);
    3739     D1 = xTrRound( 45 * ( ai0[0] - ai0[8] ) , DenShift16);
    3740     D2 = xTrRound( 24 * ai0[4] - 59 * ai0[12] , DenShift16);
    3741     D3 = xTrRound( 59 * ai0[4] + 24 * ai0[12] , DenShift16);
    3742 #else
    3743     D0 = xTrRound( 45 * ( pSrc[0] + pSrc[8] ) , DenShift16);
    3744     D1 = xTrRound( 45 * ( pSrc[0] - pSrc[8] ) , DenShift16);
    3745     D2 = xTrRound( 24 * pSrc[4] - 59 * pSrc[12] , DenShift16);
    3746     D3 = xTrRound( 59 * pSrc[4] + 24 * pSrc[12] , DenShift16);
    3747 #endif
    3748     D4 = E4 + E5;
    3749     D5 = E4 - E5;
    3750     D6 = E7 - E6;
    3751     D7 = E7 + E6;
    3752     D9 = xTrRound( 24 * E14 - 59 * E9 , DenShift16);
    3753     D10 = xTrRound(  - 59 * E13 - 24 * E10 , DenShift16);
    3754     D13 = xTrRound( 24 * E13 - 59 * E10 , DenShift16);
    3755     D14 = xTrRound( 59 * E14 + 24 * E9 , DenShift16);
    3756    
    3757     C0 = D0 + D3;
    3758     C3 = D0 - D3;
    3759     C8 = E8 + E11;
    3760     C11 = E8 - E11;
    3761     C12 = E15 - E12;
    3762     C15 = E15 + E12;
    3763     C1 = D1 + D2;
    3764     C2 = D1 - D2;
    3765     C9 = D9 + D10;
    3766     C10 = D9 - D10;
    3767     C13 = D14 - D13;
    3768     C14 = D14 + D13;
    3769     C5 = xTrRound( 45 * ( D6 - D5 ) , DenShift16);
    3770     C6 = xTrRound( 45 * ( D6 + D5 ) , DenShift16);
    3771    
    3772     B0 = C0 + D7;
    3773     B7 = C0 - D7;
    3774     B1 = C1 + C6;
    3775     B6 = C1 - C6;
    3776     B2 = C2 + C5;
    3777     B5 = C2 - C5;
    3778     B3 = C3 + D4;
    3779     B4 = C3 - D4;
    3780     B10 = xTrRound( 45 * ( C13 - C10 ) , DenShift16);
    3781     B13 = xTrRound( 45 * ( C13 + C10 ) , DenShift16);
    3782     B11 = xTrRound( 45 * ( C12 - C11 ) , DenShift16);
    3783     B12 = xTrRound( 45 * ( C12 + C11 ) , DenShift16);
    3784    
    3785     aaiTemp[0][y] = B0 + C15;
    3786     aaiTemp[15][y] = B0 - C15;
    3787     aaiTemp[1][y] = B1 + C14;
    3788     aaiTemp[14][y] = B1 - C14;
    3789     aaiTemp[2][y] = B2 + B13;
    3790     aaiTemp[13][y] = B2 - B13;
    3791     aaiTemp[3][y] = B3 + B12;
    3792     aaiTemp[12][y] = B3 - B12;
    3793     aaiTemp[4][y] = B4 + B11;
    3794     aaiTemp[11][y] = B4 - B11;
    3795     aaiTemp[5][y] = B5 + B10;
    3796     aaiTemp[10][y] = B5 - B10;
    3797     aaiTemp[6][y] = B6 + C9;
    3798     aaiTemp[9][y] = B6 - C9;
    3799     aaiTemp[7][y] = B7 + C8;
    3800     aaiTemp[8][y] = B7 - C8;
    3801    
    3802     pSrc += 16;
    3803   }
    3804  
    3805   for( x=0 ; x<16 ; x++, pDes++ )
    3806   {
    3807     F8 = xTrRound( 6 * aaiTemp[x][1] - 63 * aaiTemp[x][15] , DenShift16);
    3808     F9 = xTrRound( 49 * aaiTemp[x][9] - 40 * aaiTemp[x][7] , DenShift16);
    3809     F10 = xTrRound( 30 * aaiTemp[x][5] - 56 * aaiTemp[x][11] , DenShift16);
    3810     F11 = xTrRound( 61 * aaiTemp[x][13] - 18 * aaiTemp[x][3] , DenShift16);
    3811     F12 = xTrRound( 61 * aaiTemp[x][3] + 18 * aaiTemp[x][13] , DenShift16);
    3812     F13 = xTrRound( 30 * aaiTemp[x][11] + 56 * aaiTemp[x][5] , DenShift16);
    3813     F14 = xTrRound( 49 * aaiTemp[x][7] + 40 * aaiTemp[x][9] , DenShift16);
    3814     F15 = xTrRound( 6 * aaiTemp[x][15] + 63 * aaiTemp[x][1] , DenShift16);
    3815    
    3816     E4 = xTrRound( 12 * aaiTemp[x][2] - 62 * aaiTemp[x][14] , DenShift16);
    3817     E5 = xTrRound( 53 * aaiTemp[x][10] - 35 * aaiTemp[x][6] , DenShift16);
    3818     E6 = xTrRound( 53 * aaiTemp[x][6] + 35 * aaiTemp[x][10] , DenShift16);
    3819     E7 = xTrRound( 12 * aaiTemp[x][14] + 62 * aaiTemp[x][2] , DenShift16);
    3820     E8 = F8 + F9;
    3821     E9 = F8 - F9;
    3822     E10 = F11 - F10;
    3823     E11 = F11 + F10;
    3824     E12 = F12 + F13;
    3825     E13 = F12 - F13;
    3826     E14 = F15 - F14;
    3827     E15 = F15 + F14;
    3828    
    3829     D0 = xTrRound( 45 * ( aaiTemp[x][0] + aaiTemp[x][8] ) , DenShift16);
    3830     D1 = xTrRound( 45 * ( aaiTemp[x][0] - aaiTemp[x][8] ) , DenShift16);
    3831     D2 = xTrRound( 24 * aaiTemp[x][4] - 59 * aaiTemp[x][12] , DenShift16);
    3832     D3 = xTrRound( 59 * aaiTemp[x][4] + 24 * aaiTemp[x][12] , DenShift16);
    3833     D4 = E4 + E5;
    3834     D5 = E4 - E5;
    3835     D6 = E7 - E6;
    3836     D7 = E7 + E6;
    3837     D9 = xTrRound( 24 * E14 - 59 * E9 , DenShift16);
    3838     D10 = xTrRound(  - 59 * E13 - 24 * E10 , DenShift16);
    3839     D13 = xTrRound( 24 * E13 - 59 * E10 , DenShift16);
    3840     D14 = xTrRound( 59 * E14 + 24 * E9 , DenShift16);
    3841    
    3842     C0 = D0 + D3;
    3843     C3 = D0 - D3;
    3844     C8 = E8 + E11;
    3845     C11 = E8 - E11;
    3846     C12 = E15 - E12;
    3847     C15 = E15 + E12;
    3848     C1 = D1 + D2;
    3849     C2 = D1 - D2;
    3850     C9 = D9 + D10;
    3851     C10 = D9 - D10;
    3852     C13 = D14 - D13;
    3853     C14 = D14 + D13;
    3854     C5 = xTrRound( 45 * ( D6 - D5 ) , DenShift16);
    3855     C6 = xTrRound( 45 * ( D6 + D5 ) , DenShift16);
    3856    
    3857     B0 = C0 + D7;
    3858     B7 = C0 - D7;
    3859     B1 = C1 + C6;
    3860     B6 = C1 - C6;
    3861     B2 = C2 + C5;
    3862     B5 = C2 - C5;
    3863     B3 = C3 + D4;
    3864     B4 = C3 - D4;
    3865     B10 = xTrRound( 45 * ( C13 - C10 ) , DenShift16);
    3866     B13 = xTrRound( 45 * ( C13 + C10 ) , DenShift16);
    3867     B11 = xTrRound( 45 * ( C12 - C11 ) , DenShift16);
    3868     B12 = xTrRound( 45 * ( C12 + C11 ) , DenShift16);
    3869    
    3870     pDes[          0] = (Pel)xTrRound(B0 + C15, DCore16Shift);
    3871     pDes[uiStride15] = (Pel)xTrRound(B0 - C15, DCore16Shift);
    3872     pDes[uiStride  ] = (Pel)xTrRound(B1 + C14, DCore16Shift);
    3873     pDes[uiStride14] = (Pel)xTrRound(B1 - C14, DCore16Shift);
    3874     pDes[uiStride2 ] = (Pel)xTrRound(B2 + B13, DCore16Shift);
    3875     pDes[uiStride13] = (Pel)xTrRound(B2 - B13, DCore16Shift);
    3876     pDes[uiStride3 ] = (Pel)xTrRound(B3 + B12, DCore16Shift);
    3877     pDes[uiStride12] = (Pel)xTrRound(B3 - B12, DCore16Shift);
    3878     pDes[uiStride4 ] = (Pel)xTrRound(B4 + B11, DCore16Shift);
    3879     pDes[uiStride11] = (Pel)xTrRound(B4 - B11, DCore16Shift);
    3880     pDes[uiStride5 ] = (Pel)xTrRound(B5 + B10, DCore16Shift);
    3881     pDes[uiStride10] = (Pel)xTrRound(B5 - B10, DCore16Shift);
    3882     pDes[uiStride6 ] = (Pel)xTrRound(B6 + C9, DCore16Shift);
    3883     pDes[uiStride9 ] = (Pel)xTrRound(B6 - C9, DCore16Shift);
    3884     pDes[uiStride7 ] = (Pel)xTrRound(B7 + C8, DCore16Shift);
    3885     pDes[uiStride8 ] = (Pel)xTrRound(B7 - C8, DCore16Shift);
    3886 #ifdef TRANS_PRECISION_EXT
    3887     pDes[        0 ] =  (pDes[        0 ]+offset)>>uiBitDepthIncrease;
    3888     pDes[uiStride  ] =  (pDes[uiStride  ]+offset)>>uiBitDepthIncrease;
    3889     pDes[uiStride2 ] =  (pDes[uiStride2 ]+offset)>>uiBitDepthIncrease;
    3890     pDes[uiStride3 ] =  (pDes[uiStride3 ]+offset)>>uiBitDepthIncrease;
    3891     pDes[uiStride4 ] =  (pDes[uiStride4 ]+offset)>>uiBitDepthIncrease;
    3892     pDes[uiStride5 ] =  (pDes[uiStride5 ]+offset)>>uiBitDepthIncrease;
    3893     pDes[uiStride6 ] =  (pDes[uiStride6 ]+offset)>>uiBitDepthIncrease;
    3894     pDes[uiStride7 ] =  (pDes[uiStride7 ]+offset)>>uiBitDepthIncrease;
    3895     pDes[uiStride8 ] =  (pDes[uiStride8 ]+offset)>>uiBitDepthIncrease;
    3896     pDes[uiStride9 ] =  (pDes[uiStride9 ]+offset)>>uiBitDepthIncrease;
    3897     pDes[uiStride10] =  (pDes[uiStride10]+offset)>>uiBitDepthIncrease;
    3898     pDes[uiStride11] =  (pDes[uiStride11]+offset)>>uiBitDepthIncrease;
    3899     pDes[uiStride12] =  (pDes[uiStride12]+offset)>>uiBitDepthIncrease;
    3900     pDes[uiStride13] =  (pDes[uiStride13]+offset)>>uiBitDepthIncrease;
    3901     pDes[uiStride14] =  (pDes[uiStride14]+offset)>>uiBitDepthIncrease;
    3902     pDes[uiStride15] =  (pDes[uiStride15]+offset)>>uiBitDepthIncrease;
    3903 #endif
    3904    
    3905   }
    3906 }
    3907 
    3908 Void TComTrQuant::xIT32( Long* pSrc, Pel* pDes, UInt uiStride )
    3909 {
    3910   Int x, y;
    3911   Long aaiTemp[32][32];
    3912  
    3913   Long A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A20, A21, A22, A23, A24, A25, A26, A27;
    3914   Long B0, B1, B2, B3, B4, B5, B6, B7, B10, B11, B12, B13, B16, B17, B18, B19, B20, B21, B22, B23, B24, B25, B26, B27, B28, B29, B30, B31;
    3915   Long C0, C1, C2, C3, C5, C6, C8, C9, C10, C11, C12, C13, C14, C15, C18, C19, C20, C21, C26, C27, C28, C29;
    3916   Long D0, D1, D2, D3, D4, D5, D6, D7, D9, D10, D13, D14, D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30, D31;
    3917   Long E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E17, E18, E21, E22, E25, E26, E29, E30;
    3918   Long F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30, F31;
    3919   Long G16, G17, G18, G19, G20, G21, G22, G23, G24, G25, G26, G27, G28, G29, G30, G31;
    3920  
    3921   UInt uiStride2  = uiStride<<1;
    3922   UInt uiStride3  = uiStride2  + uiStride;
    3923   UInt uiStride4  = uiStride3  + uiStride;
    3924   UInt uiStride5  = uiStride4  + uiStride;
    3925   UInt uiStride6  = uiStride5  + uiStride;
    3926   UInt uiStride7  = uiStride6  + uiStride;
    3927   UInt uiStride8  = uiStride7  + uiStride;
    3928   UInt uiStride9  = uiStride8  + uiStride;
    3929   UInt uiStride10 = uiStride9  + uiStride;
    3930   UInt uiStride11 = uiStride10 + uiStride;
    3931   UInt uiStride12 = uiStride11 + uiStride;
    3932   UInt uiStride13 = uiStride12 + uiStride;
    3933   UInt uiStride14 = uiStride13 + uiStride;
    3934   UInt uiStride15 = uiStride14 + uiStride;
    3935   UInt uiStride16 = uiStride15 + uiStride;
    3936   UInt uiStride17 = uiStride16 + uiStride;
    3937   UInt uiStride18 = uiStride17 + uiStride;
    3938   UInt uiStride19 = uiStride18 + uiStride;
    3939   UInt uiStride20 = uiStride19 + uiStride;
    3940   UInt uiStride21 = uiStride20 + uiStride;
    3941   UInt uiStride22 = uiStride21 + uiStride;
    3942   UInt uiStride23 = uiStride22 + uiStride;
    3943   UInt uiStride24 = uiStride23 + uiStride;
    3944   UInt uiStride25 = uiStride24 + uiStride;
    3945   UInt uiStride26 = uiStride25 + uiStride;
    3946   UInt uiStride27 = uiStride26 + uiStride;
    3947   UInt uiStride28 = uiStride27 + uiStride;
    3948   UInt uiStride29 = uiStride28 + uiStride;
    3949   UInt uiStride30 = uiStride29 + uiStride;
    3950   UInt uiStride31 = uiStride30 + uiStride;
    3951 #ifdef TRANS_PRECISION_EXT
    3952 #if FULL_NBIT
    3953   Int uiBitDepthIncrease=g_iShift32x32-g_uiBitIncrement-g_uiBitDepth+8;
    3954 #else
    3955   Int uiBitDepthIncrease=g_iShift32x32-g_uiBitIncrement;
    3956 #endif
    3957   Int offset = (uiBitDepthIncrease==0)? 0:(1<<(uiBitDepthIncrease-1));
    3958 #endif
    3959   //--Butterfly
    3960   for( y=0 ; y<32 ; y++ )
    3961   {
    3962 #ifdef TRANS_PRECISION_EXT
    3963     Long     ai0[32];
    3964     ai0[0] =  pSrc[0]<<uiBitDepthIncrease;
    3965     ai0[1] =  pSrc[1]<<uiBitDepthIncrease;
    3966     ai0[2] =  pSrc[2]<<uiBitDepthIncrease;
    3967     ai0[3] =  pSrc[3]<<uiBitDepthIncrease;
    3968     ai0[4] =  pSrc[4]<<uiBitDepthIncrease;
    3969     ai0[5] =  pSrc[5]<<uiBitDepthIncrease;
    3970     ai0[6] =  pSrc[6]<<uiBitDepthIncrease;
    3971     ai0[7] =  pSrc[7]<<uiBitDepthIncrease;
    3972     ai0[8 ] =  pSrc[8 ]<<uiBitDepthIncrease;
    3973     ai0[9 ] =  pSrc[9 ]<<uiBitDepthIncrease;
    3974     ai0[10] =  pSrc[10]<<uiBitDepthIncrease;
    3975     ai0[11] =  pSrc[11]<<uiBitDepthIncrease;
    3976     ai0[12] =  pSrc[12]<<uiBitDepthIncrease;
    3977     ai0[13] =  pSrc[13]<<uiBitDepthIncrease;
    3978     ai0[14] =  pSrc[14]<<uiBitDepthIncrease;
    3979     ai0[15] =  pSrc[15]<<uiBitDepthIncrease;
    3980     ai0[16] =  pSrc[16]<<uiBitDepthIncrease;
    3981     ai0[17] =  pSrc[17]<<uiBitDepthIncrease;
    3982     ai0[18] =  pSrc[18]<<uiBitDepthIncrease;
    3983     ai0[19] =  pSrc[19]<<uiBitDepthIncrease;
    3984     ai0[20] =  pSrc[20]<<uiBitDepthIncrease;
    3985     ai0[21] =  pSrc[21]<<uiBitDepthIncrease;
    3986     ai0[22] =  pSrc[22]<<uiBitDepthIncrease;
    3987     ai0[23] =  pSrc[23]<<uiBitDepthIncrease;
    3988     ai0[24] =  pSrc[24]<<uiBitDepthIncrease;
    3989     ai0[25] =  pSrc[25]<<uiBitDepthIncrease;
    3990     ai0[26] =  pSrc[26]<<uiBitDepthIncrease;
    3991     ai0[27] =  pSrc[27]<<uiBitDepthIncrease;
    3992     ai0[28] =  pSrc[28]<<uiBitDepthIncrease;
    3993     ai0[29] =  pSrc[29]<<uiBitDepthIncrease;
    3994     ai0[30] =  pSrc[30]<<uiBitDepthIncrease;
    3995     ai0[31] =  pSrc[31]<<uiBitDepthIncrease;
    3996     G16 = xTrRound(  12 * ai0[1]  - 255 * ai0[31], DenShift32);
    3997     G17 = xTrRound( 189 * ai0[17] - 171 * ai0[15], DenShift32);
    3998     G18 = xTrRound( 109 * ai0[9]  - 231 * ai0[23], DenShift32);
    3999     G19 = xTrRound( 241 * ai0[25] -  86 * ai0[7], DenShift32);
    4000     G20 = xTrRound(  62 * ai0[5]  - 248 * ai0[27], DenShift32);
    4001     G21 = xTrRound( 219 * ai0[21] - 131 * ai0[11], DenShift32);
    4002     G22 = xTrRound( 152 * ai0[13] - 205 * ai0[19], DenShift32);
    4003     G23 = xTrRound( 253 * ai0[29] -  37 * ai0[3], DenShift32);
    4004     G24 = xTrRound( 253 * ai0[3]  +  37 * ai0[29], DenShift32);
    4005     G25 = xTrRound( 152 * ai0[19] + 205 * ai0[13], DenShift32);
    4006     G26 = xTrRound( 219 * ai0[11] + 131 * ai0[21], DenShift32);
    4007     G27 = xTrRound(  62 * ai0[27] + 248 * ai0[5], DenShift32);
    4008     G28 = xTrRound( 241 * ai0[7]  +  86 * ai0[25], DenShift32);
    4009     G29 = xTrRound( 109 * ai0[23] + 231 * ai0[9], DenShift32);
    4010     G30 = xTrRound( 189 * ai0[15] + 171 * ai0[17], DenShift32);
    4011     G31 = xTrRound(  12 * ai0[31] + 255 * ai0[1], DenShift32);
    4012    
    4013     F8  = xTrRound(  25 * ai0[2]  - 254 * ai0[30], DenShift32);
    4014     F9  = xTrRound( 197 * ai0[18] - 162 * ai0[14], DenShift32);
    4015     F10 = xTrRound( 120 * ai0[10] - 225 * ai0[22], DenShift32);
    4016     F11 = xTrRound( 244 * ai0[26] -  74 * ai0[6], DenShift32);
    4017     F12 = xTrRound( 244 * ai0[6]  +  74 * ai0[26], DenShift32);
    4018     F13 = xTrRound( 120 * ai0[22] + 225 * ai0[10], DenShift32);
    4019     F14 = xTrRound( 197 * ai0[14] + 162 * ai0[18], DenShift32);
    4020     F15 = xTrRound(  25 * ai0[30] + 254 * ai0[2], DenShift32);
    4021 #else
    4022     G16 = xTrRound( 12 * pSrc[1] - 255 * pSrc[31], DenShift32);
    4023     G17 = xTrRound( 189 * pSrc[17] - 171 * pSrc[15], DenShift32);
    4024     G18 = xTrRound( 109 * pSrc[9] - 231 * pSrc[23], DenShift32);
    4025     G19 = xTrRound( 241 * pSrc[25] - 86 * pSrc[7], DenShift32);
    4026     G20 = xTrRound( 62 * pSrc[5] - 248 * pSrc[27], DenShift32);
    4027     G21 = xTrRound( 219 * pSrc[21] - 131 * pSrc[11], DenShift32);
    4028     G22 = xTrRound( 152 * pSrc[13] - 205 * pSrc[19], DenShift32);
    4029     G23 = xTrRound( 253 * pSrc[29] - 37 * pSrc[3], DenShift32);
    4030     G24 = xTrRound( 253 * pSrc[3] + 37 * pSrc[29], DenShift32);
    4031     G25 = xTrRound( 152 * pSrc[19] + 205 * pSrc[13], DenShift32);
    4032     G26 = xTrRound( 219 * pSrc[11] + 131 * pSrc[21], DenShift32);
    4033     G27 = xTrRound( 62 * pSrc[27] + 248 * pSrc[5], DenShift32);
    4034     G28 = xTrRound( 241 * pSrc[7] + 86 * pSrc[25], DenShift32);
    4035     G29 = xTrRound( 109 * pSrc[23] + 231 * pSrc[9], DenShift32);
    4036     G30 = xTrRound( 189 * pSrc[15] + 171 * pSrc[17], DenShift32);
    4037     G31 = xTrRound( 12 * pSrc[31] + 255 * pSrc[1], DenShift32);
    4038    
    4039     F8 = xTrRound( 25 * pSrc[2] - 254 * pSrc[30], DenShift32);
    4040     F9 = xTrRound( 197 * pSrc[18] - 162 * pSrc[14], DenShift32);
    4041     F10 = xTrRound( 120 * pSrc[10] - 225 * pSrc[22], DenShift32);
    4042     F11 = xTrRound( 244 * pSrc[26] - 74 * pSrc[6], DenShift32);
    4043     F12 = xTrRound( 244 * pSrc[6] + 74 * pSrc[26], DenShift32);
    4044     F13 = xTrRound( 120 * pSrc[22] + 225 * pSrc[10], DenShift32);
    4045     F14 = xTrRound( 197 * pSrc[14] + 162 * pSrc[18], DenShift32);
    4046     F15 = xTrRound( 25 * pSrc[30] + 254 * pSrc[2], DenShift32);
    4047 #endif
    4048     F16 = G16 + G17;
    4049     F17 = G16 - G17;
    4050     F18 = G19 - G18;
    4051     F19 = G19 + G18;
    4052     F20 = G20 + G21;
    4053     F21 = G20 - G21;
    4054     F22 = G23 - G22;
    4055     F23 = G23 + G22;
    4056     F24 = G24 + G25;
    4057     F25 = G24 - G25;
    4058     F26 = G27 - G26;
    4059     F27 = G27 + G26;
    4060     F28 = G28 + G29;
    4061     F29 = G28 - G29;
    4062     F30 = G31 - G30;
    4063     F31 = G31 + G30;
    4064 #ifdef TRANS_PRECISION_EXT
    4065     E4 = xTrRound( 49 * ai0[4] - 251 * ai0[28], DenShift32);
    4066     E5 = xTrRound( 212 * ai0[20] - 142 * ai0[12], DenShift32);
    4067     E6 = xTrRound( 212 * ai0[12] + 142 * ai0[20], DenShift32);
    4068     E7 = xTrRound( 49 * ai0[28] + 251 * ai0[4], DenShift32);
    4069 #else
    4070     E4 = xTrRound( 49 * pSrc[4] - 251 * pSrc[28], DenShift32);
    4071     E5 = xTrRound( 212 * pSrc[20] - 142 * pSrc[12], DenShift32);
    4072     E6 = xTrRound( 212 * pSrc[12] + 142 * pSrc[20], DenShift32);
    4073     E7 = xTrRound( 49 * pSrc[28] + 251 * pSrc[4], DenShift32);
    4074 #endif
    4075     E8 = F8 + F9;
    4076     E9 = F8 - F9;
    4077     E10 = F11 - F10;
    4078     E11 = F11 + F10;
    4079     E12 = F12 + F13;
    4080     E13 = F12 - F13;
    4081     E14 = F15 - F14;
    4082     E15 = F15 + F14;
    4083     E17 = xTrRound( 49 * F30 - 251 * F17, DenShift32);
    4084     E18 = xTrRound(  - 251 * F29 - 49 * F18, DenShift32);
    4085     E21 = xTrRound( 212 * F26 - 142 * F21, DenShift32);
    4086     E22 = xTrRound(  - 142 * F25 - 212 * F22, DenShift32);
    4087     E25 = xTrRound( 212 * F25 - 142 * F22, DenShift32);
    4088     E26 = xTrRound( 142 * F26 + 212 * F21, DenShift32);
    4089     E29 = xTrRound( 49 * F29 - 251 * F18, DenShift32);
    4090     E30 = xTrRound( 251 * F30 + 49 * F17, DenShift32);
    4091 #ifdef TRANS_PRECISION_EXT
    4092     D0 = xTrRound( 181 * ( ai0[0] + ai0[16] ), DenShift32);
    4093     D1 = xTrRound( 181 * ( ai0[0] - ai0[16] ), DenShift32);
    4094     D2 = xTrRound( 97 * ai0[8] - 236 * ai0[24], DenShift32);
    4095     D3 = xTrRound( 236 * ai0[8] + 97 * ai0[24], DenShift32);
    4096 #else
    4097     D0 = xTrRound( 181 * ( pSrc[0] + pSrc[16] ), DenShift32);
    4098     D1 = xTrRound( 181 * ( pSrc[0] - pSrc[16] ), DenShift32);
    4099     D2 = xTrRound( 97 * pSrc[8] - 236 * pSrc[24], DenShift32);
    4100     D3 = xTrRound( 236 * pSrc[8] + 97 * pSrc[24], DenShift32);
    4101 #endif
    4102     D4 = E4 + E5;
    4103     D5 = E4 - E5;
    4104     D6 = E7 - E6;
    4105     D7 = E7 + E6;
    4106     D9 = xTrRound( 97 * E14 - 236 * E9, DenShift32);
    4107     D10 = xTrRound(  - 236 * E13 - 97 * E10, DenShift32);
    4108     D13 = xTrRound( 97 * E13 - 236 * E10, DenShift32);
    4109     D14 = xTrRound( 236 * E14 + 97 * E9, DenShift32);
    4110     D16 = F16 + F19;
    4111     D19 = F16 - F19;
    4112     D20 = F23 - F20;
    4113     D23 = F23 + F20;
    4114     D24 = F24 + F27;
    4115     D27 = F24 - F27;
    4116     D28 = F31 - F28;
    4117     D31 = F31 + F28;
    4118     D17 = E17 + E18;
    4119     D18 = E17 - E18;
    4120     D21 = E22 - E21;
    4121     D22 = E22 + E21;
    4122     D25 = E25 + E26;
    4123     D26 = E25 - E26;
    4124     D29 = E30 - E29;
    4125     D30 = E30 + E29;
    4126    
    4127     C0 = D0 + D3;
    4128     C3 = D0 - D3;
    4129     C8 = E8 + E11;
    4130     C11 = E8 - E11;
    4131     C12 = E15 - E12;
    4132     C15 = E15 + E12;
    4133     C1 = D1 + D2;
    4134     C2 = D1 - D2;
    4135     C9 = D9 + D10;
    4136     C10 = D9 - D10;
    4137     C13 = D14 - D13;
    4138     C14 = D14 + D13;
    4139     C5 = xTrRound( 181 * ( D6 - D5 ), DenShift32);
    4140     C6 = xTrRound( 181 * ( D6 + D5 ), DenShift32);
    4141     C18 = xTrRound( 97 * D29 - 236 * D18, DenShift32);
    4142     C20 = xTrRound(  - 236 * D27 - 97 * D20, DenShift32);
    4143     C26 = xTrRound(  - 236 * D21 + 97 * D26, DenShift32);
    4144     C28 = xTrRound( 97 * D19 + 236 * D28, DenShift32);
    4145     C19 = xTrRound( 97 * D28 - 236 * D19, DenShift32);
    4146     C21 = xTrRound(  - 236 * D26 - 97 * D21, DenShift32);
    4147     C27 = xTrRound(  - 236 * D20 + 97 * D27, DenShift32);
    4148     C29 = xTrRound( 97 * D18 + 236 * D29, DenShift32);
    4149    
    4150     B0 = C0 + D7;
    4151     B7 = C0 - D7;
    4152     B1 = C1 + C6;
    4153     B6 = C1 - C6;
    4154     B2 = C2 + C5;
    4155     B5 = C2 - C5;
    4156     B3 = C3 + D4;
    4157     B4 = C3 - D4;
    4158     B10 = xTrRound( 181 * ( C13 - C10 ), DenShift32);
    4159     B13 = xTrRound( 181 * ( C13 + C10 ), DenShift32);
    4160     B11 = xTrRound( 181 * ( C12 - C11 ), DenShift32);
    4161     B12 = xTrRound( 181 * ( C12 + C11 ), DenShift32);
    4162     B16 = D16 + D23;
    4163     B23 = D16 - D23;
    4164     B24 = D31 - D24;
    4165     B31 = D31 + D24;
    4166     B17 = D17 + D22;
    4167     B22 = D17 - D22;
    4168     B25 = D30 - D25;
    4169     B30 = D30 + D25;
    4170     B18 = C18 + C21;
    4171     B21 = C18 - C21;
    4172     B26 = C29 - C26;
    4173     B29 = C29 + C26;
    4174     B19 = C19 + C20;
    4175     B20 = C19 - C20;
    4176     B27 = C28 - C27;
    4177     B28 = C28 + C27;
    4178    
    4179     A0 = B0 + C15;
    4180     A15 = B0 - C15;
    4181     A1 = B1 + C14;
    4182     A14 = B1 - C14;
    4183     A2 = B2 + B13;
    4184     A13 = B2 - B13;
    4185     A3 = B3 + B12;
    4186     A12 = B3 - B12;
    4187     A4 = B4 + B11;
    4188     A11 = B4 - B11;
    4189     A5 = B5 + B10;
    4190     A10 = B5 - B10;
    4191     A6 = B6 + C9;
    4192     A9 = B6 - C9;
    4193     A7 = B7 + C8;
    4194     A8 = B7 - C8;
    4195     A20 = xTrRound( 181 * ( B27 - B20 ), DenShift32);
    4196     A27 = xTrRound( 181 * ( B27 + B20 ), DenShift32);
    4197     A21 = xTrRound( 181 * ( B26 - B21 ), DenShift32);
    4198     A26 = xTrRound( 181 * ( B26 + B21 ), DenShift32);
    4199     A22 = xTrRound( 181 * ( B25 - B22 ), DenShift32);
    4200     A25 = xTrRound( 181 * ( B25 + B22 ), DenShift32);
    4201     A23 = xTrRound( 181 * ( B24 - B23 ), DenShift32);
    4202     A24 = xTrRound( 181 * ( B24 + B23 ), DenShift32);
    4203    
    4204     aaiTemp[0][y] = A0 + B31;
    4205     aaiTemp[31][y] = A0 - B31;
    4206     aaiTemp[1][y] = A1 + B30;
    4207     aaiTemp[30][y] = A1 - B30;
    4208     aaiTemp[2][y] = A2 + B29;
    4209     aaiTemp[29][y] = A2 - B29;
    4210     aaiTemp[3][y] = A3 + B28;
    4211     aaiTemp[28][y] = A3 - B28;
    4212     aaiTemp[4][y] = A4 + A27;
    4213     aaiTemp[27][y] = A4 - A27;
    4214     aaiTemp[5][y] = A5 + A26;
    4215     aaiTemp[26][y] = A5 - A26;
    4216     aaiTemp[6][y] = A6 + A25;
    4217     aaiTemp[25][y] = A6 - A25;
    4218     aaiTemp[7][y] = A7 + A24;
    4219     aaiTemp[24][y] = A7 - A24;
    4220     aaiTemp[8][y] = A8 + A23;
    4221     aaiTemp[23][y] = A8 - A23;
    4222     aaiTemp[9][y] = A9 + A22;
    4223     aaiTemp[22][y] = A9 - A22;
    4224     aaiTemp[10][y] = A10 + A21;
    4225     aaiTemp[21][y] = A10 - A21;
    4226     aaiTemp[11][y] = A11 + A20;
    4227     aaiTemp[20][y] = A11 - A20;
    4228     aaiTemp[12][y] = A12 + B19;
    4229     aaiTemp[19][y] = A12 - B19;
    4230     aaiTemp[13][y] = A13 + B18;
    4231     aaiTemp[18][y] = A13 - B18;
    4232     aaiTemp[14][y] = A14 + B17;
    4233     aaiTemp[17][y] = A14 - B17;
    4234     aaiTemp[15][y] = A15 + B16;
    4235     aaiTemp[16][y] = A15 - B16;
    4236    
    4237     pSrc += 32;
    4238   }
    4239  
    4240   for( x=0 ; x<32 ; x++, pDes++ )
    4241   {
    4242     G16 = xTrRound( 12 * aaiTemp[x][1] - 255 * aaiTemp[x][31], DenShift32);
    4243     G17 = xTrRound( 189 * aaiTemp[x][17] - 171 * aaiTemp[x][15], DenShift32);
    4244     G18 = xTrRound( 109 * aaiTemp[x][9] - 231 * aaiTemp[x][23], DenShift32);
    4245     G19 = xTrRound( 241 * aaiTemp[x][25] - 86 * aaiTemp[x][7], DenShift32);
    4246     G20 = xTrRound( 62 * aaiTemp[x][5] - 248 * aaiTemp[x][27], DenShift32);
    4247     G21 = xTrRound( 219 * aaiTemp[x][21] - 131 * aaiTemp[x][11], DenShift32);
    4248     G22 = xTrRound( 152 * aaiTemp[x][13] - 205 * aaiTemp[x][19], DenShift32);
    4249     G23 = xTrRound( 253 * aaiTemp[x][29] - 37 * aaiTemp[x][3], DenShift32);
    4250     G24 = xTrRound( 253 * aaiTemp[x][3] + 37 * aaiTemp[x][29], DenShift32);
    4251     G25 = xTrRound( 152 * aaiTemp[x][19] + 205 * aaiTemp[x][13], DenShift32);
    4252     G26 = xTrRound( 219 * aaiTemp[x][11] + 131 * aaiTemp[x][21], DenShift32);
    4253     G27 = xTrRound( 62 * aaiTemp[x][27] + 248 * aaiTemp[x][5], DenShift32);
    4254     G28 = xTrRound( 241 * aaiTemp[x][7] + 86 * aaiTemp[x][25], DenShift32);
    4255     G29 = xTrRound( 109 * aaiTemp[x][23] + 231 * aaiTemp[x][9], DenShift32);
    4256     G30 = xTrRound( 189 * aaiTemp[x][15] + 171 * aaiTemp[x][17], DenShift32);
    4257     G31 = xTrRound( 12 * aaiTemp[x][31] + 255 * aaiTemp[x][1], DenShift32);
    4258    
    4259     F8 = xTrRound( 25 * aaiTemp[x][2] - 254 * aaiTemp[x][30], DenShift32);
    4260     F9 = xTrRound( 197 * aaiTemp[x][18] - 162 * aaiTemp[x][14], DenShift32);
    4261     F10 = xTrRound( 120 * aaiTemp[x][10] - 225 * aaiTemp[x][22], DenShift32);
    4262     F11 = xTrRound( 244 * aaiTemp[x][26] - 74 * aaiTemp[x][6], DenShift32);
    4263     F12 = xTrRound( 244 * aaiTemp[x][6] + 74 * aaiTemp[x][26], DenShift32);
    4264     F13 = xTrRound( 120 * aaiTemp[x][22] + 225 * aaiTemp[x][10], DenShift32);
    4265     F14 = xTrRound( 197 * aaiTemp[x][14] + 162 * aaiTemp[x][18], DenShift32);
    4266     F15 = xTrRound( 25 * aaiTemp[x][30] + 254 * aaiTemp[x][2], DenShift32);
    4267     F16 = G16 + G17;
    4268     F17 = G16 - G17;
    4269     F18 = G19 - G18;
    4270     F19 = G19 + G18;
    4271     F20 = G20 + G21;
    4272     F21 = G20 - G21;
    4273     F22 = G23 - G22;
    4274     F23 = G23 + G22;
    4275     F24 = G24 + G25;
    4276     F25 = G24 - G25;
    4277     F26 = G27 - G26;
    4278     F27 = G27 + G26;
    4279     F28 = G28 + G29;
    4280     F29 = G28 - G29;
    4281     F30 = G31 - G30;
    4282     F31 = G31 + G30;
    4283    
    4284     E4 = xTrRound( 49 * aaiTemp[x][4] - 251 * aaiTemp[x][28], DenShift32);
    4285     E5 = xTrRound( 212 * aaiTemp[x][20] - 142 * aaiTemp[x][12], DenShift32);
    4286     E6 = xTrRound( 212 * aaiTemp[x][12] + 142 * aaiTemp[x][20], DenShift32);
    4287     E7 = xTrRound( 49 * aaiTemp[x][28] + 251 * aaiTemp[x][4], DenShift32);
    4288     E8 = F8 + F9;
    4289     E9 = F8 - F9;
    4290     E10 = F11 - F10;
    4291     E11 = F11 + F10;
    4292     E12 = F12 + F13;
    4293     E13 = F12 - F13;
    4294     E14 = F15 - F14;
    4295     E15 = F15 + F14;
    4296     E17 = xTrRound( 49 * F30 - 251 * F17, DenShift32);
    4297     E18 = xTrRound(  - 251 * F29 - 49 * F18, DenShift32);
    4298     E21 = xTrRound( 212 * F26 - 142 * F21, DenShift32);
    4299     E22 = xTrRound(  - 142 * F25 - 212 * F22, DenShift32);
    4300     E25 = xTrRound( 212 * F25 - 142 * F22, DenShift32);
    4301     E26 = xTrRound( 142 * F26 + 212 * F21, DenShift32);
    4302     E29 = xTrRound( 49 * F29 - 251 * F18, DenShift32);
    4303     E30 = xTrRound( 251 * F30 + 49 * F17, DenShift32);
    4304    
    4305     D0 = xTrRound( 181 * ( aaiTemp[x][0] + aaiTemp[x][16] ), DenShift32);
    4306     D1 = xTrRound( 181 * ( aaiTemp[x][0] - aaiTemp[x][16] ), DenShift32);
    4307     D2 = xTrRound( 97 * aaiTemp[x][8] - 236 * aaiTemp[x][24], DenShift32);
    4308     D3 = xTrRound( 236 * aaiTemp[x][8] + 97 * aaiTemp[x][24], DenShift32);
    4309     D4 = E4 + E5;
    4310     D5 = E4 - E5;
    4311     D6 = E7 - E6;
    4312     D7 = E7 + E6;
    4313     D9 = xTrRound( 97 * E14 - 236 * E9, DenShift32);
    4314     D10 = xTrRound(  - 236 * E13 - 97 * E10, DenShift32);
    4315     D13 = xTrRound( 97 * E13 - 236 * E10, DenShift32);
    4316     D14 = xTrRound( 236 * E14 + 97 * E9, DenShift32);
    4317     D16 = F16 + F19;
    4318     D19 = F16 - F19;
    4319     D20 = F23 - F20;
    4320     D23 = F23 + F20;
    4321     D24 = F24 + F27;
    4322     D27 = F24 - F27;
    4323     D28 = F31 - F28;
    4324     D31 = F31 + F28;
    4325     D17 = E17 + E18;
    4326     D18 = E17 - E18;
    4327     D21 = E22 - E21;
    4328     D22 = E22 + E21;
    4329     D25 = E25 + E26;
    4330     D26 = E25 - E26;
    4331     D29 = E30 - E29;
    4332     D30 = E30 + E29;
    4333    
    4334     C0 = D0 + D3;
    4335     C3 = D0 - D3;
    4336     C8 = E8 + E11;
    4337     C11 = E8 - E11;
    4338     C12 = E15 - E12;
    4339     C15 = E15 + E12;
    4340     C1 = D1 + D2;
    4341     C2 = D1 - D2;
    4342     C9 = D9 + D10;
    4343     C10 = D9 - D10;
    4344     C13 = D14 - D13;
    4345     C14 = D14 + D13;
    4346     C5 = xTrRound( 181 * ( D6 - D5 ), DenShift32);
    4347     C6 = xTrRound( 181 * ( D6 + D5 ), DenShift32);
    4348     C18 = xTrRound( 97 * D29 - 236 * D18, DenShift32);
    4349     C20 = xTrRound(  - 236 * D27 - 97 * D20, DenShift32);
    4350     C26 = xTrRound(  - 236 * D21 + 97 * D26, DenShift32);
    4351     C28 = xTrRound( 97 * D19 + 236 * D28, DenShift32);
    4352     C19 = xTrRound( 97 * D28 - 236 * D19, DenShift32);
    4353     C21 = xTrRound(  - 236 * D26 - 97 * D21, DenShift32);
    4354     C27 = xTrRound(  - 236 * D20 + 97 * D27, DenShift32);
    4355     C29 = xTrRound( 97 * D18 + 236 * D29, DenShift32);
    4356    
    4357     B0 = C0 + D7;
    4358     B7 = C0 - D7;
    4359     B1 = C1 + C6;
    4360     B6 = C1 - C6;
    4361     B2 = C2 + C5;
    4362     B5 = C2 - C5;
    4363     B3 = C3 + D4;
    4364     B4 = C3 - D4;
    4365     B10 = xTrRound( 181 * ( C13 - C10 ), DenShift32);
    4366     B13 = xTrRound( 181 * ( C13 + C10 ), DenShift32);
    4367     B11 = xTrRound( 181 * ( C12 - C11 ), DenShift32);
    4368     B12 = xTrRound( 181 * ( C12 + C11 ), DenShift32);
    4369     B16 = D16 + D23;
    4370     B23 = D16 - D23;
    4371     B24 = D31 - D24;
    4372     B31 = D31 + D24;
    4373     B17 = D17 + D22;
    4374     B22 = D17 - D22;
    4375     B25 = D30 - D25;
    4376     B30 = D30 + D25;
    4377     B18 = C18 + C21;
    4378     B21 = C18 - C21;
    4379     B26 = C29 - C26;
    4380     B29 = C29 + C26;
    4381     B19 = C19 + C20;
    4382     B20 = C19 - C20;
    4383     B27 = C28 - C27;
    4384     B28 = C28 + C27;
    4385    
    4386     A0 = B0 + C15;
    4387     A15 = B0 - C15;
    4388     A1 = B1 + C14;
    4389     A14 = B1 - C14;
    4390     A2 = B2 + B13;
    4391     A13 = B2 - B13;
    4392     A3 = B3 + B12;
    4393     A12 = B3 - B12;
    4394     A4 = B4 + B11;
    4395     A11 = B4 - B11;
    4396     A5 = B5 + B10;
    4397     A10 = B5 - B10;
    4398     A6 = B6 + C9;
    4399     A9 = B6 - C9;
    4400     A7 = B7 + C8;
    4401     A8 = B7 - C8;
    4402     A20 = xTrRound( 181 * ( B27 - B20 ), DenShift32);
    4403     A27 = xTrRound( 181 * ( B27 + B20 ), DenShift32);
    4404     A21 = xTrRound( 181 * ( B26 - B21 ), DenShift32);
    4405     A26 = xTrRound( 181 * ( B26 + B21 ), DenShift32);
    4406     A22 = xTrRound( 181 * ( B25 - B22 ), DenShift32);
    4407     A25 = xTrRound( 181 * ( B25 + B22 ), DenShift32);
    4408     A23 = xTrRound( 181 * ( B24 - B23 ), DenShift32);
    4409     A24 = xTrRound( 181 * ( B24 + B23 ), DenShift32);
    4410    
    4411     pDes[         0] = (Pel)xTrRound( A0 + B31 , DCore32Shift);
    4412     pDes[uiStride31] = (Pel)xTrRound( A0 - B31 , DCore32Shift);
    4413     pDes[uiStride  ] = (Pel)xTrRound( A1 + B30 , DCore32Shift);
    4414     pDes[uiStride30] = (Pel)xTrRound( A1 - B30 , DCore32Shift);
    4415     pDes[uiStride2 ] = (Pel)xTrRound( A2 + B29 , DCore32Shift);
    4416     pDes[uiStride29] = (Pel)xTrRound( A2 - B29 , DCore32Shift);
    4417     pDes[uiStride3 ] = (Pel)xTrRound( A3 + B28 , DCore32Shift);
    4418     pDes[uiStride28] = (Pel)xTrRound( A3 - B28 , DCore32Shift);
    4419     pDes[uiStride4 ] = (Pel)xTrRound( A4 + A27 , DCore32Shift);
    4420     pDes[uiStride27] = (Pel)xTrRound( A4 - A27 , DCore32Shift);
    4421     pDes[uiStride5 ] = (Pel)xTrRound( A5 + A26 , DCore32Shift);
    4422     pDes[uiStride26] = (Pel)xTrRound( A5 - A26 , DCore32Shift);
    4423     pDes[uiStride6 ] = (Pel)xTrRound( A6 + A25 , DCore32Shift);
    4424     pDes[uiStride25] = (Pel)xTrRound( A6 - A25 , DCore32Shift);
    4425     pDes[uiStride7 ] = (Pel)xTrRound( A7 + A24 , DCore32Shift);
    4426     pDes[uiStride24] = (Pel)xTrRound( A7 - A24 , DCore32Shift);
    4427     pDes[uiStride8 ] = (Pel)xTrRound( A8 + A23 , DCore32Shift);
    4428     pDes[uiStride23] = (Pel)xTrRound( A8 - A23 , DCore32Shift);
    4429     pDes[uiStride9 ] = (Pel)xTrRound( A9 + A22 , DCore32Shift);
    4430     pDes[uiStride22] = (Pel)xTrRound( A9 - A22 , DCore32Shift);
    4431     pDes[uiStride10] = (Pel)xTrRound( A10 + A21 , DCore32Shift);
    4432     pDes[uiStride21] = (Pel)xTrRound( A10 - A21 , DCore32Shift);
    4433     pDes[uiStride11] = (Pel)xTrRound( A11 + A20 , DCore32Shift);
    4434     pDes[uiStride20] = (Pel)xTrRound( A11 - A20 , DCore32Shift);
    4435     pDes[uiStride12] = (Pel)xTrRound( A12 + B19 , DCore32Shift);
    4436     pDes[uiStride19] = (Pel)xTrRound( A12 - B19 , DCore32Shift);
    4437     pDes[uiStride13] = (Pel)xTrRound( A13 + B18 , DCore32Shift);
    4438     pDes[uiStride18] = (Pel)xTrRound( A13 - B18 , DCore32Shift);
    4439     pDes[uiStride14] = (Pel)xTrRound( A14 + B17 , DCore32Shift);
    4440     pDes[uiStride17] = (Pel)xTrRound( A14 - B17 , DCore32Shift);
    4441     pDes[uiStride15] = (Pel)xTrRound( A15 + B16 , DCore32Shift);
    4442     pDes[uiStride16] = (Pel)xTrRound( A15 - B16 , DCore32Shift);
    4443    
    4444 #ifdef TRANS_PRECISION_EXT
    4445     pDes[        0 ] =  (pDes[        0 ]+offset)>>uiBitDepthIncrease;
    4446     pDes[uiStride  ] =  (pDes[uiStride  ]+offset)>>uiBitDepthIncrease;
    4447     pDes[uiStride2 ] =  (pDes[uiStride2 ]+offset)>>uiBitDepthIncrease;
    4448     pDes[uiStride3 ] =  (pDes[uiStride3 ]+offset)>>uiBitDepthIncrease;
    4449     pDes[uiStride4 ] =  (pDes[uiStride4 ]+offset)>>uiBitDepthIncrease;
    4450     pDes[uiStride5 ] =  (pDes[uiStride5 ]+offset)>>uiBitDepthIncrease;
    4451     pDes[uiStride6 ] =  (pDes[uiStride6 ]+offset)>>uiBitDepthIncrease;
    4452     pDes[uiStride7 ] =  (pDes[uiStride7 ]+offset)>>uiBitDepthIncrease;
    4453     pDes[uiStride8 ] =  (pDes[uiStride8 ]+offset)>>uiBitDepthIncrease;
    4454     pDes[uiStride9 ] =  (pDes[uiStride9 ]+offset)>>uiBitDepthIncrease;
    4455     pDes[uiStride10] =  (pDes[uiStride10]+offset)>>uiBitDepthIncrease;
    4456     pDes[uiStride11] =  (pDes[uiStride11]+offset)>>uiBitDepthIncrease;
    4457     pDes[uiStride12] =  (pDes[uiStride12]+offset)>>uiBitDepthIncrease;
    4458     pDes[uiStride13] =  (pDes[uiStride13]+offset)>>uiBitDepthIncrease;
    4459     pDes[uiStride14] =  (pDes[uiStride14]+offset)>>uiBitDepthIncrease;
    4460     pDes[uiStride15] =  (pDes[uiStride15]+offset)>>uiBitDepthIncrease;
    4461     pDes[uiStride16] =  (pDes[uiStride16]+offset)>>uiBitDepthIncrease;
    4462     pDes[uiStride17] =  (pDes[uiStride17]+offset)>>uiBitDepthIncrease;
    4463     pDes[uiStride18] =  (pDes[uiStride18]+offset)>>uiBitDepthIncrease;
    4464     pDes[uiStride19] =  (pDes[uiStride19]+offset)>>uiBitDepthIncrease;
    4465     pDes[uiStride20] =  (pDes[uiStride20]+offset)>>uiBitDepthIncrease;
    4466     pDes[uiStride21] =  (pDes[uiStride21]+offset)>>uiBitDepthIncrease;
    4467     pDes[uiStride22] =  (pDes[uiStride22]+offset)>>uiBitDepthIncrease;
    4468     pDes[uiStride23] =  (pDes[uiStride23]+offset)>>uiBitDepthIncrease;
    4469     pDes[uiStride24] =  (pDes[uiStride24]+offset)>>uiBitDepthIncrease;
    4470     pDes[uiStride25] =  (pDes[uiStride25]+offset)>>uiBitDepthIncrease;
    4471     pDes[uiStride26] =  (pDes[uiStride26]+offset)>>uiBitDepthIncrease;
    4472     pDes[uiStride27] =  (pDes[uiStride27]+offset)>>uiBitDepthIncrease;
    4473     pDes[uiStride28] =  (pDes[uiStride28]+offset)>>uiBitDepthIncrease;
    4474     pDes[uiStride29] =  (pDes[uiStride29]+offset)>>uiBitDepthIncrease;
    4475     pDes[uiStride30] =  (pDes[uiStride30]+offset)>>uiBitDepthIncrease;
    4476     pDes[uiStride31] =  (pDes[uiStride31]+offset)>>uiBitDepthIncrease;
    4477 #endif
    4478   }
    4479 }
    4480 #endif //!E243_CORE_TRANSFORMS
    4481 #if QC_MOD_LCEC
     1905      iAdd = 0;
     1906    }
     1907    Int *piDequantCoef = getDequantCoeff(scalingListType,m_cQP.m_iRem,uiLog2TrSize-2,dir);
     1908
     1909    if(iShift > m_cQP.m_iPer)
     1910    {
     1911      for( Int n = 0; n < iWidth*iHeight; n++ )
     1912      {
     1913#if DEQUANT_CLIPPING
     1914        clipQCoef = Clip3( -32768, 32767, piQCoef[n] );
     1915        iCoeffQ = ((clipQCoef * piDequantCoef[n]) + iAdd ) >> (iShift -  m_cQP.m_iPer);
     1916#else
     1917        iCoeffQ = ((piQCoef[n] * piDequantCoef[n]) + iAdd ) >> (iShift -  m_cQP.m_iPer);
     1918#endif
     1919        piCoef[n] = Clip3(-32768,32767,iCoeffQ);
     1920      }
     1921    }
     1922    else
     1923    {
     1924      for( Int n = 0; n < iWidth*iHeight; n++ )
     1925      {
     1926#if DEQUANT_CLIPPING
     1927        clipQCoef = Clip3( -levelLimit, levelLimit - 1, piQCoef[n] );
     1928        iCoeffQ = (clipQCoef * piDequantCoef[n]) << (m_cQP.m_iPer - iShift);
     1929#else
     1930        iCoeffQ = (piQCoef[n] * piDequantCoef[n]) << (m_cQP.m_iPer - iShift);
     1931#endif
     1932        piCoef[n] = Clip3(-32768,32767,iCoeffQ);
     1933      }
     1934    }
     1935  }
     1936  else
     1937  {
     1938    iAdd = 1 << (iShift-1);
     1939    Int scale = g_invQuantScales[m_cQP.m_iRem] << m_cQP.m_iPer;
     1940
     1941    for( Int n = 0; n < iWidth*iHeight; n++ )
     1942    {
     1943#if DEQUANT_CLIPPING
     1944      clipQCoef = Clip3( -32768, 32767, piQCoef[n] );
     1945      iCoeffQ = ( clipQCoef * scale + iAdd ) >> iShift;
     1946#else
     1947      iCoeffQ = ( piQCoef[n] * scale + iAdd ) >> iShift;
     1948#endif
     1949      piCoef[n] = Clip3(-32768,32767,iCoeffQ);
     1950    }
     1951  }
     1952}
     1953
    44821954Void TComTrQuant::init( UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxTrSize, Int iSymbolMode, UInt *aTableLP4, UInt *aTableLP8, UInt *aTableLastPosVlcIndex,
    4483                        Bool bUseRDOQ,  Bool bEnc )
    4484 #else
    4485 Void TComTrQuant::init( UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxTrSize, Int iSymbolMode, UInt *aTableLP4, UInt *aTableLP8, Bool bUseRDOQ,  Bool bEnc )
    4486 #endif
     1955                       Bool bUseRDOQ,  Bool bEnc
     1956#if ADAPTIVE_QP_SELECTION
     1957                       , Bool bUseAdaptQpSelect
     1958#endif
     1959                       )
    44871960{
    44881961  m_uiMaxTrSize  = uiMaxTrSize;
    44891962  m_bEnc         = bEnc;
    44901963  m_bUseRDOQ     = bUseRDOQ;
    4491   m_uiLPTableE8 = aTableLP8;
    4492   m_uiLPTableE4 = aTableLP4;
    4493 #if QC_MOD_LCEC
    4494   m_uiLastPosVlcIndex=aTableLastPosVlcIndex;
    4495 #endif
    4496   m_iSymbolMode = iSymbolMode;
    4497  
    4498   if ( m_bEnc )
    4499   {
    4500     m_cQP.initOffsetParam( MIN_QP, MAX_QP );
    4501   }
    4502 }
    4503 
    4504 Void TComTrQuant::xQuant( TComDataCU* pcCU, Long* pSrc, TCoeff*& pDes, Int iWidth, Int iHeight, UInt& uiAcSum, TextType eTType, UInt uiAbsPartIdx )
    4505 {
    4506   xQuantLTR(pcCU, pSrc, pDes, iWidth, iHeight, uiAcSum, eTType, uiAbsPartIdx );
    4507 }
    4508 
    4509 Void TComTrQuant::xDeQuant( TCoeff* pSrc, Long*& pDes, Int iWidth, Int iHeight )
    4510 {
    4511   xDeQuantLTR( pSrc, pDes, iWidth, iHeight );
    4512 }
    4513 
    4514 #if INTRA_DST_TYPE_7
    4515 Void TComTrQuant::transformNxN( TComDataCU* pcCU, Pel* pcResidual, UInt uiStride, TCoeff*& rpcCoeff, UInt uiWidth, UInt uiHeight, UInt& uiAbsSum, TextType eTType, UInt uiAbsPartIdx )
    4516 {
     1964#if ADAPTIVE_QP_SELECTION
     1965  m_bUseAdaptQpSelect = bUseAdaptQpSelect;
     1966#endif
     1967}
     1968
     1969Void TComTrQuant::transformNxN( TComDataCU* pcCU,
     1970                                Pel*        pcResidual,
     1971                                UInt        uiStride,
     1972                                TCoeff*     rpcCoeff,
     1973#if ADAPTIVE_QP_SELECTION
     1974                                Int*&       rpcArlCoeff,
     1975#endif
     1976                                UInt        uiWidth,
     1977                                UInt        uiHeight,
     1978                                UInt&       uiAbsSum,
     1979                                TextType    eTType,
     1980                                UInt        uiAbsPartIdx )
     1981{
     1982#if LOSSLESS_CODING
     1983  if((m_cQP.qp() == 0) && (pcCU->getSlice()->getSPS()->getUseLossless()))
     1984  {
     1985    uiAbsSum=0;
     1986    for (UInt k = 0; k<uiHeight; k++)
     1987    {
     1988      for (UInt j = 0; j<uiWidth; j++)
     1989      {
     1990        rpcCoeff[k*uiWidth+j]= pcResidual[k*uiStride+j];
     1991        uiAbsSum += abs(pcResidual[k*uiStride+j]);
     1992      }
     1993    }
     1994    return;
     1995  }
     1996#endif
    45171997  UInt uiMode;  //luma intra pred
    45181998  if(eTType == TEXT_LUMA && pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTRA )
     1999  {
    45192000    uiMode = pcCU->getLumaIntraDir( uiAbsPartIdx );
     2001  }
    45202002  else
     2003  {
    45212004    uiMode = REG_DCT;
    4522 
     2005  }
     2006 
    45232007  uiAbsSum = 0;
    45242008  assert( (pcCU->getSlice()->getSPS()->getMaxTrSize() >= uiWidth) );
    45252009
    4526   xT( uiMode, pcResidual, uiStride, m_plTempCoeff, uiWidth );
    4527   xQuant( pcCU, m_plTempCoeff, rpcCoeff, uiWidth, uiHeight, uiAbsSum, eTType, uiAbsPartIdx );
    4528 }
    4529 #else
    4530 Void TComTrQuant::transformNxN( TComDataCU* pcCU, Pel* pcResidual, UInt uiStride, TCoeff*& rpcCoeff, UInt uiWidth, UInt uiHeight, UInt& uiAbsSum, TextType eTType, UInt uiAbsPartIdx )
    4531 {
    4532   uiAbsSum = 0;
    4533  
    4534   assert( (pcCU->getSlice()->getSPS()->getMaxTrSize() >= uiWidth) );
    4535  
    4536   xT( pcResidual, uiStride, m_plTempCoeff, uiWidth );
    4537   xQuant( pcCU, m_plTempCoeff, rpcCoeff, uiWidth, uiHeight, uiAbsSum, eTType, uiAbsPartIdx );
    4538 }
    4539 #endif
    4540 
    4541 
    4542 #if INTRA_DST_TYPE_7
    4543 Void TComTrQuant::invtransformNxN( TextType eText,UInt uiMode, Pel*& rpcResidual, UInt uiStride, TCoeff* pcCoeff, UInt uiWidth, UInt uiHeight )
    4544 {
    4545   xDeQuant( pcCoeff, m_plTempCoeff, uiWidth, uiHeight);
    4546   xIT( uiMode, m_plTempCoeff, rpcResidual, uiStride, uiWidth);
    4547 }
    4548 #else
    4549 Void TComTrQuant::invtransformNxN( Pel*& rpcResidual, UInt uiStride, TCoeff* pcCoeff, UInt uiWidth, UInt uiHeight )
    4550 {
    4551   xDeQuant( pcCoeff, m_plTempCoeff, uiWidth, uiHeight);
    4552   xIT( m_plTempCoeff, rpcResidual, uiStride, uiWidth );
    4553 }
    4554 #endif
    4555 
    4556 #if !E243_CORE_TRANSFORMS
    4557 Void TComTrQuant::xT2( Pel* piBlkResi, UInt uiStride, Long* psCoeff )
    4558 {
    4559   Int itmp1, itmp2;
    4560  
    4561   itmp1 = piBlkResi[0] + piBlkResi[uiStride  ];
    4562   itmp2 = piBlkResi[1] + piBlkResi[uiStride+1];
    4563  
    4564   psCoeff[0] = itmp1 + itmp2;
    4565   psCoeff[1] = itmp1 - itmp2;
    4566  
    4567   itmp1 = piBlkResi[0] - piBlkResi[uiStride  ];
    4568   itmp2 = piBlkResi[1] - piBlkResi[uiStride+1];
    4569  
    4570   psCoeff[2] = itmp1 + itmp2;
    4571   psCoeff[3] = itmp1 - itmp2;
    4572 }
    4573 
    4574 Void TComTrQuant::xT4( Pel* piBlkResi, UInt uiStride, Long* psCoeff )
    4575 {
    4576   Int aai[4][4];
    4577   Int tmp1, tmp2;
    4578  
    4579   for( Int y = 0; y < 4; y++ )
    4580   {
    4581     tmp1 = piBlkResi[0] + piBlkResi[3];
    4582     tmp2 = piBlkResi[1] + piBlkResi[2];
    4583    
    4584     aai[0][y] = tmp1 + tmp2;
    4585     aai[2][y] = tmp1 - tmp2;
    4586    
    4587     tmp1 = piBlkResi[0] - piBlkResi[3];
    4588     tmp2 = piBlkResi[1] - piBlkResi[2];
    4589    
    4590     aai[1][y] = tmp1 * 2 + tmp2 ;
    4591     aai[3][y] = tmp1  - tmp2 * 2;
    4592     piBlkResi += uiStride;
    4593   }
    4594  
    4595   for( Int x = 0; x < 4; x++, psCoeff++ )
    4596   {
    4597     tmp1 = aai[x][0] + aai[x][3];
    4598     tmp2 = aai[x][1] + aai[x][2];
    4599    
    4600     psCoeff[0] = tmp1 + tmp2;
    4601     psCoeff[8] = tmp1 - tmp2;
    4602    
    4603     tmp1 = aai[x][0] - aai[x][3];
    4604     tmp2 = aai[x][1] - aai[x][2];
    4605    
    4606     psCoeff[4]  = tmp1 * 2 + tmp2;
    4607     psCoeff[12] = tmp1 - tmp2 * 2;
    4608   }
    4609 }
    4610 
    4611 Void TComTrQuant::xT8( Pel* piBlkResi, UInt uiStride, Long* psCoeff )
    4612 {
    4613   Int aai[8][8];
    4614 #ifdef TRANS_PRECISION_EXT
    4615   Int uiBitDepthIncrease=g_iShift8x8-g_uiBitIncrement;
    4616   Int offset = (uiBitDepthIncrease==0)? 0:(1<<(uiBitDepthIncrease-1));
    4617 #endif
    4618   for( Int i = 0; i < 8; i++, piBlkResi += uiStride )
    4619   {
    4620     Int ai1 [8];
    4621     Int ai2 [8];
    4622 #ifdef TRANS_PRECISION_EXT
    4623     ai1[0] = (piBlkResi[0] + piBlkResi[7])<<uiBitDepthIncrease;
    4624     ai1[1] = (piBlkResi[1] + piBlkResi[6])<<uiBitDepthIncrease;
    4625     ai1[2] = (piBlkResi[2] + piBlkResi[5])<<uiBitDepthIncrease;
    4626     ai1[3] = (piBlkResi[3] + piBlkResi[4])<<uiBitDepthIncrease;
    4627    
    4628     ai1[4] = (piBlkResi[0] - piBlkResi[7])<<uiBitDepthIncrease;
    4629     ai1[5] = (piBlkResi[1] - piBlkResi[6])<<uiBitDepthIncrease;
    4630     ai1[6] = (piBlkResi[2] - piBlkResi[5])<<uiBitDepthIncrease;
    4631     ai1[7] = (piBlkResi[3] - piBlkResi[4])<<uiBitDepthIncrease;
    4632 #else
    4633     ai1[0] = piBlkResi[0] + piBlkResi[7];
    4634     ai1[1] = piBlkResi[1] + piBlkResi[6];
    4635     ai1[2] = piBlkResi[2] + piBlkResi[5];
    4636     ai1[3] = piBlkResi[3] + piBlkResi[4];
    4637    
    4638     ai1[4] = piBlkResi[0] - piBlkResi[7];
    4639     ai1[5] = piBlkResi[1] - piBlkResi[6];
    4640     ai1[6] = piBlkResi[2] - piBlkResi[5];
    4641     ai1[7] = piBlkResi[3] - piBlkResi[4];
    4642 #endif
    4643     ai2[0] = ai1[0] + ai1[3];
    4644     ai2[1] = ai1[1] + ai1[2];
    4645     ai2[2] = ai1[0] - ai1[3];
    4646     ai2[3] = ai1[1] - ai1[2];
    4647     ai2[4] = ai1[5] + ai1[6] + ((ai1[4]>>1) + ai1[4]);
    4648     ai2[5] = ai1[4] - ai1[7] - ((ai1[6]>>1) + ai1[6]);
    4649     ai2[6] = ai1[4] + ai1[7] - ((ai1[5]>>1) + ai1[5]);
    4650     ai2[7] = ai1[5] - ai1[6] + ((ai1[7]>>1) + ai1[7]);
    4651    
    4652     aai[0][i] =  ai2[0]     +  ai2[1];
    4653     aai[2][i] =  ai2[2]     + (ai2[3]>>1);
    4654     aai[4][i] =  ai2[0]     -  ai2[1];
    4655     aai[6][i] = (ai2[2]>>1) -  ai2[3];
    4656    
    4657     aai[1][i] =  ai2[4]     + (ai2[7]>>2);
    4658     aai[3][i] =  ai2[5]     + (ai2[6]>>2);
    4659     aai[5][i] =  ai2[6]     - (ai2[5]>>2);
    4660     aai[7][i] = (ai2[4]>>2) -  ai2[7];
    4661   }
    4662  
    4663   // vertical transform
    4664   for( Int n = 0; n < 8; n++, psCoeff++)
    4665   {
    4666     Int ai1[8];
    4667     Int ai2[8];
    4668    
    4669     ai1[0] = aai[n][0] + aai[n][7];
    4670     ai1[1] = aai[n][1] + aai[n][6];
    4671     ai1[2] = aai[n][2] + aai[n][5];
    4672     ai1[3] = aai[n][3] + aai[n][4];
    4673     ai1[4] = aai[n][0] - aai[n][7];
    4674     ai1[5] = aai[n][1] - aai[n][6];
    4675     ai1[6] = aai[n][2] - aai[n][5];
    4676     ai1[7] = aai[n][3] - aai[n][4];
    4677    
    4678     ai2[0] = ai1[0] + ai1[3];
    4679     ai2[1] = ai1[1] + ai1[2];
    4680     ai2[2] = ai1[0] - ai1[3];
    4681     ai2[3] = ai1[1] - ai1[2];
    4682     ai2[4] = ai1[5] + ai1[6] + ((ai1[4]>>1) + ai1[4]);
    4683     ai2[5] = ai1[4] - ai1[7] - ((ai1[6]>>1) + ai1[6]);
    4684     ai2[6] = ai1[4] + ai1[7] - ((ai1[5]>>1) + ai1[5]);
    4685     ai2[7] = ai1[5] - ai1[6] + ((ai1[7]>>1) + ai1[7]);
    4686    
    4687     psCoeff[ 0] =  ai2[0]     +  ai2[1];
    4688     psCoeff[16] =  ai2[2]     + (ai2[3]>>1);
    4689     psCoeff[32] =  ai2[0]     -  ai2[1];
    4690     psCoeff[48] = (ai2[2]>>1) -  ai2[3];
    4691    
    4692     psCoeff[ 8] =  ai2[4]     + (ai2[7]>>2);
    4693     psCoeff[24] =  ai2[5]     + (ai2[6]>>2);
    4694     psCoeff[40] =  ai2[6]     - (ai2[5]>>2);
    4695     psCoeff[56] = (ai2[4]>>2) -  ai2[7];
    4696 #ifdef TRANS_PRECISION_EXT
    4697     psCoeff[ 0] =  (psCoeff[ 0]+offset)>>uiBitDepthIncrease;
    4698     psCoeff[16] =  (psCoeff[16]+offset)>>uiBitDepthIncrease;
    4699     psCoeff[32] =  (psCoeff[32]+offset)>>uiBitDepthIncrease;
    4700     psCoeff[48] =  (psCoeff[48]+offset)>>uiBitDepthIncrease;
    4701    
    4702     psCoeff[ 8] =  (psCoeff[ 8]+offset)>>uiBitDepthIncrease;
    4703     psCoeff[24] =  (psCoeff[24]+offset)>>uiBitDepthIncrease;
    4704     psCoeff[40] =  (psCoeff[40]+offset)>>uiBitDepthIncrease;
    4705     psCoeff[56] =  (psCoeff[56]+offset)>>uiBitDepthIncrease;
    4706 #endif
    4707   }
    4708 }
    4709 
    4710 Void TComTrQuant::xQuant2x2( Long* plSrcCoef, TCoeff*& pDstCoef, UInt& uiAbsSum )
    4711 {
    4712   Int iLevel;
    4713   Int iSign;
    4714   Int iOffset = 1<<(6+m_cQP.per());
    4715   Int iBits   = m_cQP.per()+7;
    4716  
    4717   iSign       = plSrcCoef[0]>>31;
    4718   iLevel      = abs(plSrcCoef[0]);
    4719   iLevel     *= m_puiQuantMtx[0];
    4720   iLevel      = (iLevel + iOffset)>>iBits;
    4721  
    4722   if( iLevel != 0)
    4723   {
    4724     uiAbsSum   += iLevel;
    4725     iLevel     ^= iSign;
    4726     iLevel     -= iSign;
    4727     pDstCoef[0] = iLevel;
    4728   }
    4729   else
    4730   {
    4731     pDstCoef[0] = 0;
    4732   }
    4733  
    4734   iSign       = plSrcCoef[1]>>31;
    4735   iLevel      = abs(plSrcCoef[1]);
    4736   iLevel     *= m_puiQuantMtx[0];
    4737   iLevel      = (iLevel + iOffset)>>iBits;
    4738  
    4739   if( iLevel != 0)
    4740   {
    4741     uiAbsSum   += iLevel;
    4742     iLevel     ^= iSign;
    4743     iLevel     -= iSign;
    4744     pDstCoef[1] = iLevel;
    4745   }
    4746   else
    4747   {
    4748     pDstCoef[1] = 0;
    4749   }
    4750  
    4751   iSign       = plSrcCoef[2]>>31;
    4752   iLevel      = abs(plSrcCoef[2]);
    4753   iLevel     *= m_puiQuantMtx[0];
    4754   iLevel      = (iLevel + iOffset)>>iBits;
    4755  
    4756   if( iLevel != 0)
    4757   {
    4758     uiAbsSum   += iLevel;
    4759     iLevel     ^= iSign;
    4760     iLevel     -= iSign;
    4761     pDstCoef[2] = iLevel;
    4762   }
    4763   else
    4764   {
    4765     pDstCoef[2] = 0;
    4766   }
    4767  
    4768   iSign       = plSrcCoef[3]>>31;
    4769   iLevel      = abs(plSrcCoef[3]);
    4770   iLevel     *= m_puiQuantMtx[0];
    4771   iLevel      = (iLevel + iOffset)>>iBits;
    4772  
    4773   if( iLevel != 0)
    4774   {
    4775     uiAbsSum   += iLevel;
    4776     iLevel     ^= iSign;
    4777     iLevel     -= iSign;
    4778     pDstCoef[3] = iLevel;
    4779   }
    4780   else
    4781   {
    4782     pDstCoef[3] = 0;
    4783   }
    4784 }
    4785 
    4786 Void TComTrQuant::xQuant4x4( TComDataCU* pcCU, Long* plSrcCoef, TCoeff*& pDstCoef, UInt& uiAbsSum, TextType eTType, UInt uiAbsPartIdx )
    4787 {
    4788   if ( m_bUseRDOQ && (eTType == TEXT_LUMA || RDOQ_CHROMA) )
    4789   {
    4790     if ( m_iSymbolMode == 0)
    4791       xRateDistOptQuant_LCEC(pcCU, plSrcCoef, pDstCoef, 4, 4, uiAbsSum, eTType, uiAbsPartIdx );
    4792     else
    4793       xRateDistOptQuant(pcCU, plSrcCoef, pDstCoef, 4, 4, uiAbsSum, eTType, uiAbsPartIdx );
    4794   }
    4795   else
    4796   {
    4797     for( Int n = 0; n < 16; n++ )
    4798     {
    4799       Int iLevel, iSign;
    4800       iLevel  = plSrcCoef[n];
    4801       iSign   = iLevel;
    4802       iLevel  = abs( iLevel ) * m_puiQuantMtx[n];
    4803      
    4804       iLevel      = ( iLevel + m_cQP.m_iAdd4x4 ) >> m_cQP.m_iBits;
    4805      
    4806       if( 0 != iLevel )
     2010  xT( uiMode, pcResidual, uiStride, m_plTempCoeff, uiWidth, uiHeight );
     2011  xQuant( pcCU, m_plTempCoeff, rpcCoeff,
     2012#if ADAPTIVE_QP_SELECTION
     2013       rpcArlCoeff,
     2014#endif
     2015       uiWidth, uiHeight, uiAbsSum, eTType, uiAbsPartIdx );
     2016}
     2017
     2018#if LOSSLESS_CODING
     2019Void TComTrQuant::invtransformNxN( TComDataCU* pcCU, TextType eText, UInt uiMode,Pel* rpcResidual, UInt uiStride, TCoeff*   pcCoeff, UInt uiWidth, UInt uiHeight,  Int scalingListType)
     2020#else
     2021Void TComTrQuant::invtransformNxN(                   TextType eText, UInt uiMode,Pel*& rpcResidual, UInt uiStride, TCoeff*   pcCoeff, UInt uiWidth, UInt uiHeight, Int scalingListType)
     2022#endif
     2023{
     2024#if LOSSLESS_CODING
     2025  if((m_cQP.qp() == 0) && (pcCU->getSlice()->getSPS()->getUseLossless()))
     2026  {
     2027    for (UInt k = 0; k<uiHeight; k++)
     2028    {
     2029      for (UInt j = 0; j<uiWidth; j++)
    48072030      {
    4808         iSign     >>= 31;
    4809         uiAbsSum   += iLevel;
    4810         iLevel     ^= iSign;
    4811         iLevel     -= iSign;
    4812         pDstCoef[n] = iLevel;
    4813       }
    4814       else
    4815       {
    4816         pDstCoef [n] = 0;
    4817       }
    4818     }
    4819   }
    4820 }
    4821 
    4822 Void TComTrQuant::xQuant8x8( TComDataCU* pcCU, Long* plSrcCoef, TCoeff*& pDstCoef, UInt& uiAbsSum, TextType eTType, UInt uiAbsPartIdx )
    4823 {
    4824   Int iBit = m_cQP.m_iBits + 1;
    4825  
    4826   if ( m_bUseRDOQ && (eTType == TEXT_LUMA || RDOQ_CHROMA) )
    4827   {
    4828     if ( m_iSymbolMode == 0)
    4829       xRateDistOptQuant_LCEC(pcCU, plSrcCoef, pDstCoef, 8, 8, uiAbsSum, eTType, uiAbsPartIdx );
    4830     else
    4831       xRateDistOptQuant(pcCU, plSrcCoef, pDstCoef, 8, 8, uiAbsSum, eTType, uiAbsPartIdx );
    4832   }
    4833   else
    4834   {
    4835     for( Int n = 0; n < 64; n++ )
    4836     {
    4837       Int iLevel, iSign;
    4838      
    4839       iLevel  = plSrcCoef[n];
    4840       iSign   = iLevel;
    4841       iLevel  = abs( iLevel ) * m_puiQuantMtx[n];
    4842      
    4843       iLevel      = ( iLevel + m_cQP.m_iAdd8x8 ) >> iBit;
    4844      
    4845       if( 0 != iLevel )
    4846       {
    4847         iSign     >>= 31;
    4848         uiAbsSum   += iLevel;
    4849         iLevel     ^= iSign;
    4850         iLevel     -= iSign;
    4851         pDstCoef[n] = iLevel;
    4852       }
    4853       else
    4854       {
    4855         pDstCoef [n] = 0;
    4856       }
    4857     }
    4858   }
    4859 }
    4860 
    4861 Void TComTrQuant::xIT2( Long* plCoef, Pel* pResidual, UInt uiStride )
    4862 {
    4863   Int itemp, itmp1, itmp2;
    4864   Int iSign;
    4865   UInt uiBits = 5;
    4866   UInt uiOffset = 1<<(uiBits-1);
    4867  
    4868   itmp1 = plCoef[0] + plCoef[2];
    4869   itmp2 = plCoef[1] + plCoef[3];
    4870  
    4871   itemp = itmp1 + itmp2;
    4872   iSign = itemp>>31;
    4873   pResidual[0] = (abs(itemp) + uiOffset)>>uiBits;
    4874   pResidual[0] ^= iSign;
    4875   pResidual[0] -= iSign;
    4876  
    4877   itemp = itmp1 - itmp2;
    4878   iSign = itemp>>31;
    4879   pResidual[1] = (abs(itemp) + uiOffset)>>uiBits;
    4880   pResidual[1] ^= iSign;
    4881   pResidual[1] -= iSign;
    4882  
    4883   itmp1 = plCoef[0] - plCoef[2];
    4884   itmp2 = plCoef[1] - plCoef[3];
    4885  
    4886   itemp = itmp1 + itmp2;
    4887   iSign = itemp>>31;
    4888   pResidual[uiStride] = (abs(itemp) + uiOffset)>>uiBits;
    4889   pResidual[uiStride] ^= iSign;
    4890   pResidual[uiStride] -= iSign;
    4891  
    4892   itemp = itmp1 - itmp2;
    4893   iSign = itemp>>31;
    4894   pResidual[uiStride+1] = (abs(itemp) + uiOffset)>>uiBits;
    4895   pResidual[uiStride+1] ^= iSign;
    4896   pResidual[uiStride+1] -= iSign;
    4897 }
    4898 
    4899 Void TComTrQuant::xIT4( Long* plCoef, Pel* pResidual, UInt uiStride )
    4900 {
    4901   Int aai[4][4];
    4902   Int tmp1, tmp2;
    4903   Int x, y;
    4904   Int uiStride2=(uiStride<<1);
    4905   Int uiStride3=uiStride2 + uiStride;
    4906  
    4907   for( x = 0; x < 4; x++, plCoef+=4 )
    4908   {
    4909     tmp1 = plCoef[0] + plCoef[2];
    4910     tmp2 = (plCoef[3]>>1) + plCoef[1];
    4911    
    4912     aai[0][x] = tmp1 + tmp2;
    4913     aai[3][x] = tmp1 - tmp2;
    4914    
    4915     tmp1 = plCoef[0] - plCoef[2];
    4916     tmp2 = (plCoef[1]>>1) - plCoef[3];
    4917    
    4918     aai[1][x] = tmp1 + tmp2;
    4919     aai[2][x] = tmp1 - tmp2;
    4920   }
    4921  
    4922   for( y = 0; y < 4; y++, pResidual ++ )
    4923   {
    4924     tmp1 =  aai[y][0] + aai[y][2];
    4925     tmp2 = (aai[y][3]>>1) + aai[y][1];
    4926    
    4927     pResidual[0]         =  xRound( tmp1 + tmp2);
    4928     pResidual[uiStride3] =  xRound( tmp1 - tmp2);
    4929    
    4930     tmp1 =  aai[y][0] - aai[y][2];
    4931     tmp2 = (aai[y][1]>>1) - aai[y][3];
    4932    
    4933     pResidual[uiStride]  =  xRound( tmp1 + tmp2);
    4934     pResidual[uiStride2] =  xRound( tmp1 - tmp2);
    4935   }
    4936 }
    4937 
    4938 Void TComTrQuant::xIT8( Long* plCoef, Pel* pResidual, UInt uiStride )
    4939 {
    4940   Long aai[8][8];
    4941   Int n;
    4942 #ifdef TRANS_PRECISION_EXT
    4943 #if FULL_NBIT
    4944   Int uiBitDepthIncrease=g_iShift8x8-g_uiBitIncrement-g_uiBitDepth+8;
    4945 #else
    4946   Int uiBitDepthIncrease=g_iShift8x8-g_uiBitIncrement;
    4947 #endif
    4948   Int offset = (uiBitDepthIncrease==0)? 0:(1<<(uiBitDepthIncrease-1));
    4949 #endif
    4950   UInt uiStride2 = uiStride<<1;
    4951   UInt uiStride3 = uiStride2 + uiStride;
    4952   UInt uiStride4 = uiStride3 + uiStride;
    4953   UInt uiStride5 = uiStride4 + uiStride;
    4954   UInt uiStride6 = uiStride5 + uiStride;
    4955   UInt uiStride7 = uiStride6 + uiStride;
    4956  
    4957   for( n = 0; n < 8; n++ )
    4958   {
    4959     Long* pi = plCoef + (n<<3);
    4960     Long     ai1[8];
    4961     Long     ai2[8];
    4962 #ifdef TRANS_PRECISION_EXT
    4963     Long     ai0[8];
    4964     ai0[0] =  pi[0]<<uiBitDepthIncrease;
    4965     ai0[1] =  pi[1]<<uiBitDepthIncrease;
    4966     ai0[2] =  pi[2]<<uiBitDepthIncrease;
    4967     ai0[3] =  pi[3]<<uiBitDepthIncrease;
    4968     ai0[4] =  pi[4]<<uiBitDepthIncrease;
    4969     ai0[5] =  pi[5]<<uiBitDepthIncrease;
    4970     ai0[6] =  pi[6]<<uiBitDepthIncrease;
    4971     ai0[7] =  pi[7]<<uiBitDepthIncrease;
    4972     ai1[0] = ai0[0] + ai0[4];
    4973     ai1[2] = ai0[0] - ai0[4];
    4974    
    4975     ai1[4] = (ai0[2]>>1) -  ai0[6];
    4976     ai1[6] =  ai0[2]     + (ai0[6]>>1);
    4977    
    4978     ai1[1] = ai0[5] - ai0[3] - ai0[7] - (ai0[7]>>1);
    4979     ai1[3] = ai0[1] + ai0[7] - ai0[3] - (ai0[3]>>1);;
    4980     ai1[5] = ai0[7] - ai0[1] + ai0[5] + (ai0[5]>>1);
    4981     ai1[7] = ai0[3] + ai0[5] + ai0[1] + (ai0[1]>>1);
    4982 #else
    4983     ai1[0] = pi[0] + pi[4];
    4984     ai1[2] = pi[0] - pi[4];
    4985    
    4986     ai1[4] = (pi[2]>>1) -  pi[6];
    4987     ai1[6] =  pi[2]     + (pi[6]>>1);
    4988    
    4989     ai1[1] = pi[5] - pi[3] - pi[7] - (pi[7]>>1);
    4990     ai1[3] = pi[1] + pi[7] - pi[3] - (pi[3]>>1);;
    4991     ai1[5] = pi[7] - pi[1] + pi[5] + (pi[5]>>1);
    4992     ai1[7] = pi[3] + pi[5] + pi[1] + (pi[1]>>1);
    4993 #endif
    4994     ai2[0] = ai1[0] + ai1[6];
    4995     ai2[6] = ai1[0] - ai1[6];
    4996    
    4997     ai2[2] = ai1[2] + ai1[4];
    4998     ai2[4] = ai1[2] - ai1[4];
    4999    
    5000     ai2[1] = ai1[1] + (ai1[7]>>2);
    5001     ai2[7] = ai1[7] - (ai1[1]>>2);
    5002    
    5003     ai2[3] =  ai1[3]     + (ai1[5]>>2);
    5004     ai2[5] = (ai1[3]>>2) -  ai1[5];
    5005    
    5006     aai[n][0] = ai2[0] + ai2[7];
    5007     aai[n][1] = ai2[2] + ai2[5];
    5008     aai[n][2] = ai2[4] + ai2[3];
    5009     aai[n][3] = ai2[6] + ai2[1];
    5010     aai[n][4] = ai2[6] - ai2[1];
    5011     aai[n][5] = ai2[4] - ai2[3];
    5012     aai[n][6] = ai2[2] - ai2[5];
    5013     aai[n][7] = ai2[0] - ai2[7];
    5014   }
    5015  
    5016   for( n = 0; n < 8; n++, pResidual++ )
    5017   {
    5018     Int ai1[8];
    5019     Int ai2[8];
    5020    
    5021     ai1[0] =  aai[0][n]     +  aai[4][n];
    5022     ai1[1] =  aai[5][n]     -  aai[3][n]     - aai[7][n] - (aai[7][n]>>1);
    5023     ai1[2] =  aai[0][n]     -  aai[4][n];
    5024     ai1[3] =  aai[1][n]     +  aai[7][n]     - aai[3][n] - (aai[3][n]>>1);
    5025     ai1[4] = (aai[2][n]>>1) -  aai[6][n];
    5026     ai1[5] =  aai[7][n]     -  aai[1][n]     + aai[5][n] + (aai[5][n]>>1);
    5027     ai1[6] =  aai[2][n]     + (aai[6][n]>>1);
    5028     ai1[7] =  aai[3][n]     +  aai[5][n]     + aai[1][n] + (aai[1][n]>>1);
    5029    
    5030     ai2[2] = ai1[2] + ai1[4];
    5031     ai2[4] = ai1[2] - ai1[4];
    5032    
    5033     ai2[0] = ai1[0] + ai1[6];
    5034     ai2[6] = ai1[0] - ai1[6];
    5035    
    5036     ai2[1] = ai1[1] + (ai1[7]>>2);
    5037     ai2[7] = ai1[7] - (ai1[1]>>2);
    5038    
    5039     ai2[3] =  ai1[3]     + (ai1[5]>>2);
    5040     ai2[5] = (ai1[3]>>2) -  ai1[5];
    5041    
    5042     pResidual[        0] = xRound( ai2[0] + ai2[7] );
    5043     pResidual[uiStride ] = xRound( ai2[2] + ai2[5] );
    5044     pResidual[uiStride2] = xRound( ai2[4] + ai2[3] );
    5045     pResidual[uiStride3] = xRound( ai2[6] + ai2[1] );
    5046     pResidual[uiStride4] = xRound( ai2[6] - ai2[1] );
    5047     pResidual[uiStride5] = xRound( ai2[4] - ai2[3] );
    5048     pResidual[uiStride6] = xRound( ai2[2] - ai2[5] );
    5049     pResidual[uiStride7] = xRound( ai2[0] - ai2[7] );
    5050    
    5051 #ifdef TRANS_PRECISION_EXT
    5052     pResidual[        0] =  (pResidual[        0]+offset)>>uiBitDepthIncrease;
    5053     pResidual[uiStride ] =  (pResidual[uiStride ]+offset)>>uiBitDepthIncrease;
    5054     pResidual[uiStride2] =  (pResidual[uiStride2]+offset)>>uiBitDepthIncrease;
    5055     pResidual[uiStride3] =  (pResidual[uiStride3]+offset)>>uiBitDepthIncrease;
    5056     pResidual[uiStride4] =  (pResidual[uiStride4]+offset)>>uiBitDepthIncrease;
    5057     pResidual[uiStride5] =  (pResidual[uiStride5]+offset)>>uiBitDepthIncrease;
    5058     pResidual[uiStride6] =  (pResidual[uiStride6]+offset)>>uiBitDepthIncrease;
    5059     pResidual[uiStride7] =  (pResidual[uiStride7]+offset)>>uiBitDepthIncrease;
    5060 #endif
    5061   }
    5062 }
    5063 
    5064 Void TComTrQuant::xDeQuant2x2( TCoeff* pSrcCoef, Long*& rplDstCoef )
    5065 {
    5066   Int iDeScale = g_aiDequantCoef4[m_cQP.m_iRem];
    5067  
    5068   if( pSrcCoef[0] != 0 )
    5069   {
    5070     rplDstCoef[0] = pSrcCoef[0]*iDeScale<<m_cQP.per();
    5071   }
    5072   else
    5073   {
    5074     rplDstCoef[0] = 0;
    5075   }
    5076  
    5077   if( pSrcCoef[1] != 0 )
    5078   {
    5079     rplDstCoef[1] = pSrcCoef[1]*iDeScale<<m_cQP.per();
    5080   }
    5081   else
    5082   {
    5083     rplDstCoef[1] = 0;
    5084   }
    5085  
    5086   if( pSrcCoef[2] != 0 )
    5087   {
    5088     rplDstCoef[2] = pSrcCoef[2]*iDeScale<<m_cQP.per();
    5089   }
    5090   else
    5091   {
    5092     rplDstCoef[2] = 0;
    5093   }
    5094  
    5095   if( pSrcCoef[3] != 0 )
    5096   {
    5097     rplDstCoef[3] = pSrcCoef[3]*iDeScale<<m_cQP.per();
    5098   }
    5099   else
    5100   {
    5101     rplDstCoef[3] = 0;
    5102   }
    5103 }
    5104 
    5105 Void TComTrQuant::xDeQuant4x4( TCoeff* pSrcCoef, Long*& rplDstCoef )
    5106 {
    5107   Int iLevel;
    5108   Int iDeScale;
    5109  
    5110   for( Int n = 0; n < 16; n++ )
    5111   {
    5112     iLevel  = pSrcCoef[n];
    5113    
    5114     if( 0 != iLevel )
    5115     {
    5116       iDeScale = g_aiDequantCoef[m_cQP.m_iRem][n];
    5117      
    5118       rplDstCoef[n] = iLevel*iDeScale << m_cQP.m_iPer;
    5119     }
    5120     else
    5121     {
    5122       rplDstCoef[n] = 0;
    5123     }
    5124   }
    5125 }
    5126 
    5127 Void TComTrQuant::xDeQuant8x8( TCoeff* pSrcCoef, Long*& rplDstCoef )
    5128 {
    5129   Int iLevel;
    5130   Int iDeScale;
    5131  
    5132   Int iAdd = ( 1 << 5 ) >> m_cQP.m_iPer;
    5133  
    5134   for( Int n = 0; n < 64; n++ )
    5135   {
    5136     iLevel  = pSrcCoef[n];
    5137    
    5138     if( 0 != iLevel )
    5139     {
    5140       iDeScale = g_aiDequantCoef64[m_cQP.m_iRem][n];
    5141       rplDstCoef[n]   = ( (iLevel*iDeScale*16 + iAdd) << m_cQP.m_iPer ) >> 6;
    5142     }
    5143     else
    5144     {
    5145       rplDstCoef[n] = 0;
    5146     }
    5147   }
    5148 }
    5149 #endif //!E243_CORE_TRANSFORMS
    5150 
    5151 Void TComTrQuant::invRecurTransformNxN( TComDataCU* pcCU, UInt uiAbsPartIdx, TextType eTxt, Pel*& rpcResidual, UInt uiAddr, UInt uiStride, UInt uiWidth, UInt uiHeight, UInt uiMaxTrMode, UInt uiTrMode, TCoeff* rpcCoeff )
     2031        rpcResidual[k*uiStride+j] = pcCoeff[k*uiWidth+j];
     2032      }
     2033    }
     2034    return;
     2035  }
     2036#endif
     2037  xDeQuant( pcCoeff, m_plTempCoeff, uiWidth, uiHeight, scalingListType);
     2038  xIT( uiMode, m_plTempCoeff, rpcResidual, uiStride, uiWidth, uiHeight );
     2039}
     2040
     2041Void TComTrQuant::invRecurTransformNxN( TComDataCU* pcCU, UInt uiAbsPartIdx, TextType eTxt, Pel* rpcResidual, UInt uiAddr, UInt uiStride, UInt uiWidth, UInt uiHeight, UInt uiMaxTrMode, UInt uiTrMode, TCoeff* rpcCoeff )
    51522042{
    51532043  if( !pcCU->getCbf(uiAbsPartIdx, eTxt, uiTrMode) )
     2044  {
    51542045    return;
     2046  }
    51552047 
    51562048  UInt uiLumaTrMode, uiChromaTrMode;
     
    51582050  const UInt uiStopTrMode = eTxt == TEXT_LUMA ? uiLumaTrMode : uiChromaTrMode;
    51592051 
    5160   assert(1); // as long as quadtrees are not used for residual transform
    5161  
    51622052  if( uiTrMode == uiStopTrMode )
    51632053  {
    51642054    UInt uiDepth      = pcCU->getDepth( uiAbsPartIdx ) + uiTrMode;
    51652055    UInt uiLog2TrSize = g_aucConvertToBit[ pcCU->getSlice()->getSPS()->getMaxCUWidth() >> uiDepth ] + 2;
    5166     if( eTxt != TEXT_LUMA && uiLog2TrSize == pcCU->getSlice()->getSPS()->getQuadtreeTULog2MinSize() )
     2056    if( eTxt != TEXT_LUMA && uiLog2TrSize == 2 )
    51672057    {
    51682058      UInt uiQPDiv = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
     
    51752065    }
    51762066    Pel* pResi = rpcResidual + uiAddr;
    5177 #if INTRA_DST_TYPE_7
    5178     invtransformNxN( eTxt, REG_DCT, pResi, uiStride, rpcCoeff, uiWidth, uiHeight );
    5179 #else
    5180     invtransformNxN( pResi, uiStride, rpcCoeff, uiWidth, uiHeight );
     2067    if( pcCU->useNonSquareTrans( uiTrMode, uiAbsPartIdx ) )
     2068    {
     2069      Int trWidth  = uiWidth;
     2070      Int trHeight = uiHeight;
     2071      pcCU->getNSQTSize( uiTrMode, uiAbsPartIdx, trWidth, trHeight );
     2072
     2073      uiWidth  = trWidth;
     2074      uiHeight = trHeight;
     2075    }
     2076    Int scalingListType = (pcCU->isIntra(uiAbsPartIdx) ? 0 : 3) + g_eTTable[(Int)eTxt];
     2077    assert(scalingListType < 6);
     2078#if LOSSLESS_CODING
     2079    invtransformNxN( pcCU, eTxt, REG_DCT, pResi, uiStride, rpcCoeff, uiWidth, uiHeight, scalingListType );
     2080#else 
     2081    invtransformNxN(       eTxt, REG_DCT, pResi, uiStride, rpcCoeff, uiWidth, uiHeight, scalingListType );
    51812082#endif
    51822083  }
     
    51862087    uiWidth  >>= 1;
    51872088    uiHeight >>= 1;
    5188     UInt uiAddrOffset = uiHeight * uiStride;
    5189     UInt uiCoefOffset = uiWidth * uiHeight;
    5190     UInt uiPartOffset = pcCU->getTotalNumPart() >> (uiTrMode<<1);
    5191     invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr                         , uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff ); rpcCoeff += uiCoefOffset; uiAbsPartIdx += uiPartOffset;
    5192     invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr + uiWidth               , uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff ); rpcCoeff += uiCoefOffset; uiAbsPartIdx += uiPartOffset;
    5193     invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr + uiAddrOffset          , uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff ); rpcCoeff += uiCoefOffset; uiAbsPartIdx += uiPartOffset;
    5194     invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr + uiAddrOffset + uiWidth, uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff );
     2089    Int trWidth = uiWidth, trHeight = uiHeight;
     2090    Int trLastWidth = uiWidth << 1, trLastHeight = uiHeight << 1;
     2091    pcCU->getNSQTSize ( uiTrMode, uiAbsPartIdx, trWidth, trHeight );
     2092    pcCU->getNSQTSize ( uiTrMode - 1, uiAbsPartIdx, trLastWidth, trLastHeight );
     2093    UInt uiAddrOffset = trHeight * uiStride;
     2094    UInt uiCoefOffset = trWidth * trHeight;
     2095    UInt uiPartOffset = pcCU->getTotalNumPart() >> ( uiTrMode << 1 );   
     2096    UInt uiInterTUSplitDirection = pcCU->getInterTUSplitDirection ( trWidth, trHeight, trLastWidth, trLastHeight );
     2097    if( uiInterTUSplitDirection != 2 )
     2098    {
     2099      invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr                                                                                            , uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff ); rpcCoeff += uiCoefOffset; uiAbsPartIdx += uiPartOffset;
     2100      invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr +     trWidth * uiInterTUSplitDirection +     uiAddrOffset * ( 1 - uiInterTUSplitDirection), uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff ); rpcCoeff += uiCoefOffset; uiAbsPartIdx += uiPartOffset;
     2101      invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr + 2 * trWidth * uiInterTUSplitDirection + 2 * uiAddrOffset * ( 1 - uiInterTUSplitDirection), uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff ); rpcCoeff += uiCoefOffset; uiAbsPartIdx += uiPartOffset;
     2102      invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr + 3 * trWidth * uiInterTUSplitDirection + 3 * uiAddrOffset * ( 1 - uiInterTUSplitDirection), uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff );
     2103    }
     2104    else
     2105    {
     2106      invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr                         , uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff ); rpcCoeff += uiCoefOffset; uiAbsPartIdx += uiPartOffset;
     2107      invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr + trWidth               , uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff ); rpcCoeff += uiCoefOffset; uiAbsPartIdx += uiPartOffset;
     2108      invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr + uiAddrOffset          , uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff ); rpcCoeff += uiCoefOffset; uiAbsPartIdx += uiPartOffset;
     2109      invRecurTransformNxN( pcCU, uiAbsPartIdx, eTxt, rpcResidual, uiAddr + uiAddrOffset + trWidth, uiStride, uiWidth, uiHeight, uiMaxTrMode, uiTrMode, rpcCoeff );
     2110    }
    51952111  }
    51962112}
     
    52002116// ------------------------------------------------------------------------------------------------
    52012117
    5202 #if E243_CORE_TRANSFORMS
    52032118/** Wrapper function between HM interface and core NxN forward transform (2D)
    52042119 *  \param piBlkResi input data (residual)
     
    52082123 *  \param uiMode is Intra Prediction mode used in Mode-Dependent DCT/DST only
    52092124 */
    5210 #if INTRA_DST_TYPE_7
    5211 Void TComTrQuant::xT( UInt uiMode, Pel* piBlkResi, UInt uiStride, Long* psCoeff, Int iSize )
    5212 #else
    5213 Void TComTrQuant::xT( Pel* piBlkResi, UInt uiStride, Long* psCoeff, Int iSize )
    5214 #endif
     2125Void TComTrQuant::xT( UInt uiMode, Pel* piBlkResi, UInt uiStride, Int* psCoeff, Int iWidth, Int iHeight )
    52152126{
    52162127#if MATRIX_MULT 
    5217 #if INTRA_DST_TYPE_7
     2128  Int iSize = iWidth;
     2129  if( iWidth != iHeight)
     2130  {
     2131    xTrMxN( piBlkResi, psCoeff, uiStride, (UInt)iWidth, (UInt)iHeight );
     2132    return;
     2133  }
    52182134  xTr(piBlkResi,psCoeff,uiStride,(UInt)iSize,uiMode);
    52192135#else
    5220   xTr(piBlkResi,psCoeff,uiStride,(UInt)iSize);
    5221 #endif
    5222 #else
    5223   Int j,k;
     2136#if UNIFIED_TRANSFORM
     2137  Int j;
     2138#else
     2139  Int iSize = iWidth;
     2140  if( iWidth != iHeight)
     2141#endif
     2142  {
     2143    short block[ 64 * 64 ];
     2144    short coeff[ 64 * 64 ];
     2145    {
     2146      for (j = 0; j < iHeight; j++)
     2147      {   
     2148        memcpy( block + j * iWidth, piBlkResi + j * uiStride, iWidth * sizeof( short ) );     
     2149      }
     2150    }
     2151#if UNIFIED_TRANSFORM
     2152    xTrMxN( block, coeff, iWidth, iHeight, uiMode );
     2153#else
     2154    xTrMxN( block, coeff, iWidth, iHeight );
     2155#endif
     2156    for ( j = 0; j < iHeight * iWidth; j++ )
     2157    {   
     2158      psCoeff[ j ] = coeff[ j ];
     2159    }
     2160    return ;
     2161  }
     2162#if !UNIFIED_TRANSFORM
    52242163  if (iSize==4)
    52252164  {   
     
    52302169      memcpy(block[j],piBlkResi+j*uiStride,4*sizeof(short));     
    52312170    }
    5232 #if INTRA_DST_TYPE_7
    52332171    xTr4(block,coeff,uiMode);
    5234 #else
    5235     xTr4(block,coeff);     
    5236 #endif
    52372172    for (j=0; j<4; j++)
    52382173    {   
     
    52982233    }
    52992234  }