/src/openjpeg/src/lib/openjp2/bio.c
Line | Count | Source (jump to first uncovered line) |
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 | | Read a bit |
48 | | @param bio BIO handle |
49 | | @return Returns the read bit |
50 | | */ |
51 | | static OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio); |
52 | | /** |
53 | | Write a byte |
54 | | @param bio BIO handle |
55 | | @return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise |
56 | | */ |
57 | | static OPJ_BOOL opj_bio_byteout(opj_bio_t *bio); |
58 | | /** |
59 | | Read 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_bytein(opj_bio_t *bio); |
64 | | |
65 | | /*@}*/ |
66 | | |
67 | | /*@}*/ |
68 | | |
69 | | /* |
70 | | ========================================================== |
71 | | local functions |
72 | | ========================================================== |
73 | | */ |
74 | | |
75 | | static OPJ_BOOL opj_bio_byteout(opj_bio_t *bio) |
76 | 0 | { |
77 | 0 | bio->buf = (bio->buf << 8) & 0xffff; |
78 | 0 | bio->ct = bio->buf == 0xff00 ? 7 : 8; |
79 | 0 | if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) { |
80 | 0 | return OPJ_FALSE; |
81 | 0 | } |
82 | 0 | *bio->bp++ = (OPJ_BYTE)(bio->buf >> 8); |
83 | 0 | return OPJ_TRUE; |
84 | 0 | } |
85 | | |
86 | | static OPJ_BOOL opj_bio_bytein(opj_bio_t *bio) |
87 | 116M | { |
88 | 116M | bio->buf = (bio->buf << 8) & 0xffff; |
89 | 116M | bio->ct = bio->buf == 0xff00 ? 7 : 8; |
90 | 116M | if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) { |
91 | 87.8M | return OPJ_FALSE; |
92 | 87.8M | } |
93 | 28.3M | bio->buf |= *bio->bp++; |
94 | 28.3M | return OPJ_TRUE; |
95 | 116M | } |
96 | | |
97 | | static OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio) |
98 | 221M | { |
99 | 221M | if (bio->ct == 0) { |
100 | 116M | opj_bio_bytein( |
101 | 116M | bio); /* MSD: why not check the return value of this function ? */ |
102 | 116M | } |
103 | 221M | bio->ct--; |
104 | 221M | return (bio->buf >> bio->ct) & 1; |
105 | 221M | } |
106 | | |
107 | | /* |
108 | | ========================================================== |
109 | | Bit Input/Output interface |
110 | | ========================================================== |
111 | | */ |
112 | | |
113 | | opj_bio_t* opj_bio_create(void) |
114 | 102M | { |
115 | 102M | opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t)); |
116 | 102M | return bio; |
117 | 102M | } |
118 | | |
119 | | void opj_bio_destroy(opj_bio_t *bio) |
120 | 102M | { |
121 | 102M | if (bio) { |
122 | 102M | opj_free(bio); |
123 | 102M | } |
124 | 102M | } |
125 | | |
126 | | ptrdiff_t opj_bio_numbytes(opj_bio_t *bio) |
127 | 102M | { |
128 | 102M | return (bio->bp - bio->start); |
129 | 102M | } |
130 | | |
131 | | void opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) |
132 | 0 | { |
133 | 0 | bio->start = bp; |
134 | 0 | bio->end = bp + len; |
135 | 0 | bio->bp = bp; |
136 | 0 | bio->buf = 0; |
137 | 0 | bio->ct = 8; |
138 | 0 | } |
139 | | |
140 | | void opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) |
141 | 102M | { |
142 | 102M | bio->start = bp; |
143 | 102M | bio->end = bp + len; |
144 | 102M | bio->bp = bp; |
145 | 102M | bio->buf = 0; |
146 | 102M | bio->ct = 0; |
147 | 102M | } |
148 | | |
149 | | void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b) |
150 | 0 | { |
151 | 0 | if (bio->ct == 0) { |
152 | 0 | opj_bio_byteout( |
153 | 0 | bio); /* MSD: why not check the return value of this function ? */ |
154 | 0 | } |
155 | 0 | bio->ct--; |
156 | 0 | bio->buf |= b << bio->ct; |
157 | 0 | } |
158 | | |
159 | | void opj_bio_write(opj_bio_t *bio, OPJ_UINT32 v, OPJ_UINT32 n) |
160 | 0 | { |
161 | 0 | OPJ_INT32 i; |
162 | |
|
163 | 0 | assert((n > 0U) && (n <= 32U)); |
164 | 0 | for (i = (OPJ_INT32)n - 1; i >= 0; i--) { |
165 | 0 | opj_bio_putbit(bio, (v >> i) & 1); |
166 | 0 | } |
167 | 0 | } |
168 | | |
169 | | OPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n) |
170 | 180M | { |
171 | 180M | OPJ_INT32 i; |
172 | 180M | OPJ_UINT32 v; |
173 | | |
174 | 180M | assert((n > 0U) /* && (n <= 32U)*/); |
175 | | #ifdef OPJ_UBSAN_BUILD |
176 | | /* This assert fails for some corrupted images which are gracefully rejected */ |
177 | | /* Add this assert only for ubsan build. */ |
178 | | /* This is the condition for overflow not to occur below which is needed because of OPJ_NOSANITIZE */ |
179 | | assert(n <= 32U); |
180 | | #endif |
181 | 180M | v = 0U; |
182 | 402M | for (i = (OPJ_INT32)n - 1; i >= 0; i--) { |
183 | 221M | v |= opj_bio_getbit(bio) << |
184 | 221M | i; /* can't overflow, opj_bio_getbit returns 0 or 1 */ |
185 | 221M | } |
186 | 180M | return v; |
187 | 180M | } |
188 | | |
189 | | OPJ_BOOL opj_bio_flush(opj_bio_t *bio) |
190 | 0 | { |
191 | 0 | if (! opj_bio_byteout(bio)) { |
192 | 0 | return OPJ_FALSE; |
193 | 0 | } |
194 | 0 | if (bio->ct == 7) { |
195 | 0 | if (! opj_bio_byteout(bio)) { |
196 | 0 | return OPJ_FALSE; |
197 | 0 | } |
198 | 0 | } |
199 | 0 | return OPJ_TRUE; |
200 | 0 | } |
201 | | |
202 | | OPJ_BOOL opj_bio_inalign(opj_bio_t *bio) |
203 | 102M | { |
204 | 102M | if ((bio->buf & 0xff) == 0xff) { |
205 | 6.76k | if (! opj_bio_bytein(bio)) { |
206 | 21 | return OPJ_FALSE; |
207 | 21 | } |
208 | 6.76k | } |
209 | 102M | bio->ct = 0; |
210 | 102M | return OPJ_TRUE; |
211 | 102M | } |