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