Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
  3.  * Copyright (c) 2002-2007, Professor Benoit Macq
  4.  * Copyright (c) 2002-2003, Yannick Verschueren
  5.  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
  18.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  21.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  22.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  23.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  24.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  25.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  26.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  27.  * POSSIBILITY OF SUCH DAMAGE.
  28.  */
  29.  
  30. #include "opj_includes.h"
  31.  
  32. /*
  33.  * Read the information contains in VBAS [JPP/JPT stream message header]
  34.  * Store information (7 bits) in value
  35.  *
  36.  */
  37. unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) {
  38.         unsigned char elmt;
  39.  
  40.         elmt = cio_read(cio, 1);
  41.         while ((elmt >> 7) == 1) {
  42.                 value = (value << 7);
  43.                 value |= (elmt & 0x7f);
  44.                 elmt = cio_read(cio, 1);
  45.         }
  46.         value = (value << 7);
  47.         value |= (elmt & 0x7f);
  48.  
  49.         return value;
  50. }
  51.  
  52. /*
  53.  * Initialize the value of the message header structure
  54.  *
  55.  */
  56. void jpt_init_msg_header(opj_jpt_msg_header_t * header) {
  57.         header->Id = 0;         /* In-class Identifier    */
  58.         header->last_byte = 0;  /* Last byte information  */
  59.         header->Class_Id = 0;           /* Class Identifier       */
  60.         header->CSn_Id = 0;             /* CSn : index identifier */
  61.         header->Msg_offset = 0; /* Message offset         */
  62.         header->Msg_length = 0; /* Message length         */
  63.         header->Layer_nb = 0;           /* Auxiliary for JPP case */
  64. }
  65.  
  66. /*
  67.  * Re-initialize the value of the message header structure
  68.  *
  69.  * Only parameters always present in message header
  70.  *
  71.  */
  72. void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) {
  73.         header->Id = 0;         /* In-class Identifier    */
  74.         header->last_byte = 0;  /* Last byte information  */
  75.         header->Msg_offset = 0; /* Message offset         */
  76.         header->Msg_length = 0; /* Message length         */
  77. }
  78.  
  79. /*
  80.  * Read the message header for a JPP/JPT - stream
  81.  *
  82.  */
  83. void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) {
  84.         unsigned char elmt, Class = 0, CSn = 0;
  85.         jpt_reinit_msg_header(header);
  86.  
  87.         /* ------------- */
  88.         /* VBAS : Bin-ID */
  89.         /* ------------- */
  90.         elmt = cio_read(cio, 1);
  91.  
  92.         /* See for Class and CSn */
  93.         switch ((elmt >> 5) & 0x03) {
  94.                 case 0:
  95.                         opj_event_msg(cinfo, EVT_ERROR, "Forbidden value encounter in message header !!\n");
  96.                         break;
  97.                 case 1:
  98.                         Class = 0;
  99.                         CSn = 0;
  100.                         break;
  101.                 case 2:
  102.                         Class = 1;
  103.                         CSn = 0;
  104.                         break;
  105.                 case 3:
  106.                         Class = 1;
  107.                         CSn = 1;
  108.                         break;
  109.                 default:
  110.                         break;
  111.         }
  112.  
  113.         /* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */
  114.         if (((elmt >> 4) & 0x01) == 1)
  115.                 header->last_byte = 1;
  116.  
  117.         /* In-class identifier */
  118.         header->Id |= (elmt & 0x0f);
  119.         if ((elmt >> 7) == 1)
  120.                 header->Id = jpt_read_VBAS_info(cio, header->Id);
  121.  
  122.         /* ------------ */
  123.         /* VBAS : Class */
  124.         /* ------------ */
  125.         if (Class == 1) {
  126.                 header->Class_Id = 0;
  127.                 header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id);
  128.         }
  129.  
  130.         /* ---------- */
  131.         /* VBAS : CSn */
  132.         /* ---------- */
  133.         if (CSn == 1) {
  134.                 header->CSn_Id = 0;
  135.                 header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id);
  136.         }
  137.  
  138.         /* ----------------- */
  139.         /* VBAS : Msg_offset */
  140.         /* ----------------- */
  141.         header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset);
  142.  
  143.         /* ----------------- */
  144.         /* VBAS : Msg_length */
  145.         /* ----------------- */
  146.         header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length);
  147.  
  148.         /* ---------- */
  149.         /* VBAS : Aux */
  150.         /* ---------- */
  151.         if ((header->Class_Id & 0x01) == 1) {
  152.                 header->Layer_nb = 0;
  153.                 header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb);
  154.         }
  155. }
  156.