"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_T1_H__ 00034 #define __LSI_T1_H__ 00035 00036 #include "../LSIImageLib.h" 00037 #include "LSIJpegCommonStructs.h" 00038 #include "LSIMqc.h" 00039 #include "LSIRaw.h" 00040 #include "LSITcd.h" 00041 00042 00043 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00044 // MACROS 00045 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00046 #define T1_NMSEDEC_BITS 7 00047 00048 #define T1_SIG_NE 0x0001 00049 #define T1_SIG_SE 0x0002 00050 #define T1_SIG_SW 0x0004 00051 #define T1_SIG_NW 0x0008 00052 #define T1_SIG_N 0x0010 00053 #define T1_SIG_E 0x0020 00054 #define T1_SIG_S 0x0040 00055 #define T1_SIG_W 0x0080 00056 #define T1_SIG_OTH (T1_SIG_N | T1_SIG_NE | T1_SIG_E | T1_SIG_SE | T1_SIG_S | T1_SIG_SW | T1_SIG_W | T1_SIG_NW) 00057 #define T1_SIG_PRIM (T1_SIG_N | T1_SIG_E | T1_SIG_S | T1_SIG_W) 00058 00059 #define T1_SGN_N 0x0100 00060 #define T1_SGN_E 0x0200 00061 #define T1_SGN_S 0x0400 00062 #define T1_SGN_W 0x0800 00063 #define T1_SGN (T1_SGN_N | T1_SGN_E | T1_SGN_S | T1_SGN_W) 00064 00065 #define T1_SIG 0x1000 00066 #define T1_REFINE 0x2000 00067 #define T1_VISIT 0x4000 00068 00069 #define T1_NUMCTXS_ZC 9 00070 #define T1_NUMCTXS_SC 5 00071 #define T1_NUMCTXS_MAG 3 00072 #define T1_NUMCTXS_AGG 1 00073 #define T1_NUMCTXS_UNI 1 00074 00075 #define T1_CTXNO_ZC 0 00076 #define T1_CTXNO_SC (T1_CTXNO_ZC + T1_NUMCTXS_ZC) 00077 #define T1_CTXNO_MAG (T1_CTXNO_SC + T1_NUMCTXS_SC) 00078 #define T1_CTXNO_AGG (T1_CTXNO_MAG + T1_NUMCTXS_MAG) 00079 #define T1_CTXNO_UNI (T1_CTXNO_AGG + T1_NUMCTXS_AGG) 00080 #define T1_NUMCTXS (T1_CTXNO_UNI + T1_NUMCTXS_UNI) 00081 00082 #define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS - 1) 00083 00084 #define T1_TYPE_MQ 0 00085 #define T1_TYPE_RAW 1 00086 #define MACRO_t1_flags( X, Y ) _ptT1->flags[((X)*(_ptT1->flags_stride))+(Y)] 00087 00088 namespace lsi { 00089 00096 class CT1 { 00097 public : 00098 // == Types. 00099 typedef LSINT16 flag_t; 00100 00104 typedef struct opj_t1 { 00106 CJpegCommonStructs::opj_common_ptr cinfo; 00107 00109 CMqc::opj_mqc_t * mqc; 00111 CRaw::opj_raw_t * raw; 00112 00113 LSINT32 * data; 00114 flag_t * flags; 00115 LSINT32 w; 00116 LSINT32 h; 00117 LSINT32 datasize; 00118 LSINT32 flagssize; 00119 LSINT32 flags_stride; 00120 } opj_t1_t; 00121 00122 00123 // == Functions. 00131 static opj_t1_t * LSE_CALL t1_create( CJpegCommonStructs::opj_common_ptr _cpInfo ); 00132 00138 static LSVOID LSE_CALL t1_destroy( opj_t1_t * _ptT1 ); 00139 00147 static LSVOID LSE_CALL t1_encode_cblks( opj_t1_t * _ptT1, CTcd::opj_tcd_tile_t * _pttTile, CJ2k::opj_tcp_t * _ptTcp ); 00148 00156 static LSVOID LSE_CALL t1_decode_cblks( opj_t1_t * _ptT1, CTcd::opj_tcd_tilecomp_t * _pttTileC, CJ2k::opj_tccp_t * _ptTccp ); 00157 00158 protected : 00159 // == Members. 00163 static LSCHAR lut_ctxno_zc[1024]; 00164 00168 static LSCHAR lut_ctxno_sc[256]; 00169 00173 static LSCHAR lut_spb[256]; 00174 00178 static LSINT16 lut_nmsedec_sig[1<<T1_NMSEDEC_BITS]; 00179 00183 static LSINT16 lut_nmsedec_sig0[1<<T1_NMSEDEC_BITS]; 00184 00188 static LSINT16 lut_nmsedec_ref[1<<T1_NMSEDEC_BITS]; 00189 00193 static LSINT16 lut_nmsedec_ref0[1<<T1_NMSEDEC_BITS]; 00194 00195 // == Functions. 00203 static LSCHAR LSE_CALL t1_getctxno_zc( LSINT32 _i32F, LSINT32 _i32Orient ); 00204 00211 static LSCHAR LSE_CALL t1_getctxno_sc( LSINT32 _i32F ); 00212 00219 static LSINT32 LSE_CALL t1_getctxno_mag( LSINT32 _i32F ); 00220 00227 static LSCHAR LSE_CALL t1_getspb( LSINT32 _i32F ); 00228 00236 static LSINT16 LSE_CALL t1_getnmsedec_sig( LSINT32 _i32X, LSINT32 _i32BitPos ); 00237 00245 static LSINT16 LSE_CALL t1_getnmsedec_ref( LSINT32 _i32X, LSINT32 _i32BitPos ); 00246 00254 static LSVOID LSE_CALL t1_updateflags( flag_t * _pfFlags, LSINT32 _i32S, LSINT32 _i32Stride ); 00255 00269 static LSVOID LSE_CALL t1_enc_sigpass_step( 00270 opj_t1_t * _ptT1, 00271 flag_t * _pfFlags, 00272 LSINT32 * _pi32Data, 00273 LSINT32 _i32Orient, 00274 LSINT32 _i32BpNo, 00275 LSINT32 _i32One, 00276 LSINT32 * _pi32NmseDec, 00277 LSCHAR _i32Type, 00278 LSINT32 _i32Vsc ); 00279 00290 static LSVOID LSE_CALL t1_dec_sigpass_step_raw( 00291 opj_t1_t * _ptT1, 00292 flag_t * _pfFlags, 00293 LSINT32 * _pi32Data, 00294 LSINT32 _i32Orient, 00295 LSINT32 _i32OnePlusHalf, 00296 LSINT32 _i32Vsc ); 00297 00307 static LSVOID LSE_CALL t1_dec_sigpass_step_mqc( 00308 opj_t1_t * _ptT1, 00309 flag_t * _pfFlags, 00310 LSINT32 * _pi32Data, 00311 LSINT32 _i32Orient, 00312 LSINT32 _i32OnePlusHalf ); 00313 00324 static LSVOID LSE_CALL t1_dec_sigpass_step_mqc_vsc( 00325 opj_t1_t * _ptT1, 00326 flag_t * _pfFlags, 00327 LSINT32 * _pi32Data, 00328 LSINT32 _i32Orient, 00329 LSINT32 _i32OnePlusHalf, 00330 LSINT32 _i32Vsc ); 00331 00342 static LSVOID LSE_CALL t1_enc_sigpass( 00343 opj_t1_t * _ptT1, 00344 LSINT32 _i32BpNo, 00345 LSINT32 _i32Orient, 00346 LSINT32 * _pi32NmseDec, 00347 LSCHAR _cType, 00348 LSINT32 _i32CodeBlockStY ); 00349 00358 static LSVOID LSE_CALL t1_dec_sigpass_raw( 00359 opj_t1_t * _ptT1, 00360 LSINT32 _i32BpNo, 00361 LSINT32 _i32Orient, 00362 LSINT32 _i32CodeBlockStY ); 00363 00371 static LSVOID LSE_CALL t1_dec_sigpass_mqc( 00372 opj_t1_t * _ptT1, 00373 LSINT32 _i32BpNo, 00374 LSINT32 _i32Orient ); 00375 00383 static LSVOID LSE_CALL t1_dec_sigpass_mqc_vsc( 00384 opj_t1_t * _ptT1, 00385 LSINT32 _i32BpNo, 00386 LSINT32 _i32Orient ); 00387 00400 static LSVOID LSE_CALL t1_enc_refpass_step( 00401 opj_t1_t * _ptT1, 00402 flag_t * _pfFlags, 00403 LSINT32 * _pi32Data, 00404 LSINT32 _i32BpNo, 00405 LSINT32 _i32One, 00406 LSINT32 * _pi32NmseDec, 00407 LSCHAR _cType, 00408 LSINT32 _i32Vsc ); 00409 00420 static LSVOID LSE_CALL t1_dec_refpass_step_raw( 00421 opj_t1_t * _ptT1, 00422 flag_t * _pfFlags, 00423 LSINT32 * _pi32Data, 00424 LSINT32 _i32PosHalf, 00425 LSINT32 _i32NegHalf, 00426 LSINT32 _i32Vsc ); 00427 00437 static LSVOID LSE_CALL t1_dec_refpass_step_mqc( 00438 opj_t1_t * _ptT1, 00439 flag_t * _pfFlags, 00440 LSINT32 * _pi32Data, 00441 LSINT32 _i32PosHalf, 00442 LSINT32 _i32NegHalf ); 00443 00454 static LSVOID LSE_CALL t1_dec_refpass_step_mqc_vsc( 00455 opj_t1_t * _ptT1, 00456 flag_t * _pfFlags, 00457 LSINT32 * _pi32Data, 00458 LSINT32 _i32PosHalf, 00459 LSINT32 _i32NegHalf, 00460 LSINT32 _i32Vsc ); 00461 00471 static LSVOID LSE_CALL t1_enc_refpass( 00472 opj_t1_t * _ptT1, 00473 LSINT32 _i32BpNo, 00474 LSINT32 * _pi32NmseDec, 00475 LSCHAR _cType, 00476 LSINT32 _i32CodeBlockStY ); 00477 00485 static LSVOID LSE_CALL t1_dec_refpass_raw( 00486 opj_t1_t * _ptT1, 00487 LSINT32 _i32BpNo, 00488 LSINT32 _i32CodeBlockStY ); 00489 00496 static LSVOID LSE_CALL t1_dec_refpass_mqc( 00497 opj_t1_t * _ptT1, 00498 LSINT32 _i32BpNo ); 00499 00506 static LSVOID LSE_CALL t1_dec_refpass_mqc_vsc( 00507 opj_t1_t * _ptT1, 00508 LSINT32 _i32BpNo ); 00509 00523 static LSVOID LSE_CALL t1_enc_clnpass_step( 00524 opj_t1_t * _ptT1, 00525 flag_t * _pfFlags, 00526 LSINT32 * _pi32Data, 00527 LSINT32 _i32Orient, 00528 LSINT32 _i32BpNo, 00529 LSINT32 _i32One, 00530 LSINT32 * _pi32NmseDec, 00531 LSINT32 _i32Partial, 00532 LSINT32 _i32Vsc ); 00533 00543 static LSVOID LSE_CALL t1_dec_clnpass_step_partial( 00544 opj_t1_t * _ptT1, 00545 flag_t * _pfFlags, 00546 LSINT32 * _pi32Data, 00547 LSINT32 _i32Orient, 00548 LSINT32 _i32OnePlusHalf ); 00549 00559 static LSVOID LSE_CALL t1_dec_clnpass_step( 00560 opj_t1_t * _ptT1, 00561 flag_t * _pfFlags, 00562 LSINT32 * _pi32Data, 00563 LSINT32 _i32Orient, 00564 LSINT32 _i32OnePlusHalf ); 00565 00577 static LSVOID LSE_CALL t1_dec_clnpass_step_vsc( 00578 opj_t1_t * _ptT1, 00579 flag_t * _pfFlags, 00580 LSINT32 *_pi32Data, 00581 LSINT32 _i32Orient, 00582 LSINT32 _i32OnePlusHalf, 00583 LSINT32 _i32Partial, 00584 LSINT32 _i32Vsc ); 00585 00595 static LSVOID LSE_CALL t1_enc_clnpass( 00596 opj_t1_t * _ptT1, 00597 LSINT32 _i32BpNo, 00598 LSINT32 _i32Orient, 00599 LSINT32 * _pi32NmseDec, 00600 LSINT32 _i32CodeBlockStY ); 00601 00610 static LSVOID LSE_CALL t1_dec_clnpass( 00611 opj_t1_t * _ptT1, 00612 LSINT32 _i32BpNo, 00613 LSINT32 _i32Orient, 00614 LSINT32 _i32CodeBlockStY ); 00615 00629 static LSDOUBLE LSE_CALL t1_getwmsedec( 00630 LSINT32 _pi32NmseDec, 00631 LSINT32 _i32CompNo, 00632 LSINT32 _i32Level, 00633 LSINT32 _i32Orient, 00634 LSINT32 _i32BpNo, 00635 LSINT32 _i32QmfbId, 00636 LSDOUBLE _dStepSize, 00637 LSINT32 _i32NumComps, 00638 LSINT32 _i32Mct ); 00639 00655 static LSVOID LSE_CALL t1_encode_cblk( 00656 opj_t1_t * _ptT1, 00657 CTcd::opj_tcd_cblk_enc_t * _ptceCodeBlock, 00658 LSINT32 _i32Orient, 00659 LSINT32 _i32CompNo, 00660 LSINT32 _i32Level, 00661 LSINT32 _i32QmfbId, 00662 LSDOUBLE _dStepSize, 00663 LSINT32 _i32CodeBlockStY, 00664 LSINT32 _i32NumComps, 00665 LSINT32 _i32Mct, 00666 CTcd::opj_tcd_tile_t * _pttTile ); 00667 00677 static LSVOID LSE_CALL t1_decode_cblk( 00678 opj_t1_t * _ptT1, 00679 CTcd::opj_tcd_cblk_dec_t * _ptceCodeBlock, 00680 LSINT32 _i32Orient, 00681 LSINT32 _i32RoiShift, 00682 LSINT32 _i32CodeBlockStY ); 00683 00691 static LSBOOL LSE_CALL allocate_buffers( 00692 opj_t1_t * _ptT1, 00693 LSINT32 _i32W, 00694 LSINT32 _i32H ); 00695 }; 00696 00697 } // namespace lsi 00698 00699 #endif // __LSI_T1_H__