08323e139842403bd69cd189b8cdbcab05509b95
[openjpeg.git] / 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
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       opg_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 }