Initial revision
[openjpeg.git] / libopenjpeg / raw.c
1 /*
2  * Copyright (c) 2002-2003, Antonin Descampe
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24  * POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "raw.h"
28
29
30 unsigned char raw_c;
31 unsigned int raw_ct, raw_lenmax, raw_len;
32 unsigned char *raw_bp;
33 unsigned char *raw_start;
34 unsigned char *raw_end;
35
36 /* <summary> */
37 /* Return the number of bytes already encoded. */
38 /* </summary> */
39 int raw_numbytes()
40 {
41         return raw_bp - raw_start;
42 }
43
44 /* <summary> */
45 /* Initialize raw-encoder. */
46 /* </summary> */
47 /* <param name="bp">Output buffer.</param> */
48 void raw_init_enc(unsigned char *bp)
49 {
50         raw_bp = bp - 1;
51         raw_c = 0;
52         raw_ct = 7;
53         raw_start = bp;
54 }
55
56 /* <summary> */
57 /* Encode a symbol using the RAW-coder. */
58 /* </summary> */
59 /* <param name="d"> The symbol to be encoded (0 or 1).</param> */
60 void raw_encode(int d)
61 {
62         /*  raw_c+=d; */
63
64         raw_ct--;
65         raw_c += (d << raw_ct);
66
67         if (raw_ct == 0) {
68                 raw_bp++;
69                 *raw_bp = raw_c;
70                 raw_ct = 7;
71                 if (raw_c == 0xff) {
72                         raw_ct = 6;
73                 }
74                 raw_c = 0;
75         }
76         /*else 
77            {
78            raw_ct--;
79            raw_c<<=1;
80            } */
81 }
82
83 /* <summary> */
84 /* Flush encoded data. */
85 /* </summary> */
86 void raw_flush()
87 {
88         char first = 1;
89         int prev = 1;
90         while (raw_ct != 7) {
91                 raw_encode(first ? 0 : !(prev));
92                 prev = first ? 0 : !(prev);
93                 first = 0;
94         }
95 }
96
97 /* <summary> */
98 /* Initialize raw-decoder. */
99 /* </summary> */
100 void raw_init_dec(unsigned char *bp, int len)
101 {
102         raw_start = bp;
103         raw_lenmax = len;
104         raw_len = 0;
105         raw_c = 0;
106         raw_ct = 0;
107 }
108
109 /* <summary> */
110 /* Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN */
111 /* </summary> */
112 int raw_decode()
113 {
114         int d;
115         if (raw_ct == 0) {
116                 raw_ct = 8;
117                 if (raw_len == raw_lenmax)
118                         raw_c = 0xff;
119                 else {
120                         if (raw_c == 0xff)
121                                 raw_ct = 7;
122                         raw_c = *(raw_start + raw_len);
123                         raw_len++;
124                 }
125         }
126         raw_ct--;
127         d = (raw_c >> raw_ct) & 0x01;
128         return d;
129 }