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