1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
2d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * The copyright in this software is being made available under the 2-clauses
3d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * BSD License, included below. This software may be subject to other third
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * party and contributor rights, including patent rights, and no such rights
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * are granted under this license.
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2002-2014, Professor Benoit Macq
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2001-2003, David Janssens
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2002-2003, Yannick Verschueren
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Copyright (c) 2003-2007, Francois-Olivier Devaux
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2003-2014, Antonin Descampe
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2005, Herve Drolon, FreeImage Team
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2012, CS Systemes d'Information, France
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * All rights reserved.
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Redistribution and use in source and binary forms, with or without
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * modification, are permitted provided that the following conditions
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * are met:
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1. Redistributions of source code must retain the above copyright
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *    notice, this list of conditions and the following disclaimer.
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 2. Redistributions in binary form must reproduce the above copyright
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *    notice, this list of conditions and the following disclaimer in the
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *    documentation and/or other materials provided with the distribution.
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * POSSIBILITY OF SUCH DAMAGE.
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if defined(__SSE__) && !defined(_M_IX86) && !defined(__i386)
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define USE_SSE
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <xmmintrin.h>
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if defined(__SSE2__) && !defined(_M_IX86) && !defined(__i386)
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define USE_SSE2
46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <emmintrin.h>
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if defined(__SSE4_1__) && !defined(_M_IX86) && !defined(__i386)
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define USE_SSE4
50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <smmintrin.h>
51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "opj_includes.h"
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This table contains the norms of the basis function of the reversible MCT. */
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const OPJ_FLOAT64 opj_mct_norms[3] = { 1.732, .8292, .8292 };
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This table contains the norms of the basis function of the irreversible MCT. */
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const OPJ_FLOAT64 opj_mct_norms_real[3] = { 1.732, 1.805, 1.573 };
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst OPJ_FLOAT64 * opj_mct_get_mct_norms()
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return opj_mct_norms;
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst OPJ_FLOAT64 * opj_mct_get_mct_norms_real()
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return opj_mct_norms_real;
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* Forward reversible MCT. */
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef USE_SSE2
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_mct_encode(
80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c0,
81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c1,
82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c2,
83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T n)
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T i;
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const OPJ_SIZE_T len = n;
87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    /* buffer are aligned on 16 bytes */
88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    assert(((size_t)c0 & 0xf) == 0);
89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    assert(((size_t)c1 & 0xf) == 0);
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    assert(((size_t)c2 & 0xf) == 0);
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < (len & ~3U); i += 4) {
93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i y, u, v;
94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i r = _mm_load_si128((const __m128i *) & (c0[i]));
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i g = _mm_load_si128((const __m128i *) & (c1[i]));
96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i b = _mm_load_si128((const __m128i *) & (c2[i]));
97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        y = _mm_add_epi32(g, g);
98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        y = _mm_add_epi32(y, b);
99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        y = _mm_add_epi32(y, r);
100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        y = _mm_srai_epi32(y, 2);
101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        u = _mm_sub_epi32(b, g);
102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        v = _mm_sub_epi32(r, g);
103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_si128((__m128i *) & (c0[i]), y);
104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_si128((__m128i *) & (c1[i]), u);
105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_si128((__m128i *) & (c2[i]), v);
106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (; i < len; ++i) {
109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 r = c0[i];
110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 g = c1[i];
111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 b = c2[i];
112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 y = (r + (g * 2) + b) >> 2;
113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 u = b - g;
114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 v = r - g;
115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c0[i] = y;
116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c1[i] = u;
117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c2[i] = v;
118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else
121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid opj_mct_encode(
122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c0,
123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c1,
124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c2,
125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T n)
126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T i;
128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const OPJ_SIZE_T len = n;
129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < len; ++i) {
131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 r = c0[i];
132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 g = c1[i];
133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 b = c2[i];
134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 y = (r + (g * 2) + b) >> 2;
135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 u = b - g;
136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 v = r - g;
137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c0[i] = y;
138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c1[i] = u;
139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c2[i] = v;
140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Inverse reversible MCT. */
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef USE_SSE2
148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid opj_mct_decode(
149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c0,
150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c1,
151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c2,
152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T n)
153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T i;
155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const OPJ_SIZE_T len = n;
156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < (len & ~3U); i += 4) {
158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i r, g, b;
159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i y = _mm_load_si128((const __m128i *) & (c0[i]));
160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i u = _mm_load_si128((const __m128i *) & (c1[i]));
161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i v = _mm_load_si128((const __m128i *) & (c2[i]));
162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        g = y;
163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        g = _mm_sub_epi32(g, _mm_srai_epi32(_mm_add_epi32(u, v), 2));
164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        r = _mm_add_epi32(v, g);
165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        b = _mm_add_epi32(u, g);
166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_si128((__m128i *) & (c0[i]), r);
167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_si128((__m128i *) & (c1[i]), g);
168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_si128((__m128i *) & (c2[i]), b);
169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (; i < len; ++i) {
171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 y = c0[i];
172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 u = c1[i];
173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 v = c2[i];
174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 g = y - ((u + v) >> 2);
175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 r = v + g;
176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 b = u + g;
177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c0[i] = r;
178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c1[i] = g;
179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c2[i] = b;
180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_mct_decode(
184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c0,
185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c1,
186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c2,
187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T n)
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 i;
190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < n; ++i) {
191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 y = c0[i];
192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 u = c1[i];
193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 v = c2[i];
194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 g = y - ((u + v) >> 2);
195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 r = v + g;
196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 b = u + g;
197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c0[i] = r;
198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c1[i] = g;
199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c2[i] = b;
200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Get norm of basis function of reversible MCT. */
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */
207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno)
208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann{
209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return opj_mct_norms[compno];
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* Forward irreversible MCT. */
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef USE_SSE4
216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid opj_mct_encode_real(
217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c0,
218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c1,
219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c2,
220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T n)
221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T i;
223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const OPJ_SIZE_T len = n;
224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const __m128i ry = _mm_set1_epi32(2449);
226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const __m128i gy = _mm_set1_epi32(4809);
227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const __m128i by = _mm_set1_epi32(934);
228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const __m128i ru = _mm_set1_epi32(1382);
229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const __m128i gu = _mm_set1_epi32(2714);
230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    /* const __m128i bu = _mm_set1_epi32(4096); */
231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    /* const __m128i rv = _mm_set1_epi32(4096); */
232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const __m128i gv = _mm_set1_epi32(3430);
233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const __m128i bv = _mm_set1_epi32(666);
234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const __m128i mulround = _mm_shuffle_epi32(_mm_cvtsi32_si128(4096),
235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                             _MM_SHUFFLE(1, 0, 1, 0));
236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < (len & ~3U); i += 4) {
238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i lo, hi;
239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i y, u, v;
240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i r = _mm_load_si128((const __m128i *) & (c0[i]));
241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i g = _mm_load_si128((const __m128i *) & (c1[i]));
242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128i b = _mm_load_si128((const __m128i *) & (c2[i]));
243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = r;
245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 3, 1, 1));
246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_mul_epi32(lo, ry);
247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_mul_epi32(hi, ry);
248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_add_epi64(lo, mulround);
249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_add_epi64(hi, mulround);
250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_srli_epi64(lo, 13);
251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_slli_epi64(hi, 32 - 13);
252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        y = _mm_blend_epi16(lo, hi, 0xCC);
253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = g;
255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_shuffle_epi32(g, _MM_SHUFFLE(3, 3, 1, 1));
256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_mul_epi32(lo, gy);
257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_mul_epi32(hi, gy);
258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_add_epi64(lo, mulround);
259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_add_epi64(hi, mulround);
260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_srli_epi64(lo, 13);
261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_slli_epi64(hi, 32 - 13);
262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        y = _mm_add_epi32(y, _mm_blend_epi16(lo, hi, 0xCC));
263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = b;
265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_shuffle_epi32(b, _MM_SHUFFLE(3, 3, 1, 1));
266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_mul_epi32(lo, by);
267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_mul_epi32(hi, by);
268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_add_epi64(lo, mulround);
269d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_add_epi64(hi, mulround);
270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_srli_epi64(lo, 13);
271d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_slli_epi64(hi, 32 - 13);
272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        y = _mm_add_epi32(y, _mm_blend_epi16(lo, hi, 0xCC));
273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_si128((__m128i *) & (c0[i]), y);
274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        /*lo = b;
276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_shuffle_epi32(b, _MM_SHUFFLE(3, 3, 1, 1));
277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_mul_epi32(lo, mulround);
278d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_mul_epi32(hi, mulround);*/
279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_cvtepi32_epi64(_mm_shuffle_epi32(b, _MM_SHUFFLE(3, 2, 2, 0)));
280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_cvtepi32_epi64(_mm_shuffle_epi32(b, _MM_SHUFFLE(3, 2, 3, 1)));
281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_slli_epi64(lo, 12);
282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_slli_epi64(hi, 12);
283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_add_epi64(lo, mulround);
284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_add_epi64(hi, mulround);
285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_srli_epi64(lo, 13);
286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_slli_epi64(hi, 32 - 13);
287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        u = _mm_blend_epi16(lo, hi, 0xCC);
288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = r;
290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 3, 1, 1));
291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_mul_epi32(lo, ru);
292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_mul_epi32(hi, ru);
293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_add_epi64(lo, mulround);
294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_add_epi64(hi, mulround);
295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_srli_epi64(lo, 13);
296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_slli_epi64(hi, 32 - 13);
297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        u = _mm_sub_epi32(u, _mm_blend_epi16(lo, hi, 0xCC));
298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = g;
300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_shuffle_epi32(g, _MM_SHUFFLE(3, 3, 1, 1));
301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_mul_epi32(lo, gu);
302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_mul_epi32(hi, gu);
303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_add_epi64(lo, mulround);
304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_add_epi64(hi, mulround);
305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_srli_epi64(lo, 13);
306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_slli_epi64(hi, 32 - 13);
307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        u = _mm_sub_epi32(u, _mm_blend_epi16(lo, hi, 0xCC));
308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_si128((__m128i *) & (c1[i]), u);
309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        /*lo = r;
311d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 3, 1, 1));
312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_mul_epi32(lo, mulround);
313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_mul_epi32(hi, mulround);*/
314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_cvtepi32_epi64(_mm_shuffle_epi32(r, _MM_SHUFFLE(3, 2, 2, 0)));
315d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_cvtepi32_epi64(_mm_shuffle_epi32(r, _MM_SHUFFLE(3, 2, 3, 1)));
316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_slli_epi64(lo, 12);
317d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_slli_epi64(hi, 12);
318d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_add_epi64(lo, mulround);
319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_add_epi64(hi, mulround);
320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_srli_epi64(lo, 13);
321d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_slli_epi64(hi, 32 - 13);
322d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        v = _mm_blend_epi16(lo, hi, 0xCC);
323d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = g;
325d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_shuffle_epi32(g, _MM_SHUFFLE(3, 3, 1, 1));
326d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_mul_epi32(lo, gv);
327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_mul_epi32(hi, gv);
328d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_add_epi64(lo, mulround);
329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_add_epi64(hi, mulround);
330d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_srli_epi64(lo, 13);
331d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_slli_epi64(hi, 32 - 13);
332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        v = _mm_sub_epi32(v, _mm_blend_epi16(lo, hi, 0xCC));
333d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = b;
335d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_shuffle_epi32(b, _MM_SHUFFLE(3, 3, 1, 1));
336d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_mul_epi32(lo, bv);
337d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_mul_epi32(hi, bv);
338d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_add_epi64(lo, mulround);
339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_add_epi64(hi, mulround);
340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lo = _mm_srli_epi64(lo, 13);
341d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        hi = _mm_slli_epi64(hi, 32 - 13);
342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        v = _mm_sub_epi32(v, _mm_blend_epi16(lo, hi, 0xCC));
343d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_si128((__m128i *) & (c2[i]), v);
344d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (; i < len; ++i) {
346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 r = c0[i];
347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 g = c1[i];
348d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 b = c2[i];
349d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 y =  opj_int_fix_mul(r, 2449) + opj_int_fix_mul(g,
350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                       4809) + opj_int_fix_mul(b, 934);
351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 u = -opj_int_fix_mul(r, 1382) - opj_int_fix_mul(g,
352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                      2714) + opj_int_fix_mul(b, 4096);
353d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 v =  opj_int_fix_mul(r, 4096) - opj_int_fix_mul(g,
354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                       3430) - opj_int_fix_mul(b, 666);
355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c0[i] = y;
356d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c1[i] = u;
357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c2[i] = v;
358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_mct_encode_real(
362d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c0,
363d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c1,
364d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32* OPJ_RESTRICT c2,
365d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T n)
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
367d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 i;
368d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < n; ++i) {
369d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 r = c0[i];
370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 g = c1[i];
371d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 b = c2[i];
372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 y =  opj_int_fix_mul(r, 2449) + opj_int_fix_mul(g,
373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                       4809) + opj_int_fix_mul(b, 934);
374d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 u = -opj_int_fix_mul(r, 1382) - opj_int_fix_mul(g,
375d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                      2714) + opj_int_fix_mul(b, 4096);
376d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_INT32 v =  opj_int_fix_mul(r, 4096) - opj_int_fix_mul(g,
377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                       3430) - opj_int_fix_mul(b, 666);
378d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c0[i] = y;
379d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c1[i] = u;
380d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c2[i] = v;
381d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Inverse irreversible MCT. */
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_mct_decode_real(
389d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_FLOAT32* OPJ_RESTRICT c0,
390d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_FLOAT32* OPJ_RESTRICT c1,
391d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_FLOAT32* OPJ_RESTRICT c2,
392d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T n)
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
394d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 i;
3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef USE_SSE
396d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    __m128 vrv, vgu, vgv, vbu;
397d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    vrv = _mm_set1_ps(1.402f);
398d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    vgu = _mm_set1_ps(0.34413f);
399d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    vgv = _mm_set1_ps(0.71414f);
400d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    vbu = _mm_set1_ps(1.772f);
401d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < (n >> 3); ++i) {
402d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128 vy, vu, vv;
403d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        __m128 vr, vg, vb;
404d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
405d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vy = _mm_load_ps(c0);
406d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vu = _mm_load_ps(c1);
407d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vv = _mm_load_ps(c2);
408d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
409d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
410d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
411d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_ps(c0, vr);
412d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_ps(c1, vg);
413d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_ps(c2, vb);
414d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c0 += 4;
415d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c1 += 4;
416d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c2 += 4;
417d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
418d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vy = _mm_load_ps(c0);
419d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vu = _mm_load_ps(c1);
420d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vv = _mm_load_ps(c2);
421d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
422d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
423d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
424d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_ps(c0, vr);
425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_ps(c1, vg);
426d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        _mm_store_ps(c2, vb);
427d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c0 += 4;
428d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c1 += 4;
429d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c2 += 4;
430d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
431d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    n &= 7;
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
433d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < n; ++i) {
434d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_FLOAT32 y = c0[i];
435d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_FLOAT32 u = c1[i];
436d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_FLOAT32 v = c2[i];
437d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_FLOAT32 r = y + (v * 1.402f);
438d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_FLOAT32 g = y - (u * 0.34413f) - (v * (0.71414f));
439d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        OPJ_FLOAT32 b = y + (u * 1.772f);
440d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c0[i] = r;
441d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c1[i] = g;
442d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        c2[i] = b;
443d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Get norm of basis function of irreversible MCT. */
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */
449d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOPJ_FLOAT64 opj_mct_getnorm_real(OPJ_UINT32 compno)
450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann{
451d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return opj_mct_norms_real[compno];
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_mct_encode_custom(
456d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_BYTE * pCodingdata,
457d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T n,
458d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_BYTE ** pData,
459d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 pNbComp,
460d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 isSigned)
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
462d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_FLOAT32 * lMct = (OPJ_FLOAT32 *) pCodingdata;
463d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T i;
464d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 j;
465d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 k;
466d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 lNbMatCoeff = pNbComp * pNbComp;
467d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32 * lCurrentData = 00;
468d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32 * lCurrentMatrix = 00;
469d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32 ** lData = (OPJ_INT32 **) pData;
470d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 lMultiplicator = 1 << 13;
471d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_INT32 * lMctPtr;
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    OPJ_ARG_NOT_USED(isSigned);
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
475d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    lCurrentData = (OPJ_INT32 *) opj_malloc((pNbComp + lNbMatCoeff) * sizeof(
476d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            OPJ_INT32));
477d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (! lCurrentData) {
478d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return OPJ_FALSE;
479d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
481d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    lCurrentMatrix = lCurrentData + pNbComp;
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
483d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < lNbMatCoeff; ++i) {
484d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lCurrentMatrix[i] = (OPJ_INT32)(*(lMct++) * (OPJ_FLOAT32)lMultiplicator);
485d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
487d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < n; ++i)  {
488d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lMctPtr = lCurrentMatrix;
489d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        for (j = 0; j < pNbComp; ++j) {
490d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            lCurrentData[j] = (*(lData[j]));
491d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
493d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        for (j = 0; j < pNbComp; ++j) {
494d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            *(lData[j]) = 0;
495d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            for (k = 0; k < pNbComp; ++k) {
496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                *(lData[j]) += opj_int_fix_mul(*lMctPtr, lCurrentData[k]);
497d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                ++lMctPtr;
498d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            }
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
500d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            ++lData[j];
501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
502d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
504d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    opj_free(lCurrentData);
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
506d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return OPJ_TRUE;
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_mct_decode_custom(
510d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_BYTE * pDecodingData,
511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T n,
512d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_BYTE ** pData,
513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 pNbComp,
514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 isSigned)
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
516d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_FLOAT32 * lMct;
517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_SIZE_T i;
518d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 j;
519d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 k;
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_FLOAT32 * lCurrentData = 00;
522d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_FLOAT32 * lCurrentResult = 00;
523d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_FLOAT32 ** lData = (OPJ_FLOAT32 **) pData;
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    OPJ_ARG_NOT_USED(isSigned);
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
527d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    lCurrentData = (OPJ_FLOAT32 *) opj_malloc(2 * pNbComp * sizeof(OPJ_FLOAT32));
528d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (! lCurrentData) {
529d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return OPJ_FALSE;
530d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
531d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    lCurrentResult = lCurrentData + pNbComp;
532d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
533d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < n; ++i) {
534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lMct = (OPJ_FLOAT32 *) pDecodingData;
535d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        for (j = 0; j < pNbComp; ++j) {
536d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            lCurrentData[j] = (OPJ_FLOAT32)(*(lData[j]));
537d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        for (j = 0; j < pNbComp; ++j) {
539d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            lCurrentResult[j] = 0;
540d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            for (k = 0; k < pNbComp; ++k) {
541d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                lCurrentResult[j] += *(lMct++) * lCurrentData[k];
542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            }
543d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            *(lData[j]++) = (OPJ_FLOAT32)(lCurrentResult[j]);
544d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
545d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
546d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    opj_free(lCurrentData);
547d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return OPJ_TRUE;
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
550d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid opj_calculate_norms(OPJ_FLOAT64 * pNorms,
551d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                         OPJ_UINT32 pNbComps,
552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                         OPJ_FLOAT32 * pMatrix)
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
554d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_UINT32 i, j, lIndex;
555d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_FLOAT32 lCurrentValue;
556d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_FLOAT64 * lNorms = (OPJ_FLOAT64 *) pNorms;
557d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    OPJ_FLOAT32 * lMatrix = (OPJ_FLOAT32 *) pMatrix;
558d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
559d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (i = 0; i < pNbComps; ++i) {
560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lNorms[i] = 0;
561d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lIndex = i;
562d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
563d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        for (j = 0; j < pNbComps; ++j) {
564d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            lCurrentValue = lMatrix[lIndex];
565d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            lIndex += pNbComps;
566d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            lNorms[i] += lCurrentValue * lCurrentValue;
567d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
568d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        lNorms[i] = sqrt(lNorms[i]);
569d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
571