/src/ghostpdl/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 | | 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 | 0 | { |
83 | 0 | bio->buf = (bio->buf << 8) & 0xffff; |
84 | 0 | bio->ct = bio->buf == 0xff00 ? 7 : 8; |
85 | 0 | if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) { |
86 | 0 | return OPJ_FALSE; |
87 | 0 | } |
88 | 0 | *bio->bp++ = (OPJ_BYTE)(bio->buf >> 8); |
89 | 0 | return OPJ_TRUE; |
90 | 0 | } |
91 | | |
92 | | static OPJ_BOOL opj_bio_bytein(opj_bio_t *bio) |
93 | 1.82M | { |
94 | 1.82M | bio->buf = (bio->buf << 8) & 0xffff; |
95 | 1.82M | bio->ct = bio->buf == 0xff00 ? 7 : 8; |
96 | 1.82M | if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) { |
97 | 1.94k | return OPJ_FALSE; |
98 | 1.94k | } |
99 | 1.82M | bio->buf |= *bio->bp++; |
100 | 1.82M | return OPJ_TRUE; |
101 | 1.82M | } |
102 | | |
103 | | static void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b) |
104 | 0 | { |
105 | 0 | if (bio->ct == 0) { |
106 | 0 | opj_bio_byteout( |
107 | 0 | bio); /* MSD: why not check the return value of this function ? */ |
108 | 0 | } |
109 | 0 | bio->ct--; |
110 | 0 | bio->buf |= b << bio->ct; |
111 | 0 | } |
112 | | |
113 | | static OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio) |
114 | 12.3M | { |
115 | 12.3M | if (bio->ct == 0) { |
116 | 1.82M | opj_bio_bytein( |
117 | 1.82M | bio); /* MSD: why not check the return value of this function ? */ |
118 | 1.82M | } |
119 | 12.3M | bio->ct--; |
120 | 12.3M | return (bio->buf >> bio->ct) & 1; |
121 | 12.3M | } |
122 | | |
123 | | /* |
124 | | ========================================================== |
125 | | Bit Input/Output interface |
126 | | ========================================================== |
127 | | */ |
128 | | |
129 | | opj_bio_t* opj_bio_create(void) |
130 | 554k | { |
131 | 554k | opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t)); |
132 | 554k | return bio; |
133 | 554k | } |
134 | | |
135 | | void opj_bio_destroy(opj_bio_t *bio) |
136 | 554k | { |
137 | 554k | if (bio) { |
138 | 554k | opj_free(bio); |
139 | 554k | } |
140 | 554k | } |
141 | | |
142 | | ptrdiff_t opj_bio_numbytes(opj_bio_t *bio) |
143 | 554k | { |
144 | 554k | return (bio->bp - bio->start); |
145 | 554k | } |
146 | | |
147 | | void opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) |
148 | 0 | { |
149 | 0 | bio->start = bp; |
150 | 0 | bio->end = bp + len; |
151 | 0 | bio->bp = bp; |
152 | 0 | bio->buf = 0; |
153 | 0 | bio->ct = 8; |
154 | 0 | } |
155 | | |
156 | | void opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) |
157 | 554k | { |
158 | 554k | bio->start = bp; |
159 | 554k | bio->end = bp + len; |
160 | 554k | bio->bp = bp; |
161 | 554k | bio->buf = 0; |
162 | 554k | bio->ct = 0; |
163 | 554k | } |
164 | | |
165 | | void opj_bio_write(opj_bio_t *bio, OPJ_UINT32 v, OPJ_UINT32 n) |
166 | 0 | { |
167 | 0 | OPJ_INT32 i; |
168 | |
|
169 | 0 | assert((n > 0U) && (n <= 32U)); |
170 | 0 | for (i = (OPJ_INT32)n - 1; i >= 0; i--) { |
171 | 0 | opj_bio_putbit(bio, (v >> i) & 1); |
172 | 0 | } |
173 | 0 | } |
174 | | |
175 | | OPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n) |
176 | 7.19M | { |
177 | 7.19M | OPJ_INT32 i; |
178 | 7.19M | OPJ_UINT32 v; |
179 | | |
180 | 7.19M | 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 | 7.19M | v = 0U; |
188 | 19.5M | for (i = (OPJ_INT32)n - 1; i >= 0; i--) { |
189 | 12.3M | v |= opj_bio_getbit(bio) << |
190 | 12.3M | i; /* can't overflow, opj_bio_getbit returns 0 or 1 */ |
191 | 12.3M | } |
192 | 7.19M | return v; |
193 | 7.19M | } |
194 | | |
195 | | OPJ_BOOL opj_bio_flush(opj_bio_t *bio) |
196 | 0 | { |
197 | 0 | if (! opj_bio_byteout(bio)) { |
198 | 0 | return OPJ_FALSE; |
199 | 0 | } |
200 | 0 | if (bio->ct == 7) { |
201 | 0 | if (! opj_bio_byteout(bio)) { |
202 | 0 | return OPJ_FALSE; |
203 | 0 | } |
204 | 0 | } |
205 | 0 | return OPJ_TRUE; |
206 | 0 | } |
207 | | |
208 | | OPJ_BOOL opj_bio_inalign(opj_bio_t *bio) |
209 | 554k | { |
210 | 554k | if ((bio->buf & 0xff) == 0xff) { |
211 | 76 | if (! opj_bio_bytein(bio)) { |
212 | 0 | return OPJ_FALSE; |
213 | 0 | } |
214 | 76 | } |
215 | 554k | bio->ct = 0; |
216 | 554k | return OPJ_TRUE; |
217 | 554k | } |