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

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

Clean version with cfg-files

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