1 | /* |
2 | * The copyright in this software is being made available under the 2-clauses |
3 | * BSD License, included below. This software may be subject to other third |
4 | * party and contributor rights, including patent rights, and no such rights |
5 | * are granted under this license. |
6 | * |
7 | * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium |
8 | * Copyright (c) 2002-2014, Professor Benoit Macq |
9 | * Copyright (c) 2001-2003, David Janssens |
10 | * Copyright (c) 2002-2003, Yannick Verschueren |
11 | * Copyright (c) 2003-2007, Francois-Olivier Devaux |
12 | * Copyright (c) 2003-2014, Antonin Descampe |
13 | * Copyright (c) 2005, Herve Drolon, FreeImage Team |
14 | * All rights reserved. |
15 | * |
16 | * Redistribution and use in source and binary forms, with or without |
17 | * modification, are permitted provided that the following conditions |
18 | * are met: |
19 | * 1. Redistributions of source code must retain the above copyright |
20 | * notice, this list of conditions and the following disclaimer. |
21 | * 2. Redistributions in binary form must reproduce the above copyright |
22 | * notice, this list of conditions and the following disclaimer in the |
23 | * documentation and/or other materials provided with the distribution. |
24 | * |
25 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' |
26 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
27 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
28 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
29 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
30 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
31 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
32 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
33 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
34 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
35 | * POSSIBILITY OF SUCH DAMAGE. |
36 | */ |
37 | |
38 | #include "opj_includes.h" |
39 | |
40 | /** @defgroup BIO BIO - Individual bit input-output stream */ |
41 | /*@{*/ |
42 | |
43 | /** @name Local static functions */ |
44 | /*@{*/ |
45 | |
46 | /** |
47 | Write a bit |
48 | @param bio BIO handle |
49 | @param b Bit to write (0 or 1) |
50 | */ |
51 | static void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b); |
52 | /** |
53 | Read a bit |
54 | @param bio BIO handle |
55 | @return Returns the read bit |
56 | */ |
57 | static OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio); |
58 | /** |
59 | Write a byte |
60 | @param bio BIO handle |
61 | @return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise |
62 | */ |
63 | static OPJ_BOOL opj_bio_byteout(opj_bio_t *bio); |
64 | /** |
65 | Read a byte |
66 | @param bio BIO handle |
67 | @return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise |
68 | */ |
69 | static OPJ_BOOL opj_bio_bytein(opj_bio_t *bio); |
70 | |
71 | /*@}*/ |
72 | |
73 | /*@}*/ |
74 | |
75 | /* |
76 | ========================================================== |
77 | local functions |
78 | ========================================================== |
79 | */ |
80 | |
81 | static OPJ_BOOL opj_bio_byteout(opj_bio_t *bio) |
82 | { |
83 | bio->buf = (bio->buf << 8) & 0xffff; |
84 | bio->ct = bio->buf == 0xff00 ? 7 : 8; |
85 | if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) { |
86 | return OPJ_FALSE; |
87 | } |
88 | *bio->bp++ = (OPJ_BYTE)(bio->buf >> 8); |
89 | return OPJ_TRUE; |
90 | } |
91 | |
92 | static OPJ_BOOL opj_bio_bytein(opj_bio_t *bio) |
93 | { |
94 | bio->buf = (bio->buf << 8) & 0xffff; |
95 | bio->ct = bio->buf == 0xff00 ? 7 : 8; |
96 | if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) { |
97 | return OPJ_FALSE; |
98 | } |
99 | bio->buf |= *bio->bp++; |
100 | return OPJ_TRUE; |
101 | } |
102 | |
103 | static void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b) |
104 | { |
105 | if (bio->ct == 0) { |
106 | opj_bio_byteout( |
107 | bio); /* MSD: why not check the return value of this function ? */ |
108 | } |
109 | bio->ct--; |
110 | bio->buf |= b << bio->ct; |
111 | } |
112 | |
113 | static OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio) |
114 | { |
115 | if (bio->ct == 0) { |
116 | opj_bio_bytein( |
117 | bio); /* MSD: why not check the return value of this function ? */ |
118 | } |
119 | bio->ct--; |
120 | return (bio->buf >> bio->ct) & 1; |
121 | } |
122 | |
123 | /* |
124 | ========================================================== |
125 | Bit Input/Output interface |
126 | ========================================================== |
127 | */ |
128 | |
129 | opj_bio_t* opj_bio_create(void) |
130 | { |
131 | opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t)); |
132 | return bio; |
133 | } |
134 | |
135 | void opj_bio_destroy(opj_bio_t *bio) |
136 | { |
137 | if (bio) { |
138 | opj_free(bio); |
139 | } |
140 | } |
141 | |
142 | ptrdiff_t opj_bio_numbytes(opj_bio_t *bio) |
143 | { |
144 | return (bio->bp - bio->start); |
145 | } |
146 | |
147 | void opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) |
148 | { |
149 | bio->start = bp; |
150 | bio->end = bp + len; |
151 | bio->bp = bp; |
152 | bio->buf = 0; |
153 | bio->ct = 8; |
154 | } |
155 | |
156 | void opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) |
157 | { |
158 | bio->start = bp; |
159 | bio->end = bp + len; |
160 | bio->bp = bp; |
161 | bio->buf = 0; |
162 | bio->ct = 0; |
163 | } |
164 | |
165 | void opj_bio_write(opj_bio_t *bio, OPJ_UINT32 v, OPJ_UINT32 n) |
166 | { |
167 | OPJ_INT32 i; |
168 | |
169 | assert((n > 0U) && (n <= 32U)); |
170 | for (i = (OPJ_INT32)n - 1; i >= 0; i--) { |
171 | opj_bio_putbit(bio, (v >> i) & 1); |
172 | } |
173 | } |
174 | |
175 | OPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n) |
176 | { |
177 | OPJ_INT32 i; |
178 | OPJ_UINT32 v; |
179 | |
180 | assert((n > 0U) /* && (n <= 32U)*/); |
181 | #ifdef OPJ_UBSAN_BUILD |
182 | /* This assert fails for some corrupted images which are gracefully rejected */ |
183 | /* Add this assert only for ubsan build. */ |
184 | /* This is the condition for overflow not to occur below which is needed because of OPJ_NOSANITIZE */ |
185 | assert(n <= 32U); |
186 | #endif |
187 | v = 0U; |
188 | for (i = (OPJ_INT32)n - 1; i >= 0; i--) { |
189 | v |= opj_bio_getbit(bio) << |
190 | i; /* can't overflow, opj_bio_getbit returns 0 or 1 */ |
191 | } |
192 | return v; |
193 | } |
194 | |
195 | OPJ_BOOL opj_bio_flush(opj_bio_t *bio) |
196 | { |
197 | if (! opj_bio_byteout(bio)) { |
198 | return OPJ_FALSE; |
199 | } |
200 | if (bio->ct == 7) { |
201 | if (! opj_bio_byteout(bio)) { |
202 | return OPJ_FALSE; |
203 | } |
204 | } |
205 | return OPJ_TRUE; |
206 | } |
207 | |
208 | OPJ_BOOL opj_bio_inalign(opj_bio_t *bio) |
209 | { |
210 | if ((bio->buf & 0xff) == 0xff) { |
211 | if (! opj_bio_bytein(bio)) { |
212 | return OPJ_FALSE; |
213 | } |
214 | } |
215 | bio->ct = 0; |
216 | return OPJ_TRUE; |
217 | } |
218 | |