"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSImageLib/Src/Jpeg/LSIJ2k.h

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__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator