"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSImageLib/Src/Jpeg/LSIT1.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  * 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__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator