/* * 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 * Copyright (c) 2008, Jerome Fimes, Communications & Systemes * 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 #if defined(OPJ_STATIC) || !defined(_WIN32) #define OPJ_API #define OPJ_CALLCONV #else #define OPJ_CALLCONV __stdcall #if defined(OPJ_EXPORTS) || defined(DLL_EXPORT) #define OPJ_API __declspec(dllexport) #else #define OPJ_API __declspec(dllimport) #endif /* OPJ_EXPORTS || DLL_EXPORT */ #endif /* !OPJ_STATIC || !_WIN32 */ #ifndef __cplusplus #if defined(HAVE_STDBOOL_H) #include #else #if !defined(bool) #define bool int #endif #if !defined(true) #define true 1 #endif #if !defined(false) #define false 0 #endif #endif #endif /* __cplusplus */ typedef unsigned int OPJ_UINT32; typedef int OPJ_INT32; typedef unsigned short OPJ_UINT16; typedef short OPJ_INT16; typedef char OPJ_CHAR; typedef unsigned char OPJ_BYTE; typedef unsigned int OPJ_SIZE_T; typedef double OPJ_FLOAT64; typedef float OPJ_FLOAT32; #if defined(_MSC_VER) || defined(__BORLANDC__) typedef __int64 OPJ_INT64; #else typedef long long OPJ_INT64; #endif #define OPENJPEG_VERSION "1.2.0" /* ========================================================== Compiler directives ========================================================== */ #include /* ========================================================== 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 */ #define J2K_DEFAULT_NB_SEGS 10 #define J2K_STREAM_CHUNK_SIZE 0x100000 /** 1 mega by default */ #define J2K_DEFAULT_HEADER_SIZE 1000 #define J2K_MCC_DEFAULT_NB_RECORDS 10 #define J2K_MCT_DEFAULT_NB_RECORDS 10 /* 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 */ /* <> */ /**@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; /** use restrictive decoding ? */ OPJ_UINT32 m_use_restrict_decode : 1; /*@}*/ /* <> */ /** 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 bool OPJ_CALLCONV opj_setup_decoder(opj_codec_t *dinfo, opj_dparameters_t *parameters); #endif /** 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_codec_t *p_decompressor, opj_stream_t * cio); /** * Writes a tile with the given data. * * @param p_compressor the jpeg2000 codec. * @param p_tile_index the index of the tile to write. At the moment, the tiles must be written from 0 to n-1 in sequence. * @param p_data pointer to the data to write. Data is arranged in sequence, data_comp0, then data_comp1, then ... NO INTERLEAVING should be set. * @param p_data_size this value os used to make sure the data being written is correct. The size must be equal to the sum for each component of tile_width * tile_height * component_size. component_size can be 1,2 or 4 bytes, * depending on the precision of the given component. * @param p_stream the stream to write data to. * * @return true if the data could be written. */ OPJ_API bool OPJ_CALLCONV opj_write_tile ( opj_codec_t *p_codec, OPJ_UINT32 p_tile_index, OPJ_BYTE * p_data, OPJ_UINT32 p_data_size, opj_stream_t *p_stream ); /** * Reads a tile header. This function is compulsory and allows one to know the size of the tile thta will be decoded. * The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile. * * @param p_codec the jpeg2000 codec. * @param p_tile_index pointer to a value that will hold the index of the tile being decoded, in case of success. * @param p_data_size pointer to a value that will hold the maximum size of the decoded data, in case of success. In case * of truncated codestreams, the actual number of bytes decoded may be lower. The computation of the size is the same * as depicted in opj_write_tile. * @param p_tile_x0 pointer to a value that will hold the x0 pos of the tile (in the image). * @param p_tile_y0 pointer to a value that will hold the y0 pos of the tile (in the image). * @param p_tile_x1 pointer to a value that will hold the x1 pos of the tile (in the image). * @param p_tile_y1 pointer to a value that will hold the y1 pos of the tile (in the image). * @param p_nb_comps pointer to a value that will hold the number of components in the tile. * @param p_should_go_on pointer to a boolean that will hold the fact that the decoding should go on. In case the * codestream is over at the time of the call, the value will be set to false. The user should then stop * the decoding. * @param p_stream the stream to decode. * @return true if the tile header could be decoded. In case the decoding should end, the returned value is still true. * returning false may be the result of a shortage of memory or an internal error. */ OPJ_API bool OPJ_CALLCONV opj_read_tile_header( opj_codec_t *p_codec, OPJ_UINT32 * p_tile_index, OPJ_UINT32 * p_data_size, OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0, OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1, OPJ_UINT32 * p_nb_comps, bool * p_should_go_on, opj_stream_t * p_stream); /** * Reads a tile data. This function is compulsory and allows one to decode tile data. opj_read_tile_header should be called before. * The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile. * * @param p_codec the jpeg2000 codec. * @param p_tile_index the index of the tile being decoded, this should be the value set by opj_read_tile_header. * @param p_data pointer to a memory block that will hold the decoded data. * @param p_data_size size of p_data. p_data_size should be bigger or equal to the value set by opj_read_tile_header. * @param p_stream the stream to decode. * * @return true if the data could be decoded. */ OPJ_API bool OPJ_CALLCONV opj_decode_tile_data( opj_codec_t *p_codec, OPJ_UINT32 p_tile_index, OPJ_BYTE * p_data, OPJ_UINT32 p_data_size, opj_stream_t *p_stream ); /** * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading. * * @param p_codec the jpeg2000 codec. * @param p_start_x the left position of the rectangle to decode (in image coordinates). * @param p_end_x the right position of the rectangle to decode (in image coordinates). * @param p_start_y the up position of the rectangle to decode (in image coordinates). * @param p_end_y the bottom position of the rectangle to decode (in image coordinates). * * @return true if the area could be set. */ OPJ_API bool OPJ_CALLCONV opj_set_decode_area( opj_codec_t *p_codec, OPJ_INT32 p_start_x, OPJ_INT32 p_start_y, OPJ_INT32 p_end_x, OPJ_INT32 p_end_y ); /** 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_stream_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_codec_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format); /** Destroy a decompressor handle @param dinfo decompressor handle to destroy */ OPJ_API void OPJ_CALLCONV opj_destroy_codec(opj_codec_t * p_codec); /** 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); /** * Sets the MCT matrix to use. * * @param parameters the parameters to change. * @param pEncodingMatrix the encoding matrix. * @param p_dc_shift the dc shift coefficients to use. * @param pNbComp the number of components of the image. * * @return true if the parameters could be set. */ OPJ_API bool OPJ_CALLCONV opj_set_MCT(opj_cparameters_t *parameters,OPJ_FLOAT32 * pEncodingMatrix,OPJ_INT32 * p_dc_shift,OPJ_UINT32 pNbComp); /** * Restricts the decoding to the given image area. * * @param parameters the parameters to update. * @param p_start_x the starting x position of the area to decode. * @param p_start_y the starting y position of the area to decode. * @param p_end_x the x end position of the area to decode. * @param p_end_x the y end position of the area to decode. */ OPJ_API bool OPJ_CALLCONV opj_restrict_decoding (opj_dparameters_t *parameters,OPJ_INT32 p_start_x,OPJ_INT32 p_start_y,OPJ_INT32 p_end_x,OPJ_INT32 p_end_y); #ifdef USE_OPJ_DEPRECATED #ifdef _MSC_VER #pragma message ("warning, opj_setup_encoder is deprecated") #else #warning "warning, opj_setup_encoder is deprecated" #endif /** 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 bool OPJ_CALLCONV opj_setup_encoder(opj_codec_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image); #endif /** * Decodes an image header. * * @param p_codec codec to use to decode the image. * @param p_image pointer to a previously created image. * @param p_tile_x0 pointer to a value that will hold the reference point x0 of the tiling grid. * @param p_tile_y0 pointer to a value that will hold the reference point y0 of the tiling grid. * @param p_tile_width pointer to a value that will hold the size in x of a tile in the grid. * @param p_tile_height pointer to a value that will hold the size in y of a tile in the grid. * @param p_nb_tiles_x pointer to a value that will hold the number of tiles in the x direction. * @param p_nb_tiles_y pointer to a value that will hold the number of tiles in the y direction. */ OPJ_API bool OPJ_CALLCONV opj_read_header ( opj_codec_t *p_codec, opj_image_t ** p_image, OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0, OPJ_UINT32 * p_tile_width, OPJ_UINT32 * p_tile_height, OPJ_UINT32 * p_nb_tiles_x, OPJ_UINT32 * p_nb_tiles_y, opj_stream_t *p_cio); OPJ_API bool OPJ_CALLCONV opj_end_decompress (opj_codec_t *p_codec,opj_stream_t *p_cio); /** 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_codec_t *cinfo, opj_stream_t * cio); OPJ_API bool OPJ_CALLCONV opj_start_compress (opj_codec_t *p_codec,opj_image_t * p_image,opj_stream_t *p_cio); OPJ_API bool OPJ_CALLCONV opj_end_compress (opj_codec_t *p_codec,opj_stream_t *p_cio); /** 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_stream_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); //============================================================================== //============================================================================== /** profiling part */ #ifdef _PROFILE void _ProfInit(void); void _ProfPrint(void); #define PROFINIT() _ProfInit(); #define PROFSAVE(file) _ProfSave(file); #define PROFPRINT() _ProfPrint(); #else #define PROFINIT() #define PROFSAVE(file) #define PROFPRINT() #endif // !_PROFILE #ifdef __cplusplus } #endif #endif /* OPENJPEG_H */