aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/openjpeg-libsl/libopenjpeg/bio.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/openjpeg-libsl/libopenjpeg/bio.c')
-rw-r--r--libraries/openjpeg-libsl/libopenjpeg/bio.c187
1 files changed, 187 insertions, 0 deletions
diff --git a/libraries/openjpeg-libsl/libopenjpeg/bio.c b/libraries/openjpeg-libsl/libopenjpeg/bio.c
new file mode 100644
index 0000000..2a305a7
--- /dev/null
+++ b/libraries/openjpeg-libsl/libopenjpeg/bio.c
@@ -0,0 +1,187 @@
1/*
2 * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
3 * Copyright (c) 2002-2007, Professor Benoit Macq
4 * Copyright (c) 2001-2003, David Janssens
5 * Copyright (c) 2002-2003, Yannick Verschueren
6 * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
7 * Copyright (c) 2005, Herve Drolon, FreeImage Team
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include "opj_includes.h"
33
34/** @defgroup BIO BIO - Individual bit input-output stream */
35/*@{*/
36
37/** @name Local static functions */
38/*@{*/
39
40/**
41Write a bit
42@param bio BIO handle
43@param b Bit to write (0 or 1)
44*/
45static void bio_putbit(opj_bio_t *bio, int b);
46/**
47Read a bit
48@param bio BIO handle
49@return Returns the read bit
50*/
51static int bio_getbit(opj_bio_t *bio);
52/**
53Write a byte
54@param bio BIO handle
55@return Returns 0 if successful, returns 1 otherwise
56*/
57static int bio_byteout(opj_bio_t *bio);
58/**
59Read a byte
60@param bio BIO handle
61@return Returns 0 if successful, returns 1 otherwise
62*/
63static int bio_bytein(opj_bio_t *bio);
64
65/*@}*/
66
67/*@}*/
68
69/*
70==========================================================
71 local functions
72==========================================================
73*/
74
75static int bio_byteout(opj_bio_t *bio) {
76 bio->buf = (bio->buf << 8) & 0xffff;
77 bio->ct = bio->buf == 0xff00 ? 7 : 8;
78 if (bio->bp >= bio->end) {
79 return 1;
80 }
81 *bio->bp++ = bio->buf >> 8;
82 return 0;
83}
84
85static int bio_bytein(opj_bio_t *bio) {
86 bio->buf = (bio->buf << 8) & 0xffff;
87 bio->ct = bio->buf == 0xff00 ? 7 : 8;
88 if (bio->bp >= bio->end) {
89 return 1;
90 }
91 bio->buf |= *bio->bp++;
92 return 0;
93}
94
95static void bio_putbit(opj_bio_t *bio, int b) {
96 if (bio->ct == 0) {
97 bio_byteout(bio);
98 }
99 bio->ct--;
100 bio->buf |= b << bio->ct;
101}
102
103static int bio_getbit(opj_bio_t *bio) {
104 if (bio->ct == 0) {
105 bio_bytein(bio);
106 }
107 bio->ct--;
108 return (bio->buf >> bio->ct) & 1;
109}
110
111/*
112==========================================================
113 Bit Input/Output interface
114==========================================================
115*/
116
117opj_bio_t* bio_create() {
118 opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
119 return bio;
120}
121
122void bio_destroy(opj_bio_t *bio) {
123 if(bio) {
124 opj_free(bio);
125 }
126}
127
128int bio_numbytes(opj_bio_t *bio) {
129 return (bio->bp - bio->start);
130}
131
132void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) {
133 bio->start = bp;
134 bio->end = bp + len;
135 bio->bp = bp;
136 bio->buf = 0;
137 bio->ct = 8;
138}
139
140void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) {
141 bio->start = bp;
142 bio->end = bp + len;
143 bio->bp = bp;
144 bio->buf = 0;
145 bio->ct = 0;
146}
147
148void bio_write(opj_bio_t *bio, int v, int n) {
149 int i;
150 for (i = n - 1; i >= 0; i--) {
151 bio_putbit(bio, (v >> i) & 1);
152 }
153}
154
155int bio_read(opj_bio_t *bio, int n) {
156 int i, v;
157 v = 0;
158 for (i = n - 1; i >= 0; i--) {
159 v += bio_getbit(bio) << i;
160 }
161 return v;
162}
163
164int bio_flush(opj_bio_t *bio) {
165 bio->ct = 0;
166 if (bio_byteout(bio)) {
167 return 1;
168 }
169 if (bio->ct == 7) {
170 bio->ct = 0;
171 if (bio_byteout(bio)) {
172 return 1;
173 }
174 }
175 return 0;
176}
177
178int bio_inalign(opj_bio_t *bio) {
179 bio->ct = 0;
180 if ((bio->buf & 0xff) == 0xff) {
181 if (bio_bytein(bio)) {
182 return 1;
183 }
184 bio->ct = 0;
185 }
186 return 0;
187}