Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2001-2003, David Janssens
  3.  * Copyright (c) 2002-2003, Yannick Verschueren
  4.  * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
  5.  * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team
  6.  * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
  7.  * All rights reserved.
  8.  *
  9.  * Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions
  11.  * are met:
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in the
  16.  *    documentation and/or other materials provided with the distribution.
  17.  *
  18.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
  19.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  20.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  21.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  22.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  23.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  24.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  25.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  26.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  27.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  28.  * POSSIBILITY OF SUCH DAMAGE.
  29.  */
  30.  
  31. #include "opj_includes.h"
  32.  
  33. /* ----------------------------------------------------------------------- */
  34.  
  35. opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) {
  36.         opj_cp_t *cp = NULL;
  37.         opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t));
  38.         if(!cio) return NULL;
  39.         cio->cinfo = cinfo;
  40.         if(buffer && length) {
  41.                 /* wrap a user buffer containing the encoded image */
  42.                 cio->openmode = OPJ_STREAM_READ;
  43.                 cio->buffer = buffer;
  44.                 cio->length = length;
  45.         }
  46.         else if(!buffer && !length && cinfo) {
  47.                 /* allocate a buffer for the encoded image */
  48.                 cio->openmode = OPJ_STREAM_WRITE;
  49.                 switch(cinfo->codec_format) {
  50.                         case CODEC_J3D:
  51.                         case CODEC_J2K:
  52.                                 cp = ((opj_j3d_t*)cinfo->j3d_handle)->cp;
  53.                                 break;
  54.                         default:
  55.                                 opj_free(cio);
  56.                                 return NULL;
  57.                 }
  58.                 cio->length = cp->tdx * cp->tdy * cp->tdz * cp->tw * cp->th * cp->tl * 4;
  59.                 cio->buffer = (unsigned char *)opj_malloc(cio->length);
  60.                 if(!cio->buffer) {
  61.                         opj_free(cio);
  62.                         return NULL;
  63.                 }
  64.         }
  65.         else {
  66.                 opj_free(cio);
  67.                 return NULL;
  68.         }
  69.  
  70.         /* Initialize byte IO */
  71.         cio->start = cio->buffer;
  72.         cio->end = cio->buffer + cio->length;
  73.         cio->bp = cio->buffer;
  74.  
  75.         return cio;
  76. }
  77.  
  78. void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio) {
  79.         if(cio) {
  80.                 if(cio->openmode == OPJ_STREAM_WRITE) {
  81.                         /* destroy the allocated buffer */
  82.                         opj_free(cio->buffer);
  83.                 }
  84.                 /* destroy the cio */
  85.                 opj_free(cio);
  86.         }
  87. }
  88.  
  89.  
  90. /* ----------------------------------------------------------------------- */
  91.  
  92. /*
  93.  * Get position in byte stream.
  94.  */
  95. int OPJ_CALLCONV cio_tell(opj_cio_t *cio) {
  96.         return cio->bp - cio->start;
  97. }
  98.  
  99. /*
  100.  * Set position in byte stream.
  101.  *
  102.  * pos : position, in number of bytes, from the beginning of the stream
  103.  */
  104. void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) {
  105.         cio->bp = cio->start + pos;
  106. }
  107.  
  108. /*
  109.  * Number of bytes left before the end of the stream.
  110.  */
  111. int cio_numbytesleft(opj_cio_t *cio) {
  112.         return cio->end - cio->bp;
  113. }
  114.  
  115. /*
  116.  * Get pointer to the current position in the stream.
  117.  */
  118. unsigned char *cio_getbp(opj_cio_t *cio) {
  119.         return cio->bp;
  120. }
  121.  
  122. /*
  123.  * Write a byte.
  124.  */
  125. bool cio_byteout(opj_cio_t *cio, unsigned char v) {
  126.         if (cio->bp >= cio->end) {
  127.                 opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n");
  128.                 return false;
  129.         }
  130.         *cio->bp++ = v;
  131.         return true;
  132. }
  133.  
  134. /*
  135.  * Read a byte.
  136.  */
  137. unsigned char cio_bytein(opj_cio_t *cio) {
  138.         if (cio->bp >= cio->end) {
  139.                 opj_event_msg(cio->cinfo, EVT_ERROR, "read error\n");
  140.                 return 0;
  141.         }
  142.         return *cio->bp++;
  143. }
  144.  
  145. /*
  146.  * Write some bytes.
  147.  *
  148.  * v : value to write
  149.  * n : number of bytes to write
  150.  */
  151. unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n) {
  152.         int i;
  153.         for (i = n - 1; i >= 0; i--) {
  154.                 if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) )
  155.                         return 0;
  156.         }
  157.         return n;
  158. }
  159.  
  160. /*
  161.  * Read some bytes.
  162.  *
  163.  * n : number of bytes to read
  164.  *
  165.  * return : value of the n bytes read
  166.  */
  167. unsigned int cio_read(opj_cio_t *cio, int n) {
  168.         int i;
  169.         unsigned int v;
  170.         v = 0;
  171.         for (i = n - 1; i >= 0; i--) {
  172.                 v += cio_bytein(cio) << (i << 3);
  173.         }
  174.         return v;
  175. }
  176.  
  177. /*
  178.  * Skip some bytes.
  179.  *
  180.  * n : number of bytes to skip
  181.  */
  182. void cio_skip(opj_cio_t *cio, int n) {
  183.         cio->bp += n;
  184. }
  185.  
  186. /*
  187.  * Write some bytes.
  188.  *
  189.  * v : value to write
  190.  * n : number of bytes to write
  191.  */
  192. int cio_write_int(opj_cio_t *cio, int v, int n) {
  193.         int i;
  194.         for (i = n - 1; i >= 0; i--) {
  195.                 if( !cio_byteout(cio, (char) ((v >> (i << 3)) & 0xff)) )
  196.                         return 0;
  197.         }
  198.         return n;
  199. }
  200.  
  201. /*
  202.  * Read some bytes.
  203.  *
  204.  * n : number of bytes to read
  205.  *
  206.  * return : value of the n bytes read
  207.  */
  208. int cio_read_int(opj_cio_t *cio, int n) {
  209.         int i;
  210.         int v;
  211.         v = 0;
  212.         for (i = n - 1; i >= 0; i--) {
  213.                 v += cio_bytein(cio) << (i << 3);
  214.         }
  215.         return v;
  216. }
  217.  
  218.