/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef OPENJPEG_H #define OPENJPEG_H #define OPENJPEG_VERSION "1.3.0" /* ========================================================== Compiler directives ========================================================== */ #if defined(OPJ_STATIC) || !(defined(WIN32) || defined(__WIN32__)) #define OPJ_API #define OPJ_CALLCONV #else #define OPJ_CALLCONV __stdcall /* The following ifdef block is the standard way of creating macros which make exporting from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS symbol defined on the command line. this symbol should not be defined on any project that uses this DLL. This way any other project whose source files include this file see OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols defined with this macro as being exported. */ #ifdef OPJ_EXPORTS #define OPJ_API __declspec(dllexport) #else #define OPJ_API __declspec(dllimport) #endif /* OPJ_EXPORTS */ #endif /* !OPJ_STATIC || !WIN32 */ #ifndef __cplusplus #if defined(HAVE_STDBOOL_H) /* The C language implementation does correctly provide the standard header file "stdbool.h". */ #include #else /* The C language implementation does not provide the standard header file "stdbool.h" as required by ISO/IEC 9899:1999. Try to compensate for this braindamage below. */ #if !defined(bool) #define bool int #endif #if !defined(true) #define true 1 #endif #if !defined(false) #define false 0 #endif #endif #endif /* __cplusplus */ /* ========================================================== Useful constant definitions ========================================================== */ #define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */ #define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */ #define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */ /* UniPG>> */ #define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */ #define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */ #define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */ #define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */ #define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */ #define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */ #define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */ #define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */ /* <
  • Error messages
  • Warning messages
  • Debugging messages */ typedef struct opj_event_mgr { /** Error message callback if available, NULL otherwise */ opj_msg_callback error_handler; /** Warning message callback if available, NULL otherwise */ opj_msg_callback warning_handler; /** Debug message callback if available, NULL otherwise */ opj_msg_callback info_handler; } opj_event_mgr_t; /* ========================================================== codec typedef definitions ========================================================== */ /** Progression order changes */ typedef struct opj_poc { /** Resolution num start, Component num start, given by POC */ int resno0, compno0; /** Layer num end,Resolution num end, Component num end, given by POC */ int layno1, resno1, compno1; /** Layer num start,Precinct num start, Precinct num end */ int layno0, precno0, precno1; /** Progression order enum*/ OPJ_PROG_ORDER prg1,prg; /** Progression order string*/ char progorder[5]; /** Tile number */ int tile; /** Start and end values for Tile width and height*/ int tx0,tx1,ty0,ty1; /** Start value, initialised in pi_initialise_encode*/ int layS, resS, compS, prcS; /** End value, initialised in pi_initialise_encode */ int layE, resE, compE, prcE; /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/ int txS,txE,tyS,tyE,dx,dy; /** Temporary values for Tile parts, initialised in pi_create_encode */ int lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t; } opj_poc_t; /** Compression parameters */ typedef struct opj_cparameters { /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */ bool tile_size_on; /** XTOsiz */ int cp_tx0; /** YTOsiz */ int cp_ty0; /** XTsiz */ int cp_tdx; /** YTsiz */ int cp_tdy; /** allocation by rate/distortion */ int cp_disto_alloc; /** allocation by fixed layer */ int cp_fixed_alloc; /** add fixed_quality */ int cp_fixed_quality; /** fixed layer */ int *cp_matrice; /** comment for coding */ char *cp_comment; /** csty : coding style */ int csty; /** progression order (default LRCP) */ OPJ_PROG_ORDER prog_order; /** progression order changes */ opj_poc_t POC[32]; /** number of progression order changes (POC), default to 0 */ int numpocs; /** number of layers */ int tcp_numlayers; /** rates of layers */ float tcp_rates[100]; /** different psnr for successive layers */ float tcp_distoratio[100]; /** number of resolutions */ int numresolution; /** initial code block width, default to 64 */ int cblockw_init; /** initial code block height, default to 64 */ int cblockh_init; /** mode switch (cblk_style) */ int mode; /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */ int irreversible; /** region of interest: affected component in [0..3], -1 means no ROI */ int roi_compno; /** region of interest: upshift value */ int roi_shift; /* number of precinct size specifications */ int res_spec; /** initial precinct width */ int prcw_init[J2K_MAXRLVLS]; /** initial precinct height */ int prch_init[J2K_MAXRLVLS]; /**@name command line encoder parameters (not used inside the library) */ /*@{*/ /** input file name */ char infile[OPJ_PATH_LEN]; /** output file name */ char outfile[OPJ_PATH_LEN]; /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ int index_on; /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ char index[OPJ_PATH_LEN]; /** subimage encoding: origin image offset in x direction */ int image_offset_x0; /** subimage encoding: origin image offset in y direction */ int image_offset_y0; /** subsampling value for dx */ int subsampling_dx; /** subsampling value for dy */ int subsampling_dy; /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/ int decod_format; /** output file format 0: J2K, 1: JP2, 2: JPT */ int cod_format; /*@}*/ /* UniPG>> */ /**@name JPWL encoding parameters */ /*@{*/ /** enables writing of EPC in MH, thus activating JPWL */ bool jpwl_epc_on; /** error protection method for MH (0,1,16,32,37-128) */ int jpwl_hprot_MH; /** tile number of header protection specification (>=0) */ int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; /** error protection methods for TPHs (0,1,16,32,37-128) */ int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS]; /** tile number of packet protection specification (>=0) */ int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS]; /** packet number of packet protection specification (>=0) */ int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS]; /** error protection methods for packets (0,1,16,32,37-128) */ int jpwl_pprot[JPWL_MAX_NO_PACKSPECS]; /** enables writing of ESD, (0=no/1/2 bytes) */ int jpwl_sens_size; /** sensitivity addressing size (0=auto/2/4 bytes) */ int jpwl_sens_addr; /** sensitivity range (0-3) */ int jpwl_sens_range; /** sensitivity method for MH (-1=no,0-7) */ int jpwl_sens_MH; /** tile number of sensitivity specification (>=0) */ int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; /** sensitivity methods for TPHs (-1=no,0-7) */ int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS]; /*@}*/ /* <> */ /**@name JPWL decoding parameters */ /*@{*/ /** activates the JPWL correction capabilities */ bool jpwl_correct; /** expected number of components */ int jpwl_exp_comps; /** maximum number of tiles */ int jpwl_max_tiles; /*@}*/ /* <> */ /** Marker structure */ typedef struct opj_marker_info_t { /** marker type */ unsigned short int type; /** position in codestream */ int pos; /** length, marker val included */ int len; } opj_marker_info_t; /* <> */ /** number of markers */ int marknum; /** list of markers */ opj_marker_info_t *marker; /** actual size of markers array */ int maxmarknum; /* <cp. @param dinfo decompressor handle @param parameters decompression parameters */ OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters); /** Decode an image from a JPEG-2000 codestream @param dinfo decompressor handle @param cio Input buffer stream @return Returns a decoded image if successful, returns NULL otherwise */ OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio); /** Decode an image from a JPEG-2000 codestream and extract the codestream information @param dinfo decompressor handle @param cio Input buffer stream @param cstr_info Codestream information structure if needed afterwards, NULL otherwise @return Returns a decoded image if successful, returns NULL otherwise */ OPJ_API opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info); /** Creates a J2K/JP2 compression structure @param format Coder to select @return Returns a handle to a compressor if successful, returns NULL otherwise */ OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format); /** Destroy a compressor handle @param cinfo compressor handle to destroy */ OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo); /** Set encoding parameters to default values, that means :
    • Lossless
    • 1 tile
    • Size of precinct : 2^15 x 2^15 (means 1 precinct)
    • Size of code-block : 64 x 64
    • Number of resolutions: 6
    • No SOP marker in the codestream
    • No EPH marker in the codestream
    • No sub-sampling in x or y direction
    • No mode switch activated
    • Progression order: LRCP
    • No index file
    • No ROI upshifted
    • No offset of the origin of the image
    • No offset of the origin of the tiles
    • Reversible DWT 5-3
    @param parameters Compression parameters */ OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters); /** Setup the encoder parameters using the current image and using user parameters. @param cinfo Compressor handle @param parameters Compression parameters @param image Input filled image */ OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image); /** Encode an image into a JPEG-2000 codestream @param cinfo compressor handle @param cio Output buffer stream @param image Image to encode @param index Depreacted -> Set to NULL. To extract index, used opj_encode_wci() @return Returns true if successful, returns false otherwise */ OPJ_API bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index); /** Encode an image into a JPEG-2000 codestream and extract the codestream information @param cinfo compressor handle @param cio Output buffer stream @param image Image to encode @param cstr_info Codestream information structure if needed afterwards, NULL otherwise @return Returns true if successful, returns false otherwise */ OPJ_API bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); /** Destroy Codestream information after compression or decompression @param cstr_info Codestream information structure */ OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info); #ifdef __cplusplus } #endif #endif /* OPENJPEG_H */