/* * The copyright in this software is being made available under the 2-clauses * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan * Copyright (c) 2008, Jerome Fimes, Communications & Systemes * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France * Copyright (c) 2012, CS Systemes d'Information, France * 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 /* ========================================================== Compiler directives ========================================================== */ /* The inline keyword is supported by C99 but not by C90. Most compilers implement their own version of this keyword ... */ #ifndef INLINE #if defined(_MSC_VER) #define INLINE __forceinline #elif defined(__GNUC__) #define INLINE __inline__ #elif defined(__MWERKS__) #define INLINE inline #else /* add other compilers here ... */ #define INLINE #endif /* defined() */ #endif /* INLINE */ /* deprecated attribute */ #ifdef __GNUC__ #define OPJ_DEPRECATED(func) func __attribute__ ((deprecated)) #elif defined(_MSC_VER) #define OPJ_DEPRECATED(func) __declspec(deprecated) func #else #pragma message("WARNING: You need to implement DEPRECATED for this compiler") #define OPJ_DEPRECATED(func) func #endif // PDFium doesn't need to export any of these methods. #define OPJ_API #define OPJ_LOCAL #define OPJ_CALLCONV typedef int OPJ_BOOL; #define OPJ_TRUE 1 #define OPJ_FALSE 0 typedef char OPJ_CHAR; typedef float OPJ_FLOAT32; typedef double OPJ_FLOAT64; typedef unsigned char OPJ_BYTE; #include "opj_stdint.h" typedef int8_t OPJ_INT8; typedef uint8_t OPJ_UINT8; typedef int16_t OPJ_INT16; typedef uint16_t OPJ_UINT16; typedef int32_t OPJ_INT32; typedef uint32_t OPJ_UINT32; typedef int64_t OPJ_INT64; typedef uint64_t OPJ_UINT64; typedef int64_t OPJ_OFF_T; /* 64-bit file offset type */ #include typedef size_t OPJ_SIZE_T; /* Avoid compile-time warning because parameter is not used */ #define OPJ_ARG_NOT_USED(x) (void)(x) /* ========================================================== Useful constant definitions ========================================================== */ #define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */ #define OPJ_J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */ #define OPJ_J2K_MAXBANDS (3*OPJ_J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */ #define OPJ_J2K_DEFAULT_NB_SEGS 10 #define OPJ_J2K_STREAM_CHUNK_SIZE 0x100000 /** 1 mega by default */ #define OPJ_J2K_DEFAULT_HEADER_SIZE 1000 #define OPJ_J2K_MCC_DEFAULT_NB_RECORDS 10 #define OPJ_J2K_MCT_DEFAULT_NB_RECORDS 10 /* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */ #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 */ /* <= OPJ_PROFILE_CINEMA_2K)&&((v) <= OPJ_PROFILE_CINEMA_S4K)) #define OPJ_IS_STORAGE(v) ((v) == OPJ_PROFILE_CINEMA_LTS) #define OPJ_IS_BROADCAST(v) (((v) >= OPJ_PROFILE_BC_SINGLE)&&((v) <= ((OPJ_PROFILE_BC_MULTI_R) | (0x000b)))) #define OPJ_IS_IMF(v) (((v) >= OPJ_PROFILE_IMF_2K)&&((v) <= ((OPJ_PROFILE_IMF_8K_R) | (0x009b)))) #define OPJ_IS_PART2(v) ((v) & OPJ_PROFILE_PART2) /** * JPEG 2000 codestream and component size limits in cinema profiles * */ #define OPJ_CINEMA_24_CS 1302083 /** Maximum codestream length for 24fps */ #define OPJ_CINEMA_48_CS 651041 /** Maximum codestream length for 48fps */ #define OPJ_CINEMA_24_COMP 1041666 /** Maximum size per color component for 2K & 4K @ 24fps */ #define OPJ_CINEMA_48_COMP 520833 /** Maximum size per color component for 2K @ 48fps */ /* ========================================================== enum definitions ========================================================== */ /** * DEPRECATED: use RSIZ, OPJ_PROFILE_* and OPJ_EXTENSION_* instead * Rsiz Capabilities * */ typedef enum RSIZ_CAPABILITIES { OPJ_STD_RSIZ = 0, /** Standard JPEG2000 profile*/ OPJ_CINEMA2K = 3, /** Profile name for a 2K image*/ OPJ_CINEMA4K = 4, /** Profile name for a 4K image*/ OPJ_MCT = 0x8100 } OPJ_RSIZ_CAPABILITIES; /** * DEPRECATED: use RSIZ, OPJ_PROFILE_* and OPJ_EXTENSION_* instead * Digital cinema operation mode * */ typedef enum CINEMA_MODE { OPJ_OFF = 0, /** Not Digital Cinema*/ OPJ_CINEMA2K_24 = 1, /** 2K Digital Cinema at 24 fps*/ OPJ_CINEMA2K_48 = 2, /** 2K Digital Cinema at 48 fps*/ OPJ_CINEMA4K_24 = 3 /** 4K Digital Cinema at 24 fps*/ }OPJ_CINEMA_MODE; /** * Progression order * */ typedef enum PROG_ORDER { OPJ_PROG_UNKNOWN = -1, /**< place-holder */ OPJ_LRCP = 0, /**< layer-resolution-component-precinct order */ OPJ_RLCP = 1, /**< resolution-layer-component-precinct order */ OPJ_RPCL = 2, /**< resolution-precinct-component-layer order */ OPJ_PCRL = 3, /**< precinct-component-resolution-layer order */ OPJ_CPRL = 4 /**< component-precinct-resolution-layer order */ } OPJ_PROG_ORDER; /** * Supported image color spaces */ typedef enum COLOR_SPACE { OPJ_CLRSPC_UNKNOWN = -1, /**< not supported by the library */ OPJ_CLRSPC_UNSPECIFIED = 0, /**< not specified in the codestream */ OPJ_CLRSPC_SRGB = 1, /**< sRGB */ OPJ_CLRSPC_GRAY = 2, /**< grayscale */ OPJ_CLRSPC_SYCC = 3, /**< YUV */ OPJ_CLRSPC_EYCC = 4, /**< e-YCC */ OPJ_CLRSPC_CMYK = 5 /**< CMYK */ } OPJ_COLOR_SPACE; /** * Supported codec */ typedef enum CODEC_FORMAT { OPJ_CODEC_UNKNOWN = -1, /**< place-holder */ OPJ_CODEC_J2K = 0, /**< JPEG-2000 codestream : read/write */ OPJ_CODEC_JPT = 1, /**< JPT-stream (JPEG 2000, JPIP) : read only */ OPJ_CODEC_JP2 = 2, /**< JP2 file format : read/write */ OPJ_CODEC_JPP = 3, /**< JPP-stream (JPEG 2000, JPIP) : to be coded */ OPJ_CODEC_JPX = 4 /**< JPX file format (JPEG 2000 Part-2) : to be coded */ } OPJ_CODEC_FORMAT; /* ========================================================== event manager typedef definitions ========================================================== */ /** * Callback function prototype for events * @param msg Event message * @param client_data Client object where will be return the event message * */ typedef void (*opj_msg_callback) (const char *msg, void *client_data); /* ========================================================== codec typedef definitions ========================================================== */ /** * Progression order changes * */ typedef struct opj_poc { /** Resolution num start, Component num start, given by POC */ OPJ_UINT32 resno0, compno0; /** Layer num end,Resolution num end, Component num end, given by POC */ OPJ_UINT32 layno1, resno1, compno1; /** Layer num start,Precinct num start, Precinct num end */ OPJ_UINT32 layno0, precno0, precno1; /** Progression order enum*/ OPJ_PROG_ORDER prg1,prg; /** Progression order string*/ OPJ_CHAR progorder[5]; /** Tile number */ OPJ_UINT32 tile; /** Start and end values for Tile width and height*/ OPJ_INT32 tx0,tx1,ty0,ty1; /** Start value, initialised in pi_initialise_encode*/ OPJ_UINT32 layS, resS, compS, prcS; /** End value, initialised in pi_initialise_encode */ OPJ_UINT32 layE, resE, compE, prcE; /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/ OPJ_UINT32 txS,txE,tyS,tyE,dx,dy; /** Temporary values for Tile parts, initialised in pi_create_encode */ OPJ_UINT32 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) */ OPJ_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 OPJ_LRCP) */ OPJ_PROG_ORDER prog_order; /** progression order changes */ opj_poc_t POC[32]; /** number of progression order changes (POC), default to 0 */ OPJ_UINT32 numpocs; /** number of layers */ int tcp_numlayers; /** rates of layers - might be subsequently limited by the max_cs_size field */ 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[OPJ_J2K_MAXRLVLS]; /** initial precinct height */ int prch_init[OPJ_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>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */ /**@name JPWL encoding parameters */ /*@{*/ /** enables writing of EPC in MH, thus activating JPWL */ OPJ_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]; /*@}*/ /* <> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */ /**@name JPWL decoding parameters */ /*@{*/ /** activates the JPWL correction capabilities */ OPJ_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 { /** marker type */ unsigned short int type; /** position in codestream */ OPJ_OFF_T 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; /* <> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */ /** number of markers */ OPJ_UINT32 marknum; /** list of markers */ opj_marker_info_t *marker; /** actual size of markers array */ OPJ_UINT32 maxmarknum; /* <> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */ /** number of markers */ OPJ_UINT32 marknum; /** list of markers */ opj_marker_info_t *marker; /** actual size of markers array */ OPJ_UINT32 maxmarknum; /* < */ /* ========================================================== Metadata from the JP2file ========================================================== */ /** * Info structure of the JP2 file * EXPERIMENTAL FOR THE MOMENT */ typedef struct opj_jp2_metadata { /** */ OPJ_INT32 not_used; } opj_jp2_metadata_t; /** * Index structure of the JP2 file * EXPERIMENTAL FOR THE MOMENT */ typedef struct opj_jp2_index { /** */ OPJ_INT32 not_used; } opj_jp2_index_t; #ifdef __cplusplus extern "C" { #endif /* ========================================================== openjpeg version ========================================================== */ /* Get the version of the openjpeg library*/ OPJ_API const char * OPJ_CALLCONV opj_version(void); /* ========================================================== image functions definitions ========================================================== */ /** * Create an image * * @param numcmpts number of components * @param cmptparms components parameters * @param clrspc image color space * @return returns a new image structure if successful, returns NULL otherwise * */ OPJ_API opj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc); /** * Deallocate any resources associated with an image * * @param image image to be destroyed */ OPJ_API void OPJ_CALLCONV opj_image_destroy(opj_image_t *image); /** * Creates an image without allocating memory for the image (used in the new version of the library). * * @param numcmpts the number of components * @param cmptparms the components parameters * @param clrspc the image color space * * @return a new image structure if successful, NULL otherwise. */ OPJ_API opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc); /* ========================================================== stream functions definitions ========================================================== */ /** * Creates an abstract stream. This function does nothing except allocating memory and initializing the abstract stream. * * @param p_is_input if set to true then the stream will be an input stream, an output stream else. * * @return a stream object. */ OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_default_create(OPJ_BOOL p_is_input); /** * Creates an abstract stream. This function does nothing except allocating memory and initializing the abstract stream. * * @param p_buffer_size FIXME DOC * @param p_is_input if set to true then the stream will be an input stream, an output stream else. * * @return a stream object. */ OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size, OPJ_BOOL p_is_input); /** * Destroys a stream created by opj_create_stream. This function does NOT close the abstract stream. If needed the user must * close its own implementation of the stream. * * @param p_stream the stream to destroy. */ OPJ_API void OPJ_CALLCONV opj_stream_destroy(opj_stream_t* p_stream); /** * Sets the given function to be used as a read function. * @param p_stream the stream to modify * @param p_function the function to use a read function. */ OPJ_API void OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream, opj_stream_read_fn p_function); /** * Sets the given function to be used as a write function. * @param p_stream the stream to modify * @param p_function the function to use a write function. */ OPJ_API void OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream, opj_stream_write_fn p_function); /** * Sets the given function to be used as a skip function. * @param p_stream the stream to modify * @param p_function the function to use a skip function. */ OPJ_API void OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream, opj_stream_skip_fn p_function); /** * Sets the given function to be used as a seek function, the stream is then seekable. * @param p_stream the stream to modify * @param p_function the function to use a skip function. */ OPJ_API void OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream, opj_stream_seek_fn p_function); /** * Sets the given data to be used as a user data for the stream. * @param p_stream the stream to modify * @param p_data the data to set. * @param p_function the function to free p_data when opj_stream_destroy() is called. */ OPJ_API void OPJ_CALLCONV opj_stream_set_user_data (opj_stream_t* p_stream, void * p_data, opj_stream_free_user_data_fn p_function); /** * Sets the length of the user data for the stream. * * @param p_stream the stream to modify * @param data_length length of the user_data. */ OPJ_API void OPJ_CALLCONV opj_stream_set_user_data_length(opj_stream_t* p_stream, OPJ_UINT64 data_length); /** * Create a stream from a file identified with its filename with default parameters (helper function) * @param fname the filename of the file to stream * @param p_is_read_stream whether the stream is a read stream (true) or not (false) */ OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream (const char *fname, OPJ_BOOL p_is_read_stream); /** Create a stream from a file identified with its filename with a specific buffer size * @param fname the filename of the file to stream * @param p_buffer_size size of the chunk used to stream * @param p_is_read_stream whether the stream is a read stream (true) or not (false) */ OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream (const char *fname, OPJ_SIZE_T p_buffer_size, OPJ_BOOL p_is_read_stream); /* ========================================================== event manager functions definitions ========================================================== */ /** * Set the info handler use by openjpeg. * @param p_codec the codec previously initialise * @param p_callback the callback function which will be used * @param p_user_data client object where will be returned the message */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_info_handler(opj_codec_t * p_codec, opj_msg_callback p_callback, void * p_user_data); /** * Set the warning handler use by openjpeg. * @param p_codec the codec previously initialise * @param p_callback the callback function which will be used * @param p_user_data client object where will be returned the message */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_warning_handler(opj_codec_t * p_codec, opj_msg_callback p_callback, void * p_user_data); /** * Set the error handler use by openjpeg. * @param p_codec the codec previously initialise * @param p_callback the callback function which will be used * @param p_user_data client object where will be returned the message */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec, opj_msg_callback p_callback, void * p_user_data); /* ========================================================== codec functions definitions ========================================================== */ /** * Creates a J2K/JP2 decompression structure * @param format Decoder to select * * @return Returns a handle to a decompressor if successful, returns NULL otherwise * */ OPJ_API opj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format); /** * Destroy a decompressor handle * * @param p_codec decompressor handle to destroy */ OPJ_API void OPJ_CALLCONV opj_destroy_codec(opj_codec_t * p_codec); /** * Read after the codestream if necessary * @param p_codec the JPEG2000 codec to read. * @param p_stream the JPEG2000 stream. */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_decompress ( opj_codec_t *p_codec, opj_stream_t *p_stream); /** * Set decoding parameters to default values * @param parameters Decompression parameters */ OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters); /** * Setup the decoder with decompression parameters provided by the user and with the message handler * provided by the user. * * @param p_codec decompressor handler * @param parameters decompression parameters * * @return true if the decoder is correctly set */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec, opj_dparameters_t *parameters ); /** * Decodes an image header. * * @param p_stream the jpeg2000 stream. * @param p_codec the jpeg2000 codec to read. * @param p_image the image structure initialized with the characteristics of encoded image. * * @return true if the main header of the codestream and the JP2 header is correctly read. */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_read_header ( opj_stream_t *p_stream, opj_codec_t *p_codec, opj_image_t **p_image); /** * 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_image the decoded image previously setted by opj_read_header * @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 OPJ_BOOL OPJ_CALLCONV opj_set_decode_area( opj_codec_t *p_codec, opj_image_t* p_image, 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 * * @param p_decompressor decompressor handle * @param p_stream Input buffer stream * @param p_image the decoded image * @return true if success, otherwise false * */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_decode( opj_codec_t *p_decompressor, opj_stream_t *p_stream, opj_image_t *p_image); /** * Get the decoded tile from the codec * * @param p_codec the jpeg2000 codec. * @param p_stream input streamm * @param p_image output image * @param tile_index index of the tile which will be decode * * @return true if success, otherwise false */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile( opj_codec_t *p_codec, opj_stream_t *p_stream, opj_image_t *p_image, OPJ_UINT32 tile_index); /** * Set the resolution factor of the decoded image * @param p_codec the jpeg2000 codec. * @param res_factor resolution factor to set * * @return true if success, otherwise false */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(opj_codec_t *p_codec, OPJ_UINT32 res_factor); /** * Writes a tile with the given data. * * @param p_codec 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 OPJ_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 OPJ_BOOL OPJ_CALLCONV opj_read_tile_header( opj_codec_t *p_codec, opj_stream_t * p_stream, 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, OPJ_BOOL * p_should_go_on ); /** * 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 OPJ_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 ); /* COMPRESSION FUNCTIONS*/ /** * 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); /** 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 p_codec Compressor handle * @param parameters Compression parameters * @param image Input filled image */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec, opj_cparameters_t *parameters, opj_image_t *image); /** * Start to compress the current image. * @param p_codec Compressor handle * @param image Input filled image * @param p_stream Input stgream */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_start_compress ( opj_codec_t *p_codec, opj_image_t * p_image, opj_stream_t *p_stream); /** * End to compress the current image. * @param p_codec Compressor handle * @param p_stream Input stgream */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_compress (opj_codec_t *p_codec, opj_stream_t *p_stream); /** * Encode an image into a JPEG-2000 codestream * @param p_codec compressor handle * @param p_stream Output buffer stream * * @return Returns true if successful, returns false otherwise */ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_encode(opj_codec_t *p_codec, opj_stream_t *p_stream); /* ========================================================== codec output functions definitions ========================================================== */ /* EXPERIMENTAL FUNCTIONS FOR NOW, USED ONLY IN J2K_DUMP*/ /** 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_v2_t **cstr_info); /** * Dump the codec information into the output stream * * @param p_codec the jpeg2000 codec. * @param info_flag type of information dump. * @param output_stream output stream where dump the informations get from the codec. * */ OPJ_API void OPJ_CALLCONV opj_dump_codec( opj_codec_t *p_codec, OPJ_INT32 info_flag, FILE* output_stream); /** * Get the codestream information from the codec * * @param p_codec the jpeg2000 codec. * * @return a pointer to a codestream information structure. * */ OPJ_API opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_t *p_codec); /** * Get the codestream index from the codec * * @param p_codec the jpeg2000 codec. * * @return a pointer to a codestream index structure. * */ OPJ_API opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec); OPJ_API void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index); /** * Get the JP2 file information from the codec FIXME * * @param p_codec the jpeg2000 codec. * * @return a pointer to a JP2 metadata structure. * */ OPJ_API opj_jp2_metadata_t* OPJ_CALLCONV opj_get_jp2_metadata(opj_codec_t *p_codec); /** * Get the JP2 file index from the codec FIXME * * @param p_codec the jpeg2000 codec. * * @return a pointer to a JP2 index structure. * */ OPJ_API opj_jp2_index_t* OPJ_CALLCONV opj_get_jp2_index(opj_codec_t *p_codec); /* ========================================================== MCT functions ========================================================== */ /** * 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 OPJ_BOOL OPJ_CALLCONV opj_set_MCT( opj_cparameters_t *parameters, OPJ_FLOAT32 * pEncodingMatrix, OPJ_INT32 * p_dc_shift, OPJ_UINT32 pNbComp); #ifdef __cplusplus } #endif #endif /* OPENJPEG_H */