X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2Fgdcmopenjpeg%2Flibopenjpeg%2Fcio.c;h=146c5d3d460bdcd2ccb5393ff5efb6ae20227195;hb=24394a63b18810c791af1c913e1a6fc712d3d3a0;hp=6e49221ee59325c5182fbceb21fee125962a2747;hpb=46640df1364cc8916e252b7a45087fed816c9f57;p=gdcm.git diff --git a/src/gdcmopenjpeg/libopenjpeg/cio.c b/src/gdcmopenjpeg/libopenjpeg/cio.c index 6e49221e..146c5d3d 100644 --- a/src/gdcmopenjpeg/libopenjpeg/cio.c +++ b/src/gdcmopenjpeg/libopenjpeg/cio.c @@ -1,5 +1,9 @@ /* - * Copyright (c) 2001-2002, David Janssens + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,30 +28,74 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "cio.h" -#include -#include +#include "opj_includes.h" -static unsigned char *cio_start; /* pointer to the start of the stream */ -static unsigned char *cio_end; /* pointer to the end of the stream */ -static unsigned char *cio_bp; /* pointer to the present position */ +/* ----------------------------------------------------------------------- */ -extern jmp_buf j2k_error; +opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) { + opj_cp_t *cp = NULL; + opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t)); + if(!cio) return NULL; + cio->cinfo = cinfo; + if(buffer && length) { + /* wrap a user buffer containing the encoded image */ + cio->openmode = OPJ_STREAM_READ; + cio->buffer = buffer; + cio->length = length; + } + else if(!buffer && !length && cinfo) { + /* allocate a buffer for the encoded image */ + cio->openmode = OPJ_STREAM_WRITE; + switch(cinfo->codec_format) { + case CODEC_J2K: + cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp; + break; + case CODEC_JP2: + cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp; + break; + default: + opj_free(cio); + return NULL; + } + cio->length = cp->tdx * cp->tdy * cp->tw * cp->th * 4; + cio->buffer = (unsigned char *)opj_malloc(cio->length); + if(!cio->buffer) { + opj_free(cio); + return NULL; + } + } + else { + opj_free(cio); + return NULL; + } -/* - * Number of bytes written. - */ -int cio_numbytes() -{ - return cio_bp - cio_start; + /* Initialize byte IO */ + cio->start = cio->buffer; + cio->end = cio->buffer + cio->length; + cio->bp = cio->buffer; + + return cio; +} + +void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio) { + if(cio) { + if(cio->openmode == OPJ_STREAM_WRITE) { + /* destroy the allocated buffer */ + opj_free(cio->buffer); + } + /* destroy the cio */ + opj_free(cio); + } } + +/* ----------------------------------------------------------------------- */ + /* * Get position in byte stream. */ -int cio_tell() -{ - return cio_bp - cio_start; +int OPJ_CALLCONV cio_tell(opj_cio_t *cio) { + return cio->bp - cio->start; } /* @@ -55,59 +103,45 @@ int cio_tell() * * pos : position, in number of bytes, from the beginning of the stream */ -void cio_seek(int pos) -{ - cio_bp = cio_start + pos; +void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) { + cio->bp = cio->start + pos; } /* * Number of bytes left before the end of the stream. */ -int cio_numbytesleft() -{ - return cio_end - cio_bp; +int cio_numbytesleft(opj_cio_t *cio) { + return cio->end - cio->bp; } /* * Get pointer to the current position in the stream. */ -unsigned char *cio_getbp() -{ - return cio_bp; -} - -/* - * Initialize byte IO - * - * bp : destination/source stream - * len : length of the stream - */ -void cio_init(unsigned char *bp, int len) -{ - cio_start = bp; - cio_end = bp + len; - cio_bp = bp; +unsigned char *cio_getbp(opj_cio_t *cio) { + return cio->bp; } /* * Write a byte. */ -void cio_byteout(unsigned char v) -{ - if (cio_bp >= cio_end) - longjmp(j2k_error, 1); - *cio_bp++ = v; - +bool cio_byteout(opj_cio_t *cio, unsigned char v) { + if (cio->bp >= cio->end) { + opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n"); + return false; + } + *cio->bp++ = v; + return true; } /* * Read a byte. */ -unsigned char cio_bytein() -{ - if (cio_bp >= cio_end) - longjmp(j2k_error, 1); - return *cio_bp++; +unsigned char cio_bytein(opj_cio_t *cio) { + if (cio->bp >= cio->end) { + opj_event_msg(cio->cinfo, EVT_ERROR, "read error\n"); + return 0; + } + return *cio->bp++; } /* @@ -116,12 +150,13 @@ unsigned char cio_bytein() * v : value to write * n : number of bytes to write */ -void cio_write(unsigned int v, int n) -{ +unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n) { int i; for (i = n - 1; i >= 0; i--) { - cio_byteout((unsigned char) ((v >> (i << 3)) & 0xff)); + if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) ) + return 0; } + return n; } /* @@ -131,13 +166,12 @@ void cio_write(unsigned int v, int n) * * return : value of the n bytes read */ -unsigned int cio_read(int n) -{ +unsigned int cio_read(opj_cio_t *cio, int n) { int i; unsigned int v; v = 0; for (i = n - 1; i >= 0; i--) { - v += cio_bytein() << (i << 3); + v += cio_bytein(cio) << (i << 3); } return v; } @@ -147,34 +181,9 @@ unsigned int cio_read(int n) * * n : number of bytes to skip */ -void cio_skip(int n) -{ - cio_bp += n; +void cio_skip(opj_cio_t *cio, int n) { + cio->bp += n; } -/* - * Read n bytes, copy to buffer - * - * n : number of bytes to transfer - */ -void cio_read_to_buf(unsigned char* src_buf, int n)/* Glenn adds */ -{ - if (cio_bp + n > cio_end) - longjmp(j2k_error, 1); - memcpy(cio_bp, src_buf, n); - cio_bp += n; -} -/* - * Write n bytes, copy from buffer - * - * n : number of bytes to transfer - */ -void cio_write_from_buf(unsigned char* dest_buf, int n)/* Glenn adds */ -{ - if (cio_bp + n > cio_end) - longjmp(j2k_error, 1); - memcpy(dest_buf, cio_bp, n); - cio_bp += n; -}