source: 3DVCSoftware/trunk/source/Lib/TLibCommon/TComTrQuant.cpp @ 2

Last change on this file since 2 was 2, checked in by hhi, 13 years ago

inital import

  • Property svn:eol-style set to native
File size: 214.1 KB
Line 
1
2
3/** \file     TComTrQuant.cpp
4    \brief    transform and quantization class
5*/
6
7#include <stdlib.h>
8#include <math.h>
9#include <memory.h>
10#include "TComTrQuant.h"
11#include "TComPic.h"
12#include "ContextTables.h"
13
14// ====================================================================================================================
15// Constants
16// ====================================================================================================================
17
18#define RDOQ_CHROMA                 1           ///< use of RDOQ in chroma
19
20#define DQ_BITS                     6
21#define Q_BITS_8                    16
22#define SIGN_BITS                   1
23
24// ====================================================================================================================
25// Tables
26// ====================================================================================================================
27
28// RDOQ parameter
29Int entropyBits[128]=
30{
31  895,    943,    994,   1048,   1105,   1165,   1228,   1294,
32  1364,   1439,   1517,   1599,   1686,   1778,   1875,   1978,
33  2086,   2200,   2321,   2448,   2583,   2725,   2876,   3034,
34  3202,   3380,   3568,   3767,   3977,   4199,   4435,   4684,
35  4948,   5228,   5525,   5840,   6173,   6527,   6903,   7303,
36  7727,   8178,   8658,   9169,   9714,  10294,  10914,  11575,
37  12282,  13038,  13849,  14717,  15650,  16653,  17734,  18899,
38  20159,  21523,  23005,  24617,  26378,  28306,  30426,  32768,
39  32768,  35232,  37696,  40159,  42623,  45087,  47551,  50015,
40  52479,  54942,  57406,  59870,  62334,  64798,  67262,  69725,
41  72189,  74653,  77117,  79581,  82044,  84508,  86972,  89436,
42  91900,  94363,  96827,  99291, 101755, 104219, 106683, 109146,
43  111610, 114074, 116538, 119002, 121465, 123929, 126393, 128857,
44  131321, 133785, 136248, 138712, 141176, 143640, 146104, 148568,
45  151031, 153495, 155959, 158423, 160887, 163351, 165814, 168278,
46  170742, 173207, 175669, 178134, 180598, 183061, 185525, 187989
47};
48
49static const Int estErr4x4[6][4][4]=
50{
51  {
52    {25600, 27040, 25600, 27040},
53    {27040, 25600, 27040, 25600},
54    {25600, 27040, 25600, 27040},
55    {27040, 25600, 27040, 25600}
56  },
57  {
58    {30976, 31360, 30976, 31360},
59    {31360, 32400, 31360, 32400},
60    {30976, 31360, 30976, 31360},
61    {31360, 32400, 31360, 32400}
62  },
63  {
64    {43264, 40960, 43264, 40960},
65    {40960, 40000, 40960, 40000},
66    {43264, 40960, 43264, 40960},
67    {40960, 40000, 40960, 40000}
68  },
69  {
70    {50176, 51840, 50176, 51840},
71    {51840, 52900, 51840, 52900},
72    {50176, 51840, 50176, 51840},
73    {51840, 52900, 51840, 52900}
74  },
75  {
76    {65536, 64000, 65536, 64000},
77    {64000, 62500, 64000, 62500},
78    {65536, 64000, 65536, 64000},
79    {64000, 62500, 64000, 62500}
80  },
81  {
82    {82944, 84640, 82944, 84640},
83    {84640, 84100, 84640, 84100},
84    {82944, 84640, 82944, 84640},
85    {84640, 84100, 84640, 84100}
86  }
87};
88
89static const Int estErr8x8[6][8][8]={
90  {
91    {6553600, 6677056, 6400000, 6677056, 6553600, 6677056, 6400000, 6677056},
92    {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
93    {6400000, 6658560, 6553600, 6658560, 6400000, 6658560, 6553600, 6658560},
94    {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
95    {6553600, 6677056, 6400000, 6677056, 6553600, 6677056, 6400000, 6677056},
96    {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201},
97    {6400000, 6658560, 6553600, 6658560, 6400000, 6658560, 6553600, 6658560},
98    {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201}
99  },
100  {
101    {7929856, 8156736, 8028160, 8156736, 7929856, 8156736, 8028160, 8156736},
102    {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
103    {8028160, 7814560, 7840000, 7814560, 8028160, 7814560, 7840000, 7814560},
104    {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
105    {7929856, 8156736, 8028160, 8156736, 7929856, 8156736, 8028160, 8156736},
106    {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770},
107    {8028160, 7814560, 7840000, 7814560, 8028160, 7814560, 7840000, 7814560},
108    {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770}
109  },
110  {
111    {11075584, 10653696, 11151360, 10653696, 11075584, 10653696, 11151360, 10653696},
112    {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
113    {11151360, 11109160, 11289600, 11109160, 11151360, 11109160, 11289600, 11109160},
114    {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
115    {11075584, 10653696, 11151360, 10653696, 11075584, 10653696, 11151360, 10653696},
116    {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652},
117    {11151360, 11109160, 11289600, 11109160, 11151360, 11109160, 11289600, 11109160},
118    {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652}
119  },
120  {
121    {12845056, 12503296, 12544000, 12503296, 12845056, 12503296, 12544000, 12503296},
122    {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
123    {12544000, 12588840, 12960000, 12588840, 12544000, 12588840, 12960000, 12588840},
124    {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
125    {12845056, 12503296, 12544000, 12503296, 12845056, 12503296, 12544000, 12503296},
126    {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156},
127    {12544000, 12588840, 12960000, 12588840, 12544000, 12588840, 12960000, 12588840},
128    {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156}
129  },
130  {
131    {16777216, 16646400, 16384000, 16646400, 16777216, 16646400, 16384000, 16646400},
132    {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
133    {16384000, 16692640, 16646400, 16692640, 16384000, 16692640, 16646400, 16692640},
134    {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
135    {16777216, 16646400, 16384000, 16646400, 16777216, 16646400, 16384000, 16646400},
136    {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116},
137    {16384000, 16692640, 16646400, 16692640, 16384000, 16692640, 16646400, 16692640},
138    {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116}
139  },
140  {
141    {21233664, 21381376, 21667840, 21381376, 21233664, 21381376, 21667840, 21381376},
142    {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
143    {21667840, 21374440, 21529600, 21374440, 21667840, 21374440, 21529600, 21374440},
144    {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
145    {21233664, 21381376, 21667840, 21381376, 21233664, 21381376, 21667840, 21381376},
146    {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376},
147    {21667840, 21374440, 21529600, 21374440, 21667840, 21374440, 21529600, 21374440},
148    {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376}
149  }
150};
151
152#if QC_MOD_LCEC
153#if CAVLC_COEF_LRG_BLK
154  static const int VLClength[14][128] = {
155#else
156  static const int VLClength[13][128] = {
157#endif
158    { 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},
159    { 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},
160    { 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},
161    { 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},
162    { 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},
163    { 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},
164    { 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},
165    { 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},
166    { 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},
167    { 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},
168    { 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},
169
170    { 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},
171    { 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}
172#if CAVLC_COEF_LRG_BLK
173    ,{ 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}
174#endif
175  };
176#endif
177static const Int estErr16x16[6] = { 25329, 30580, 42563, 49296, 64244, 82293 };
178static const Int estErr32x32[6] = { 25351, 30674, 42843, 49687, 64898, 82136 };
179
180// ====================================================================================================================
181// Qp class member functions
182// ====================================================================================================================
183
184QpParam::QpParam()
185{
186}
187
188Void QpParam::initOffsetParam( Int iStartQP, Int iEndQP )
189{
190  Int iDefaultOffset;
191  Int iDefaultOffset_LTR;
192 
193  Int iPer;
194 
195  for (Int iQP = iStartQP; iQP <= iEndQP; iQP++)
196  {
197    for (UInt uiSliceType = 0; uiSliceType < 3; uiSliceType++)
198    {
199      Int k =  (iQP + 6*g_uiBitIncrement)/6;
200#if FULL_NBIT
201      k += g_uiBitDepth - 8;
202#endif
203     
204      Bool bLowPass = (uiSliceType == 0);
205      iDefaultOffset = (bLowPass? 10922 : 5462);
206     
207      bLowPass = (uiSliceType == 0);
208      iDefaultOffset_LTR = (bLowPass? 170 : 86);
209     
210      iPer = QP_BITS + k - QOFFSET_BITS;
211      m_aiAdd2x2[iQP][uiSliceType] = iDefaultOffset << iPer;
212      m_aiAdd4x4[iQP][uiSliceType] = iDefaultOffset << iPer;
213     
214      iPer = QP_BITS + 1 + k - QOFFSET_BITS;
215      m_aiAdd8x8[iQP][uiSliceType] = iDefaultOffset << iPer;
216     
217      iPer = ECore16Shift + k - QOFFSET_BITS_LTR;
218      m_aiAdd16x16[iQP][uiSliceType] = iDefaultOffset_LTR << iPer;
219     
220      iPer = ECore32Shift + k - QOFFSET_BITS_LTR;
221      m_aiAdd32x32[iQP][uiSliceType] = iDefaultOffset_LTR << iPer;
222    }
223  }
224}
225
226// ====================================================================================================================
227// TComTrQuant class member functions
228// ====================================================================================================================
229
230TComTrQuant::TComTrQuant()
231{
232  m_cQP.clear();
233 
234  // allocate temporary buffers
235  m_plTempCoeff  = new Long[ MAX_CU_SIZE*MAX_CU_SIZE ];
236 
237  // allocate bit estimation class  (for RDOQ)
238  m_pcEstBitsSbac = new estBitsSbacStruct;
239}
240
241TComTrQuant::~TComTrQuant()
242{
243  // delete temporary buffers
244  if ( m_plTempCoeff )
245  {
246    delete [] m_plTempCoeff;
247    m_plTempCoeff = NULL;
248  }
249 
250  // delete bit estimation class
251  if ( m_pcEstBitsSbac ) delete m_pcEstBitsSbac;
252}
253
254/// Including Chroma QP Parameter setting
255Void TComTrQuant::setQPforQuant( Int iQP, Bool bLowpass, SliceType eSliceType, TextType eTxtType)
256{
257  iQP = Max( Min( iQP, 51 ), 0 );
258 
259  if(eTxtType != TEXT_LUMA) //Chroma
260  {
261    iQP  = g_aucChromaScale[ iQP ];
262  }
263 
264  m_cQP.setQpParam( iQP, bLowpass, eSliceType, m_bEnc );
265}
266
267#if E243_CORE_TRANSFORMS
268
269#if MATRIX_MULT
270/** NxN forward transform (2D) using brute force matrix multiplication (3 nested loops)
271 *  \param block pointer to input data (residual)
272 *  \param coeff pointer to output data (transform coefficients)
273 *  \param uiStride stride of input data
274 *  \param uiTrSize transform size (uiTrSize x uiTrSize)
275 *  \param uiMode is Intra Prediction mode used in Mode-Dependent DCT/DST only
276 */
277#if INTRA_DST_TYPE_7
278void xTr(Pel *block, Long *coeff, UInt uiStride, UInt uiTrSize, UInt uiMode)
279#else
280void xTr(Pel *block, Long *coeff, UInt uiStride, UInt uiTrSize)
281#endif
282{
283  Int i,j,k,iSum;
284  Int tmp[32*32];
285  const short *iT;
286  UInt uiLog2TrSize = g_aucConvertToBit[ uiTrSize ] + 2;
287
288  if (uiTrSize==4)
289  {
290    iT  = g_aiT4[0];
291  }
292  else if (uiTrSize==8)
293  {
294    iT = g_aiT8[0];
295  }
296  else if (uiTrSize==16)
297  {
298    iT = g_aiT16[0];
299  }
300  else if (uiTrSize==32)
301  {
302    iT = g_aiT32[0];
303  }
304  else{
305    assert(0);
306  }
307
308#if FULL_NBIT
309  int shift_1st = uiLog2TrSize - 1 + g_uiBitDepth - 8; // log2(N) - 1 + g_uiBitDepth - 8
310#else
311  int shift_1st = uiLog2TrSize - 1 + g_uiBitIncrement; // log2(N) - 1 + g_uiBitIncrement
312#endif
313
314  int add_1st = 1<<(shift_1st-1);
315  int shift_2nd = uiLog2TrSize + 6;
316  int add_2nd = 1<<(shift_2nd-1);
317
318  /* Horizontal transform */
319
320#if INTRA_DST_TYPE_7
321  if (uiTrSize==4)
322  {
323    if (uiMode != REG_DCT && g_aucDCTDSTMode_Hor[uiMode])
324    {
325      iT  =  g_as_DST_MAT_4[0];
326    }
327  }
328#endif
329  for (i=0; i<uiTrSize; i++)
330  {
331    for (j=0; j<uiTrSize; j++)
332    {
333      iSum = 0;
334      for (k=0; k<uiTrSize; k++)
335      {
336        iSum += iT[i*uiTrSize+k]*block[j*uiStride+k];
337      }
338      tmp[i*uiTrSize+j] = (iSum + add_1st)>>shift_1st;
339    }
340  }
341/* Vertical transform */
342#if INTRA_DST_TYPE_7
343  if (uiTrSize==4)
344  {
345    if (uiMode != REG_DCT && g_aucDCTDSTMode_Vert[uiMode])
346    {
347      iT  =  g_as_DST_MAT_4[0];
348    }
349    else
350    {
351      iT  = g_aiT4[0];
352    }
353  }
354 #endif
355  for (i=0; i<uiTrSize; i++)
356  {                 
357    for (j=0; j<uiTrSize; j++)
358    {
359      iSum = 0;
360      for (k=0; k<uiTrSize; k++)
361      {
362        iSum += iT[i*uiTrSize+k]*tmp[j*uiTrSize+k];       
363      }
364      coeff[i*uiTrSize+j] = (iSum + add_2nd)>>shift_2nd; 
365    }
366  } 
367}
368
369/** NxN inverse transform (2D) using brute force matrix multiplication (3 nested loops)
370 *  \param coeff pointer to input data (transform coefficients)
371 *  \param block pointer to output data (residual)
372 *  \param uiStride stride of output data
373 *  \param uiTrSize transform size (uiTrSize x uiTrSize)
374 *  \param uiMode is Intra Prediction mode used in Mode-Dependent DCT/DST only
375 */
376#if INTRA_DST_TYPE_7
377void xITr(Long *coeff, Pel *block, UInt uiStride, UInt uiTrSize, UInt uiMode)
378#else
379void xITr(Long *coeff, Pel *block, UInt uiStride, UInt uiTrSize)
380#endif
381{
382  int i,j,k,iSum;
383  Int tmp[32*32];
384  const short *iT;
385  UInt uiLog2TrSize = g_aucConvertToBit[ uiTrSize ] + 2;
386  if (uiTrSize==4)
387  {
388    iT  = g_aiT4[0];
389  }
390  else if (uiTrSize==8)
391  {
392    iT = g_aiT8[0];
393  }
394  else if (uiTrSize==16)
395  {
396    iT = g_aiT16[0];
397  }
398  else if (uiTrSize==32)
399  {
400    iT = g_aiT32[0];
401  }
402  else{
403    assert(0);
404  }
405  int shift_1st = SHIFT_INV_1ST;
406  int add_1st = 1<<(shift_1st-1); 
407#if FULL_NBIT
408  int shift_2nd = SHIFT_INV_2ND - ((short)g_uiBitDepth - 8);
409#else
410  int shift_2nd = SHIFT_INV_2ND - g_uiBitIncrement;
411#endif
412  int add_2nd = 1<<(shift_2nd-1);
413#if INTRA_DST_TYPE_7
414  if (uiTrSize==4)
415  {
416    if (uiMode != REG_DCT && g_aucDCTDSTMode_Vert[uiMode] ) // Check for DCT or DST
417    {
418      iT  =  g_as_DST_MAT_4[0];
419    }
420  }
421#endif
422  /* Horizontal transform */
423  for (i=0; i<uiTrSize; i++)
424  {   
425    for (j=0; j<uiTrSize; j++)
426    {
427      iSum = 0;
428      for (k=0; k<uiTrSize; k++)
429      {       
430        iSum += iT[k*uiTrSize+i]*coeff[k*uiTrSize+j]; 
431      }
432      tmp[i*uiTrSize+j] = (iSum + add_1st)>>shift_1st;
433    }
434  }   
435#if INTRA_DST_TYPE_7
436  if (uiTrSize==4)
437  {
438    if (uiMode != REG_DCT && g_aucDCTDSTMode_Hor[uiMode] )   // Check for DCT or DST
439    {
440      iT  =  g_as_DST_MAT_4[0];
441    }
442    else 
443    {
444      iT  = g_aiT4[0];
445    }
446  }
447#endif
448  /* Vertical transform */
449  for (i=0; i<uiTrSize; i++)
450  {   
451    for (j=0; j<uiTrSize; j++)
452    {
453      iSum = 0;
454      for (k=0; k<uiTrSize; k++)
455      {       
456        iSum += iT[k*uiTrSize+j]*tmp[i*uiTrSize+k];
457      }
458      block[i*uiStride+j] = (iSum + add_2nd)>>shift_2nd;
459    }
460  }
461}
462
463#else //MATRIX_MULT
464
465/** 4x4 forward transform implemented using partial butterfly structure (1D)
466 *  \param block input data (residual)
467 *  \param coeff output data (transform coefficients)
468 *  \param shift specifies right shift after 1D transform
469 */
470void partialButterfly4(short block[4][4],short coeff[4][4],int shift)
471{
472  int j; 
473  int E[2],O[2];
474  int add = 1<<(shift-1);
475
476  for (j=0; j<4; j++)
477  {   
478    /* E and O */
479    E[0] = block[j][0] + block[j][3];
480    O[0] = block[j][0] - block[j][3];
481    E[1] = block[j][1] + block[j][2];
482    O[1] = block[j][1] - block[j][2];
483
484    coeff[0][j] = (g_aiT4[0][0]*E[0] + g_aiT4[0][1]*E[1] + add)>>shift;
485    coeff[2][j] = (g_aiT4[2][0]*E[0] + g_aiT4[2][1]*E[1] + add)>>shift;
486    coeff[1][j] = (g_aiT4[1][0]*O[0] + g_aiT4[1][1]*O[1] + add)>>shift;
487    coeff[3][j] = (g_aiT4[3][0]*O[0] + g_aiT4[3][1]*O[1] + add)>>shift;
488  }
489}
490
491#if INTRA_DST_TYPE_7
492// Fast DST Algorithm. Full matrix multiplication for DST and Fast DST algorithm
493// give identical results
494void fastForwardDst(short block[4][4],short coeff[4][4],int shift)  // input block, output coeff
495{
496  int i, c[4];
497  int rnd_factor = 1<<(shift-1);
498  for (i=0; i<4; i++)
499  {
500    // Intermediate Variables
501    c[0] = block[i][0] + block[i][3];
502    c[1] = block[i][1] + block[i][3];
503    c[2] = block[i][0] - block[i][1];
504    c[3] = 74* block[i][2];
505   
506    coeff[0][i] =  ( 29 * c[0] + 55 * c[1]         + c[3]               + rnd_factor ) >> shift;
507    coeff[1][i] =  ( 74 * (block[i][0]+ block[i][1] - block[i][3])      + rnd_factor ) >> shift;
508    coeff[2][i] =  ( 29 * c[2] + 55 * c[0]         - c[3]               + rnd_factor ) >> shift;
509    coeff[3][i] =  ( 55 * c[2] - 29 * c[1]         + c[3]               + rnd_factor ) >> shift;
510  }
511}
512void fastInverseDst(short tmp[4][4],short block[4][4],int shift)  // input tmp, output block
513{
514  int i, c[4];
515  int rnd_factor = 1<<(shift-1);
516  for (i=0; i<4; i++)
517  { 
518    // Intermediate Variables
519    c[0] = tmp[0][i] + tmp[2][i];
520    c[1] = tmp[2][i] + tmp[3][i];
521    c[2] = tmp[0][i] - tmp[3][i];
522    c[3] = 74* tmp[1][i];
523
524    block[i][0] =  ( 29 * c[0] + 55 * c[1]     + c[3]               + rnd_factor ) >> shift;
525    block[i][1] =  ( 55 * c[2] - 29 * c[1]     + c[3]               + rnd_factor ) >> shift;
526    block[i][2] =  ( 74 * (tmp[0][i] - tmp[2][i]  + tmp[3][i])      + rnd_factor ) >> shift;
527    block[i][3] =  ( 55 * c[0] + 29 * c[2]     - c[3]               + rnd_factor ) >> shift;
528  }
529}
530#endif
531/** 4x4 forward transform (2D)
532 *  \param block input data (residual)
533 *  \param coeff output data (transform coefficients)
534 *  \param uiMode is Intra Prediction mode used in Mode-Dependent DCT/DST only
535 */
536#if INTRA_DST_TYPE_7
537void xTr4(short block[4][4],short coeff[4][4],UInt uiMode)
538#else
539void xTr4(short block[4][4],short coeff[4][4])
540#endif
541{
542#if FULL_NBIT
543  int shift_1st = 1 + g_uiBitDepth - 8; // log2(4) - 1 + g_uiBitDepth - 8
544#else
545  int shift_1st = 1 + g_uiBitIncrement; // log2(4) - 1 + g_uiBitIncrement
546#endif
547  int shift_2nd = 8;                    // log2(4) + 6
548  short tmp[4][4]; 
549#if INTRA_DST_TYPE_7
550  if (uiMode != REG_DCT && g_aucDCTDSTMode_Hor[uiMode])// Check for DCT or DST
551  {
552    fastForwardDst(block,tmp,shift_1st); // Forward DST BY FAST ALGORITHM, block input, tmp output
553  }
554  else 
555  {
556    partialButterfly4(block,tmp,shift_1st);
557  }
558#else
559  partialButterfly4(block,tmp,shift_1st);
560#endif
561
562#if INTRA_DST_TYPE_7
563  if (uiMode != REG_DCT && g_aucDCTDSTMode_Vert[uiMode] )   // Check for DCT or DST
564  {
565    fastForwardDst(tmp,coeff,shift_2nd); // Forward DST BY FAST ALGORITHM, tmp input, coeff output
566  }
567  else 
568  {
569    partialButterfly4(tmp,coeff,shift_2nd);
570  }   
571#else
572  partialButterfly4(tmp,coeff,shift_2nd);
573#endif
574}
575
576/** 4x4 inverse transform implemented using partial butterfly structure (1D)
577 *  \param coeff input data (transform coefficients)
578 *  \param block output data (residual)
579 *  \param shift specifies right shift after 1D transform
580 */
581void partialButterflyInverse4(short tmp[4][4],short block[4][4],int shift)
582{
583  int j;   
584  int E[2],O[2];
585  int add = 1<<(shift-1);
586
587  for (j=0; j<4; j++)
588  {   
589    /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */   
590    O[0] = g_aiT4[1][0]*tmp[1][j] + g_aiT4[3][0]*tmp[3][j];
591    O[1] = g_aiT4[1][1]*tmp[1][j] + g_aiT4[3][1]*tmp[3][j];
592    E[0] = g_aiT4[0][0]*tmp[0][j] + g_aiT4[2][0]*tmp[2][j];
593    E[1] = g_aiT4[0][1]*tmp[0][j] + g_aiT4[2][1]*tmp[2][j];
594   
595    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */ 
596    block[j][0] = (E[0] + O[0] + add)>>shift;
597    block[j][1] = (E[1] + O[1] + add)>>shift;
598    block[j][2] = (E[1] - O[1] + add)>>shift;
599    block[j][3] = (E[0] - O[0] + add)>>shift;
600  }
601}
602
603/** 4x4 inverse transform (2D)
604 *  \param coeff input data (transform coefficients)
605 *  \param block output data (residual)
606 *  \param uiMode is Intra Prediction mode used in Mode-Dependent DCT/DST only
607 */
608#if INTRA_DST_TYPE_7
609void xITr4(short coeff[4][4],short block[4][4], UInt uiMode)
610#else
611void xITr4(short coeff[4][4],short block[4][4])
612#endif
613{
614  int shift_1st = SHIFT_INV_1ST;
615#if FULL_NBIT
616  int shift_2nd = SHIFT_INV_2ND - ((short)g_uiBitDepth - 8);
617#else
618  int shift_2nd = SHIFT_INV_2ND - g_uiBitIncrement;
619#endif
620  short tmp[4][4];
621 
622#if INTRA_DST_TYPE_7
623  if (uiMode != REG_DCT && g_aucDCTDSTMode_Vert[uiMode] )    // Check for DCT or DST
624  {
625    fastInverseDst(coeff,tmp,shift_1st);    // Inverse DST by FAST Algorithm, coeff input, tmp output
626  }
627  else
628  {
629    partialButterflyInverse4(coeff,tmp,shift_1st);   
630  } 
631#else
632  partialButterflyInverse4(coeff,tmp,shift_1st);
633#endif
634#if INTRA_DST_TYPE_7
635  if (uiMode != REG_DCT && g_aucDCTDSTMode_Hor[uiMode] )    // Check for DCT or DST
636  {
637    fastInverseDst(tmp,block,shift_2nd); // Inverse DST by FAST Algorithm, tmp input, coeff output
638  }
639  else
640  {
641    partialButterflyInverse4(tmp,block,shift_2nd);
642  }   
643#else
644   partialButterflyInverse4(tmp,block,shift_2nd);
645#endif
646}
647
648/** 8x8 forward transform implemented using partial butterfly structure (1D)
649 *  \param block input data (residual)
650 *  \param coeff output data (transform coefficients)
651 *  \param shift specifies right shift after 1D transform
652 */
653void partialButterfly8(short block[8][8],short coeff[8][8],int shift)
654{
655  int j,k; 
656  int E[4],O[4];
657  int EE[2],EO[2];
658  int add = 1<<(shift-1);
659
660  for (j=0; j<8; j++)
661  {   
662    /* E and O*/
663    for (k=0;k<4;k++)
664    {
665      E[k] = block[j][k] + block[j][7-k];
666      O[k] = block[j][k] - block[j][7-k];
667    }   
668    /* EE and EO */
669    EE[0] = E[0] + E[3];   
670    EO[0] = E[0] - E[3];
671    EE[1] = E[1] + E[2];
672    EO[1] = E[1] - E[2];
673
674    coeff[0][j] = (g_aiT8[0][0]*EE[0] + g_aiT8[0][1]*EE[1] + add)>>shift;
675    coeff[4][j] = (g_aiT8[4][0]*EE[0] + g_aiT8[4][1]*EE[1] + add)>>shift; 
676    coeff[2][j] = (g_aiT8[2][0]*EO[0] + g_aiT8[2][1]*EO[1] + add)>>shift;
677    coeff[6][j] = (g_aiT8[6][0]*EO[0] + g_aiT8[6][1]*EO[1] + add)>>shift; 
678
679    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;
680    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;
681    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;
682    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;
683  }
684}
685
686/** 8x8 forward transform (2D)
687 *  \param block input data (residual)
688 *  \param coeff  output data (transform coefficients)
689 */
690void xTr8(short block[8][8],short coeff[8][8])
691{
692#if FULL_NBIT
693  int shift_1st = 2 + g_uiBitDepth - 8; // log2(8) - 1 + g_uiBitDepth - 8
694#else
695  int shift_1st = 2 + g_uiBitIncrement; // log2(8) - 1 + g_uiBitIncrement
696#endif
697  int shift_2nd = 9;                    // log2(8) + 6
698  short tmp[8][8]; 
699
700  partialButterfly8(block,tmp,shift_1st);
701  partialButterfly8(tmp,coeff,shift_2nd);
702}
703
704/** 8x8 inverse transform implemented using partial butterfly structure (1D)
705 *  \param coeff input data (transform coefficients)
706 *  \param block output data (residual)
707 *  \param shift specifies right shift after 1D transform
708 */
709void partialButterflyInverse8(short tmp[8][8],short block[8][8],int shift)
710{
711  int j,k;   
712  int E[4],O[4];
713  int EE[2],EO[2];
714  int add = 1<<(shift-1);
715
716  for (j=0; j<8; j++)
717  {   
718    /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
719    for (k=0;k<4;k++)
720    {
721      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];
722    }
723   
724    EO[0] = g_aiT8[2][0]*tmp[2][j] + g_aiT8[6][0]*tmp[6][j];
725    EO[1] = g_aiT8[2][1]*tmp[2][j] + g_aiT8[6][1]*tmp[6][j];
726    EE[0] = g_aiT8[0][0]*tmp[0][j] + g_aiT8[4][0]*tmp[4][j];
727    EE[1] = g_aiT8[0][1]*tmp[0][j] + g_aiT8[4][1]*tmp[4][j];
728
729    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */ 
730    E[0] = EE[0] + EO[0];
731    E[3] = EE[0] - EO[0];
732    E[1] = EE[1] + EO[1];
733    E[2] = EE[1] - EO[1];
734    for (k=0;k<4;k++)
735    {
736      block[j][k] = (E[k] + O[k] + add)>>shift;
737      block[j][k+4] = (E[3-k] - O[3-k] + add)>>shift;
738    }       
739  }
740}
741
742/** 8x8 inverse transform (2D)
743 *  \param coeff input data (transform coefficients)
744 *  \param block output data (residual)
745 */
746void xITr8(short coeff[8][8],short block[8][8])
747{
748  int shift_1st = SHIFT_INV_1ST;
749#if FULL_NBIT
750  int shift_2nd = SHIFT_INV_2ND - ((short)g_uiBitDepth - 8);
751#else
752  int shift_2nd = SHIFT_INV_2ND - g_uiBitIncrement;
753#endif
754  short tmp[8][8];
755 
756  partialButterflyInverse8(coeff,tmp,shift_1st);
757  partialButterflyInverse8(tmp,block,shift_2nd);
758}
759
760/** 16x16 forward transform implemented using partial butterfly structure (1D)
761 *  \param block input data (residual)
762 *  \param coeff output data (transform coefficients)
763 *  \param shift specifies right shift after 1D transform
764 */
765void partialButterfly16(short block[16][16],short coeff[16][16],int shift)
766{
767  int j,k;
768  int E[8],O[8];
769  int EE[4],EO[4];
770  int EEE[2],EEO[2];
771  int add = 1<<(shift-1);
772
773  for (j=0; j<16; j++)
774  {   
775    /* E and O*/
776    for (k=0;k<8;k++)
777    {
778      E[k] = block[j][k] + block[j][15-k];
779      O[k] = block[j][k] - block[j][15-k];
780    } 
781    /* EE and EO */
782    for (k=0;k<4;k++)
783    {
784      EE[k] = E[k] + E[7-k];
785      EO[k] = E[k] - E[7-k];
786    }
787    /* EEE and EEO */
788    EEE[0] = EE[0] + EE[3];   
789    EEO[0] = EE[0] - EE[3];
790    EEE[1] = EE[1] + EE[2];
791    EEO[1] = EE[1] - EE[2];
792
793    coeff[ 0][j] = (g_aiT16[ 0][0]*EEE[0] + g_aiT16[ 0][1]*EEE[1] + add)>>shift;       
794    coeff[ 8][j] = (g_aiT16[ 8][0]*EEE[0] + g_aiT16[ 8][1]*EEE[1] + add)>>shift;   
795    coeff[ 4][j] = (g_aiT16[ 4][0]*EEO[0] + g_aiT16[ 4][1]*EEO[1] + add)>>shift;       
796    coeff[12][j] = (g_aiT16[12][0]*EEO[0] + g_aiT16[12][1]*EEO[1] + add)>>shift;
797
798    for (k=2;k<16;k+=4)
799    {
800      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;     
801    }
802   
803    for (k=1;k<16;k+=2)
804    {
805      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] + 
806                     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;
807    }
808
809  }
810}
811
812/** 16x16 forward transform (2D)
813 *  \param block input data (residual)
814 *  \param coeff output data (transform coefficients)
815 */
816void xTr16(short block[16][16],short coeff[16][16])
817{
818 #if FULL_NBIT
819  int shift_1st = 3 + g_uiBitDepth - 8; // log2(16) - 1 + g_uiBitDepth - 8
820#else
821  int shift_1st = 3 + g_uiBitIncrement; // log2(16) - 1 + g_uiBitIncrement
822#endif
823  int shift_2nd = 10;                   // log2(16) + 6
824  short tmp[16][16]; 
825
826  partialButterfly16(block,tmp,shift_1st);
827  partialButterfly16(tmp,coeff,shift_2nd);
828}
829
830/** 16x16 inverse transform implemented using partial butterfly structure (1D)
831 *  \param coeff input data (transform coefficients)
832 *  \param block output data (residual)
833 *  \param shift specifies right shift after 1D transform
834 */
835void partialButterflyInverse16(short tmp[16][16],short block[16][16],int shift)
836{
837  int j,k; 
838  int E[8],O[8];
839  int EE[4],EO[4];
840  int EEE[2],EEO[2];
841  int add = 1<<(shift-1);
842
843  for (j=0; j<16; j++)
844  {   
845    /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
846    for (k=0;k<8;k++)
847    {
848      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] + 
849             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];
850    }
851    for (k=0;k<4;k++)
852    {
853      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];
854    }
855    EEO[0] = g_aiT16[4][0]*tmp[4][j] + g_aiT16[12][0]*tmp[12][j];
856    EEE[0] = g_aiT16[0][0]*tmp[0][j] + g_aiT16[ 8][0]*tmp[ 8][j];
857    EEO[1] = g_aiT16[4][1]*tmp[4][j] + g_aiT16[12][1]*tmp[12][j];
858    EEE[1] = g_aiT16[0][1]*tmp[0][j] + g_aiT16[ 8][1]*tmp[ 8][j];
859
860    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */ 
861    for (k=0;k<2;k++)
862    {
863      EE[k] = EEE[k] + EEO[k];
864      EE[k+2] = EEE[1-k] - EEO[1-k];
865    }   
866    for (k=0;k<4;k++)
867    {
868      E[k] = EE[k] + EO[k];
869      E[k+4] = EE[3-k] - EO[3-k];
870    }   
871    for (k=0;k<8;k++)
872    {
873      block[j][k] = (E[k] + O[k] + add)>>shift;
874      block[j][k+8] = (E[7-k] - O[7-k] + add)>>shift;
875    }       
876  }
877}
878
879/** 16x16 inverse transform (2D)
880 *  \param coeff input data (transform coefficients)
881 *  \param block output data (residual)
882 */
883void xITr16(short coeff[16][16],short block[16][16])
884{
885  int shift_1st = SHIFT_INV_1ST;
886#if FULL_NBIT
887  int shift_2nd = SHIFT_INV_2ND - ((short)g_uiBitDepth - 8);
888#else
889  int shift_2nd = SHIFT_INV_2ND - g_uiBitIncrement;
890#endif
891  short tmp[16][16];
892 
893  partialButterflyInverse16(coeff,tmp,shift_1st);
894  partialButterflyInverse16(tmp,block,shift_2nd);
895}
896
897/** 32x32 forward transform implemented using partial butterfly structure (1D)
898 *  \param block input data (residual)
899 *  \param coeff output data (transform coefficients)
900 *  \param shift specifies right shift after 1D transform
901 */
902void partialButterfly32(short block[32][32],short coeff[32][32],int shift)
903{
904  int j,k;
905  int E[16],O[16];
906  int EE[8],EO[8];
907  int EEE[4],EEO[4];
908  int EEEE[2],EEEO[2];
909  int add = 1<<(shift-1);
910
911  for (j=0; j<32; j++)
912  {   
913    /* E and O*/
914    for (k=0;k<16;k++)
915    {
916      E[k] = block[j][k] + block[j][31-k];
917      O[k] = block[j][k] - block[j][31-k];
918    } 
919    /* EE and EO */
920    for (k=0;k<8;k++)
921    {
922      EE[k] = E[k] + E[15-k];
923      EO[k] = E[k] - E[15-k];
924    }
925    /* EEE and EEO */
926    for (k=0;k<4;k++)
927    {
928      EEE[k] = EE[k] + EE[7-k];
929      EEO[k] = EE[k] - EE[7-k];
930    }
931    /* EEEE and EEEO */
932    EEEE[0] = EEE[0] + EEE[3];   
933    EEEO[0] = EEE[0] - EEE[3];
934    EEEE[1] = EEE[1] + EEE[2];
935    EEEO[1] = EEE[1] - EEE[2];
936
937    coeff[ 0][j] = (g_aiT32[ 0][0]*EEEE[0] + g_aiT32[ 0][1]*EEEE[1] + add)>>shift;
938    coeff[16][j] = (g_aiT32[16][0]*EEEE[0] + g_aiT32[16][1]*EEEE[1] + add)>>shift;
939    coeff[ 8][j] = (g_aiT32[ 8][0]*EEEO[0] + g_aiT32[ 8][1]*EEEO[1] + add)>>shift; 
940    coeff[24][j] = (g_aiT32[24][0]*EEEO[0] + g_aiT32[24][1]*EEEO[1] + add)>>shift;
941    for (k=4;k<32;k+=8)
942    {
943      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;
944    }       
945    for (k=2;k<32;k+=4)
946    {
947      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] + 
948                     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;
949    }       
950    for (k=1;k<32;k+=2)
951    {
952      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] + 
953                     g_aiT32[k][ 4]*O[ 4] + g_aiT32[k][ 5]*O[ 5] + g_aiT32[k][ 6]*O[ 6] + g_aiT32[k][ 7]*O[ 7] +
954                     g_aiT32[k][ 8]*O[ 8] + g_aiT32[k][ 9]*O[ 9] + g_aiT32[k][10]*O[10] + g_aiT32[k][11]*O[11] + 
955                     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;
956    }
957  }
958}
959
960/** 32x32 forward transform (2D)
961 *  \param block input data (residual)
962 *  \param coeff output data (transform coefficients)
963 */
964void xTr32(short block[32][32],short coeff[32][32])
965{
966 #if FULL_NBIT
967  int shift_1st = 4 + g_uiBitDepth - 8; // log2(32) - 1 + g_uiBitDepth - 8
968#else
969  int shift_1st = 4 + g_uiBitIncrement; // log2(32) - 1 + g_uiBitIncrement
970#endif
971  int shift_2nd = 11;                   // log2(32) + 6
972  short tmp[32][32]; 
973
974  partialButterfly32(block,tmp,shift_1st);
975  partialButterfly32(tmp,coeff,shift_2nd);
976}
977
978/** 32x32 inverse transform implemented using partial butterfly structure (1D)
979 *  \param coeff input data (transform coefficients)
980 *  \param block output data (residual)
981 *  \param shift specifies right shift after 1D transform
982 */
983void partialButterflyInverse32(short tmp[32][32],short block[32][32],int shift)
984{
985  int j,k; 
986  int E[16],O[16];
987  int EE[8],EO[8];
988  int EEE[4],EEO[4];
989  int EEEE[2],EEEO[2];
990  int add = 1<<(shift-1);
991
992  for (j=0; j<32; j++)
993  {   
994    /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
995    for (k=0;k<16;k++)
996    {
997      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] + 
998             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] + 
999             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] + 
1000             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];
1001    }
1002    for (k=0;k<8;k++)
1003    {
1004      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] + 
1005              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];
1006    }
1007    for (k=0;k<4;k++)
1008    {
1009      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];
1010    }
1011    EEEO[0] = g_aiT32[8][0]*tmp[8][j] + g_aiT32[24][0]*tmp[24][j];
1012    EEEO[1] = g_aiT32[8][1]*tmp[8][j] + g_aiT32[24][1]*tmp[24][j];
1013    EEEE[0] = g_aiT32[0][0]*tmp[0][j] + g_aiT32[16][0]*tmp[16][j];   
1014    EEEE[1] = g_aiT32[0][1]*tmp[0][j] + g_aiT32[16][1]*tmp[16][j];
1015
1016    /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
1017    EEE[0] = EEEE[0] + EEEO[0];
1018    EEE[3] = EEEE[0] - EEEO[0];
1019    EEE[1] = EEEE[1] + EEEO[1];
1020    EEE[2] = EEEE[1] - EEEO[1];   
1021    for (k=0;k<4;k++)
1022    {
1023      EE[k] = EEE[k] + EEO[k];
1024      EE[k+4] = EEE[3-k] - EEO[3-k];
1025    }   
1026    for (k=0;k<8;k++)
1027    {
1028      E[k] = EE[k] + EO[k];
1029      E[k+8] = EE[7-k] - EO[7-k];
1030    }   
1031    for (k=0;k<16;k++)
1032    {
1033      block[j][k] = (E[k] + O[k] + add)>>shift;
1034      block[j][k+16] = (E[15-k] - O[15-k] + add)>>shift;
1035    }       
1036  }
1037}
1038
1039/** 32x32 inverse transform (2D)
1040 *  \param coeff input data (transform coefficients)
1041 *  \param block output data (residual)
1042 */
1043void xITr32(short coeff[32][32],short block[32][32])
1044{
1045  int shift_1st = SHIFT_INV_1ST;
1046#if FULL_NBIT
1047  int shift_2nd = SHIFT_INV_2ND - ((short)g_uiBitDepth - 8);
1048#else
1049  int shift_2nd = SHIFT_INV_2ND - g_uiBitIncrement;
1050#endif
1051  short tmp[32][32];
1052 
1053  partialButterflyInverse32(coeff,tmp,shift_1st);
1054  partialButterflyInverse32(tmp,block,shift_2nd);
1055}
1056#endif //MATRIX_MULT
1057#else //E243_CORE_TRANSFORMS
1058
1059Void TComTrQuant::xT32( Pel* pSrc, UInt uiStride, Long* pDes )
1060{
1061  Int x, y;
1062  Long aaiTemp[32][32];
1063 
1064  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;
1065  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;
1066  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;
1067  Long D0, D1, D2, D3, D5, D6, D8, D9, D10, D11, D12, D13, D14, D15, D18, D19, D20, D21, D26, D27, D28, D29;
1068  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;
1069  Long F8, F9, F10, F11, F12, F13, F14, F15, F17, F18, F21, F22, F25, F26, F29, F30;
1070  Long G16, G17, G18, G19, G20, G21, G22, G23, G24, G25, G26, G27, G28, G29, G30, G31;
1071#ifdef TRANS_PRECISION_EXT
1072  Int uiBitDepthIncrease=g_iShift32x32-g_uiBitIncrement;
1073  Int offset = (uiBitDepthIncrease==0)? 0:(1<<(uiBitDepthIncrease-1));
1074#endif
1075  //--Butterfly
1076  for( y=0 ; y<32 ; y++ )
1077  {
1078#ifdef TRANS_PRECISION_EXT
1079    A0  = (pSrc[0] + pSrc[31])<<uiBitDepthIncrease;
1080    A31 = (pSrc[0] - pSrc[31])<<uiBitDepthIncrease;
1081    A1  = (pSrc[1] + pSrc[30])<<uiBitDepthIncrease;
1082    A30 = (pSrc[1] - pSrc[30])<<uiBitDepthIncrease;
1083    A2  = (pSrc[2] + pSrc[29])<<uiBitDepthIncrease;
1084    A29 = (pSrc[2] - pSrc[29])<<uiBitDepthIncrease;
1085    A3  = (pSrc[3] + pSrc[28])<<uiBitDepthIncrease;
1086    A28 = (pSrc[3] - pSrc[28])<<uiBitDepthIncrease;
1087    A4  = (pSrc[4] + pSrc[27])<<uiBitDepthIncrease;
1088    A27 = (pSrc[4] - pSrc[27])<<uiBitDepthIncrease;
1089    A5  = (pSrc[5] + pSrc[26])<<uiBitDepthIncrease;
1090    A26 = (pSrc[5] - pSrc[26])<<uiBitDepthIncrease;
1091    A6  = (pSrc[6] + pSrc[25])<<uiBitDepthIncrease;
1092    A25 = (pSrc[6] - pSrc[25])<<uiBitDepthIncrease;
1093    A7  = (pSrc[7] + pSrc[24])<<uiBitDepthIncrease;
1094    A24 = (pSrc[7] - pSrc[24])<<uiBitDepthIncrease;
1095    A8  = (pSrc[8] + pSrc[23])<<uiBitDepthIncrease;
1096    A23 = (pSrc[8] - pSrc[23])<<uiBitDepthIncrease;
1097    A9  = (pSrc[9] + pSrc[22])<<uiBitDepthIncrease;
1098    A22 = (pSrc[9] - pSrc[22])<<uiBitDepthIncrease;
1099    A10 = (pSrc[10] + pSrc[21])<<uiBitDepthIncrease;
1100    A21 = (pSrc[10] - pSrc[21])<<uiBitDepthIncrease;
1101    A11 = (pSrc[11] + pSrc[20])<<uiBitDepthIncrease;
1102    A20 = (pSrc[11] - pSrc[20])<<uiBitDepthIncrease;
1103    A12 = (pSrc[12] + pSrc[19])<<uiBitDepthIncrease;
1104    A19 = (pSrc[12] - pSrc[19])<<uiBitDepthIncrease;
1105    A13 = (pSrc[13] + pSrc[18])<<uiBitDepthIncrease;
1106    A18 = (pSrc[13] - pSrc[18])<<uiBitDepthIncrease;
1107    A14 = (pSrc[14] + pSrc[17])<<uiBitDepthIncrease;
1108    A17 = (pSrc[14] - pSrc[17])<<uiBitDepthIncrease;
1109    A15 = (pSrc[15] + pSrc[16])<<uiBitDepthIncrease;
1110    A16 = (pSrc[15] - pSrc[16])<<uiBitDepthIncrease;
1111#else
1112    A0 = pSrc[0] + pSrc[31];
1113    A31 = pSrc[0] - pSrc[31];
1114    A1 = pSrc[1] + pSrc[30];
1115    A30 = pSrc[1] - pSrc[30];
1116    A2 = pSrc[2] + pSrc[29];
1117    A29 = pSrc[2] - pSrc[29];
1118    A3 = pSrc[3] + pSrc[28];
1119    A28 = pSrc[3] - pSrc[28];
1120    A4 = pSrc[4] + pSrc[27];
1121    A27 = pSrc[4] - pSrc[27];
1122    A5 = pSrc[5] + pSrc[26];
1123    A26 = pSrc[5] - pSrc[26];
1124    A6 = pSrc[6] + pSrc[25];
1125    A25 = pSrc[6] - pSrc[25];
1126    A7 = pSrc[7] + pSrc[24];
1127    A24 = pSrc[7] - pSrc[24];
1128    A8 = pSrc[8] + pSrc[23];
1129    A23 = pSrc[8] - pSrc[23];
1130    A9 = pSrc[9] + pSrc[22];
1131    A22 = pSrc[9] - pSrc[22];
1132    A10 = pSrc[10] + pSrc[21];
1133    A21 = pSrc[10] - pSrc[21];
1134    A11 = pSrc[11] + pSrc[20];
1135    A20 = pSrc[11] - pSrc[20];
1136    A12 = pSrc[12] + pSrc[19];
1137    A19 = pSrc[12] - pSrc[19];
1138    A13 = pSrc[13] + pSrc[18];
1139    A18 = pSrc[13] - pSrc[18];
1140    A14 = pSrc[14] + pSrc[17];
1141    A17 = pSrc[14] - pSrc[17];
1142    A15 = pSrc[15] + pSrc[16];
1143    A16 = pSrc[15] - pSrc[16];
1144#endif
1145    B0 = A0 + A15;
1146    B15 = A0 - A15;
1147    B1 = A1 + A14;
1148    B14 = A1 - A14;
1149    B2 = A2 + A13;
1150    B13 = A2 - A13;
1151    B3 = A3 + A12;
1152    B12 = A3 - A12;
1153    B4 = A4 + A11;
1154    B11 = A4 - A11;
1155    B5 = A5 + A10;
1156    B10 = A5 - A10;
1157    B6 = A6 + A9;
1158    B9 = A6 - A9;
1159    B7 = A7 + A8;
1160    B8 = A7 - A8;
1161    B20 = xTrRound( 181 * ( A27 - A20 ) , DenShift32);
1162    B27 = xTrRound( 181 * ( A27 + A20 ) , DenShift32);
1163    B21 = xTrRound( 181 * ( A26 - A21 ) , DenShift32);
1164    B26 = xTrRound( 181 * ( A26 + A21 ) , DenShift32);
1165    B22 = xTrRound( 181 * ( A25 - A22 ) , DenShift32);
1166    B25 = xTrRound( 181 * ( A25 + A22 ) , DenShift32);
1167    B23 = xTrRound( 181 * ( A24 - A23 ) , DenShift32);
1168    B24 = xTrRound( 181 * ( A24 + A23 ) , DenShift32);;
1169   
1170    C0 = B0 + B7;
1171    C7 = B0 - B7;
1172    C1 = B1 + B6;
1173    C6 = B1 - B6;
1174    C2 = B2 + B5;
1175    C5 = B2 - B5;
1176    C3 = B3 + B4;
1177    C4 = B3 - B4;
1178    C10 = xTrRound( 181 * ( B13 - B10 ) , DenShift32);
1179    C13 = xTrRound( 181 * ( B13 + B10 ) , DenShift32);
1180    C11 = xTrRound( 181 * ( B12 - B11 ) , DenShift32);
1181    C12 = xTrRound( 181 * ( B12 + B11 ) , DenShift32);
1182    C16 = A16 + B23;
1183    C23 = A16 - B23;
1184    C24 = A31 - B24;
1185    C31 = A31 + B24;
1186    C17 = A17 + B22;
1187    C22 = A17 - B22;
1188    C25 = A30 - B25;
1189    C30 = A30 + B25;
1190    C18 = A18 + B21;
1191    C21 = A18 - B21;
1192    C26 = A29 - B26;
1193    C29 = A29 + B26;
1194    C19 = A19 + B20;
1195    C20 = A19 - B20;
1196    C27 = A28 - B27;
1197    C28 = A28 + B27;
1198   
1199    D0 = C0 + C3;
1200    D3 = C0 - C3;
1201    D8 = B8 + C11;
1202    D11 = B8 - C11;
1203    D12 = B15 - C12;
1204    D15 = B15 + C12;
1205    D1 = C1 + C2;
1206    D2 = C1 - C2;
1207    D9 = B9 + C10;
1208    D10 = B9 - C10;
1209    D13 = B14 - C13;
1210    D14 = B14 + C13;
1211    D5 = xTrRound( 181 * ( C6 - C5 ) , DenShift32);
1212    D6 = xTrRound( 181 * ( C6 + C5 ) , DenShift32);
1213    D18 = xTrRound( 97 * C29 - 236 * C18 , DenShift32);
1214    D20 = xTrRound(  - 236 * C27 - 97 * C20 , DenShift32);
1215    D26 = xTrRound(  - 236 * C21 + 97 * C26 , DenShift32);
1216    D28 = xTrRound( 97 * C19 + 236 * C28 , DenShift32);
1217    D19 = xTrRound( 97 * C28 - 236 * C19 , DenShift32);
1218    D21 = xTrRound(  - 236 * C26 - 97 * C21 , DenShift32);
1219    D27 = xTrRound(  - 236 * C20 + 97 * C27 , DenShift32);
1220    D29 = xTrRound( 97 * C18 + 236 * C29 , DenShift32);;
1221   
1222    aaiTemp[0][y] = xTrRound( 181 * ( D0 + D1 ) , DenShift32);
1223    aaiTemp[16][y] = xTrRound( 181 * ( D0 - D1 ) , DenShift32);
1224    aaiTemp[8][y] = xTrRound( 236 * D3 + 97 * D2 , DenShift32);
1225    aaiTemp[24][y] = xTrRound( 97 * D3 - 236 * D2 , DenShift32);
1226    E4 = C4 + D5;
1227    E5 = C4 - D5;
1228    E6 = C7 - D6;
1229    E7 = C7 + D6;
1230    E9 = xTrRound( 97 * D14 - 236 * D9 , DenShift32);
1231    E10 = xTrRound(  - 236 * D13 - 97 * D10 , DenShift32);
1232    E13 = xTrRound( 97 * D13 - 236 * D10 , DenShift32);
1233    E14 = xTrRound( 236 * D14 + 97 * D9 , DenShift32);
1234    E16 = C16 + D19;
1235    E19 = C16 - D19;
1236    E20 = C23 - D20;
1237    E23 = C23 + D20;
1238    E24 = C24 + D27;
1239    E27 = C24 - D27;
1240    E28 = C31 - D28;
1241    E31 = C31 + D28;
1242    E17 = C17 + D18;
1243    E18 = C17 - D18;
1244    E21 = C22 - D21;
1245    E22 = C22 + D21;
1246    E25 = C25 + D26;
1247    E26 = C25 - D26;
1248    E29 = C30 - D29;
1249    E30 = C30 + D29;
1250   
1251    aaiTemp[4][y] = xTrRound( 49 * E4 + 251 * E7 , DenShift32);
1252    aaiTemp[20][y] = xTrRound( 212 * E5 + 142 * E6 , DenShift32);
1253    aaiTemp[12][y] = xTrRound( 212 * E6 - 142 * E5 , DenShift32);
1254    aaiTemp[28][y] = xTrRound( 49 * E7 - 251 * E4 , DenShift32);
1255    F8 = D8 + E9;
1256    F9 = D8 - E9;
1257    F10 = D11 - E10;
1258    F11 = D11 + E10;
1259    F12 = D12 + E13;
1260    F13 = D12 - E13;
1261    F14 = D15 - E14;
1262    F15 = D15 + E14;
1263    F17 = xTrRound( 49 * E30 - 251 * E17 , DenShift32);
1264    F18 = xTrRound(  - 251 * E29 - 49 * E18 , DenShift32);
1265    F21 = xTrRound( 212 * E26 - 142 * E21 , DenShift32);
1266    F22 = xTrRound(  - 142 * E25 - 212 * E22 , DenShift32);
1267    F25 = xTrRound( 212 * E25 - 142 * E22 , DenShift32);
1268    F26 = xTrRound( 142 * E26 + 212 * E21 , DenShift32);
1269    F29 = xTrRound( 49 * E29 - 251 * E18 , DenShift32);
1270    F30 = xTrRound( 251 * E30 + 49 * E17 , DenShift32);;
1271   
1272    aaiTemp[2][y] = xTrRound( 25 * F8 + 254 * F15 , DenShift32);
1273    aaiTemp[18][y] = xTrRound( 197 * F9 + 162 * F14 , DenShift32);
1274    aaiTemp[10][y] = xTrRound( 120 * F10 + 225 * F13 , DenShift32);
1275    aaiTemp[26][y] = xTrRound( 244 * F11 + 74 * F12 , DenShift32);
1276    aaiTemp[6][y] = xTrRound( 244 * F12 - 74 * F11 , DenShift32);
1277    aaiTemp[22][y] = xTrRound( 120 * F13 - 225 * F10 , DenShift32);
1278    aaiTemp[14][y] = xTrRound( 197 * F14 - 162 * F9 , DenShift32);
1279    aaiTemp[30][y] = xTrRound( 25 * F15 - 254 * F8 , DenShift32);
1280    G16 = E16 + F17;
1281    G17 = E16 - F17;
1282    G18 = E19 - F18;
1283    G19 = E19 + F18;
1284    G20 = E20 + F21;
1285    G21 = E20 - F21;
1286    G22 = E23 - F22;
1287    G23 = E23 + F22;
1288    G24 = E24 + F25;
1289    G25 = E24 - F25;
1290    G26 = E27 - F26;
1291    G27 = E27 + F26;
1292    G28 = E28 + F29;
1293    G29 = E28 - F29;
1294    G30 = E31 - F30;
1295    G31 = E31 + F30;
1296   
1297    aaiTemp[1][y] = xTrRound( 12 * G16 + 255 * G31 , DenShift32);
1298    aaiTemp[17][y] = xTrRound( 189 * G17 + 171 * G30 , DenShift32);
1299    aaiTemp[9][y] = xTrRound( 109 * G18 + 231 * G29 , DenShift32);
1300    aaiTemp[25][y] = xTrRound( 241 * G19 + 86 * G28 , DenShift32);
1301    aaiTemp[5][y] = xTrRound( 62 * G20 + 248 * G27 , DenShift32);
1302    aaiTemp[21][y] = xTrRound( 219 * G21 + 131 * G26 , DenShift32);
1303    aaiTemp[13][y] = xTrRound( 152 * G22 + 205 * G25 , DenShift32);
1304    aaiTemp[29][y] = xTrRound( 253 * G23 + 37 * G24 , DenShift32);
1305    aaiTemp[3][y] = xTrRound( 253 * G24 - 37 * G23 , DenShift32);
1306    aaiTemp[19][y] = xTrRound( 152 * G25 - 205 * G22 , DenShift32);
1307    aaiTemp[11][y] = xTrRound( 219 * G26 - 131 * G21 , DenShift32);
1308    aaiTemp[27][y] = xTrRound( 62 * G27 - 248 * G20 , DenShift32);
1309    aaiTemp[7][y] = xTrRound( 241 * G28 - 86 * G19 , DenShift32);
1310    aaiTemp[23][y] = xTrRound( 109 * G29 - 231 * G18 , DenShift32);
1311    aaiTemp[15][y] = xTrRound( 189 * G30 - 171 * G17 , DenShift32);
1312    aaiTemp[31][y] = xTrRound( 12 * G31 - 255 * G16 , DenShift32);
1313   
1314    pSrc += uiStride;
1315  }
1316 
1317  for( x=0 ; x<32 ; x++, pDes++ )
1318  {
1319    A0 = aaiTemp[x][0] + aaiTemp[x][31];
1320    A31 = aaiTemp[x][0] - aaiTemp[x][31];
1321    A1 = aaiTemp[x][1] + aaiTemp[x][30];
1322    A30 = aaiTemp[x][1] - aaiTemp[x][30];
1323    A2 = aaiTemp[x][2] + aaiTemp[x][29];
1324    A29 = aaiTemp[x][2] - aaiTemp[x][29];
1325    A3 = aaiTemp[x][3] + aaiTemp[x][28];
1326    A28 = aaiTemp[x][3] - aaiTemp[x][28];
1327    A4 = aaiTemp[x][4] + aaiTemp[x][27];
1328    A27 = aaiTemp[x][4] - aaiTemp[x][27];
1329    A5 = aaiTemp[x][5] + aaiTemp[x][26];
1330    A26 = aaiTemp[x][5] - aaiTemp[x][26];
1331    A6 = aaiTemp[x][6] + aaiTemp[x][25];
1332    A25 = aaiTemp[x][6] - aaiTemp[x][25];
1333    A7 = aaiTemp[x][7] + aaiTemp[x][24];
1334    A24 = aaiTemp[x][7] - aaiTemp[x][24];
1335    A8 = aaiTemp[x][8] + aaiTemp[x][23];
1336    A23 = aaiTemp[x][8] - aaiTemp[x][23];
1337    A9 = aaiTemp[x][9] + aaiTemp[x][22];
1338    A22 = aaiTemp[x][9] - aaiTemp[x][22];
1339    A10 = aaiTemp[x][10] + aaiTemp[x][21];
1340    A21 = aaiTemp[x][10] - aaiTemp[x][21];
1341    A11 = aaiTemp[x][11] + aaiTemp[x][20];
1342    A20 = aaiTemp[x][11] - aaiTemp[x][20];
1343    A12 = aaiTemp[x][12] + aaiTemp[x][19];
1344    A19 = aaiTemp[x][12] - aaiTemp[x][19];
1345    A13 = aaiTemp[x][13] + aaiTemp[x][18];
1346    A18 = aaiTemp[x][13] - aaiTemp[x][18];
1347    A14 = aaiTemp[x][14] + aaiTemp[x][17];
1348    A17 = aaiTemp[x][14] - aaiTemp[x][17];
1349    A15 = aaiTemp[x][15] + aaiTemp[x][16];
1350    A16 = aaiTemp[x][15] - aaiTemp[x][16];
1351   
1352    B0 = A0 + A15;
1353    B15 = A0 - A15;
1354    B1 = A1 + A14;
1355    B14 = A1 - A14;
1356    B2 = A2 + A13;
1357    B13 = A2 - A13;
1358    B3 = A3 + A12;
1359    B12 = A3 - A12;
1360    B4 = A4 + A11;
1361    B11 = A4 - A11;
1362    B5 = A5 + A10;
1363    B10 = A5 - A10;
1364    B6 = A6 + A9;
1365    B9 = A6 - A9;
1366    B7 = A7 + A8;
1367    B8 = A7 - A8;
1368    B20 = xTrRound( 181 * ( A27 - A20 ) , DenShift32);
1369    B27 = xTrRound( 181 * ( A27 + A20 ) , DenShift32);
1370    B21 = xTrRound( 181 * ( A26 - A21 ) , DenShift32);
1371    B26 = xTrRound( 181 * ( A26 + A21 ) , DenShift32);
1372    B22 = xTrRound( 181 * ( A25 - A22 ) , DenShift32);
1373    B25 = xTrRound( 181 * ( A25 + A22 ) , DenShift32);
1374    B23 = xTrRound( 181 * ( A24 - A23 ) , DenShift32);
1375    B24 = xTrRound( 181 * ( A24 + A23 ) , DenShift32);;
1376   
1377    C0 = B0 + B7;
1378    C7 = B0 - B7;
1379    C1 = B1 + B6;
1380    C6 = B1 - B6;
1381    C2 = B2 + B5;
1382    C5 = B2 - B5;
1383    C3 = B3 + B4;
1384    C4 = B3 - B4;
1385    C10 = xTrRound( 181 * ( B13 - B10 ) , DenShift32);
1386    C13 = xTrRound( 181 * ( B13 + B10 ) , DenShift32);
1387    C11 = xTrRound( 181 * ( B12 - B11 ) , DenShift32);
1388    C12 = xTrRound( 181 * ( B12 + B11 ) , DenShift32);
1389    C16 = A16 + B23;
1390    C23 = A16 - B23;
1391    C24 = A31 - B24;
1392    C31 = A31 + B24;
1393    C17 = A17 + B22;
1394    C22 = A17 - B22;
1395    C25 = A30 - B25;
1396    C30 = A30 + B25;
1397    C18 = A18 + B21;
1398    C21 = A18 - B21;
1399    C26 = A29 - B26;
1400    C29 = A29 + B26;
1401    C19 = A19 + B20;
1402    C20 = A19 - B20;
1403    C27 = A28 - B27;
1404    C28 = A28 + B27;
1405   
1406    D0 = C0 + C3;
1407    D3 = C0 - C3;
1408    D8 = B8 + C11;
1409    D11 = B8 - C11;
1410    D12 = B15 - C12;
1411    D15 = B15 + C12;
1412    D1 = C1 + C2;
1413    D2 = C1 - C2;
1414    D9 = B9 + C10;
1415    D10 = B9 - C10;
1416    D13 = B14 - C13;
1417    D14 = B14 + C13;
1418    D5 = xTrRound( 181 * ( C6 - C5 ) , DenShift32);
1419    D6 = xTrRound( 181 * ( C6 + C5 ) , DenShift32);
1420    D18 = xTrRound( 97 * C29 - 236 * C18 , DenShift32);
1421    D20 = xTrRound(  - 236 * C27 - 97 * C20 , DenShift32);
1422    D26 = xTrRound(  - 236 * C21 + 97 * C26 , DenShift32);
1423    D28 = xTrRound( 97 * C19 + 236 * C28 , DenShift32);
1424    D19 = xTrRound( 97 * C28 - 236 * C19 , DenShift32);
1425    D21 = xTrRound(  - 236 * C26 - 97 * C21 , DenShift32);
1426    D27 = xTrRound(  - 236 * C20 + 97 * C27 , DenShift32);
1427    D29 = xTrRound( 97 * C18 + 236 * C29 , DenShift32);;
1428   
1429    pDes[0] = xTrRound( 181 * ( D0 + D1 ) , DenShift32);
1430    pDes[512] = xTrRound( 181 * ( D0 - D1 ) , DenShift32);
1431    pDes[256] = xTrRound( 236 * D3 + 97 * D2 , DenShift32);
1432    pDes[768] = xTrRound( 97 * D3 - 236 * D2 , DenShift32);
1433#ifdef TRANS_PRECISION_EXT
1434    pDes[0]   = (pDes[0]  +offset)>>uiBitDepthIncrease;
1435    pDes[512] = (pDes[512]+offset)>>uiBitDepthIncrease;
1436    pDes[256] = (pDes[256]+offset)>>uiBitDepthIncrease;
1437    pDes[768] = (pDes[768]+offset)>>uiBitDepthIncrease;
1438#endif
1439    E4 = C4 + D5;
1440    E5 = C4 - D5;
1441    E6 = C7 - D6;
1442    E7 = C7 + D6;
1443    E9 = xTrRound( 97 * D14 - 236 * D9 , DenShift32);
1444    E10 = xTrRound(  - 236 * D13 - 97 * D10 , DenShift32);
1445    E13 = xTrRound( 97 * D13 - 236 * D10 , DenShift32);
1446    E14 = xTrRound( 236 * D14 + 97 * D9 , DenShift32);
1447    E16 = C16 + D19;
1448    E19 = C16 - D19;
1449    E20 = C23 - D20;
1450    E23 = C23 + D20;
1451    E24 = C24 + D27;
1452    E27 = C24 - D27;
1453    E28 = C31 - D28;
1454    E31 = C31 + D28;
1455    E17 = C17 + D18;
1456    E18 = C17 - D18;
1457    E21 = C22 - D21;
1458    E22 = C22 + D21;
1459    E25 = C25 + D26;
1460    E26 = C25 - D26;
1461    E29 = C30 - D29;
1462    E30 = C30 + D29;
1463   
1464    pDes[128] = xTrRound( 49 * E4 + 251 * E7 , DenShift32);
1465    pDes[640] = xTrRound( 212 * E5 + 142 * E6 , DenShift32);
1466    pDes[384] = xTrRound( 212 * E6 - 142 * E5 , DenShift32);
1467    pDes[896] = xTrRound( 49 * E7 - 251 * E4 , DenShift32);
1468#ifdef TRANS_PRECISION_EXT
1469    pDes[128] = (pDes[128]+offset)>>uiBitDepthIncrease;
1470    pDes[640] = (pDes[640]+offset)>>uiBitDepthIncrease;
1471    pDes[384] = (pDes[384]+offset)>>uiBitDepthIncrease;
1472    pDes[896] = (pDes[896]+offset)>>uiBitDepthIncrease;
1473#endif
1474    F8 = D8 + E9;
1475    F9 = D8 - E9;
1476    F10 = D11 - E10;
1477    F11 = D11 + E10;
1478    F12 = D12 + E13;
1479    F13 = D12 - E13;
1480    F14 = D15 - E14;
1481    F15 = D15 + E14;
1482    F17 = xTrRound( 49 * E30 - 251 * E17 , DenShift32);
1483    F18 = xTrRound(  - 251 * E29 - 49 * E18 , DenShift32);
1484    F21 = xTrRound( 212 * E26 - 142 * E21 , DenShift32);
1485    F22 = xTrRound(  - 142 * E25 - 212 * E22 , DenShift32);
1486    F25 = xTrRound( 212 * E25 - 142 * E22 , DenShift32);
1487    F26 = xTrRound( 142 * E26 + 212 * E21 , DenShift32);
1488    F29 = xTrRound( 49 * E29 - 251 * E18 , DenShift32);
1489    F30 = xTrRound( 251 * E30 + 49 * E17 , DenShift32);;
1490   
1491    pDes[64] = xTrRound( 25 * F8 + 254 * F15 , DenShift32);
1492    pDes[576] = xTrRound( 197 * F9 + 162 * F14 , DenShift32);
1493    pDes[320] = xTrRound( 120 * F10 + 225 * F13 , DenShift32);
1494    pDes[832] = xTrRound( 244 * F11 + 74 * F12 , DenShift32);
1495    pDes[192] = xTrRound( 244 * F12 - 74 * F11 , DenShift32);
1496    pDes[704] = xTrRound( 120 * F13 - 225 * F10 , DenShift32);
1497    pDes[448] = xTrRound( 197 * F14 - 162 * F9 , DenShift32);
1498    pDes[960] = xTrRound( 25 * F15 - 254 * F8 , DenShift32);
1499#ifdef TRANS_PRECISION_EXT
1500    pDes[64]  = (pDes[64] +offset)>>uiBitDepthIncrease;
1501    pDes[576] = (pDes[576]+offset)>>uiBitDepthIncrease;
1502    pDes[320] = (pDes[320]+offset)>>uiBitDepthIncrease;
1503    pDes[832] = (pDes[832]+offset)>>uiBitDepthIncrease;
1504    pDes[192] = (pDes[192]+offset)>>uiBitDepthIncrease;
1505    pDes[704] = (pDes[704]+offset)>>uiBitDepthIncrease;
1506    pDes[448] = (pDes[448]+offset)>>uiBitDepthIncrease;
1507    pDes[960] = (pDes[960]+offset)>>uiBitDepthIncrease;
1508#endif
1509    G16 = E16 + F17;
1510    G17 = E16 - F17;
1511    G18 = E19 - F18;
1512    G19 = E19 + F18;
1513    G20 = E20 + F21;
1514    G21 = E20 - F21;
1515    G22 = E23 - F22;
1516    G23 = E23 + F22;
1517    G24 = E24 + F25;
1518    G25 = E24 - F25;
1519    G26 = E27 - F26;
1520    G27 = E27 + F26;
1521    G28 = E28 + F29;
1522    G29 = E28 - F29;
1523    G30 = E31 - F30;
1524    G31 = E31 + F30;
1525   
1526    pDes[32] = xTrRound( 12 * G16 + 255 * G31 , DenShift32);
1527    pDes[544] = xTrRound( 189 * G17 + 171 * G30 , DenShift32);
1528    pDes[288] = xTrRound( 109 * G18 + 231 * G29 , DenShift32);
1529    pDes[800] = xTrRound( 241 * G19 + 86 * G28 , DenShift32);
1530    pDes[160] = xTrRound( 62 * G20 + 248 * G27 , DenShift32);
1531    pDes[672] = xTrRound( 219 * G21 + 131 * G26 , DenShift32);
1532    pDes[416] = xTrRound( 152 * G22 + 205 * G25 , DenShift32);
1533    pDes[928] = xTrRound( 253 * G23 + 37 * G24 , DenShift32);
1534    pDes[96] = xTrRound( 253 * G24 - 37 * G23 , DenShift32);
1535    pDes[608] = xTrRound( 152 * G25 - 205 * G22 , DenShift32);
1536    pDes[352] = xTrRound( 219 * G26 - 131 * G21 , DenShift32);
1537    pDes[864] = xTrRound( 62 * G27 - 248 * G20 , DenShift32);
1538    pDes[224] = xTrRound( 241 * G28 - 86 * G19 , DenShift32);
1539    pDes[736] = xTrRound( 109 * G29 - 231 * G18 , DenShift32);
1540    pDes[480] = xTrRound( 189 * G30 - 171 * G17 , DenShift32);
1541    pDes[992] = xTrRound( 12 * G31 - 255 * G16 , DenShift32);
1542#ifdef TRANS_PRECISION_EXT
1543    pDes[32]  = (pDes[32] +offset)>>uiBitDepthIncrease;
1544    pDes[544] = (pDes[544]+offset)>>uiBitDepthIncrease;
1545    pDes[288] = (pDes[288]+offset)>>uiBitDepthIncrease;
1546    pDes[800] = (pDes[800]+offset)>>uiBitDepthIncrease;
1547    pDes[160] = (pDes[160]+offset)>>uiBitDepthIncrease;
1548    pDes[672] = (pDes[672]+offset)>>uiBitDepthIncrease;
1549    pDes[416] = (pDes[416]+offset)>>uiBitDepthIncrease;
1550    pDes[928] = (pDes[928]+offset)>>uiBitDepthIncrease;
1551    pDes[96]  = (pDes[96] +offset)>>uiBitDepthIncrease;
1552    pDes[608] = (pDes[608]+offset)>>uiBitDepthIncrease;
1553    pDes[352] = (pDes[352]+offset)>>uiBitDepthIncrease;
1554    pDes[864] = (pDes[864]+offset)>>uiBitDepthIncrease;
1555    pDes[224] = (pDes[224]+offset)>>uiBitDepthIncrease;
1556    pDes[736] = (pDes[736]+offset)>>uiBitDepthIncrease;
1557    pDes[480] = (pDes[480]+offset)>>uiBitDepthIncrease;
1558    pDes[992] = (pDes[992]+offset)>>uiBitDepthIncrease;
1559#endif
1560  }
1561}
1562
1563Void TComTrQuant::xT16( Pel* pSrc, UInt uiStride, Long* pDes )
1564{
1565  Int x, y;
1566 
1567  Long aaiTemp[16][16];
1568  Long B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15;
1569  Long C0, C1, C2, C3, C4, C5, C6, C7, C10, C11, C12, C13;
1570  Long D0, D1, D2, D3, D5, D6, D8, D9, D10, D11, D12, D13, D14, D15;
1571  Long E4, E5, E6, E7, E9, E10, E13, E14;
1572  Long F8, F9, F10, F11, F12, F13, F14, F15;
1573#ifdef TRANS_PRECISION_EXT
1574  Int uiBitDepthIncrease=g_iShift16x16-g_uiBitIncrement;
1575  Int offset = (uiBitDepthIncrease==0)? 0:(1<<(uiBitDepthIncrease-1));
1576#endif
1577 
1578  //--Butterfly
1579  for( y=0 ; y<16 ; y++ )
1580  {
1581#ifdef TRANS_PRECISION_EXT
1582    B0  = (pSrc[0] + pSrc[15])<<uiBitDepthIncrease;
1583    B15 = (pSrc[0] - pSrc[15])<<uiBitDepthIncrease;
1584    B1  = (pSrc[1] + pSrc[14])<<uiBitDepthIncrease;
1585    B14 = (pSrc[1] - pSrc[14])<<uiBitDepthIncrease;
1586    B2  = (pSrc[2] + pSrc[13])<<uiBitDepthIncrease;
1587    B13 = (pSrc[2] - pSrc[13])<<uiBitDepthIncrease;
1588    B3  = (pSrc[3] + pSrc[12])<<uiBitDepthIncrease;
1589    B12 = (pSrc[3] - pSrc[12])<<uiBitDepthIncrease;
1590    B4  = (pSrc[4] + pSrc[11])<<uiBitDepthIncrease;
1591    B11 = (pSrc[4] - pSrc[11])<<uiBitDepthIncrease;
1592    B5  = (pSrc[5] + pSrc[10])<<uiBitDepthIncrease;
1593    B10 = (pSrc[5] - pSrc[10])<<uiBitDepthIncrease;
1594    B6  = (pSrc[6] + pSrc[9])<<uiBitDepthIncrease;
1595    B9  = (pSrc[6] - pSrc[9])<<uiBitDepthIncrease;
1596    B7  = (pSrc[7] + pSrc[8])<<uiBitDepthIncrease;
1597    B8  = (pSrc[7] - pSrc[8])<<uiBitDepthIncrease;
1598#else
1599    B0 = pSrc[0] + pSrc[15];
1600    B15 = pSrc[0] - pSrc[15];
1601    B1 = pSrc[1] + pSrc[14];
1602    B14 = pSrc[1] - pSrc[14];
1603    B2 = pSrc[2] + pSrc[13];
1604    B13 = pSrc[2] - pSrc[13];
1605    B3 = pSrc[3] + pSrc[12];
1606    B12 = pSrc[3] - pSrc[12];
1607    B4 = pSrc[4] + pSrc[11];
1608    B11 = pSrc[4] - pSrc[11];
1609    B5 = pSrc[5] + pSrc[10];
1610    B10 = pSrc[5] - pSrc[10];
1611    B6 = pSrc[6] + pSrc[9];
1612    B9 = pSrc[6] - pSrc[9];
1613    B7 = pSrc[7] + pSrc[8];
1614    B8 = pSrc[7] - pSrc[8];
1615#endif
1616    C0 = B0 + B7;
1617    C7 = B0 - B7;
1618    C1 = B1 + B6;
1619    C6 = B1 - B6;
1620    C2 = B2 + B5;
1621    C5 = B2 - B5;
1622    C3 = B3 + B4;
1623    C4 = B3 - B4;
1624    C10 = xTrRound( 45 * ( B13 - B10 ) , DenShift16);
1625    C13 = xTrRound( 45 * ( B13 + B10 ) , DenShift16);
1626    C11 = xTrRound( 45 * ( B12 - B11 ) , DenShift16);
1627    C12 = xTrRound( 45 * ( B12 + B11 ) , DenShift16);
1628   
1629    D0 = C0 + C3;
1630    D3 = C0 - C3;
1631    D8 = B8 + C11;
1632    D11 = B8 - C11;
1633    D12 = B15 - C12;
1634    D15 = B15 + C12;
1635    D1 = C1 + C2;
1636    D2 = C1 - C2;
1637    D9 = B9 + C10;
1638    D10 = B9 - C10;
1639    D13 = B14 - C13;
1640    D14 = B14 + C13;
1641    D5 = xTrRound( 45 * ( C6 - C5 ) , DenShift16);
1642    D6 = xTrRound( 45 * ( C6 + C5 ) , DenShift16);
1643   
1644    aaiTemp[0][y] = xTrRound( 45 * ( D0 + D1 ) , DenShift16);
1645    aaiTemp[8][y] = xTrRound( 45 * ( D0 - D1 ) , DenShift16);
1646    aaiTemp[4][y] = xTrRound( 59 * D3 + 24 * D2 , DenShift16);
1647    aaiTemp[12][y] = xTrRound( 24 * D3 - 59 * D2 , DenShift16);
1648    E4 = C4 + D5;
1649    E5 = C4 - D5;
1650    E6 = C7 - D6;
1651    E7 = C7 + D6;
1652    E9 = xTrRound( 24 * D14 - 59 * D9 , DenShift16);
1653    E10 = xTrRound(  -59 * D13 - 24 * D10 , DenShift16);
1654    E13 = xTrRound( 24 * D13 - 59 * D10 , DenShift16);
1655    E14 = xTrRound( 59 * D14 + 24 * D9 , DenShift16);
1656   
1657    aaiTemp[2][y] = xTrRound( 12 * E4 + 62 * E7 , DenShift16);
1658    aaiTemp[10][y] = xTrRound( 53 * E5 + 35 * E6 , DenShift16);
1659    aaiTemp[6][y] = xTrRound( 53 * E6 - 35 * E5 , DenShift16);
1660    aaiTemp[14][y] = xTrRound( 12 * E7 - 62 * E4 , DenShift16);
1661    F8 = D8 + E9;
1662    F9 = D8 - E9;
1663    F10 = D11 - E10;
1664    F11 = D11 + E10;
1665    F12 = D12 + E13;
1666    F13 = D12 - E13;
1667    F14 = D15 - E14;
1668    F15 = D15 + E14;
1669   
1670    aaiTemp[1][y] = xTrRound( 6 * F8 + 63 * F15 , DenShift16);
1671    aaiTemp[9][y] = xTrRound( 49 * F9 + 40 * F14 , DenShift16);
1672    aaiTemp[5][y] = xTrRound( 30 * F10 + 56 * F13 , DenShift16);
1673    aaiTemp[13][y] = xTrRound( 61 * F11 + 18 * F12 , DenShift16);
1674    aaiTemp[3][y] = xTrRound( 61 * F12 - 18 * F11 , DenShift16);
1675    aaiTemp[11][y] = xTrRound( 30 * F13 - 56 * F10 , DenShift16);
1676    aaiTemp[7][y] = xTrRound( 49 * F14 - 40 * F9 , DenShift16);
1677    aaiTemp[15][y] = xTrRound( 6 * F15 - 63 * F8 , DenShift16);
1678   
1679    pSrc += uiStride;
1680  }
1681 
1682  for( x=0 ; x<16 ; x++, pDes++ )
1683  {
1684    B0 = aaiTemp[x][0] + aaiTemp[x][15];
1685    B15 = aaiTemp[x][0] - aaiTemp[x][15];
1686    B1 = aaiTemp[x][1] + aaiTemp[x][14];
1687    B14 = aaiTemp[x][1] - aaiTemp[x][14];
1688    B2 = aaiTemp[x][2] + aaiTemp[x][13];
1689    B13 = aaiTemp[x][2] - aaiTemp[x][13];
1690    B3 = aaiTemp[x][3] + aaiTemp[x][12];
1691    B12 = aaiTemp[x][3] - aaiTemp[x][12];
1692    B4 = aaiTemp[x][4] + aaiTemp[x][11];
1693    B11 = aaiTemp[x][4] - aaiTemp[x][11];
1694    B5 = aaiTemp[x][5] + aaiTemp[x][10];
1695    B10 = aaiTemp[x][5] - aaiTemp[x][10];
1696    B6 = aaiTemp[x][6] + aaiTemp[x][9];
1697    B9 = aaiTemp[x][6] - aaiTemp[x][9];
1698    B7 = aaiTemp[x][7] + aaiTemp[x][8];
1699    B8 = aaiTemp[x][7] - aaiTemp[x][8];
1700   
1701    C0 = B0 + B7;
1702    C7 = B0 - B7;
1703    C1 = B1 + B6;
1704    C6 = B1 - B6;
1705    C2 = B2 + B5;
1706    C5 = B2 - B5;
1707    C3 = B3 + B4;
1708    C4 = B3 - B4;
1709    C10 = xTrRound( 45 * ( B13 - B10 ) , DenShift16);
1710    C13 = xTrRound( 45 * ( B13 + B10 ) , DenShift16);
1711    C11 = xTrRound( 45 * ( B12 - B11 ) , DenShift16);
1712    C12 = xTrRound( 45 * ( B12 + B11 ) , DenShift16);
1713   
1714    D0 = C0 + C3;
1715    D3 = C0 - C3;
1716    D8 = B8 + C11;
1717    D11 = B8 - C11;
1718    D12 = B15 - C12;
1719    D15 = B15 + C12;
1720    D1 = C1 + C2;
1721    D2 = C1 - C2;
1722    D9 = B9 + C10;
1723    D10 = B9 - C10;
1724    D13 = B14 - C13;
1725    D14 = B14 + C13;
1726    D5 = xTrRound( 45 * ( C6 - C5 ) , DenShift16);
1727    D6 = xTrRound( 45 * ( C6 + C5 ) , DenShift16);
1728   
1729    pDes[0] = xTrRound( 45 * ( D0 + D1 ) , DenShift16);
1730    pDes[128] = xTrRound( 45 * ( D0 - D1 ) , DenShift16);
1731    pDes[64] = xTrRound( 59 * D3 + 24 * D2 , DenShift16);
1732    pDes[192] = xTrRound( 24 * D3 - 59 * D2 , DenShift16);
1733#ifdef TRANS_PRECISION_EXT
1734    pDes[0  ] = (pDes[0  ]+offset)>>uiBitDepthIncrease;
1735    pDes[128] = (pDes[128]+offset)>>uiBitDepthIncrease;
1736    pDes[64 ] = (pDes[64 ]+offset)>>uiBitDepthIncrease;
1737    pDes[192] = (pDes[192]+offset)>>uiBitDepthIncrease;
1738#endif
1739    E4 = C4 + D5;
1740    E5 = C4 - D5;
1741    E6 = C7 - D6;
1742    E7 = C7 + D6;
1743    E9 = xTrRound( 24 * D14 - 59 * D9 , DenShift16);
1744    E10 = xTrRound(  -59 * D13 - 24 * D10 , DenShift16);
1745    E13 = xTrRound( 24 * D13 - 59 * D10 , DenShift16);
1746    E14 = xTrRound( 59 * D14 + 24 * D9 , DenShift16);
1747   
1748    pDes[32] = xTrRound( 12 * E4 + 62 * E7 , DenShift16);
1749    pDes[160] = xTrRound( 53 * E5 + 35 * E6 , DenShift16);
1750    pDes[96] = xTrRound( 53 * E6 - 35 * E5 , DenShift16);
1751    pDes[224] = xTrRound( 12 * E7 - 62 * E4 , DenShift16);
1752#ifdef TRANS_PRECISION_EXT
1753    pDes[32]  = (pDes[32] +offset)>>uiBitDepthIncrease;
1754    pDes[160] = (pDes[160]+offset)>>uiBitDepthIncrease;
1755    pDes[96]  = (pDes[96] +offset)>>uiBitDepthIncrease;
1756    pDes[224] = (pDes[224]+offset)>>uiBitDepthIncrease;
1757#endif
1758    F8 = D8 + E9;
1759    F9 = D8 - E9;
1760    F10 = D11 - E10;
1761    F11 = D11 + E10;
1762    F12 = D12 + E13;
1763    F13 = D12 - E13;
1764    F14 = D15 - E14;
1765    F15 = D15 + E14;
1766   
1767    pDes[16] = xTrRound( 6 * F8 + 63 * F15 , DenShift16);
1768    pDes[144] = xTrRound( 49 * F9 + 40 * F14 , DenShift16);
1769    pDes[80] = xTrRound( 30 * F10 + 56 * F13 , DenShift16);
1770    pDes[208] = xTrRound( 61 * F11 + 18 * F12 , DenShift16);
1771    pDes[48] = xTrRound( 61 * F12 - 18 * F11 , DenShift16);
1772    pDes[176] = xTrRound( 30 * F13 - 56 * F10 , DenShift16);
1773    pDes[112] = xTrRound( 49 * F14 - 40 * F9 , DenShift16);
1774    pDes[240] = xTrRound( 6 * F15 - 63 * F8 , DenShift16);
1775#ifdef TRANS_PRECISION_EXT
1776    pDes[16]  = (pDes[16] +offset)>>uiBitDepthIncrease;
1777    pDes[144] = (pDes[144]+offset)>>uiBitDepthIncrease;
1778    pDes[80]  = (pDes[80] +offset)>>uiBitDepthIncrease;
1779    pDes[208] = (pDes[208]+offset)>>uiBitDepthIncrease;
1780    pDes[48]  = (pDes[48] +offset)>>uiBitDepthIncrease;
1781    pDes[176] = (pDes[176]+offset)>>uiBitDepthIncrease;
1782    pDes[112] = (pDes[112]+offset)>>uiBitDepthIncrease;
1783    pDes[240] = (pDes[240]+offset)>>uiBitDepthIncrease;
1784#endif
1785  }
1786}
1787#endif //E243_CORE_TRANSFORMS
1788
1789#if QC_MOD_LCEC_RDOQ
1790UInt TComTrQuant::xCountVlcBits(UInt uiTableNumber, UInt uiCodeNumber)
1791{
1792  UInt uiLength = 0;
1793  UInt uiCode = 0;
1794
1795  if ( uiCodeNumber < 128 )
1796  {
1797    uiLength=VLClength[uiTableNumber][uiCodeNumber];
1798  }
1799  else
1800  {
1801    if ( uiTableNumber < 10 )
1802    {
1803      if ( uiTableNumber < 5 )
1804      {
1805        uiCode = uiCodeNumber - (6 * (1 << uiTableNumber)) + (1 << uiTableNumber);
1806        uiLength = ( 6 - uiTableNumber ) + 1 + 2 * xLeadingZeros(uiCode);
1807      }
1808      else if ( uiTableNumber < 8 )
1809      {
1810        uiLength = 1 + (uiTableNumber - 4) + (uiCodeNumber >> (uiTableNumber - 4));
1811      }
1812      else if ( uiTableNumber == 9 )
1813      {
1814        uiLength = 5 + ((uiCodeNumber + 5) >> 4);
1815      }
1816    }
1817    else
1818    {
1819      if ( uiTableNumber == 10 )
1820      {
1821        uiCode = uiCodeNumber + 1;
1822        uiLength = 1 + 2 * xLeadingZeros(uiCode);
1823      }
1824#if CAVLC_COEF_LRG_BLK
1825      else if (uiTableNumber == 12)
1826      {
1827        uiLength = 7+(uiCodeNumber>>6);
1828      }
1829      else if(uiTableNumber == 13)
1830      {
1831        uiLength = 5+(uiCodeNumber>>4);
1832      }
1833#endif
1834    }
1835  }
1836  return uiLength;
1837}
1838
1839
1840#if CAVLC_COEF_LRG_BLK
1841Int TComTrQuant::bitCountRDOQ(Int coeff, Int pos, Int nTab, Int lastCoeffFlag,Int levelMode,Int run, Int maxrun, Int vlc_adaptive, Int N, 
1842                              UInt uiTr1, Int iSum_big_coef, Int iBlockType, TComDataCU* pcCU, const UInt **pLumaRunTr1)
1843#else
1844Int TComTrQuant::bitCountRDOQ(Int coeff, Int pos, Int nTab, Int lastCoeffFlag,Int levelMode,Int run, Int maxrun, Int vlc_adaptive, Int N, 
1845                              UInt uiTr1, Int iSum_big_coef, Int iBlockType, TComDataCU* pcCU)
1846#endif
1847{
1848  UInt cn, n, level, lev;
1849  Int vlc,x,cx,vlcNum,bits;
1850  static const int vlcTable4[3] = {2,2,2};             // Y4x4I,Y4x4P,Y4x4B,
1851
1852  Int sign = coeff < 0 ? 1 : 0;
1853
1854  if ( N==4 )
1855  {
1856    n = Max(0, nTab - 2);
1857  }
1858  else
1859  {
1860    n = nTab;
1861  }
1862
1863  UInt uiModZeroCoding = 0;
1864  const UInt *uiVlcTableTemp;
1865
1866#if CAVLC_COEF_LRG_BLK
1867  uiModZeroCoding = (m_uiRDOQOffset==1 || N>8)? 1:0;
1868  int tmprun = Min(maxrun,28);
1869
1870  if( N<=8 )
1871  {
1872    uiVlcTableTemp = (nTab==2 || nTab==5)? g_auiVlcTable8x8Intra:g_auiVlcTable8x8Inter;
1873  }
1874  else
1875  {
1876    uiVlcTableTemp = (nTab==5)? g_auiVlcTable16x16Intra:g_auiVlcTable16x16Inter;
1877  }
1878#else
1879  if( nTab == 2 || nTab == 5 ){
1880    uiVlcTableTemp = g_auiVlcTable8x8Intra;
1881  }
1882  else
1883  {
1884    uiVlcTableTemp = g_auiVlcTable8x8Inter;
1885  }
1886#endif
1887
1888  level = abs(coeff);
1889  lev = (level == 1) ? 0 : 1;
1890
1891  if ( level )
1892  {
1893    if ( lastCoeffFlag == 1 )
1894    {     
1895      x = pos + (level == 1 ? 0 : N * N);
1896      if( N == 4 )
1897      {
1898        cx = m_uiLPTableE4[(n << 5) + x];
1899        vlcNum = vlcTable4[n];
1900      }
1901      else{
1902#if CAVLC_COEF_LRG_BLK
1903        cx = xLastLevelInd(lev, pos, N);
1904#else
1905        cx = m_uiLPTableE8[(n << 7) + x];
1906#endif
1907        vlcNum = g_auiLastPosVlcNum[n][Min(16,m_uiLastPosVlcIndex[n])];
1908      }
1909      bits=xCountVlcBits( vlcNum, cx );
1910
1911      if ( level > 1 )
1912      {
1913        bits += xCountVlcBits( 0, 2 * (level - 2) + sign );
1914      }
1915      else
1916      {
1917        bits++;
1918      }
1919
1920    }
1921    else{ // Level !=0  && lastCoeffFlag==0
1922
1923      if ( !levelMode ){   
1924#if CAVLC_COEF_LRG_BLK
1925          if(nTab == 2 || nTab == 5)
1926          {
1927            cn = xRunLevelInd(lev, run, maxrun, pLumaRunTr1[uiTr1][tmprun]);
1928          }
1929          else
1930          {
1931            cn = xRunLevelIndInter(lev, run, maxrun);
1932          }
1933          vlc = uiVlcTableTemp[tmprun];
1934#else
1935        if ( N == 4 ){
1936          // 4x4
1937          if ( nTab == 2 ){
1938            cn = xRunLevelInd(lev, run, maxrun, g_auiLumaRunTr14x4[uiTr1][maxrun]);
1939          }
1940          else{
1941#if RUNLEVEL_TABLE_CUT
1942            cn = xRunLevelIndInter(lev, run, maxrun);
1943#else
1944            cn = g_auiLumaRun8x8[maxrun][lev][run];
1945#endif
1946          }
1947          vlc = uiVlcTableTemp[maxrun];
1948        }
1949        else {
1950          // 8x8
1951          if(nTab == 2 || nTab == 5)
1952          {
1953            cn = xRunLevelInd(lev, run, maxrun, g_auiLumaRunTr18x8[uiTr1][Min(maxrun,28)]);
1954          }
1955          else
1956          {
1957#if RUNLEVEL_TABLE_CUT
1958            cn = xRunLevelIndInter(lev, run, maxrun);
1959#else
1960            cn = g_auiLumaRun8x8[Min(maxrun,28)][lev][run];
1961#endif
1962          }
1963          vlc = uiVlcTableTemp[Min(maxrun,28)];
1964        }
1965#endif
1966        bits = xCountVlcBits( vlc, cn );
1967        if ( level > 1 ){
1968          bits += xCountVlcBits( 0, 2 * (level - 2) + sign );
1969        }
1970        else{
1971          bits++;
1972        } 
1973
1974      }
1975      else{ // Level !=0  && lastCoeffFlag==0 && levelMode
1976        bits = (xCountVlcBits( vlc_adaptive, level ) + 1);
1977      }
1978    }
1979  }
1980  else{
1981
1982    if (levelMode){
1983      bits=xCountVlcBits( vlc_adaptive, level );
1984    }
1985    else{                       
1986      if ( pos == 0 && lastCoeffFlag == 0){ 
1987
1988#if CAVLC_COEF_LRG_BLK
1989        vlc = uiVlcTableTemp[tmprun];
1990        if(nTab == 2 || nTab == 5)
1991        {
1992          cn = xRunLevelInd(0, run + 1, maxrun, pLumaRunTr1[uiTr1][tmprun]);
1993        }
1994        else
1995        {
1996          cn = xRunLevelIndInter(0, run + 1, maxrun);
1997        }
1998#else
1999        if ( N == 4 ){
2000          // 4x4
2001          vlc = uiVlcTableTemp[maxrun];
2002          if ( nTab == 2 ){
2003            cn = xRunLevelInd(0, run + 1, maxrun, g_auiLumaRunTr14x4[uiTr1][maxrun]);
2004          }
2005          else{
2006#if RUNLEVEL_TABLE_CUT
2007            cn = xRunLevelIndInter(0, run+1, maxrun);
2008#else
2009            cn = g_auiLumaRun8x8[maxrun][0][run + 1];
2010#endif
2011          }
2012        }
2013        else{
2014          // 8x8
2015          vlc = uiVlcTableTemp[Min(maxrun, 28)];
2016          if(nTab == 2 || nTab == 5){
2017            cn = xRunLevelInd(0, run + 1, maxrun, g_auiLumaRunTr18x8[uiTr1][Min(maxrun, 28)]);
2018          }
2019          else{
2020#if RUNLEVEL_TABLE_CUT
2021            cn = xRunLevelIndInter(0, run+1, maxrun);
2022#else
2023            cn = g_auiLumaRun8x8[Min(maxrun, 28)][0][run + 1];
2024#endif
2025          }
2026        }
2027#endif
2028        bits=xCountVlcBits( vlc, cn );
2029      }
2030      else{
2031        bits = 0;
2032
2033        if ( pos > 0 && uiModZeroCoding == 1 ){
2034
2035          Int iSum_big_coefTemp, levelModeTemp, maxrunTemp;
2036          UInt uiTr1Temp;
2037
2038          if ( lastCoeffFlag == 0 ){
2039
2040#if CAVLC_COEF_LRG_BLK
2041            vlc = uiVlcTableTemp[tmprun];
2042            if(nTab == 2 || nTab == 5)
2043            {
2044              cn = xRunLevelInd(0, run + 1, maxrun, pLumaRunTr1[uiTr1][tmprun]);
2045            }
2046            else
2047            {
2048              cn = xRunLevelIndInter(0, run + 1, maxrun);
2049            }
2050#else
2051            if ( N == 4 ){
2052              // 4x4
2053              vlc = uiVlcTableTemp[maxrun];
2054              if ( nTab == 2 ){
2055                cn = xRunLevelInd(0, run + 1, maxrun, g_auiLumaRunTr14x4[uiTr1][maxrun]);
2056              }
2057              else{
2058#if RUNLEVEL_TABLE_CUT
2059                cn = xRunLevelIndInter(0, run+1, maxrun);
2060#else
2061                cn = g_auiLumaRun8x8[maxrun][0][run + 1];
2062#endif
2063              }
2064            }
2065            else{
2066              // 8x8
2067              vlc = uiVlcTableTemp[Min(maxrun, 28)];
2068              if(nTab == 2 || nTab == 5){
2069                cn = xRunLevelInd(0, run + 1, maxrun, g_auiLumaRunTr18x8[uiTr1][Min(maxrun, 28)]);
2070              }
2071              else{
2072#if RUNLEVEL_TABLE_CUT
2073                cn = xRunLevelIndInter(0, run+1, maxrun);
2074#else
2075                cn = g_auiLumaRun8x8[Min(maxrun,28)][0][run + 1];
2076#endif
2077              }
2078            }
2079#endif
2080          }
2081          else{
2082
2083            x = (pos - 1);
2084            if( N == 4 )
2085            {
2086              cn = m_uiLPTableE4[(n << 5) + x];
2087              vlc = vlcTable4[n];
2088            }
2089            else{
2090#if CAVLC_COEF_LRG_BLK
2091              cn = xLastLevelInd(lev, pos, N);
2092#else
2093              cn = m_uiLPTableE8[(n << 7) + x];
2094#endif
2095              vlc = g_auiLastPosVlcNum[n][Min(16, m_uiLastPosVlcIndex[n])];
2096            }
2097          }
2098          bits+=xCountVlcBits( vlc, cn );
2099
2100          // Next coeff is 1 with run=0
2101
2102          iSum_big_coefTemp = iSum_big_coef;
2103          levelModeTemp = levelMode;
2104          Int switch_thr[10] = {49,49,0,49,49,0,49,49,49,49};
2105
2106          if ( N > 4 ){ 
2107            if ( level > 1 ){
2108              iSum_big_coefTemp += level;
2109              if ((N * N - pos - 1) > switch_thr[iBlockType] || iSum_big_coefTemp > 2) levelModeTemp = 1;
2110            }
2111          }
2112          else{
2113            if ( level > 1 ) levelModeTemp = 1;
2114          }
2115
2116          if ( levelModeTemp == 1 ){
2117            bits-=xCountVlcBits( vlc_adaptive, 1);
2118          }
2119          else{
2120            maxrunTemp = pos - 1;
2121            uiTr1Temp = uiTr1;
2122
2123            if ( uiTr1Temp > 0 && level < 2 ){
2124              uiTr1Temp++;
2125              uiTr1Temp = Min(MAX_TR1, uiTr1Temp);
2126            }
2127            else{
2128              uiTr1Temp=0;
2129            }
2130
2131#if CAVLC_COEF_LRG_BLK
2132            vlc = uiVlcTableTemp[Min(maxrunTemp,28)];
2133            if(nTab == 2 || nTab == 5)
2134            {
2135              cn = xRunLevelInd(0, 0, maxrunTemp, pLumaRunTr1[uiTr1Temp][Min(maxrunTemp,28)]);
2136            }
2137            else
2138            {
2139              cn = xRunLevelIndInter(0, 0, maxrunTemp);
2140            }
2141#else
2142            if ( N == 4 ){
2143              // 4x4
2144              vlc = uiVlcTableTemp[maxrunTemp];
2145              if ( nTab == 2 ){
2146                cn = xRunLevelInd(0, 0, maxrunTemp, g_auiLumaRunTr14x4[uiTr1Temp][maxrunTemp]);
2147              }
2148              else{
2149#if RUNLEVEL_TABLE_CUT
2150                cn = xRunLevelIndInter(0, 0, maxrunTemp);
2151#else
2152                cn = g_auiLumaRun8x8[maxrunTemp][0][0];
2153#endif
2154              }
2155            }
2156            else{
2157              // 8x8
2158              vlc = uiVlcTableTemp[Min(maxrunTemp,28)];
2159              if(nTab == 2 || nTab == 5){
2160                cn = xRunLevelInd(0, 0, maxrunTemp, g_auiLumaRunTr18x8[uiTr1Temp][Min(maxrunTemp,28)]);
2161              }
2162              else{
2163#if RUNLEVEL_TABLE_CUT
2164                cn = xRunLevelIndInter(0, 0, maxrunTemp);
2165#else
2166                cn = g_auiLumaRun8x8[Min(maxrunTemp,28)][0][0];
2167#endif
2168              }
2169            }
2170#endif
2171            bits -= xCountVlcBits( vlc, cn );
2172          }
2173        } // if ( pos > 0 && uiModZeroCoding == 1 ){
2174
2175      } 
2176    }
2177  }
2178  return bits;
2179}
2180
2181Int TComTrQuant::xCodeCoeffCountBitsLast(TCoeff* scoeff, levelDataStruct* levelData, Int nTab, UInt N)
2182{
2183  Int i, prevCoeffInd, lastPosMin, iRate;
2184  Int done,last_pos;
2185#if CAVLC_COEF_LRG_BLK
2186  Int run_done, maxrun,run, bitsLast[1024], bitsRun[1024], bitsLastPrev;
2187  quantLevelStruct quantCoeffInfo[1024];
2188#else
2189  Int run_done, maxrun,run, bitsLast[256], bitsRun[256], bitsLastPrev;
2190  quantLevelStruct quantCoeffInfo[256];
2191#endif
2192  UInt last_pos_init, bitsLevel, sign, lev, cn, vlc, uiBitShift=15, uiNoCoeff=N*N, absLevel;
2193  Int n;
2194  double lagrMin, lagr, lagrPrev;
2195  UInt uiLumaRunNoTr14x4[15]={2, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2};
2196  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};
2197
2198
2199  if ( N == 4 ){
2200    n = Max(0, nTab - 2);
2201  }
2202  else
2203  {
2204    n = nTab;
2205  }
2206
2207  /* Do the last coefficient first */
2208  i = uiNoCoeff - 1;
2209  done = 0;
2210
2211  while ( !done && i >= 0 )
2212  {
2213    if (scoeff[i])
2214    {
2215      done = 1;
2216    }
2217    else
2218    {
2219      i--;
2220    }
2221  }
2222  if (i == -1)
2223  {
2224    return(-1);
2225  }
2226
2227  last_pos = last_pos_init = i;
2228  prevCoeffInd = i;
2229
2230  i--;
2231
2232  if ( i >= 0 ){
2233
2234    /* Go into run mode */
2235    run_done = 0;
2236    while ( !run_done )
2237    {
2238      maxrun = i;
2239
2240      run = 0;
2241      done = 0;
2242      while ( !done )
2243      {
2244        if ( !scoeff[i] )
2245        {
2246          run++;
2247        }
2248        else
2249        {
2250          quantCoeffInfo[prevCoeffInd].run=run;
2251          quantCoeffInfo[prevCoeffInd].maxrun=maxrun;
2252          quantCoeffInfo[prevCoeffInd].nextLev=(abs(scoeff[i]) == 1) ? 0 : 1;
2253          quantCoeffInfo[prevCoeffInd].nexLevelVal=scoeff[i];
2254
2255          prevCoeffInd = i;
2256
2257          run = 0;
2258          done = 1;
2259        }
2260        if (i == 0)
2261        {
2262          quantCoeffInfo[prevCoeffInd].run=run;
2263          quantCoeffInfo[prevCoeffInd].maxrun=maxrun;
2264          quantCoeffInfo[prevCoeffInd].nextLev=0;
2265          quantCoeffInfo[prevCoeffInd].nexLevelVal=0;
2266
2267          done = 1;
2268          run_done = 1;
2269        }
2270        i--;
2271      }
2272    }
2273  }
2274
2275#if CAVLC_COEF_LRG_BLK
2276  const UInt *vlcTableIntra = (N<=8)? g_auiVlcTable8x8Intra:g_auiVlcTable16x16Intra;
2277  const UInt *vlcTableInter = (N<=8)? g_auiVlcTable8x8Inter:g_auiVlcTable16x16Inter;
2278  const UInt *pLumaRunTr1 = (N==4)? uiLumaRunNoTr14x4:uiLumaRunNoTr18x8;
2279#endif
2280  for (i = last_pos_init; i >= 0; i--){
2281
2282    if (scoeff[i]){
2283
2284      bitsLast[i] = bitsRun[i] = 0; 
2285
2286      last_pos = i;
2287      {
2288        int x,cx,vlcNum;
2289        int vlcTable[3] = {2,2,2};
2290
2291        bitsLevel=0;
2292        absLevel = abs(scoeff[i]);
2293        sign = (scoeff[i] < 0) ? 1 : 0;
2294        lev = (absLevel == 1) ? 0 : 1;
2295
2296        if (absLevel > 1)
2297        {
2298          bitsLevel=xCountVlcBits( 0, 2*(absLevel-2)+sign );
2299        }
2300        else
2301        {
2302          bitsLevel++;
2303        }
2304
2305        x = uiNoCoeff*lev + last_pos;
2306
2307        if ( uiNoCoeff == 16 ){
2308          cx = m_uiLPTableE4[n * 32 + x];
2309          vlcNum = vlcTable[n];
2310        }
2311        else {
2312#if CAVLC_COEF_LRG_BLK
2313          cx = xLastLevelInd(lev, last_pos, N);
2314#else
2315          cx = m_uiLPTableE8[n * 128 + x];
2316#endif
2317          vlcNum = g_auiLastPosVlcNum[n][Min(16,m_uiLastPosVlcIndex[n])];
2318        }
2319        bitsLast[i]=bitsLevel + xCountVlcBits( vlcNum, cx);
2320      }
2321
2322      bitsRun[i]=0;
2323
2324      if ( i > 0 )
2325      {
2326        bitsLevel = 0;
2327        if ( quantCoeffInfo[i].nexLevelVal != 0 ){
2328          absLevel = abs(quantCoeffInfo[i].nexLevelVal);
2329          sign = (quantCoeffInfo[i].nexLevelVal < 0) ? 1 : 0;
2330          lev = (absLevel == 1) ? 0 : 1;
2331
2332          if (absLevel > 1)
2333          {
2334            bitsLevel = xCountVlcBits( 0, 2 * (absLevel - 2) + sign );
2335          }
2336          else
2337          {
2338            bitsLevel++;
2339          }
2340        }
2341
2342        bitsRun[i] = bitsLevel;
2343        run = quantCoeffInfo[i].run;
2344        maxrun = quantCoeffInfo[i].maxrun;
2345
2346#if CAVLC_COEF_LRG_BLK
2347        Int tmprun = Min(maxrun,28);
2348        if(nTab == 2 || nTab == 5)
2349        {
2350          vlc = vlcTableIntra[tmprun]; 
2351          cn = xRunLevelInd(quantCoeffInfo[i].nextLev, run, maxrun, pLumaRunTr1[tmprun]);
2352        }
2353        else
2354        {
2355          vlc = vlcTableInter[tmprun]; 
2356          cn = xRunLevelIndInter(quantCoeffInfo[i].nextLev, run, maxrun);
2357        }
2358        bitsRun[i] += xCountVlcBits( vlc, cn );
2359#else
2360        if ( uiNoCoeff == 16 )
2361        {
2362          if ( nTab == 2 ){
2363            vlc = g_auiVlcTable8x8Intra[maxrun];       
2364            cn = xRunLevelInd(quantCoeffInfo[i].nextLev, run, maxrun, uiLumaRunNoTr14x4[maxrun]);
2365          }
2366          else{
2367            vlc = g_auiVlcTable8x8Inter[maxrun];           
2368#if RUNLEVEL_TABLE_CUT
2369            cn = xRunLevelIndInter(quantCoeffInfo[i].nextLev, run, maxrun);
2370#else
2371            cn = g_auiLumaRun8x8[maxrun][quantCoeffInfo[i].nextLev][run];
2372#endif
2373          }
2374          bitsRun[i] += xCountVlcBits( vlc, cn );
2375        }
2376        else
2377        {
2378          if(nTab == 2 || nTab == 5){
2379            vlc = g_auiVlcTable8x8Intra[Min(maxrun,28)];         
2380            cn = xRunLevelInd(quantCoeffInfo[i].nextLev, run, maxrun, uiLumaRunNoTr18x8[min(maxrun,28)]);
2381          }
2382          else{
2383            vlc = g_auiVlcTable8x8Inter[Min(maxrun,28)];           
2384#if RUNLEVEL_TABLE_CUT
2385            cn = xRunLevelIndInter(quantCoeffInfo[i].nextLev, run, maxrun); 
2386#else
2387            cn = g_auiLumaRun8x8[min(maxrun,28)][quantCoeffInfo[i].nextLev][run];
2388#endif
2389          }
2390          bitsRun[i] += xCountVlcBits( vlc, cn );
2391        }
2392#endif
2393      }
2394    }
2395  }
2396
2397  lagrMin=0; lastPosMin=-1; 
2398  for (i=0; i<uiNoCoeff; i++){
2399    if ( scoeff[i] != 0 ){
2400      lagrMin += levelData[i].errLevel[0];
2401    }
2402  }
2403
2404  UInt first=1; 
2405
2406  bitsLastPrev=0; lagrPrev=lagrMin;
2407  for (i=0; i<uiNoCoeff; i++){
2408    if (scoeff[i]){
2409      iRate = (bitsRun[i] + bitsLast[i] - bitsLastPrev) << uiBitShift;
2410      lagr = lagrPrev-levelData[i].errLevel[0] + levelData[i].errLevel[levelData[i].quantInd] + m_dLambda*iRate;
2411      bitsLastPrev = bitsLast[i];
2412      lagrPrev = lagr;
2413
2414      if ( lagr < lagrMin || abs(scoeff[i]) > 1 || first == 1){
2415        lagrMin = lagr;
2416        lastPosMin =i;
2417        first = 0;
2418      }
2419    }
2420  }
2421
2422  return(lastPosMin);
2423}   
2424#else
2425#if QC_MOD_LCEC
2426Int TComTrQuant::bitCount_LCEC(Int k,Int pos,Int nTab, Int lpflag,Int levelMode,Int run, Int maxrun, Int vlc_adaptive, Int N, UInt uiTr1)
2427#else
2428Int TComTrQuant::bitCount_LCEC(Int k,Int pos,Int n,Int lpflag,Int levelMode,Int run,Int maxrun,Int vlc_adaptive,Int N)
2429#endif
2430{
2431  UInt cn;
2432  int vlc,x,cx,vlcNum,bits,temp;
2433#if QC_MOD_LCEC == 0
2434  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};
2435  static const int vlcTable8[8] = {10,10,3,3,3,4,4,4}; // U,V,Y8x8I,Y8x8P,Y8x8B,Y16x16I,Y16x16P,Y16x16B
2436#endif
2437  static const int vlcTable4[3] = {2,2,2};             // Y4x4I,Y4x4P,Y4x4B,
2438#if QC_MOD_LCEC == 0
2439  static const int VLClength[11][128] =
2440  {
2441    { 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},
2442    { 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},
2443    { 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},
2444    { 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},
2445    { 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},
2446    { 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},
2447    { 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},
2448    { 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},
2449    { 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},
2450    { 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},
2451    { 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}
2452  };
2453#endif
2454  int sign = k<0 ? 1 : 0;
2455 
2456  k = abs(k);
2457#if QC_MOD_LCEC
2458  Int n;
2459  Int lev = (k>1 ? 1 : 0);
2460  if (N==4)
2461    n=max(0,nTab-2);
2462  else
2463    n=nTab;
2464#endif
2465  if (N != 4 && N!= 8)
2466  {
2467    FATAL_ERROR_0("unsupported block size in bitCount_LCEC()" , -1 );
2468  }
2469  if (k)
2470  {
2471    if (lpflag==1)
2472    {                       
2473      x = pos + (k==1 ? 0 : N*N);
2474      if (N==8)
2475      {
2476        cx = m_uiLPTableE8[n*128+x];
2477#if QC_MOD_LCEC
2478        vlcNum = g_auiLastPosVlcNum[n][Min(16,m_uiLastPosVlcIndex[n])];
2479#else
2480        vlcNum = vlcTable8[n];
2481#endif
2482      }
2483      else // (N==4)
2484      {
2485        cx = m_uiLPTableE4[n*32+x];
2486        vlcNum = vlcTable4[n];
2487      }
2488      bits = VLClength[vlcNum][cx];
2489      if (k>1)
2490      {
2491        temp = 2*(k-2)+sign;
2492        if(temp > 127)
2493          temp = 127;
2494        bits += VLClength[0][temp];
2495      }
2496      else
2497        bits += 1;                                     
2498    }
2499    else
2500    {
2501      if (!levelMode)
2502      {                                                   
2503#if QC_MOD_LCEC
2504        const UInt *p_auiLumaRunTr1 = g_auiLumaRunTr14x4[uiTr1];
2505        UInt ui_maxrun = maxrun;
2506        if (N==8)
2507        { 
2508          p_auiLumaRunTr1 = g_auiLumaRunTr18x8[uiTr1];
2509          ui_maxrun =min(maxrun,28);
2510        }
2511        if(nTab == 2 || nTab == 5)
2512        {
2513          cn = xRunLevelInd(lev, run, maxrun, p_auiLumaRunTr1[ui_maxrun]);
2514          vlc = g_auiVlcTable8x8Intra[ui_maxrun];
2515        }
2516        else
2517        {
2518          cn = g_auiLumaRun8x8[ui_maxrun][lev][run];
2519          vlc = g_auiVlcTable8x8Inter[ui_maxrun];
2520        }
2521#else                                     
2522        if (maxrun > 27)
2523        {
2524          cn = g_auiLumaRun8x8[28][k>1 ? 1 : 0][run];
2525        }
2526        else
2527        {
2528          cn = g_auiLumaRun8x8[maxrun][k>1 ? 1 : 0][run];
2529        }
2530        vlc = (maxrun>27) ? 3 : vlctable_8x8[maxrun];
2531#endif
2532        bits = VLClength[vlc][cn];
2533        if (k>1)
2534        {
2535          temp = 2*(k-2)+sign;
2536          if(temp > 127)
2537            temp = 127;
2538          bits += VLClength[0][temp];
2539        }
2540        else
2541          bits += 1; 
2542       
2543      }
2544      else
2545      {
2546        if(k > 127)
2547          k = 127;
2548        bits = VLClength[vlc_adaptive][k] + 1;
2549      }
2550    }
2551  }
2552  else
2553  {
2554    if (levelMode)
2555      bits = VLClength[vlc_adaptive][k];
2556    else
2557    {                       
2558      if (pos==0 && lpflag==0)
2559      { 
2560#if QC_MOD_LCEC
2561        const UInt *p_auiLumaRunTr1 = g_auiLumaRunTr14x4[uiTr1];
2562        UInt ui_maxrun = maxrun;
2563        if (N==8)
2564        { 
2565           p_auiLumaRunTr1 = g_auiLumaRunTr18x8[uiTr1];
2566           ui_maxrun =min(maxrun,28);
2567        }
2568        if(nTab == 2 || nTab == 5)
2569        {
2570          cn = xRunLevelInd(0, run+1, maxrun, p_auiLumaRunTr1[ui_maxrun]);
2571          vlc = g_auiVlcTable8x8Intra[ui_maxrun];
2572        }
2573        else
2574        {
2575          cn = g_auiLumaRun8x8[ui_maxrun][0][run+1];
2576          vlc = g_auiVlcTable8x8Inter[ui_maxrun];
2577        }
2578#else   
2579        if (maxrun > 27)
2580        {
2581          cn = g_auiLumaRun8x8[28][0][run+1];
2582        }
2583        else
2584        {
2585          cn = g_auiLumaRun8x8[maxrun][0][run+1];
2586        }
2587        vlc = (maxrun>27) ? 3 : vlctable_8x8[maxrun];
2588#endif
2589        bits = VLClength[vlc][cn];
2590      }
2591      else
2592        bits = 0;
2593    }
2594  }
2595  return bits;
2596}
2597#endif
2598#if QC_MOD_LCEC_RDOQ
2599static levelDataStruct slevelData  [ MAX_CU_SIZE*MAX_CU_SIZE ];
2600Void TComTrQuant::xRateDistOptQuant_LCEC(TComDataCU* pcCU, Long* pSrcCoeff, TCoeff*& pDstCoeff, UInt uiWidth, UInt uiHeight, UInt& uiAbsSum, TextType eTType, 
2601                                         UInt uiAbsPartIdx )
2602{
2603  Int     i, j;
2604  Int     iShift = 0;
2605  Int     qp_rem, q_bits;
2606  Double  err, lagr, lagrMin;
2607  Double  normFact = 0.0;
2608  Double  OneOverNormFact = 0.0;
2609  Double  fTemp = 0.0;
2610  Int     iQuantCoeff;
2611 
2612#if E243_CORE_TRANSFORMS
2613  Int     iShiftQBits, iSign, iRate, lastPosMin, iBlockType;
2614  UInt    uiBitShift = SCALE_BITS, uiScanPos, levelInd;
2615  Int     levelBest, iLevel;
2616#else
2617  Bool    bExt8x8Flag = false;
2618  Int     iShiftQBits, iSign, iRate, lastPosMin, iBlockType;
2619  UInt    uiBitShift = 15, uiScanPos, levelInd;
2620  Int     levelBest, iLevel, iAdd;
2621#endif
2622
2623  levelDataStruct* levelData = &slevelData[0];
2624
2625  Int     iPos, iScanning;
2626
2627#if CAVLC_COEF_LRG_BLK
2628  static TCoeff sQuantCoeff[1024];
2629#else
2630  static TCoeff sQuantCoeff[256];
2631#endif
2632
2633  qp_rem    = m_cQP.m_iRem;
2634  q_bits    = m_cQP.m_iBits;
2635
2636  UInt noCoeff=(uiWidth < 8 ? 16 : 64);
2637#if CAVLC_COEF_LRG_BLK
2638  UInt maxBlSize = (eTType==TEXT_LUMA)? 32:8;
2639  UInt uiBlSize = Min(uiWidth,maxBlSize);
2640  noCoeff = uiBlSize*uiBlSize;
2641#endif
2642
2643#if E243_CORE_TRANSFORMS
2644  UInt uiLog2TrSize = g_aucConvertToBit[ uiWidth ] + 2;
2645  UInt uiQ = g_auiQ[m_cQP.rem()];
2646
2647#if FULL_NBIT
2648  UInt uiBitDepth = g_uiBitDepth;
2649#else
2650  UInt uiBitDepth = g_uiBitDepth + g_uiBitIncrement;
2651#endif
2652  Int iTransformShift = MAX_TR_DYNAMIC_RANGE - uiBitDepth - uiLog2TrSize;  // Represents scaling through forward transform
2653  double dErrScale = (double)(1<<uiBitShift);                              // Compensate for scaling of bitcount in Lagrange cost function
2654  dErrScale = dErrScale*pow(2.0,-2.0*iTransformShift);                     // Compensate for scaling through forward transform
2655  dErrScale = dErrScale/(double)(uiQ*uiQ);                                 // Compensate for qp-dependent multiplier applied before calculating the Lagrange cost function
2656  dErrScale = dErrScale/(double)(1<<(2*g_uiBitIncrement));                   // Compensate for Lagrange multiplier that is tuned towards 8-bit input
2657
2658  q_bits = QUANT_SHIFT + m_cQP.m_iPer + iTransformShift;                   // Right shift of non-RDOQ quantizer;  level = (coeff*uiQ + offset)>>q_bits
2659
2660  iShift = uiLog2TrSize;
2661  if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V)
2662  {
2663    iBlockType = eTType-2;
2664  }
2665  else
2666  {
2667    iBlockType = (uiWidth < 16 ? 2 : 5) + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() ); 
2668  }
2669#else
2670  if ( uiWidth == 4 && uiHeight == 4 )
2671  {
2672    normFact = pow(2., (2 * DQ_BITS + 19));
2673    if ( g_uiBitIncrement ) normFact *= 1 << (2 * g_uiBitIncrement);
2674    m_puiQuantMtx = &g_aiQuantCoef  [m_cQP.m_iRem][0];
2675    iShift = 2;
2676    iAdd = m_cQP.m_iAdd4x4;
2677
2678    if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V)
2679      iBlockType = eTType-2;
2680    else
2681      iBlockType = 2 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() );
2682  }
2683  else
2684    if ( uiWidth == 8 && uiHeight == 8 )
2685    {
2686      q_bits++;
2687      normFact = pow(2., (2 * Q_BITS_8 + 9));
2688      if ( g_uiBitIncrement ) normFact *= 1<<(2*g_uiBitIncrement);
2689      m_puiQuantMtx = &g_aiQuantCoef64[m_cQP.m_iRem][0];
2690      iShift = 3;
2691      iAdd = m_cQP.m_iAdd8x8;
2692
2693      if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V) 
2694        iBlockType = eTType-2;
2695      else
2696        iBlockType = 2 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() ); 
2697    }
2698    else
2699      if ( uiWidth == 16 && uiHeight == 16 )
2700      {
2701        q_bits = ECore16Shift + m_cQP.per();
2702        normFact = pow(2., 21);
2703        if ( g_uiBitIncrement ) normFact *= 1 << (2 * g_uiBitIncrement);
2704        fTemp = estErr16x16[qp_rem] / normFact;
2705
2706        m_puiQuantMtx = ( &g_aiQuantCoef256[m_cQP.m_iRem][0] );
2707        iShift = 4;
2708        iAdd = m_cQP.m_iAdd16x16;
2709        bExt8x8Flag = true;
2710
2711        if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V) 
2712          iBlockType = eTType-2;
2713        else
2714          iBlockType = 5 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() ); 
2715      }
2716      else
2717        if ( uiWidth == 32 && uiHeight == 32 )
2718        {
2719          q_bits = ECore32Shift + m_cQP.per();
2720          normFact = pow(2., 21);
2721          if ( g_uiBitIncrement ) normFact *= 1<<(2*g_uiBitIncrement);
2722          fTemp = estErr32x32[qp_rem]/normFact;
2723
2724          m_puiQuantMtx = ( &g_aiQuantCoef1024[m_cQP.m_iRem][0] );
2725          iShift = 5;
2726          iAdd = m_cQP.m_iAdd32x32;
2727          bExt8x8Flag = true;
2728
2729          if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V) 
2730            iBlockType = eTType-2;
2731          else
2732            iBlockType = 5 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() ); 
2733        }
2734        else
2735        {
2736          iBlockType =0;
2737
2738          assert(0);
2739        }
2740#endif //E243_CORE_TRANSFORMS
2741        memset(&pDstCoeff[0],0,uiWidth*uiHeight*sizeof(TCoeff)); 
2742
2743        iShiftQBits = (1 <<( q_bits - 1));
2744
2745
2746#if QC_MDCS
2747#if CAVLC_COEF_LRG_BLK
2748        UInt uiLog2BlkSize = g_aucConvertToBit[ pcCU->isIntra( uiAbsPartIdx ) ? uiWidth : uiBlSize   ] + 2;
2749#else
2750        UInt uiLog2BlkSize = g_aucConvertToBit[ pcCU->isIntra( uiAbsPartIdx ) ? uiWidth : Min(8,uiWidth)    ] + 2;
2751#endif
2752        const UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
2753#else
2754        const UInt* pucScan;
2755        if( !pcCU->isIntra(uiAbsPartIdx )){
2756#if CAVLC_COEF_LRG_BLK
2757          pucScan = g_auiFrameScanXY[ g_aucConvertToBit[ uiBlSize ] + 1];
2758#else
2759          pucScan = g_auiFrameScanXY[ g_aucConvertToBit[ Min(uiWidth, 8) ] + 1];
2760#endif
2761        }
2762        else{
2763          pucScan = g_auiFrameScanXY[ g_aucConvertToBit[ uiWidth ] + 1];
2764        }
2765#endif //QC_MDCS
2766
2767
2768
2769        OneOverNormFact = 1.0 / normFact;
2770
2771        UInt uiShift_local = iShift;
2772        UInt uiRes_local = (uiWidth - 1);
2773        UInt uiWidth_local = uiShift_local;
2774
2775#if CAVLC_COEF_LRG_BLK
2776        if(!pcCU->isIntra(uiAbsPartIdx) && uiWidth > maxBlSize)
2777        {
2778          uiShift_local = g_aucConvertToBit[ maxBlSize ] + 2;;
2779          uiRes_local = maxBlSize - 1; 
2780        }
2781#else
2782        if( !pcCU->isIntra(uiAbsPartIdx) && uiWidth >= 16 )
2783        {
2784          uiShift_local = 3;
2785          uiRes_local = 7; 
2786        }
2787#endif
2788
2789        Int iAddRDOQ = 0;
2790#if E243_CORE_TRANSFORMS
2791        /* Code below is consistent with JCTVC-E243 but could preferably be replaced with iAddRDOQ = 171 << (q_bits-9); */
2792        if (q_bits>=15)
2793        {
2794          iAddRDOQ = (uiWidth<16 ? 10922 : 10880) << (q_bits-15);
2795        }
2796        else
2797        {
2798          iAddRDOQ = (uiWidth<16 ? 10922 : 10880) >> (15-q_bits);
2799        }
2800#else
2801        {
2802          UInt uiSliceType = 0;
2803
2804          Int iQP=pcCU->getSlice()->getSliceQp();
2805          if( eTType != TEXT_LUMA ) //Chroma
2806          {
2807            iQP  = g_aucChromaScale[ iQP ];
2808          }
2809
2810          Int iDefaultOffset;
2811          Int iDefaultOffset_LTR;
2812          Int iPer;
2813          Int k =  (iQP + 6 * g_uiBitIncrement) / 6;
2814#if FULL_NBIT
2815          k += g_uiBitDepth - 8;
2816#endif
2817          Bool bLowPass = (uiSliceType == 0);
2818          iDefaultOffset = (bLowPass ? 10922 : 5462);
2819
2820          bLowPass = (uiSliceType == 0);
2821          iDefaultOffset_LTR = (bLowPass? 170 : 86);
2822
2823          if ( uiWidth == 4 && uiWidth == 4 ){
2824            iPer = QP_BITS + k - QOFFSET_BITS;
2825            iAddRDOQ = iDefaultOffset << iPer;
2826          }
2827          else if ( uiWidth == 8 && uiWidth == 8){
2828            iPer = QP_BITS + k + 1 - QOFFSET_BITS;
2829            iAddRDOQ = iDefaultOffset << iPer;
2830          }
2831          else if ( uiWidth == 16 && uiHeight == 16 ){
2832            iPer = ECore16Shift + k - QOFFSET_BITS_LTR;
2833            iAddRDOQ = iDefaultOffset_LTR << iPer;
2834          }
2835          else if ( uiWidth == 32 && uiHeight == 32 ){
2836            iPer = ECore32Shift + k - QOFFSET_BITS_LTR;
2837            iAddRDOQ = iDefaultOffset_LTR << iPer;
2838          }
2839        }
2840#endif
2841        if (m_uiRDOQOffset==1)
2842          iAddRDOQ=iShiftQBits;
2843
2844        for (iScanning=noCoeff-1; iScanning>=0; iScanning--) 
2845        {
2846#if QC_MDCS
2847          iPos = g_auiSigLastScan[uiScanIdx][uiLog2BlkSize-1][iScanning];
2848#else
2849          iPos = pucScan[iScanning];
2850#endif //QC_MDCS
2851          j = iPos >> uiShift_local;
2852          i = iPos &  uiRes_local;
2853          iPos = (j << uiWidth_local) + i;
2854
2855          levelDataStruct *psLevelData = &levelData[iScanning];
2856#if E243_CORE_TRANSFORMS
2857          psLevelData->levelDouble = abs(pSrcCoeff[iPos]) * uiQ;         
2858          iQuantCoeff = (Int)((psLevelData->levelDouble + iAddRDOQ) >> q_bits);
2859
2860          psLevelData->levelQ   = (Long)( psLevelData->levelDouble >> q_bits );
2861          psLevelData->lowerInt = ( ( psLevelData->levelDouble - (psLevelData->levelQ << q_bits) ) < iShiftQBits ) ? true : false;
2862
2863          iSign = pSrcCoeff[iPos] < 0 ? -1 : 1;
2864          sQuantCoeff[iScanning] = iQuantCoeff*iSign;
2865
2866          fTemp = dErrScale;
2867#else
2868          psLevelData->levelDouble = abs( pSrcCoeff[iPos] * (Long) m_puiQuantMtx[iPos]);
2869          iQuantCoeff=(Int)((psLevelData->levelDouble +iAddRDOQ) >> q_bits);
2870
2871          psLevelData->levelQ   = ( psLevelData->levelDouble >> q_bits );
2872          psLevelData->lowerInt = ( ( psLevelData->levelDouble - (psLevelData->levelQ << q_bits) ) < iShiftQBits ) ? true : false;
2873
2874          iSign = pSrcCoeff[iPos] < 0 ? -1 : 1;
2875          sQuantCoeff[iScanning] = iQuantCoeff*iSign;
2876
2877          if      ( uiWidth == 4 ) fTemp = estErr4x4[qp_rem][i][j] * OneOverNormFact;
2878          else if ( uiWidth == 8 ) fTemp = estErr8x8[qp_rem][i][j] * OneOverNormFact;
2879#endif
2880          psLevelData->level[0] = 0;
2881          err = (Double)(psLevelData->levelDouble);
2882          psLevelData->errLevel[0] = err * err * fTemp;
2883
2884          if ( !psLevelData->levelQ )
2885          {
2886            if ( psLevelData->lowerInt )
2887            {
2888              psLevelData->noLevels = 1;
2889            }
2890            else
2891            {
2892              psLevelData->level[1] = 1;
2893              psLevelData->noLevels = 2;
2894            }
2895            if (iQuantCoeff==0)
2896              psLevelData->quantInd=0;
2897            else
2898              psLevelData->quantInd=1;
2899
2900          }
2901          else if ( psLevelData->lowerInt )
2902          {
2903            psLevelData->level[1] = psLevelData->levelQ;
2904            psLevelData->noLevels = 2;
2905
2906            if ( psLevelData->levelQ > 1 ){
2907              psLevelData->noLevels++;
2908              psLevelData->level[2] = 1;
2909            }
2910
2911            psLevelData->quantInd = 1;
2912          }
2913          else
2914          {
2915            psLevelData->level[1] = psLevelData->levelQ;
2916            psLevelData->level[2] = psLevelData->levelQ + 1;
2917            psLevelData->noLevels = 3;
2918
2919            if ( psLevelData->levelQ > 1 ){
2920              psLevelData->noLevels++;
2921              psLevelData->level[3] = 1;
2922            }
2923            if ( iQuantCoeff == psLevelData->level[1] )
2924              psLevelData->quantInd = 1;
2925            else
2926              psLevelData->quantInd = 2;
2927          }
2928
2929          for ( levelInd = 1; levelInd < psLevelData->noLevels; levelInd++ ){
2930            err = (Double)((psLevelData->level[levelInd] << q_bits) - psLevelData->levelDouble);
2931            psLevelData->errLevel[levelInd] = err * err * fTemp;
2932            psLevelData->level[levelInd] *= iSign;
2933          }
2934        }
2935
2936#if CAVLC_COEF_LRG_BLK==0
2937        UInt uiNum;
2938        if ( uiWidth == 4 )
2939          uiNum = 4;
2940        else
2941          uiNum = 8;
2942#endif
2943
2944        // Last Position
2945#if CAVLC_COEF_LRG_BLK
2946        lastPosMin = xCodeCoeffCountBitsLast(sQuantCoeff, levelData, iBlockType, uiBlSize);
2947#else
2948        lastPosMin = xCodeCoeffCountBitsLast(sQuantCoeff, levelData, iBlockType, uiNum);
2949#endif
2950        memset(&sQuantCoeff[lastPosMin+1],0,sizeof(TCoeff) * (noCoeff - (lastPosMin + 1)));
2951
2952
2953        Int  iLpFlag = 1; 
2954        Int  iLevelMode = 0;
2955        Int  iRun = 0;
2956        Int  iVlc_adaptive = 0;
2957        Int  iMaxrun = 0;
2958        Int  iSum_big_coef = 0;
2959
2960
2961        UInt uiTr1=0;
2962        UInt absBestLevel;
2963
2964        Int atable[5] = {4,6,14,28,0xfffffff};
2965        Int switch_thr[10] = {49,49,0,49,49,0,49,49,49,49};
2966
2967        Int levelIndBest, iRateMin=0, levelStart;
2968        Double lagrCoded=0, lagrNotCoded=0;
2969#if CAVLC_COEF_LRG_BLK
2970        const UInt **pLumaRunTr1 = (uiWidth==4)? g_pLumaRunTr14x4:g_pLumaRunTr18x8;
2971        UInt coeffBlkSize = (uiWidth==4)? 4:(noCoeff==64)? 8:(noCoeff==256)? 16:32;
2972#endif
2973
2974        for (iScanning = lastPosMin; iScanning>=0; iScanning--){
2975          uiScanPos = iScanning;
2976          levelStart = (iScanning == lastPosMin) ? 1 : 0;
2977
2978          sQuantCoeff[uiScanPos] = levelBest = 0;
2979          levelDataStruct *psLevelData = &levelData[uiScanPos];
2980          if ( psLevelData->noLevels >1 || iScanning == 0 ){
2981
2982            lagrMin = 0; iRateMin = 0;
2983            for (levelInd = levelStart; levelInd < psLevelData->noLevels; levelInd++){
2984
2985              lagr = psLevelData->errLevel[levelInd];
2986              iLevel=psLevelData->level[levelInd];
2987
2988#if CAVLC_COEF_LRG_BLK
2989              iRate = bitCountRDOQ(iLevel,uiScanPos,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,
2990                coeffBlkSize,uiTr1, iSum_big_coef, iBlockType, pcCU, pLumaRunTr1)<<uiBitShift;
2991#else
2992              if ( uiWidth == 4 ){
2993                iRate = bitCountRDOQ(iLevel,uiScanPos,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,4,uiTr1, 
2994                  iSum_big_coef,iBlockType, pcCU)<<uiBitShift;
2995              }
2996              else{
2997                iRate = bitCountRDOQ(iLevel,uiScanPos,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,8,uiTr1, 
2998                  iSum_big_coef, iBlockType, pcCU) << uiBitShift;
2999              }
3000#endif
3001              lagr += m_dLambda * iRate; 
3002
3003              if ( lagr < lagrMin || levelInd == levelStart){
3004                lagrMin = lagr;
3005                iRateMin = iRate;
3006                levelBest = iLevel;
3007                levelIndBest = levelInd;
3008              }
3009            }
3010          }
3011
3012          if ( levelBest != 0 ){
3013            lagrCoded += lagrMin;
3014            lagrNotCoded += psLevelData->errLevel[0];
3015          }
3016          if ( uiScanPos == 0 && levelBest == 0 ){
3017            lagrCoded += m_dLambda * iRateMin;
3018          }
3019
3020          sQuantCoeff[uiScanPos] = levelBest;
3021
3022          absBestLevel = abs(levelBest);
3023          if ( levelBest != 0 ){ 
3024
3025            if ( uiWidth > 4 ){ 
3026              if ( !iLpFlag && absBestLevel > 1 ){
3027                iSum_big_coef += absBestLevel;
3028                if ((noCoeff - uiScanPos - 1) > switch_thr[iBlockType] || iSum_big_coef > 2) iLevelMode = 1; 
3029              }
3030            }
3031            else{
3032              if ( absBestLevel > 1 ) iLevelMode = 1;
3033            }
3034
3035            if ( iLpFlag == 1 )
3036            {
3037              uiTr1 = (absBestLevel > 1) ? 0 : 1;
3038            }
3039            else
3040            {
3041              if ( uiTr1 == 0 || absBestLevel >= 2 )
3042              { 
3043                uiTr1 = 0;
3044              }
3045              else if ( uiTr1 < MAX_TR1 )
3046              {
3047                uiTr1++;
3048              }
3049            }
3050            iMaxrun = iScanning - 1;
3051            iLpFlag = 0;
3052            iRun = 0;
3053            if ( iLevelMode && (absBestLevel > atable[iVlc_adaptive])) iVlc_adaptive++;       
3054          }
3055          else
3056          {
3057            iRun += 1;         
3058          }
3059        }
3060
3061        if (lastPosMin >= 0 && lagrCoded > lagrNotCoded){
3062          for (iScanning = lastPosMin; iScanning>=0; iScanning--){
3063            sQuantCoeff[iScanning] = 0;
3064          }
3065        }
3066
3067#if CAVLC_COEF_LRG_BLK
3068        if ((!pcCU->isIntra(uiAbsPartIdx) && uiWidth > maxBlSize))
3069        {
3070          for (iScanning=noCoeff-1; iScanning>=0; iScanning--) 
3071          {
3072#if QC_MDCS
3073            iPos = g_auiSigLastScan[uiScanIdx][uiLog2BlkSize-1][iScanning];
3074#else
3075            iPos = pucScan[iScanning];
3076#endif //QC_MDCS
3077            j = iPos >>  (g_aucConvertToBit[ maxBlSize ] + 2);
3078            i = iPos & (maxBlSize-1);
3079            iPos = (j<<(g_aucConvertToBit[ uiWidth ] + 2))+i;
3080            pDstCoeff[iPos] = sQuantCoeff[iScanning];
3081            uiAbsSum += abs(sQuantCoeff[iScanning]);
3082          }
3083        }
3084#else
3085        if ((!pcCU->isIntra(uiAbsPartIdx) && uiWidth >= 16))
3086        {
3087          for (iScanning = noCoeff - 1; iScanning >= 0; iScanning--) 
3088          {
3089#if QC_MDCS
3090            iPos = g_auiSigLastScan[uiScanIdx][uiLog2BlkSize-1][iScanning];
3091#else
3092            iPos = pucScan[iScanning];
3093#endif //QC_MDCS
3094            j = iPos >> 3;
3095            i = iPos & 0x7;
3096            iPos = uiWidth * j + i;
3097            pDstCoeff[iPos] = sQuantCoeff[iScanning];
3098            uiAbsSum += abs(sQuantCoeff[iScanning]);
3099          }
3100        }
3101#endif
3102        else
3103        {
3104          for (iScanning = noCoeff - 1; iScanning >= 0; iScanning--) 
3105          {
3106#if QC_MDCS
3107            iPos = g_auiSigLastScan[uiScanIdx][uiLog2BlkSize-1][iScanning];
3108#else
3109            iPos = pucScan[iScanning];
3110#endif //QC_MDCS
3111            pDstCoeff[iPos] = sQuantCoeff[iScanning];
3112            uiAbsSum += abs(sQuantCoeff[iScanning]);
3113          }
3114        }
3115}
3116#else
3117Void TComTrQuant::xRateDistOptQuant_LCEC             ( TComDataCU*                     pcCU,
3118                                                      Long*                           plSrcCoeff,
3119                                                      TCoeff*&                        piDstCoeff,
3120                                                      UInt                            uiWidth,
3121                                                      UInt                            uiHeight,
3122                                                      UInt&                           uiAbsSum,
3123                                                      TextType                        eTType,
3124                                                      UInt                            uiAbsPartIdx )
3125{
3126  Int iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,iSum_big_coef,iSign;
3127  Int atable[5] = {4,6,14,28,0xfffffff};
3128  Int switch_thr[8] = {49,49,0,49,49,0,49,49};
3129 
3130  const UInt* pucScan;
3131  UInt* piQuantCoef = NULL;
3132  UInt uiBlkPos,uiPosY,uiPosX,uiLog2BlkSize,uiConvBit,uiLevel,uiMaxLevel,uiMinLevel,uiAbsLevel,uiBestAbsLevel,uiBitShift;
3133  Int iScanning,iQpRem,iBlockType,iRate;
3134  Int  iQBits      = m_cQP.m_iBits;
3135  Int64 lLevelDouble;
3136  Double dErr,dTemp=0,dNormFactor,rd64UncodedCost,rd64CodedCost,dCurrCost;
3137 
3138  uiBitShift = 15;
3139  iQpRem = m_cQP.m_iRem;
3140 
3141  Bool bExt8x8Flag = false;
3142  uiLog2BlkSize = g_aucConvertToBit[ uiWidth ] + 2; 
3143  uiConvBit = g_aucConvertToBit[ uiWidth ];
3144 
3145#if QC_MDCS
3146  const UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
3147#endif //QC_MDCS
3148 
3149  if (uiWidth == 4)
3150  {
3151#if QC_MOD_LCEC
3152    if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V)
3153      iBlockType = eTType-2;
3154    else
3155      iBlockType = 2 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() );
3156#else
3157    iBlockType = 0 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() ); 
3158#endif
3159    iQBits = m_cQP.m_iBits;                 
3160    dNormFactor = pow(2., (2*DQ_BITS+19));
3161    if ( g_uiBitIncrement ) dNormFactor *= 1<<(2*g_uiBitIncrement);
3162    piQuantCoef = ( g_aiQuantCoef[m_cQP.rem()] );
3163  }
3164  else if (uiWidth == 8)
3165  {
3166    if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V) 
3167      iBlockType = eTType-2;
3168    else
3169      iBlockType = 2 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() ); 
3170    iQBits = m_cQP.m_iBits + 1;                 
3171    dNormFactor = pow(2., (2*Q_BITS_8+9)); 
3172    if ( g_uiBitIncrement ) dNormFactor *= 1<<(2*g_uiBitIncrement);
3173    piQuantCoef = ( g_aiQuantCoef64[m_cQP.rem()] );
3174  }
3175  else
3176  {
3177    if (eTType==TEXT_CHROMA_U || eTType==TEXT_CHROMA_V) 
3178      iBlockType = eTType-2;
3179    else
3180      iBlockType = 5 + ( pcCU->isIntra(uiAbsPartIdx) ? 0 : pcCU->getSlice()->getSliceType() ); 
3181   
3182    if(!pcCU->isIntra(uiAbsPartIdx))
3183    {
3184      uiLog2BlkSize = g_aucConvertToBit[ 8 ] + 2; 
3185      uiConvBit = g_aucConvertToBit[ 8 ];
3186    }
3187    dNormFactor = pow(2., 21);
3188    if ( g_uiBitIncrement ) dNormFactor *= 1<<(2*g_uiBitIncrement);
3189   
3190    bExt8x8Flag = true;
3191   
3192    if ( uiWidth == 16)
3193    {
3194      piQuantCoef = ( g_aiQuantCoef256[m_cQP.rem()] );
3195      iQBits = ECore16Shift + m_cQP.per();     
3196      dTemp = estErr16x16[iQpRem]/dNormFactor;
3197    }
3198    else if ( uiWidth == 32)
3199    {
3200      piQuantCoef = ( g_aiQuantCoef1024[m_cQP.rem()] );
3201      iQBits = ECore32Shift + m_cQP.per();
3202      dTemp = estErr32x32[iQpRem]/dNormFactor;
3203    }
3204    else
3205    {
3206      assert(0);
3207    }
3208    memset(&piDstCoeff[0],0,uiWidth*uiHeight*sizeof(TCoeff)); 
3209  }
3210 
3211  pucScan = g_auiFrameScanXY [ uiConvBit + 1 ];
3212 
3213  iLpFlag = 1;  // shawn note: last position flag
3214  iLevelMode = 0;
3215  iRun = 0;
3216  iVlc_adaptive = 0;
3217  iMaxrun = 0;
3218  iSum_big_coef = 0;
3219#if QC_MOD_LCEC
3220  UInt uiTr1=0;
3221#endif
3222 
3223  for (iScanning=(uiWidth<8 ? 15 : 63); iScanning>=0; iScanning--) 
3224  {           
3225#if QC_MDCS
3226    uiBlkPos = g_auiSigLastScan[uiScanIdx][uiLog2BlkSize-1][iScanning];
3227#else
3228    uiBlkPos = pucScan[iScanning];
3229#endif //QC_MDCS
3230    uiPosY   = uiBlkPos >> uiLog2BlkSize;
3231    uiPosX   = uiBlkPos - ( uiPosY << uiLog2BlkSize );
3232   
3233    if (uiWidth==4)
3234      dTemp = estErr4x4[ iQpRem ][ uiPosX ][ uiPosY ] / dNormFactor; 
3235    else if(uiWidth==8)
3236      dTemp = estErr8x8[ iQpRem ][ uiPosX ][ uiPosY ] / dNormFactor;
3237    else if(!pcCU->isIntra(uiAbsPartIdx))
3238      uiBlkPos = uiWidth*uiPosY+uiPosX;
3239   
3240    lLevelDouble = abs(plSrcCoeff[uiBlkPos]);
3241   
3242    lLevelDouble = lLevelDouble * (Int64) ( uiWidth == 64? piQuantCoef[m_cQP.rem()]: piQuantCoef[uiBlkPos] );
3243   
3244    iSign = plSrcCoeff[uiBlkPos]<0 ? -1 : 1;
3245   
3246   
3247    uiLevel = (UInt)(lLevelDouble  >> iQBits);     
3248    uiMaxLevel = uiLevel + 1;
3249    uiMinLevel = Max(1,(Int)uiLevel - 2);
3250   
3251    uiBestAbsLevel = 0;
3252#if QC_MOD_LCEC
3253    if (uiWidth==4)
3254      iRate = bitCount_LCEC(0,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,4,uiTr1)<<uiBitShift; 
3255    else 
3256      iRate = bitCount_LCEC(0,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,8,uiTr1)<<uiBitShift; 
3257#else
3258    if (uiWidth==4)
3259      iRate = bitCount_LCEC(0,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,4)<<uiBitShift; 
3260    else 
3261      iRate = bitCount_LCEC(0,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,8)<<uiBitShift; 
3262#endif
3263   
3264    dErr = Double( lLevelDouble );
3265    rd64UncodedCost = dErr * dErr * dTemp;
3266    rd64CodedCost   = rd64UncodedCost + xGetICost( iRate ); 
3267    for(uiAbsLevel = uiMinLevel; uiAbsLevel <= uiMaxLevel ; uiAbsLevel++ ) 
3268    {
3269#if QC_MOD_LCEC
3270      if (uiWidth==4)
3271        iRate = bitCount_LCEC(iSign*uiAbsLevel,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,4,uiTr1)<<uiBitShift; 
3272      else 
3273        iRate = bitCount_LCEC(iSign*uiAbsLevel,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,8,uiTr1)<<uiBitShift; 
3274#else
3275      if (uiWidth==4)
3276        iRate = bitCount_LCEC(iSign*uiAbsLevel,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,4)<<uiBitShift; 
3277      else 
3278        iRate = bitCount_LCEC(iSign*uiAbsLevel,iScanning,iBlockType,iLpFlag,iLevelMode,iRun,iMaxrun,iVlc_adaptive,8)<<uiBitShift; 
3279#endif
3280      dErr = Double( lLevelDouble  - (((Int64)uiAbsLevel) << iQBits ) );
3281      rd64UncodedCost = dErr * dErr * dTemp;
3282      dCurrCost = rd64UncodedCost + xGetICost( iRate ); 
3283      if( dCurrCost < rd64CodedCost )
3284      {         
3285        uiBestAbsLevel  = uiAbsLevel;
3286        rd64CodedCost   = dCurrCost;
3287      }
3288    }
3289   
3290   
3291    if (uiBestAbsLevel)
3292    {                 
3293      if (uiWidth>4)
3294      { 
3295        if (!iLpFlag && uiBestAbsLevel > 1)
3296        {
3297          iSum_big_coef += uiBestAbsLevel;
3298          if ((63-iScanning) > switch_thr[iBlockType] || iSum_big_coef > 2)
3299            iLevelMode = 1;
3300        }
3301      }
3302      else
3303      {
3304        if (uiBestAbsLevel>1)
3305          iLevelMode = 1;
3306      }
3307#if QC_MOD_LCEC
3308      if (iLpFlag==1){
3309        if (uiBestAbsLevel>1){
3310          uiTr1=0;
3311        }
3312        else{
3313          uiTr1=1;
3314        }
3315      }
3316      else{
3317        if (uiTr1>0 && uiBestAbsLevel<2){
3318          uiTr1++;
3319          uiTr1=Min(MAX_TR1,uiTr1);
3320        }
3321        else{
3322          uiTr1=0;
3323        }
3324      }
3325#endif
3326      iMaxrun = iScanning-1;
3327      iLpFlag = 0;
3328      iRun = 0;
3329      if (iLevelMode && (uiBestAbsLevel > atable[iVlc_adaptive]))
3330        iVlc_adaptive++;                   
3331    }
3332    else
3333    {
3334      iRun += 1;         
3335    }
3336   
3337    uiAbsSum += uiBestAbsLevel;
3338    piDstCoeff[uiBlkPos] = iSign*uiBestAbsLevel;
3339  } // for uiScanning
3340} 
3341#endif
3342
3343Void TComTrQuant::xQuantLTR  (TComDataCU* pcCU, Long* pSrc, TCoeff*& pDes, Int iWidth, Int iHeight, UInt& uiAcSum, TextType eTType, UInt uiAbsPartIdx )
3344{
3345  Long*   piCoef    = pSrc;
3346  TCoeff* piQCoef   = pDes;
3347  Int   iAdd = 0;
3348 
3349#if E243_CORE_TRANSFORMS
3350  if ( m_bUseRDOQ && (eTType == TEXT_LUMA || RDOQ_CHROMA) )
3351  {
3352    if ( m_iSymbolMode == 0)
3353      xRateDistOptQuant_LCEC(pcCU, piCoef, pDes, iWidth, iHeight, uiAcSum, eTType, uiAbsPartIdx );
3354    else
3355      xRateDistOptQuant( pcCU, piCoef, pDes, iWidth, iHeight, uiAcSum, eTType, uiAbsPartIdx );
3356  }
3357  else
3358  {
3359    const UInt*  pucScan;
3360    UInt uiConvBit = g_aucConvertToBit[ iWidth ];
3361    pucScan        = g_auiFrameScanXY [ uiConvBit + 1 ];
3362
3363    UInt uiLog2TrSize = g_aucConvertToBit[ iWidth ] + 2;
3364    UInt uiQ = g_auiQ[m_cQP.rem()];
3365
3366#if FULL_NBIT
3367    UInt uiBitDepth = g_uiBitDepth;
3368#else
3369    UInt uiBitDepth = g_uiBitDepth + g_uiBitIncrement;
3370#endif
3371    UInt iTransformShift = MAX_TR_DYNAMIC_RANGE - uiBitDepth - uiLog2TrSize;  // Represents scaling through forward transform
3372    Int iQBits = QUANT_SHIFT + m_cQP.m_iPer + iTransformShift;                // Right shift of non-RDOQ quantizer;  level = (coeff*uiQ + offset)>>q_bits
3373
3374    iAdd = (pcCU->getSlice()->getSliceType()==I_SLICE ? 171 : 85) << (iQBits-9);
3375
3376    for( Int n = 0; n < iWidth*iHeight; n++ )
3377    {
3378      Long iLevel;
3379      Int  iSign;
3380      UInt uiBlockPos = pucScan[n]; 
3381      iLevel  = (Long) piCoef[uiBlockPos];
3382      iSign   = (iLevel < 0 ? -1: 1);     
3383
3384      iLevel = (abs(iLevel) * uiQ + iAdd ) >> iQBits;
3385#if CAVLC_COEF_LRG_BLK
3386      if (m_iSymbolMode == 0 && n>=64 && eTType != TEXT_LUMA)
3387      {
3388        iLevel = 0;
3389      }
3390#else
3391      if (m_iSymbolMode == 0 && iWidth>8)
3392      {
3393        /* Two methods of limiting number of encoded coefficients to 8x8 for intra and inter respectively */
3394        if (pcCU->isIntra( uiAbsPartIdx ))
3395        {
3396          if(n>=64) iLevel = 0;
3397        }
3398        else
3399        {
3400          if ((uiBlockPos%iWidth)>=8 || (uiBlockPos/iWidth)>=8) iLevel = 0;
3401        }
3402      }
3403#endif
3404      uiAcSum += iLevel;
3405      iLevel *= iSign;       
3406      piQCoef[uiBlockPos] = iLevel;
3407    } // for n
3408  } //if RDOQ
3409  //return;
3410
3411#else //E243_CORE_TRANSFORMS
3412
3413  UInt* piQuantCoef = NULL;
3414  Int   iNewBits    = 0;
3415  switch(iWidth)
3416  {
3417    case 2:
3418    {
3419      m_puiQuantMtx = &g_aiQuantCoef4[m_cQP.m_iRem];
3420      xQuant2x2(piCoef, piQCoef, uiAcSum );
3421      return;
3422    }
3423    case 4:
3424    {
3425      m_puiQuantMtx = &g_aiQuantCoef[m_cQP.m_iRem][0];
3426      xQuant4x4(pcCU, piCoef, piQCoef, uiAcSum, eTType, uiAbsPartIdx );
3427      return;
3428    }
3429    case 8:
3430    {
3431      m_puiQuantMtx = &g_aiQuantCoef64[m_cQP.m_iRem][0];
3432      xQuant8x8(pcCU, piCoef, piQCoef, uiAcSum, eTType, uiAbsPartIdx );
3433      return;
3434    }
3435    case 16:
3436    {
3437      piQuantCoef = ( g_aiQuantCoef256[m_cQP.rem()] );
3438      iNewBits = ECore16Shift + m_cQP.per();
3439      iAdd = m_cQP.m_iAdd16x16;
3440      break;
3441    }
3442    case 32:
3443    {
3444      piQuantCoef = ( g_aiQuantCoef1024[m_cQP.rem()] );
3445      iNewBits = ECore32Shift + m_cQP.per();
3446      iAdd = m_cQP.m_iAdd32x32;
3447      break;
3448    }
3449    default:
3450      assert(0);
3451      break;
3452  }
3453 
3454  if ( m_bUseRDOQ && (eTType == TEXT_LUMA || RDOQ_CHROMA) )
3455  {
3456    if ( m_iSymbolMode == 0)
3457      xRateDistOptQuant_LCEC(pcCU, piCoef, pDes, iWidth, iHeight, uiAcSum, eTType, uiAbsPartIdx );
3458    else
3459      xRateDistOptQuant( pcCU, piCoef, pDes, iWidth, iHeight, uiAcSum, eTType, uiAbsPartIdx );
3460  }
3461  else
3462  {
3463    UInt uiAcSum_init = uiAcSum;
3464    for( Int n = 0; n < iWidth*iHeight; n++ )
3465    {
3466      Long iLevel;
3467      Int  iSign;
3468      iLevel  = (Long) piCoef[n];
3469      iSign   = (iLevel < 0 ? -1: 1);
3470      if ( iWidth == 64 ) iLevel = abs( iLevel ) * piQuantCoef[m_cQP.rem()];
3471      else                iLevel = abs( iLevel ) * piQuantCoef[n];
3472     
3473      if (!pcCU->isIntra( uiAbsPartIdx ) && (m_iSymbolMode == 0) && ((n%iWidth)>=8 || (n/iWidth)>=8))
3474        iLevel = 0;
3475      else
3476        iLevel = ( iLevel + iAdd ) >> iNewBits;
3477     
3478      if( 0 != iLevel )
3479      {
3480        uiAcSum += iLevel;
3481        iLevel    *= iSign;
3482        piQCoef[n] = iLevel;
3483      }
3484      else
3485      {
3486        piQCoef[n] = 0;
3487      }
3488    }
3489   
3490    const UInt*  pucScan;
3491    if(pcCU->isIntra( uiAbsPartIdx ) && m_iSymbolMode == 0 && iWidth >= 16)
3492    {
3493      UInt uiConvBit = g_aucConvertToBit[ iWidth ];
3494      pucScan        = g_auiFrameScanXY [ uiConvBit + 1 ];
3495#if CAVLC_COEF_LRG_BLK
3496      UInt noCoeff = (eTType == TEXT_LUMA)? (iWidth*iHeight):64;
3497
3498      for( Int n = noCoeff; n < iWidth*iHeight; n++ )
3499      {
3500        piQCoef[ pucScan[ n ] ] = 0;
3501      }
3502      uiAcSum = uiAcSum_init;
3503      for( Int n = 0; n < noCoeff; n++ )
3504      {
3505        uiAcSum += abs(piQCoef[ pucScan[ n ] ]);
3506      }
3507#else
3508      for( Int n = 64; n < iWidth*iHeight; n++ )
3509      {
3510        piQCoef[ pucScan[ n ] ] = 0;
3511      }
3512     
3513      uiAcSum = uiAcSum_init;
3514     
3515      for( Int n = 0; n < 64; n++ )
3516      {
3517        uiAcSum += abs(piQCoef[ pucScan[ n ] ]);
3518      }
3519#endif
3520    }
3521  }
3522#endif
3523}
3524
3525Void TComTrQuant::xDeQuantLTR( TCoeff* pSrc, Long*& pDes, Int iWidth, Int iHeight )
3526{
3527 
3528  TCoeff* piQCoef   = pSrc;
3529  Long*   piCoef    = pDes;
3530 
3531  if ( iWidth > (Int)m_uiMaxTrSize )
3532  {
3533    iWidth  = m_uiMaxTrSize;
3534    iHeight = m_uiMaxTrSize;
3535  }
3536 
3537#if E243_CORE_TRANSFORMS
3538  Int iShift,iAdd,iCoeffQ;
3539  UInt uiQ;
3540  UInt uiLog2TrSize = g_aucConvertToBit[ iWidth ] + 2;
3541
3542#if FULL_NBIT
3543  UInt uiBitDepth = g_uiBitDepth;
3544#else
3545  UInt uiBitDepth = g_uiBitDepth + g_uiBitIncrement;
3546#endif
3547  UInt iTransformShift = MAX_TR_DYNAMIC_RANGE - uiBitDepth - uiLog2TrSize; 
3548  iShift = QUANT_IQUANT_SHIFT - QUANT_SHIFT - iTransformShift;
3549  iAdd = 1 << (iShift-1);
3550  uiQ = g_auiIQ[m_cQP.m_iRem];
3551
3552  for( Int n = 0; n < iWidth*iHeight; n++ )
3553  {
3554    iCoeffQ = ((piQCoef[n]*(Int)uiQ << m_cQP.m_iPer)+iAdd)>>iShift;
3555    piCoef[n] = Clip3(-32768,32767,iCoeffQ);
3556  } 
3557#else
3558  UInt* piDeQuantCoef = NULL;
3559  switch(iWidth)
3560  {
3561    case 2:
3562    {
3563      xDeQuant2x2( piQCoef, piCoef );
3564      return;
3565    }
3566    case 4:
3567    {
3568      xDeQuant4x4( piQCoef, piCoef );
3569      return;
3570    }
3571    case 8:
3572    {
3573      xDeQuant8x8( piQCoef, piCoef );
3574      return;
3575    }
3576    case 16:
3577    {
3578      piDeQuantCoef = ( g_aiDeQuantCoef256[m_cQP.rem()] );
3579      break;
3580    }
3581    case 32:
3582    {
3583      piDeQuantCoef = ( g_aiDeQuantCoef1024[m_cQP.rem()] );
3584      break;
3585    }
3586    case 64:
3587    {
3588      piDeQuantCoef = ( g_aiDeQuantCoef4096 ); // To save the memory for g_aiDeQuantCoef4096
3589      break;
3590    }
3591  }
3592 
3593  Int iLevel;
3594  Int iDeScale;
3595 
3596  for( Int n = 0; n < iWidth*iHeight; n++ )
3597  {
3598    iLevel  = piQCoef[n];
3599   
3600    if( 0 != iLevel )
3601    {
3602      if ( iWidth == 64 ) iDeScale = piDeQuantCoef[m_cQP.rem()];
3603      else                iDeScale = piDeQuantCoef[n];
3604      piCoef[n] = (Long) (iLevel*iDeScale) << m_cQP.per();
3605    }
3606    else
3607    {
3608      piCoef [n] = 0;
3609    }
3610  }
3611#endif
3612}
3613#if !E243_CORE_TRANSFORMS
3614Void TComTrQuant::xIT16( Long* pSrc, Pel* pDes, UInt uiStride )
3615{
3616  Int x, y;
3617  Long aaiTemp[16][16];
3618 
3619  Long B0, B1, B2, B3, B4, B5, B6, B7, B10, B11, B12, B13;
3620  Long C0, C1, C2, C3, C5, C6, C8, C9, C10, C11, C12, C13, C14, C15;
3621  Long D0, D1, D2, D3, D4, D5, D6, D7, D9, D10, D13, D14;
3622  Long E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15;
3623  Long F8, F9, F10, F11, F12, F13, F14, F15;
3624 
3625  UInt uiStride2  = uiStride<<1;
3626  UInt uiStride3  = uiStride2  + uiStride;
3627  UInt uiStride4  = uiStride3  + uiStride;
3628  UInt uiStride5  = uiStride4  + uiStride;
3629  UInt uiStride6  = uiStride5  + uiStride;
3630  UInt uiStride7  = uiStride6  + uiStride;
3631  UInt uiStride8  = uiStride7  + uiStride;
3632  UInt uiStride9  = uiStride8  + uiStride;
3633  UInt uiStride10 = uiStride9  + uiStride;
3634  UInt uiStride11 = uiStride10 + uiStride;
3635  UInt uiStride12 = uiStride11 + uiStride;
3636  UInt uiStride13 = uiStride12 + uiStride;
3637  UInt uiStride14 = uiStride13 + uiStride;
3638  UInt uiStride15 = uiStride14 + uiStride;
3639#ifdef TRANS_PRECISION_EXT
3640#if FULL_NBIT
3641  Int uiBitDepthIncrease=g_iShift16x16-g_uiBitIncrement-g_uiBitDepth+8;
3642#else
3643  Int uiBitDepthIncrease=g_iShift16x16-g_uiBitIncrement;
3644#endif
3645  Int offset = (uiBitDepthIncrease==0)? 0:(1<<(uiBitDepthIncrease-1));
3646#endif
3647  //--Butterfly
3648  for( y=0 ; y<16 ; y++ )
3649  {
3650#ifdef TRANS_PRECISION_EXT
3651    Long     ai0[16];
3652    ai0[0] =  pSrc[0]<<uiBitDepthIncrease;
3653    ai0[1] =  pSrc[1]<<uiBitDepthIncrease;
3654    ai0[2] =  pSrc[2]<<uiBitDepthIncrease;
3655    ai0[3] =  pSrc[3]<<uiBitDepthIncrease;
3656    ai0[4] =  pSrc[4]<<uiBitDepthIncrease;
3657    ai0[5] =  pSrc[5]<<uiBitDepthIncrease;
3658    ai0[6] =  pSrc[6]<<uiBitDepthIncrease;
3659    ai0[7] =  pSrc[7]<<uiBitDepthIncrease;
3660    ai0[8 ] =  pSrc[8 ]<<uiBitDepthIncrease;
3661    ai0[9 ] =  pSrc[9 ]<<uiBitDepthIncrease;
3662    ai0[10] =  pSrc[10]<<uiBitDepthIncrease;
3663    ai0[11] =  pSrc[11]<<uiBitDepthIncrease;
3664    ai0[12] =  pSrc[12]<<uiBitDepthIncrease;
3665    ai0[13] =  pSrc[13]<<uiBitDepthIncrease;
3666    ai0[14] =  pSrc[14]<<uiBitDepthIncrease;
3667    ai0[15] =  pSrc[15]<<uiBitDepthIncrease;
3668    F8 = xTrRound( 6 * ai0[1] - 63 * ai0[15] , DenShift16);
3669    F9 = xTrRound( 49 * ai0[9] - 40 * ai0[7] , DenShift16);
3670    F10 = xTrRound( 30 * ai0[5] - 56 * ai0[11] , DenShift16);
3671    F11 = xTrRound( 61 * ai0[13] - 18 * ai0[3] , DenShift16);
3672    F12 = xTrRound( 61 * ai0[3] + 18 * ai0[13] , DenShift16);
3673    F13 = xTrRound( 30 * ai0[11] + 56 * ai0[5] , DenShift16);
3674    F14 = xTrRound( 49 * ai0[7] + 40 * ai0[9] , DenShift16);
3675    F15 = xTrRound( 6 * ai0[15] + 63 * ai0[1] , DenShift16);
3676   
3677    E4 = xTrRound( 12 * ai0[2] - 62 * ai0[14] , DenShift16);
3678    E5 = xTrRound( 53 * ai0[10] - 35 * ai0[6] , DenShift16);
3679    E6 = xTrRound( 53 * ai0[6] + 35 * ai0[10] , DenShift16);
3680    E7 = xTrRound( 12 * ai0[14] + 62 * ai0[2] , DenShift16);
3681#else
3682    F8 = xTrRound( 6 * pSrc[1] - 63 * pSrc[15] , DenShift16);
3683    F9 = xTrRound( 49 * pSrc[9] - 40 * pSrc[7] , DenShift16);
3684    F10 = xTrRound( 30 * pSrc[5] - 56 * pSrc[11] , DenShift16);
3685    F11 = xTrRound( 61 * pSrc[13] - 18 * pSrc[3] , DenShift16);
3686    F12 = xTrRound( 61 * pSrc[3] + 18 * pSrc[13] , DenShift16);
3687    F13 = xTrRound( 30 * pSrc[11] + 56 * pSrc[5] , DenShift16);
3688    F14 = xTrRound( 49 * pSrc[7] + 40 * pSrc[9] , DenShift16);
3689    F15 = xTrRound( 6 * pSrc[15] + 63 * pSrc[1] , DenShift16);
3690   
3691    E4 = xTrRound( 12 * pSrc[2] - 62 * pSrc[14] , DenShift16);
3692    E5 = xTrRound( 53 * pSrc[10] - 35 * pSrc[6] , DenShift16);
3693    E6 = xTrRound( 53 * pSrc[6] + 35 * pSrc[10] , DenShift16);
3694    E7 = xTrRound( 12 * pSrc[14] + 62 * pSrc[2] , DenShift16);
3695#endif
3696    E8 = F8 + F9;
3697    E9 = F8 - F9;
3698    E10 = F11 - F10;
3699    E11 = F11 + F10;
3700    E12 = F12 + F13;
3701    E13 = F12 - F13;
3702    E14 = F15 - F14;
3703    E15 = F15 + F14;
3704#ifdef TRANS_PRECISION_EXT
3705    D0 = xTrRound( 45 * ( ai0[0] + ai0[8] ) , DenShift16);
3706    D1 = xTrRound( 45 * ( ai0[0] - ai0[8] ) , DenShift16);
3707    D2 = xTrRound( 24 * ai0[4] - 59 * ai0[12] , DenShift16);
3708    D3 = xTrRound( 59 * ai0[4] + 24 * ai0[12] , DenShift16);
3709#else
3710    D0 = xTrRound( 45 * ( pSrc[0] + pSrc[8] ) , DenShift16);
3711    D1 = xTrRound( 45 * ( pSrc[0] - pSrc[8] ) , DenShift16);
3712    D2 = xTrRound( 24 * pSrc[4] - 59 * pSrc[12] , DenShift16);
3713    D3 = xTrRound( 59 * pSrc[4] + 24 * pSrc[12] , DenShift16);
3714#endif
3715    D4 = E4 + E5;
3716    D5 = E4 - E5;
3717    D6 = E7 - E6;
3718    D7 = E7 + E6;
3719    D9 = xTrRound( 24 * E14 - 59 * E9 , DenShift16);
3720    D10 = xTrRound(  - 59 * E13 - 24 * E10 , DenShift16);
3721    D13 = xTrRound( 24 * E13 - 59 * E10 , DenShift16);
3722    D14 = xTrRound( 59 * E14 + 24 * E9 , DenShift16);
3723   
3724    C0 = D0 + D3;
3725    C3 = D0 - D3;
3726    C8 = E8 + E11;
3727    C11 = E8 - E11;
3728    C12 = E15 - E12;
3729    C15 = E15 + E12;
3730    C1 = D1 + D2;
3731    C2 = D1 - D2;
3732    C9 = D9 + D10;
3733    C10 = D9 - D10;
3734    C13 = D14 - D13;
3735    C14 = D14 + D13;
3736    C5 = xTrRound( 45 * ( D6 - D5 ) , DenShift16);
3737    C6 = xTrRound( 45 * ( D6 + D5 ) , DenShift16);
3738   
3739    B0 = C0 + D7;
3740    B7 = C0 - D7;
3741    B1 = C1 + C6;
3742    B6 = C1 - C6;
3743    B2 = C2 + C5;
3744    B5 = C2 - C5;
3745    B3 = C3 + D4;
3746    B4 = C3 - D4;
3747    B10 = xTrRound( 45 * ( C13 - C10 ) , DenShift16);
3748    B13 = xTrRound( 45 * ( C13 + C10 ) , DenShift16);
3749    B11 = xTrRound( 45 * ( C12 - C11 ) , DenShift16);
3750    B12 = xTrRound( 45 * ( C12 + C11 ) , DenShift16);
3751   
3752    aaiTemp[0][y] = B0 + C15;
3753    aaiTemp[15][y] = B0 - C15;
3754    aaiTemp[1][y] = B1 + C14;
3755    aaiTemp[14][y] = B1 - C14;
3756    aaiTemp[2][y] = B2 + B13;
3757    aaiTemp[13][y] = B2 - B13;
3758    aaiTemp[3][y] = B3 + B12;
3759    aaiTemp[12][y] = B3 - B12;
3760    aaiTemp[4][y] = B4 + B11;
3761    aaiTemp[11][y] = B4 - B11;
3762    aaiTemp[5][y] = B5 + B10;
3763    aaiTemp[10][y] = B5 - B10;
3764    aaiTemp[6][y] = B6 + C9;
3765    aaiTemp[9][y] = B6 - C9;
3766    aaiTemp[7][y] = B7 + C8;
3767    aaiTemp[8][y] = B7 - C8;
3768   
3769    pSrc += 16;
3770  }
3771 
3772  for( x=0 ; x<16 ; x++, pDes++ )
3773  {
3774    F8 = xTrRound( 6 * aaiTemp[x][1] - 63 * aaiTemp[x][15] , DenShift16);
3775    F9 = xTrRound( 49 * aaiTemp[x][9] - 40 * aaiTemp[x][7] , DenShift16);
3776    F10 = xTrRound( 30 * aaiTemp[x][5] - 56 * aaiTemp[x][11] , DenShift16);
3777    F11 = xTrRound( 61 * aaiTemp[x][13] - 18 * aaiTemp[x][3] , DenShift16);
3778    F12 = xTrRound( 61 * aaiTemp[x][3] + 18 * aaiTemp[x][13] , DenShift16);
3779    F13 = xTrRound( 30 * aaiTemp[x][11] + 56 * aaiTemp[x][5] , DenShift16);
3780    F14 = xTrRound( 49 * aaiTemp[x][7] + 40 * aaiTemp[x][9] , DenShift16);
3781    F15 = xTrRound( 6 * aaiTemp[x][15] + 63 * aaiTemp[x][1] , DenShift16);
3782   
3783    E4 = xTrRound( 12 * aaiTemp[x][2] - 62 * aaiTemp[x][14] , DenShift16);
3784    E5 = xTrRound( 53 * aaiTemp[x][10] - 35 * aaiTemp[x][6] , DenShift16);
3785    E6 = xTrRound( 53 * aaiTemp[x][6] + 35 * aaiTemp[x][10] , DenShift16);
3786    E7 = xTrRound( 12 * aaiTemp[x][14] + 62 * aaiTemp[x][2] , DenShift16);
3787    E8 = F8 + F9;
3788    E9 = F8 - F9;
3789    E10 = F11 - F10;
3790    E11 = F11 + F10;
3791    E12 = F12 + F13;
3792    E13 = F12 - F13;
3793    E14 = F15 - F14;
3794    E15 = F15 + F14;
3795   
3796    D0 = xTrRound( 45 * ( aaiTemp[x][0] + aaiTemp[x][8] ) , DenShift16);
3797    D1 = xTrRound( 45 * ( aaiTemp[x][0] - aaiTemp[x][8] ) , DenShift16);
3798    D2 = xTrRound( 24 * aaiTemp[x][4] - 59 * aaiTemp[x][12] , DenShift16);
3799    D3 = xTrRound( 59 * aaiTemp[x][4] + 24 * aaiTemp[x][12] , DenShift16);
3800    D4 = E4 + E5;
3801    D5 = E4 - E5;
3802    D6 = E7 - E6;
3803    D7 = E7 + E6;
3804    D9 = xTrRound( 24 * E14 - 59 * E9 , DenShift16);
3805    D10 = xTrRound(  - 59 * E13 - 24 * E10 , DenShift16);
3806    D13 = xTrRound( 24 * E13 - 59 * E10 , DenShift16);
3807    D14 = xTrRound( 59 * E14 + 24 * E9 , DenShift16);
3808   
3809    C0 = D0 + D3;
3810    C3 = D0 - D3;
3811    C8 = E8 + E11;
3812    C11 = E8 - E11;
3813    C12 = E15 - E12;
3814    C15 = E15 + E12;
3815    C1 = D1 + D2;
3816    C2 = D1 - D2;
3817    C9 = D9 + D10;
3818    C10 = D9 - D10;
3819    C13 = D14 - D13;
3820    C14 = D14 + D13;
3821    C5 = xTrRound( 45 * ( D6 - D5 ) , DenShift16);
3822    C6 = xTrRound( 45 * ( D6 + D5 ) , DenShift16);
3823   
3824    B0 = C0 + D7;
3825    B7 = C0 - D7;
3826    B1 = C1 + C6;
3827    B6 = C1 - C6;
3828    B2 = C2 + C5;
3829    B5 = C2 - C5;
3830    B3 = C3 + D4;
3831    B4 = C3 - D4;
3832    B10 = xTrRound( 45 * ( C13 - C10 ) , DenShift16);
3833    B13 = xTrRound( 45 * ( C13 + C10 ) , DenShift16);
3834    B11 = xTrRound( 45 * ( C12 - C11 ) , DenShift16);
3835    B12 = xTrRound( 45 * ( C12 + C11 ) , DenShift16);