1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The copyright in this software is being made available under the 2-clauses 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 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 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2003-2007, Francois-Olivier Devaux 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2003-2014, Antonin Descampe 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2005, Herve Drolon, FreeImage Team 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2007, Jonathan Ballard <dzonatas@dzonux.net> 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com> 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 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __SSE__ 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <xmmintrin.h> 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "opj_includes.h" 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@{*/ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define OPJ_WS(i) v->mem[(i)*2] 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define OPJ_WD(i) v->mem[(1+(i)*2)] 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** @name Local data structures */ 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@{*/ 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct dwt_local { 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32* mem; 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 dn; 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 sn; 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 cas; 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} opj_dwt_t; 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef union { 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 f[4]; 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} opj_v4_t; 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct v4dwt_local { 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4_t* wavelet ; 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 dn ; 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 sn ; 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 cas ; 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} opj_v4dwt_t ; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const OPJ_FLOAT32 opj_dwt_alpha = 1.586134342f; /* 12994 */ 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const OPJ_FLOAT32 opj_dwt_beta = 0.052980118f; /* 434 */ 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const OPJ_FLOAT32 opj_dwt_gamma = -0.882911075f; /* -7233 */ 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const OPJ_FLOAT32 opj_dwt_delta = -0.443506852f; /* -3633 */ 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const OPJ_FLOAT32 opj_K = 1.230174105f; /* 10078 */ 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const OPJ_FLOAT32 opj_c13318 = 1.625732422f; 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@}*/ 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovVirtual function type for wavelet transform in 1-D 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef void (*DWT1DFN)(opj_dwt_t* v); 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** @name Local static functions */ 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@{*/ 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovForward lazy transform (horizontal) 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas); 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovForward lazy transform (vertical) 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas); 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovInverse lazy transform (horizontal) 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_dwt_interleave_h(opj_dwt_t* h, OPJ_INT32 *a); 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovInverse lazy transform (vertical) 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x); 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovForward 5-3 wavelet transform in 1-D 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas); 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovInverse 5-3 wavelet transform in 1-D 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_dwt_decode_1(opj_dwt_t *v); 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas); 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovForward 9-7 wavelet transform in 1-D 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas); 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovExplicit calculation of the Quantization Stepsizes 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_stepsize_t *bandno_stepsize); 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovInverse wavelet transform in 2-D. 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i, DWT1DFN fn); 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_dwt_encode_procedure( opj_tcd_tilecomp_t * tilec, 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) ); 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i); 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Inverse 9-7 wavelet transform in 1-D. */ 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_v4dwt_decode(opj_v4dwt_t* restrict dwt); 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size); 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read); 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __SSE__ 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c); 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c); 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c); 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, OPJ_FLOAT32 c); 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@}*/ 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@}*/ 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define OPJ_S(i) a[(i)*2] 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define OPJ_D(i) a[(1+(i)*2)] 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define OPJ_S_(i) ((i)<0?OPJ_S(0):((i)>=sn?OPJ_S(sn-1):OPJ_S(i))) 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define OPJ_D_(i) ((i)<0?OPJ_D(0):((i)>=dn?OPJ_D(dn-1):OPJ_D(i))) 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* new */ 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define OPJ_SS_(i) ((i)<0?OPJ_S(0):((i)>=dn?OPJ_S(dn-1):OPJ_S(i))) 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define OPJ_DD_(i) ((i)<0?OPJ_D(0):((i)>=sn?OPJ_D(sn-1):OPJ_D(i))) 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This table contains the norms of the 5-3 wavelets for different bands. */ 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const OPJ_FLOAT64 opj_dwt_norms[4][10] = { 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3}, 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93} 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This table contains the norms of the 9-7 wavelets for different bands. */ 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const OPJ_FLOAT64 opj_dwt_norms_real[4][10] = { 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9}, 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2} 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov========================================================== 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov local functions 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov========================================================== 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Forward lazy transform (horizontal). */ 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) { 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i; 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_dest = b; 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_src = a+cas; 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0; i<sn; ++i) { 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_dest++ = *l_src; 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src += 2; 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest = b + sn; 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src = a + 1 - cas; 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0; i<dn; ++i) { 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_dest++=*l_src; 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src += 2; 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Forward lazy transform (vertical). */ 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas) { 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i = sn; 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_dest = b; 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_src = a+cas; 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (i--) { 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_dest = *l_src; 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest += x; 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src += 2; 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } /* b[i*x]=a[2*i+cas]; */ 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest = b + sn * x; 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src = a + 1 - cas; 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i = dn; 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (i--) { 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_dest = *l_src; 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest += x; 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src += 2; 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } /*b[(sn+i)*x]=a[(2*i+1-cas)];*/ 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Inverse lazy transform (horizontal). */ 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_dwt_interleave_h(opj_dwt_t* h, OPJ_INT32 *a) { 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 *ai = a; 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 *bi = h->mem + h->cas; 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i = h->sn; 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while( i-- ) { 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *bi = *(ai++); 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi += 2; 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ai = a + h->sn; 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi = h->mem + 1 - h->cas; 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i = h->dn ; 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while( i-- ) { 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *bi = *(ai++); 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi += 2; 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Inverse lazy transform (vertical). */ 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x) { 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 *ai = a; 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 *bi = v->mem + v->cas; 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i = v->sn; 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while( i-- ) { 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *bi = *ai; 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi += 2; 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ai += x; 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ai = a + (v->sn * x); 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi = v->mem + 1 - v->cas; 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i = v->dn ; 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while( i-- ) { 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *bi = *ai; 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi += 2; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ai += x; 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Forward 5-3 wavelet transform in 1-D. */ 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) { 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i; 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!cas) { 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < dn; i++) OPJ_D(i) -= (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1; 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < sn; i++) OPJ_S(i) += (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2; 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_S(0) *= 2; 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < dn; i++) OPJ_S(i) -= (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1; 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < sn; i++) OPJ_D(i) += (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2; 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Inverse 5-3 wavelet transform in 1-D. */ 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) { 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i; 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!cas) { 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < sn; i++) OPJ_S(i) -= (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2; 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < dn; i++) OPJ_D(i) += (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1; 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_S(0) /= 2; 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < sn; i++) OPJ_D(i) -= (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2; 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < dn; i++) OPJ_S(i) += (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1; 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Inverse 5-3 wavelet transform in 1-D. */ 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_dwt_decode_1(opj_dwt_t *v) { 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_dwt_decode_1_(v->mem, v->dn, v->sn, v->cas); 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Forward 9-7 wavelet transform in 1-D. */ 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) { 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i; 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!cas) { 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < dn; i++) 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_D(i) -= opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 12993); 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < sn; i++) 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_S(i) -= opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 434); 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < dn; i++) 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_D(i) += opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 7233); 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < sn; i++) 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_S(i) += opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 3633); 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < dn; i++) 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 5038); /*5038 */ 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < sn; i++) 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 6659); /*6660 */ 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */ 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < dn; i++) 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_S(i) -= opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 12993); 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < sn; i++) 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_D(i) -= opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 434); 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < dn; i++) 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_S(i) += opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 7233); 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < sn; i++) 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_D(i) += opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 3633); 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < dn; i++) 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 5038); /*5038 */ 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < sn; i++) 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 6659); /*6660 */ 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_stepsize_t *bandno_stepsize) { 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 p, n; 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p = opj_int_floorlog2(stepsize) - 13; 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov n = 11 - opj_int_floorlog2(stepsize); 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff; 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bandno_stepsize->expn = numbps - p; 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov========================================================== 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DWT interface 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov========================================================== 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Forward 5-3 wavelet transform in 2-D. */ 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovINLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) ) 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i, j, k; 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 *a = 00; 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 *aj = 00; 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 *bj = 00; 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 w, l; 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 rw; /* width of the resolution level computed */ 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 rh; /* height of the resolution level computed */ 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_data_size; 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_resolution_t * l_cur_res = 0; 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_resolution_t * l_last_res = 0; 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov w = tilec->x1-tilec->x0; 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l = (OPJ_INT32)tilec->numresolutions-1; 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov a = tilec->data; 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cur_res = tilec->resolutions + l; 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_last_res = l_cur_res - 1; 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_data_size = opj_dwt_max_resolution( tilec->resolutions,tilec->numresolutions) * (OPJ_UINT32)sizeof(OPJ_INT32); 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bj = (OPJ_INT32*)opj_malloc((size_t)l_data_size); 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! bj) { 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i = l; 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (i--) { 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 rw1; /* width of the resolution level once lower than computed one */ 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 rh1; /* height of the resolution level once lower than computed one */ 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 dn, sn; 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rw = l_cur_res->x1 - l_cur_res->x0; 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rh = l_cur_res->y1 - l_cur_res->y0; 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rw1 = l_last_res->x1 - l_last_res->x0; 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rh1 = l_last_res->y1 - l_last_res->y0; 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cas_row = l_cur_res->x0 & 1; 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cas_col = l_cur_res->y0 & 1; 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sn = rh1; 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dn = rh - rh1; 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j = 0; j < rw; ++j) { 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov aj = a + j; 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k = 0; k < rh; ++k) { 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bj[k] = aj[k*w]; 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*p_function) (bj, dn, sn, cas_col); 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sn = rw1; 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dn = rw - rw1; 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j = 0; j < rh; j++) { 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov aj = a + j * w; 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k = 0; k < rw; k++) bj[k] = aj[k]; 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*p_function) (bj, dn, sn, cas_row); 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_dwt_deinterleave_h(bj, aj, dn, sn, cas_row); 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cur_res = l_last_res; 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --l_last_res; 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(bj); 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Forward 5-3 wavelet transform in 2-D. */ 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_dwt_encode(opj_tcd_tilecomp_t * tilec) 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return opj_dwt_encode_procedure(tilec,opj_dwt_encode_1); 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Inverse 5-3 wavelet transform in 2-D. */ 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_dwt_decode(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres) { 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return opj_dwt_decode_tile(tilec, numres, &opj_dwt_decode_1); 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Get gain of 5-3 wavelet transform. */ 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_UINT32 opj_dwt_getgain(OPJ_UINT32 orient) { 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (orient == 0) 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (orient == 1 || orient == 2) 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Get norm of 5-3 wavelet. */ 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_FLOAT64 opj_dwt_getnorm(OPJ_UINT32 level, OPJ_UINT32 orient) { 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return opj_dwt_norms[orient][level]; 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Forward 9-7 wavelet transform in 2-D. */ 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_dwt_encode_real(opj_tcd_tilecomp_t * tilec) 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return opj_dwt_encode_procedure(tilec,opj_dwt_encode_1_real); 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Get gain of 9-7 wavelet transform. */ 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_UINT32 opj_dwt_getgain_real(OPJ_UINT32 orient) { 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)orient; 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Get norm of 9-7 wavelet. */ 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_FLOAT64 opj_dwt_getnorm_real(OPJ_UINT32 level, OPJ_UINT32 orient) { 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return opj_dwt_norms_real[orient][level]; 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, OPJ_UINT32 prec) { 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 numbands, bandno; 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov numbands = 3 * tccp->numresolutions - 2; 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (bandno = 0; bandno < numbands; bandno++) { 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT64 stepsize; 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 resno, level, orient, gain; 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1); 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1); 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov level = tccp->numresolutions - 1 - resno; 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2)); 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stepsize = 1.0; 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT64 norm = opj_dwt_norms_real[orient][level]; 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stepsize = (1 << (gain)) / norm; 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_dwt_encode_stepsize((OPJ_INT32) floor(stepsize * 8192.0), (OPJ_INT32)(prec + gain), &tccp->stepsizes[bandno]); 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Determine maximum computed resolution level for inverse wavelet transform */ 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i) { 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 mr = 0; 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 w; 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while( --i ) { 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++r; 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( mr < ( w = (OPJ_UINT32)(r->x1 - r->x0) ) ) 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov mr = w ; 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( mr < ( w = (OPJ_UINT32)(r->y1 - r->y0) ) ) 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov mr = w ; 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return mr ; 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Inverse wavelet transform in 2-D. */ 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres, DWT1DFN dwt_1D) { 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_dwt_t h; 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_dwt_t v; 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_resolution_t* tr = tilec->resolutions; 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 rw = (OPJ_UINT32)(tr->x1 - tr->x0); /* width of the resolution level computed */ 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 rh = (OPJ_UINT32)(tr->y1 - tr->y0); /* height of the resolution level computed */ 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0); 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov h.mem = (OPJ_INT32*) 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_aligned_malloc(opj_dwt_max_resolution(tr, numres) * sizeof(OPJ_INT32)); 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! h.mem){ 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov v.mem = h.mem; 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while( --numres) { 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * restrict tiledp = tilec->data; 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 j; 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++tr; 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov h.sn = (OPJ_INT32)rw; 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov v.sn = (OPJ_INT32)rh; 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rw = (OPJ_UINT32)(tr->x1 - tr->x0); 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rh = (OPJ_UINT32)(tr->y1 - tr->y0); 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn); 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov h.cas = tr->x0 % 2; 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(j = 0; j < rh; ++j) { 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_dwt_interleave_h(&h, &tiledp[j*w]); 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (dwt_1D)(&h); 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(&tiledp[j*w], h.mem, rw * sizeof(OPJ_INT32)); 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn); 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov v.cas = tr->y0 % 2; 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(j = 0; j < rw; ++j){ 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 k; 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_dwt_interleave_v(&v, &tiledp[j], (OPJ_INT32)w); 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (dwt_1D)(&v); 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(k = 0; k < rh; ++k) { 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tiledp[k * w + j] = v.mem[k]; 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_aligned_free(h.mem); 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size){ 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32* restrict bi = (OPJ_FLOAT32*) (w->wavelet + w->cas); 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 count = w->sn; 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i, k; 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(k = 0; k < 2; ++k){ 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( count + 3 * x < size && ((size_t) a & 0x0f) == 0 && ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0 ) { 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Fast code path */ 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < count; ++i){ 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 j = i; 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi[i*8 ] = a[j]; 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j += x; 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi[i*8 + 1] = a[j]; 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j += x; 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi[i*8 + 2] = a[j]; 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j += x; 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi[i*8 + 3] = a[j]; 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Slow code path */ 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < count; ++i){ 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 j = i; 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi[i*8 ] = a[j]; 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j += x; 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(j >= size) continue; 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi[i*8 + 1] = a[j]; 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j += x; 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(j >= size) continue; 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi[i*8 + 2] = a[j]; 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j += x; 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(j >= size) continue; 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi[i*8 + 3] = a[j]; /* This one*/ 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi = (OPJ_FLOAT32*) (w->wavelet + 1 - w->cas); 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov a += w->sn; 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size -= w->sn; 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov count = w->dn; 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read){ 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4_t* restrict bi = v->wavelet + v->cas; 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i; 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < v->sn; ++i){ 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(&bi[i*2], &a[i*x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32)); 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov a += v->sn * x; 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bi = v->wavelet + 1 - v->cas; 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < v->dn; ++i){ 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(&bi[i*2], &a[i*x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32)); 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __SSE__ 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c){ 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov __m128* restrict vw = (__m128*) w; 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i; 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 4x unrolled loop */ 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < count >> 2; ++i){ 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *vw = _mm_mul_ps(*vw, c); 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vw += 2; 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *vw = _mm_mul_ps(*vw, c); 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vw += 2; 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *vw = _mm_mul_ps(*vw, c); 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vw += 2; 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *vw = _mm_mul_ps(*vw, c); 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vw += 2; 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov count &= 3; 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < count; ++i){ 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *vw = _mm_mul_ps(*vw, c); 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vw += 2; 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c){ 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov __m128* restrict vl = (__m128*) l; 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov __m128* restrict vw = (__m128*) w; 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i; 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov __m128 tmp1, tmp2, tmp3; 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tmp1 = vl[0]; 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < m; ++i){ 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tmp2 = vw[-1]; 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tmp3 = vw[ 0]; 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c)); 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tmp1 = tmp3; 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vw += 2; 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vl = vw - 2; 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m >= k){ 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov c = _mm_add_ps(c, c); 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov c = _mm_mul_ps(c, vl[0]); 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(; m < k; ++m){ 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov __m128 tmp = vw[-1]; 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vw[-1] = _mm_add_ps(tmp, c); 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vw += 2; 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c) 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32* restrict fw = (OPJ_FLOAT32*) w; 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i; 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < count; ++i){ 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp1 = fw[i*8 ]; 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp2 = fw[i*8 + 1]; 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp3 = fw[i*8 + 2]; 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp4 = fw[i*8 + 3]; 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[i*8 ] = tmp1 * c; 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[i*8 + 1] = tmp2 * c; 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[i*8 + 2] = tmp3 * c; 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[i*8 + 3] = tmp4 * c; 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, OPJ_FLOAT32 c) 742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32* restrict fl = (OPJ_FLOAT32*) l; 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32* restrict fw = (OPJ_FLOAT32*) w; 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i; 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < m; ++i){ 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp1_1 = fl[0]; 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp1_2 = fl[1]; 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp1_3 = fl[2]; 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp1_4 = fl[3]; 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp2_1 = fw[-4]; 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp2_2 = fw[-3]; 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp2_3 = fw[-2]; 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp2_4 = fw[-1]; 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp3_1 = fw[0]; 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp3_2 = fw[1]; 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp3_3 = fw[2]; 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp3_4 = fw[3]; 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c); 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c); 761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c); 762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c); 763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fl = fw; 764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw += 8; 765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m < k){ 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 c1; 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 c2; 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 c3; 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 c4; 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov c += c; 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov c1 = fl[0] * c; 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov c2 = fl[1] * c; 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov c3 = fl[2] * c; 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov c4 = fl[3] * c; 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(; m < k; ++m){ 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp1 = fw[-4]; 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp2 = fw[-3]; 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp3 = fw[-2]; 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 tmp4 = fw[-1]; 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[-4] = tmp1 + c1; 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[-3] = tmp2 + c2; 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[-2] = tmp3 + c3; 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw[-1] = tmp4 + c4; 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fw += 8; 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Inverse 9-7 wavelet transform in 1-D. */ 794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_v4dwt_decode(opj_v4dwt_t* restrict dwt) 796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 a, b; 798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(dwt->cas == 0) { 799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!((dwt->dn > 0) || (dwt->sn > 1))){ 800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov a = 0; 803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov b = 1; 804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }else{ 805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!((dwt->sn > 0) || (dwt->dn > 1))) { 806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov a = 1; 809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov b = 0; 810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __SSE__ 812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step1_sse(dwt->wavelet+a, dwt->sn, _mm_set1_ps(opj_K)); 813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step1_sse(dwt->wavelet+b, dwt->dn, _mm_set1_ps(opj_c13318)); 814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(opj_dwt_delta)); 815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(opj_dwt_gamma)); 816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(opj_dwt_beta)); 817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(opj_dwt_alpha)); 818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step1(dwt->wavelet+a, dwt->sn, opj_K); 820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step1(dwt->wavelet+b, dwt->dn, opj_c13318); 821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), opj_dwt_delta); 822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), opj_dwt_gamma); 823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), opj_dwt_beta); 824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), opj_dwt_alpha); 825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <summary> */ 830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Inverse 9-7 wavelet transform in 2-D. */ 831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* </summary> */ 832ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numres) 833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_t h; 835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_t v; 836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_resolution_t* res = tilec->resolutions; 838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 rw = (OPJ_UINT32)(res->x1 - res->x0); /* width of the resolution level computed */ 840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 rh = (OPJ_UINT32)(res->y1 - res->y0); /* height of the resolution level computed */ 841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0); 843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov h.wavelet = (opj_v4_t*) opj_aligned_malloc((opj_dwt_max_resolution(res, numres)+5) * sizeof(opj_v4_t)); 845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov v.wavelet = h.wavelet; 846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while( --numres) { 848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * restrict aj = (OPJ_FLOAT32*) tilec->data; 849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 bufsize = (OPJ_UINT32)((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)); 850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 j; 851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov h.sn = (OPJ_INT32)rw; 853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov v.sn = (OPJ_INT32)rh; 854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++res; 856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rw = (OPJ_UINT32)(res->x1 - res->x0); /* width of the resolution level computed */ 858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rh = (OPJ_UINT32)(res->y1 - res->y0); /* height of the resolution level computed */ 859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn); 861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov h.cas = res->x0 % 2; 862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(j = (OPJ_INT32)rh; j > 3; j -= 4) { 864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 k; 865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize); 866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode(&h); 867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(k = (OPJ_INT32)rw; --k >= 0;){ 869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov aj[k ] = h.wavelet[k].f[0]; 870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov aj[k+(OPJ_INT32)w ] = h.wavelet[k].f[1]; 871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov aj[k+(OPJ_INT32)w*2] = h.wavelet[k].f[2]; 872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov aj[k+(OPJ_INT32)w*3] = h.wavelet[k].f[3]; 873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov aj += w*4; 876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bufsize -= w*4; 877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (rh & 0x03) { 880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 k; 881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j = rh & 0x03; 882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize); 883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode(&h); 884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(k = (OPJ_INT32)rw; --k >= 0;){ 885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(j) { 886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 3: aj[k+(OPJ_INT32)w*2] = h.wavelet[k].f[2]; 887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 2: aj[k+(OPJ_INT32)w ] = h.wavelet[k].f[1]; 888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: aj[k ] = h.wavelet[k].f[0]; 889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn); 894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov v.cas = res->y0 % 2; 895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov aj = (OPJ_FLOAT32*) tilec->data; 897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(j = (OPJ_INT32)rw; j > 3; j -= 4){ 898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 k; 899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, 4); 901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode(&v); 902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(k = 0; k < rh; ++k){ 904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(OPJ_FLOAT32)); 905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov aj += 4; 907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (rw & 0x03){ 910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 k; 911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j = rw & 0x03; 913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, j); 915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_v4dwt_decode(&v); 916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(k = 0; k < rh; ++k){ 918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(&aj[k*w], &v.wavelet[k], (size_t)j * sizeof(OPJ_FLOAT32)); 919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_aligned_free(h.wavelet); 924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 926