"L. Spiro Engine"
|
00001 /* 00002 * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium 00003 * Copyright (c) 2002-2007, Professor Benoit Macq 00004 * Copyright (c) 2001-2003, David Janssens 00005 * Copyright (c) 2002-2003, Yannick Verschueren 00006 * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe 00007 * Copyright (c) 2005, Herve Drolon, FreeImage Team 00008 * All rights reserved. 00009 * 00010 * Redistribution and use in source and binary forms, with or without 00011 * modification, are permitted provided that the following conditions 00012 * are met: 00013 * 1. Redistributions of source code must retain the above copyright 00014 * notice, this list of conditions and the following disclaimer. 00015 * 2. Redistributions in binary form must reproduce the above copyright 00016 * notice, this list of conditions and the following disclaimer in the 00017 * documentation and/or other materials provided with the distribution. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' 00020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00023 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00024 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00025 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00026 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00027 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00028 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00029 * POSSIBILITY OF SUCH DAMAGE. 00030 */ 00031 00032 00033 #ifndef __LSI_DWT_H__ 00034 #define __LSI_DWT_H__ 00035 00036 #include "../LSIImageLib.h" 00037 #include "LSITcd.h" 00038 #include "LSIJ2k.h" 00039 00040 namespace lsi { 00041 00048 class CDwt { 00049 public : 00050 // == Functions. 00057 static LSVOID LSE_CALL dwt_encode( CTcd::opj_tcd_tilecomp_t * _pttTileC ); 00058 00066 static LSVOID LSE_CALL dwt_decode( CTcd::opj_tcd_tilecomp_t * _pttTileC, LSINT32 _i32NumRes ); 00067 00074 static LSINT32 LSE_CALL dwt_getgain( LSINT32 _i32Orient ); 00075 00083 static LSDOUBLE LSE_CALL dwt_getnorm( LSINT32 _i32Level, LSINT32 _i32Orient ); 00084 00091 static LSVOID LSE_CALL dwt_encode_real( CTcd::opj_tcd_tilecomp_t * _pttTileC ); 00092 00100 static LSVOID LSE_CALL dwt_decode_real( CTcd::opj_tcd_tilecomp_t * _pttTileC, LSINT32 _i32NumRes ); 00101 00108 static LSINT32 LSE_CALL dwt_getgain_real( LSINT32 _i32Orient ); 00109 00117 static LSDOUBLE LSE_CALL dwt_getnorm_real( LSINT32 _i32Level, LSINT32 _i32Orient ); 00118 00125 static LSVOID LSE_CALL dwt_calc_explicit_stepsizes( CJ2k::opj_tccp_t * _ptTccp, LSINT32 _i32Prec ); 00126 00127 00128 protected : 00129 // == Types. 00133 typedef struct dwt_local { 00134 LSINT32 * mem; 00135 LSINT32 dn; 00136 LSINT32 sn; 00137 LSINT32 cas; 00138 } dwt_t; 00139 00143 typedef union { 00144 LSFLOAT f[4]; 00145 } v4; 00146 00150 typedef struct v4dwt_local { 00151 v4 * wavelet; 00152 LSINT32 dn; 00153 LSINT32 sn; 00154 LSINT32 cas; 00155 } v4dwt_t; 00156 00162 typedef LSVOID (LSE_CALL * DWT1DFN)( dwt_t * _pdV ); 00163 00164 00165 // == Members. 00169 static const LSDOUBLE dwt_norms[4][10]; 00170 00174 static const LSDOUBLE dwt_norms_real[4][10]; 00175 00179 static const LSFLOAT m_fK; 00180 00184 static const LSFLOAT m_c13318; 00185 00189 static const LSFLOAT m_dwt_alpha; 00190 00194 static const LSFLOAT m_dwt_beta; 00195 00199 static const LSFLOAT m_dwt_gamma; 00200 00204 static const LSFLOAT m_dwt_delta; 00205 00206 00207 // == Functions. 00217 static LSVOID LSE_CALL dwt_deinterleave_h( LSINT32 * _pi32A, LSINT32 * _pi32B, LSINT32 _i32Dn, LSINT32 _i32Sn, LSINT32 _i32Cas ); 00218 00229 static LSVOID LSE_CALL dwt_deinterleave_v( LSINT32 * _pi32A, LSINT32 * _pi32B, LSINT32 _i32Dn, LSINT32 _i32Sn, LSINT32 _i32X, LSINT32 _i32Cas ); 00230 00237 static LSVOID LSE_CALL dwt_interleave_h( dwt_t * _pdH, LSINT32 * _pi32A ); 00238 00246 static LSVOID LSE_CALL dwt_interleave_v( dwt_t * _pdV, LSINT32 * _pi32A, LSINT32 _i32X ); 00247 00256 static LSVOID LSE_CALL dwt_encode_1( LSINT32 * _pi32A, LSINT32 _i32Dn, LSINT32 _i32Sn, LSINT32 _i32Cas ); 00257 00263 static LSVOID LSE_CALL dwt_decode_1( dwt_t * _pdV ); 00264 00273 static LSVOID LSE_CALL dwt_encode_1_real( LSINT32 * _pi32A, LSINT32 _i32Dn, LSINT32 _i32Sn, LSINT32 _i32Cas ); 00274 00282 static LSVOID LSE_CALL dwt_encode_stepsize( LSINT32 _i32StepSize, LSINT32 _i32NumBps, CJ2k::opj_stepsize_t * _psBandNoStepSize ); 00283 00291 static LSVOID LSE_CALL dwt_decode_tile( CTcd::opj_tcd_tilecomp_t * _pttTileC, LSINT32 _i32I, DWT1DFN _dFn ); 00292 00299 static LSINT32 LSE_CALL dwt_decode_max_resolution( CTcd::opj_tcd_resolution_t * LSE_RESTRICT _ptrR, LSINT32 _i32I ); 00300 00309 static LSVOID LSE_CALL v4dwt_interleave_h( v4dwt_t * LSE_RESTRICT _pvW, LSFLOAT * LSE_RESTRICT _pfA, LSINT32 _i32X, LSINT32 _i32Size ); 00310 00318 static LSVOID LSE_CALL v4dwt_interleave_v( v4dwt_t * LSE_RESTRICT _pvV, LSFLOAT * LSE_RESTRICT _pfA, LSINT32 _i32X ); 00319 00325 static LSVOID LSE_CALL v4dwt_decode( v4dwt_t * LSE_RESTRICT _pvDwt ); 00326 00335 static LSVOID LSE_CALL dwt_decode_1_( LSINT32 * _pi32A, LSINT32 _i32Dn, LSINT32 _i32Sn, LSINT32 _i32Cas ); 00336 00344 static LSVOID LSE_CALL v4dwt_decode_step1( v4 * _pvW, LSINT32 _i32Count, const LSFLOAT _fC ); 00345 00355 static LSVOID LSE_CALL v4dwt_decode_step2( v4 * _pvL, v4 * _pvW, LSINT32 _i32K, LSINT32 _i32M, LSFLOAT _fC ); 00356 }; 00357 00358 } // namespace lsi 00359 00360 #endif // __LSI_DWT_H__