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