fixed a bug in t1.c that prevented in some cases a true lossless compression (thanks...
[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 #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 }