"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 * Copyright (c) 2006-2007, Parvatha Elangovan 00009 * All rights reserved. 00010 * 00011 * Redistribution and use in source and binary forms, with or without 00012 * modification, are permitted provided that the following conditions 00013 * are met: 00014 * 1. Redistributions of source code must retain the above copyright 00015 * notice, this list of conditions and the following disclaimer. 00016 * 2. Redistributions in binary form must reproduce the above copyright 00017 * notice, this list of conditions and the following disclaimer in the 00018 * documentation and/or other materials provided with the distribution. 00019 * 00020 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' 00021 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00022 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00023 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00024 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00025 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00026 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00027 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00028 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00029 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00030 * POSSIBILITY OF SUCH DAMAGE. 00031 */ 00032 00033 00034 #ifndef __LSI_J2K_H__ 00035 #define __LSI_J2K_H__ 00036 00037 #include "../LSIImageLib.h" 00038 #include "LSICio.h" 00039 #include "LSIJpegCommonStructs.h" 00040 #include "LSIJpegImage.h" 00041 00042 00043 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00044 // MACROS 00045 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00046 #define J2K_CP_CSTY_PRT 0x01 00047 #define J2K_CP_CSTY_SOP 0x02 00048 #define J2K_CP_CSTY_EPH 0x04 00049 #define J2K_CCP_CSTY_PRT 0x01 00050 #define J2K_CCP_CBLKSTY_LAZY 0x01 00051 #define J2K_CCP_CBLKSTY_RESET 0x02 00052 #define J2K_CCP_CBLKSTY_TERMALL 0x04 00053 #define J2K_CCP_CBLKSTY_VSC 0x08 00054 #define J2K_CCP_CBLKSTY_PTERM 0x10 00055 #define J2K_CCP_CBLKSTY_SEGSYM 0x20 00056 #define J2K_CCP_QNTSTY_NOQNT 0 00057 #define J2K_CCP_QNTSTY_SIQNT 1 00058 #define J2K_CCP_QNTSTY_SEQNT 2 00059 00060 #define J2K_MS_SOC 0xFF4F 00061 #define J2K_MS_SOT 0xFF90 00062 #define J2K_MS_SOD 0xFF93 00063 #define J2K_MS_EOC 0xFFD9 00064 #define J2K_MS_SIZ 0xFF51 00065 #define J2K_MS_COD 0xFF52 00066 #define J2K_MS_COC 0xFF53 00067 #define J2K_MS_RGN 0xFF5E 00068 #define J2K_MS_QCD 0xFF5C 00069 #define J2K_MS_QCC 0xFF5D 00070 #define J2K_MS_POC 0xFF5F 00071 #define J2K_MS_TLM 0xFF55 00072 #define J2K_MS_PLM 0xFF57 00073 #define J2K_MS_PLT 0xFF58 00074 #define J2K_MS_PPM 0xFF60 00075 #define J2K_MS_PPT 0xFF61 00076 #define J2K_MS_SOP 0xFF91 00077 #define J2K_MS_EPH 0xFF92 00078 #define J2K_MS_CRG 0xFF63 00079 #define J2K_MS_COM 0xFF64 00081 #ifdef USE_JPWL 00082 #define J2K_MS_EPC 0xFF68 00083 #define J2K_MS_EPB 0xFF66 00084 #define J2K_MS_ESD 0xFF67 00085 #define J2K_MS_RED 0xFF69 00086 #endif // #ifdef USE_JPWL 00087 #ifdef USE_JPSEC 00088 #define J2K_MS_SEC 0xFF65 00089 #define J2K_MS_INSEC 0xFF94 00090 #endif // #ifdef USE_JPSEC 00091 00092 namespace lsi { 00093 00100 class CJ2k { 00101 public : 00102 // == Enumerations. 00107 typedef enum J2K_STATUS { 00108 J2K_STATE_MHSOC = 0x0001, 00109 J2K_STATE_MHSIZ = 0x0002, 00110 J2K_STATE_MH = 0x0004, 00111 J2K_STATE_TPHSOT = 0x0008, 00112 J2K_STATE_TPH = 0x0010, 00113 J2K_STATE_MT = 0x0020, 00114 J2K_STATE_NEOC = 0x0040, 00115 J2K_STATE_ERR = 0x0080 00116 } J2K_STATUS; 00117 00121 typedef enum T2_MODE { 00122 THRESH_CALC = 0, 00123 FINAL_PASS = 1 00124 }J2K_T2_MODE; 00125 00126 00127 // == Types. 00131 typedef struct opj_stepsize { 00133 LSINT32 expn; 00135 LSINT32 mant; 00136 } opj_stepsize_t; 00137 00141 typedef struct opj_tccp { 00143 LSINT32 csty; 00145 LSINT32 numresolutions; 00147 LSINT32 cblkw; 00149 LSINT32 cblkh; 00151 LSINT32 cblksty; 00153 LSINT32 qmfbid; 00155 LSINT32 qntsty; 00157 opj_stepsize_t stepsizes[J2K_MAXBANDS]; 00159 LSINT32 numgbits; 00161 LSINT32 roishift; 00163 LSINT32 prcw[J2K_MAXRLVLS]; 00165 LSINT32 prch[J2K_MAXRLVLS]; 00166 } opj_tccp_t; 00167 00173 typedef struct opj_tcp { 00175 LSINT32 first; 00177 LSINT32 csty; 00179 OPJ_PROG_ORDER prg; 00181 LSINT32 numlayers; 00183 LSINT32 mct; 00185 LSFLOAT rates[100]; 00187 LSINT32 numpocs; 00189 LSINT32 POC; 00191 CJpegCommonStructs::opj_poc_t 00192 pocs[32]; 00194 LSUINT8 * ppt_data; 00196 LSUINT8 * ppt_data_first; 00198 LSINT32 ppt; 00200 LSINT32 ppt_store; 00202 LSINT32 ppt_len; 00204 LSFLOAT distoratio[100]; 00206 opj_tccp_t * tccps; 00207 } opj_tcp_t; 00208 00212 typedef struct opj_cp { 00214 OPJ_CINEMA_MODE cinema; 00216 LSINT32 max_comp_size; 00218 LSINT32 img_size; 00220 OPJ_RSIZ_CAPABILITIES rsiz; 00222 LSCHAR tp_on; 00224 LSCHAR tp_flag; 00226 LSINT32 tp_pos; 00228 LSINT32 disto_alloc; 00230 LSINT32 fixed_alloc; 00232 LSINT32 fixed_quality; 00234 LSINT32 reduce; 00236 LSINT32 layer; 00238 OPJ_LIMIT_DECODING limit_decoding; 00240 LSINT32 tx0; 00242 LSINT32 ty0; 00244 LSINT32 tdx; 00246 LSINT32 tdy; 00248 LSCHAR * comment; 00250 LSINT32 tw; 00252 LSINT32 th; 00254 LSINT32 * tileno; 00256 LSINT32 tileno_size; 00258 LSUINT8 * ppm_data; 00260 LSUINT8 * ppm_data_first; 00262 LSINT32 ppm; 00264 LSINT32 ppm_store; 00266 LSINT32 ppm_previous; 00268 LSINT32 ppm_len; 00270 opj_tcp_t * tcps; 00272 LSINT32 * matrice; 00273 } opj_cp_t; 00274 00278 typedef struct opj_j2k { 00280 CJpegCommonStructs::opj_common_ptr 00281 cinfo; 00282 00284 LSINT32 state; 00286 LSINT32 curtileno; 00288 LSINT32 tp_num; 00290 LSINT32 cur_tp_num; 00292 LSINT32 * cur_totnum_tp; 00297 LSINT32 tlm_start; 00300 LSINT32 totnum_tp; 00305 LSUINT8 * eot; 00310 LSINT32 sot_start; 00311 LSINT32 sod_start; 00316 LSINT32 pos_correction; 00318 LSUINT8 ** tile_data; 00320 LSINT32 * tile_len; 00325 opj_tcp_t * default_tcp; 00327 CJpegImage::opj_image_t * image; 00329 opj_cp_t * cp; 00331 CJpegCommonStructs::opj_codestream_info_t * 00332 cstr_info; 00334 CCio::opj_cio_t * cio; 00335 } opj_j2k_t; 00336 00337 00338 // == Functions. 00345 static opj_j2k_t * LSE_CALL j2k_create_decompress( CJpegCommonStructs::opj_common_ptr _cpInfoC ); 00346 00352 static LSVOID LSE_CALL j2k_destroy_decompress( opj_j2k_t * _pjJ2k ); 00353 00361 static LSVOID LSE_CALL j2k_setup_decoder( opj_j2k_t * _pjJ2k, CJpegCommonStructs::opj_dparameters_t * _pdParameters ); 00362 00371 static CJpegImage::opj_image_t * LSE_CALL 00372 j2k_decode( opj_j2k_t * _pjJ2k, CCio::opj_cio_t * _pcCio, CJpegCommonStructs::opj_codestream_info_t * _pciCStrInfo ); 00373 00382 static CJpegImage::opj_image_t * LSE_CALL 00383 j2k_decode_jpt_stream( opj_j2k_t * _pjJ2k, CCio::opj_cio_t * _pcCio, CJpegCommonStructs::opj_codestream_info_t * _pciCStrInfo ); 00384 00391 static opj_j2k_t * LSE_CALL j2k_create_compress( CJpegCommonStructs::opj_common_ptr _cpInfo ); 00392 00398 static LSVOID LSE_CALL j2k_destroy_compress( opj_j2k_t * _pjJ2k ); 00399 00408 static LSVOID LSE_CALL j2k_setup_encoder( opj_j2k_t * _pjJ2k, CJpegCommonStructs::opj_cparameters_t * _pcpParameters, CJpegImage::opj_image_t * _piImage ); 00409 00416 static const LSCHAR * LSE_CALL j2k_convert_progression_order( OPJ_PROG_ORDER _poOrder ); 00417 00427 static LSBOOL LSE_CALL j2k_encode( opj_j2k_t * _pjJ2k, CCio::opj_cio_t * _pcCio, CJpegImage::opj_image_t * _piImage, CJpegCommonStructs::opj_codestream_info_t * _pciCStrInfo ); 00428 00429 00430 protected : 00431 // == Types. 00432 typedef struct opj_dec_mstabent_t { 00434 LSINT32 id; 00436 LSINT32 states; 00438 LSVOID (LSE_CALL * handler)( opj_j2k_t * j2k ); 00439 } * LPopj_dec_mstabent_t, * const LPCopj_dec_mstabent_t; 00440 00441 00442 // == Members. 00443 static opj_dec_mstabent_t j2k_dec_mstab[]; 00444 00445 00446 // == Functions. 00453 static opj_dec_mstabent_t * LSE_CALL 00454 j2k_dec_mstab_lookup( LSINT32 _i32Id ); 00455 00461 static LSVOID LSE_CALL j2k_write_soc( opj_j2k_t * _pjJ2k ); 00462 00468 static LSVOID LSE_CALL j2k_read_soc( opj_j2k_t * _pjJ2k ); 00469 00475 static LSVOID LSE_CALL j2k_write_siz( opj_j2k_t * _pjJ2k ); 00476 00482 static LSVOID LSE_CALL j2k_read_siz( opj_j2k_t * _pjJ2k ); 00483 00489 static LSVOID LSE_CALL j2k_write_com( opj_j2k_t * _pjJ2k ); 00490 00496 static LSVOID LSE_CALL j2k_read_com( opj_j2k_t * _pjJ2k ); 00497 00504 static LSVOID LSE_CALL j2k_write_cox( opj_j2k_t * _pjJ2k, LSINT32 _i32CompNo ); 00505 00512 static LSVOID LSE_CALL j2k_read_cox( opj_j2k_t * _pjJ2k, LSINT32 _i32CompNo ); 00513 00519 static LSVOID LSE_CALL j2k_write_cod( opj_j2k_t * _pjJ2k ); 00520 00526 static LSVOID LSE_CALL j2k_read_cod( opj_j2k_t * _pjJ2k ); 00527 00534 static LSVOID LSE_CALL j2k_write_coc( opj_j2k_t * _pjJ2k, LSINT32 _i32CompNo ); 00535 00540 static LSVOID LSE_CALL j2k_read_coc( opj_j2k_t * _pjJ2k ); 00541 00548 static LSVOID LSE_CALL j2k_write_qcx( opj_j2k_t * _pjJ2k, LSINT32 _i32CompNo ); 00549 00557 static LSVOID LSE_CALL j2k_read_qcx( opj_j2k_t * _pjJ2k, LSINT32 _i32CompNo, LSINT32 _i32Len ); 00558 00564 static LSVOID LSE_CALL j2k_write_qcd( opj_j2k_t * _pjJ2k ); 00565 00571 static LSVOID LSE_CALL j2k_read_qcd( opj_j2k_t * _pjJ2k ); 00572 00579 static LSVOID LSE_CALL j2k_write_qcc( opj_j2k_t * _pjJ2k, LSINT32 _i32CompNo ); 00580 00586 static LSVOID LSE_CALL j2k_read_qcc( opj_j2k_t * _pjJ2k ); 00587 00593 static LSVOID LSE_CALL j2k_write_poc( opj_j2k_t * _pjJ2k ); 00594 00600 static LSVOID LSE_CALL j2k_read_poc( opj_j2k_t * _pjJ2k ); 00601 00607 static LSVOID LSE_CALL j2k_read_crg( opj_j2k_t * _pjJ2k ); 00608 00614 static LSVOID LSE_CALL j2k_read_tlm( opj_j2k_t * _pjJ2k ); 00615 00621 static LSVOID LSE_CALL j2k_read_plm( opj_j2k_t * _pjJ2k ); 00622 00628 static LSVOID LSE_CALL j2k_read_plt( opj_j2k_t * _pjJ2k ); 00629 00635 static LSVOID LSE_CALL j2k_read_ppm( opj_j2k_t * _pjJ2k ); 00636 00642 static LSVOID LSE_CALL j2k_read_ppt( opj_j2k_t * _pjJ2k ); 00643 00649 static LSVOID LSE_CALL j2k_write_tlm( opj_j2k_t * _pjJ2k ); 00650 00656 static LSVOID LSE_CALL j2k_write_sot( opj_j2k_t * _pjJ2k ); 00657 00663 static LSVOID LSE_CALL j2k_read_sot( opj_j2k_t * _pjJ2k ); 00664 00671 static LSVOID LSE_CALL j2k_write_sod( opj_j2k_t * _pjJ2k, LSVOID * _i32TileCoder ); 00672 00678 static LSVOID LSE_CALL j2k_read_sod( opj_j2k_t * _pjJ2k ); 00679 00687 static LSVOID LSE_CALL j2k_write_rgn( opj_j2k_t * _pjJ2k, LSINT32 _i32CompNo, LSINT32 _i32TileNo ); 00688 00694 static LSVOID LSE_CALL j2k_read_rgn( opj_j2k_t * _pjJ2k ); 00695 00701 static LSVOID LSE_CALL j2k_write_eoc( opj_j2k_t * _pjJ2k ); 00702 00708 static LSVOID LSE_CALL j2k_read_eoc( opj_j2k_t * _pjJ2k ); 00709 00715 static LSVOID LSE_CALL j2k_read_unk( opj_j2k_t * _pjJ2k ); 00716 00725 static LSINT32 LSE_CALL j2k_get_num_tp( opj_cp_t * _pcCp, LSINT32 _i32PiNo, LSINT32 _i32TileNo ); 00726 00736 static LSINT32 LSE_CALL j2k_calculate_tp( opj_cp_t * _pcCp, CJpegImage::opj_image_t * _piImage, opj_j2k_t * _pjJ2k ); 00737 00738 }; 00739 00740 } // namespace lsi 00741 00742 #endif // __LSI_J2K_H__