Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * Copyright (c) 2016 Alexandra Hájková | ||
3 | * | ||
4 | * This file is part of FFmpeg. | ||
5 | * | ||
6 | * FFmpeg is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU Lesser General Public | ||
8 | * License as published by the Free Software Foundation; either | ||
9 | * version 2.1 of the License, or (at your option) any later version. | ||
10 | * | ||
11 | * FFmpeg is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
14 | * Lesser General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU Lesser General Public | ||
17 | * License along with FFmpeg; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | */ | ||
20 | |||
21 | #ifdef BITSTREAM_TEMPLATE_LE | ||
22 | # define BS_SUFFIX_LOWER _le | ||
23 | # define BS_SUFFIX_UPPER LE | ||
24 | #else | ||
25 | # define BS_SUFFIX_LOWER _be | ||
26 | # define BS_SUFFIX_UPPER BE | ||
27 | #endif | ||
28 | |||
29 | #define BS_JOIN(x, y, z) x ## y ## z | ||
30 | #define BS_JOIN3(x, y, z) BS_JOIN(x, y, z) | ||
31 | #define BS_FUNC(x) BS_JOIN3(bits_, x, BS_SUFFIX_LOWER) | ||
32 | |||
33 | #define BSCTX BS_JOIN3(Bitstream, Context, BS_SUFFIX_UPPER) | ||
34 | |||
35 | typedef struct BSCTX { | ||
36 | uint64_t bits; // stores bits read from the buffer | ||
37 | const uint8_t *buffer, *buffer_end; | ||
38 | const uint8_t *ptr; // pointer to the position inside a buffer | ||
39 | unsigned bits_valid; // number of bits left in bits field | ||
40 | unsigned size_in_bits; | ||
41 | } BSCTX; | ||
42 | |||
43 | /** | ||
44 | * @return | ||
45 | * - 0 on successful refill | ||
46 | * - a negative number when bitstream end is hit | ||
47 | * | ||
48 | * Always succeeds when UNCHECKED_BITSTREAM_READER is enabled. | ||
49 | */ | ||
50 | 23566 | static inline int BS_FUNC(priv_refill_64)(BSCTX *bc) | |
51 | { | ||
52 | #if !UNCHECKED_BITSTREAM_READER | ||
53 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 21699 times.
|
21705 | if (bc->ptr >= bc->buffer_end) |
54 | 6 | return -1; | |
55 | #endif | ||
56 | |||
57 | #ifdef BITSTREAM_TEMPLATE_LE | ||
58 | 19780 | bc->bits = AV_RL64(bc->ptr); | |
59 | #else | ||
60 | 3780 | bc->bits = AV_RB64(bc->ptr); | |
61 | #endif | ||
62 | 23560 | bc->ptr += 8; | |
63 | 23560 | bc->bits_valid = 64; | |
64 | |||
65 | 23560 | return 0; | |
66 | } | ||
67 | |||
68 | /** | ||
69 | * @return | ||
70 | * - 0 on successful refill | ||
71 | * - a negative number when bitstream end is hit | ||
72 | * | ||
73 | * Always succeeds when UNCHECKED_BITSTREAM_READER is enabled. | ||
74 | */ | ||
75 | 9193218 | static inline int BS_FUNC(priv_refill_32)(BSCTX *bc) | |
76 | { | ||
77 | #if !UNCHECKED_BITSTREAM_READER | ||
78 |
2/2✓ Branch 0 taken 248 times.
✓ Branch 1 taken 3986880 times.
|
3987128 | if (bc->ptr >= bc->buffer_end) |
79 | 248 | return -1; | |
80 | #endif | ||
81 | |||
82 | #ifdef BITSTREAM_TEMPLATE_LE | ||
83 | 217949 | bc->bits |= (uint64_t)AV_RL32(bc->ptr) << bc->bits_valid; | |
84 | #else | ||
85 | 8975021 | bc->bits |= (uint64_t)AV_RB32(bc->ptr) << (32 - bc->bits_valid); | |
86 | #endif | ||
87 | 9192970 | bc->ptr += 4; | |
88 | 9192970 | bc->bits_valid += 32; | |
89 | |||
90 | 9192970 | return 0; | |
91 | } | ||
92 | |||
93 | /** | ||
94 | * Initialize BitstreamContext. | ||
95 | * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes | ||
96 | * larger than the actual read bits because some optimized bitstream | ||
97 | * readers read 32 or 64 bits at once and could read over the end | ||
98 | * @param bit_size the size of the buffer in bits | ||
99 | * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow. | ||
100 | */ | ||
101 | 3897 | static inline int BS_FUNC(init)(BSCTX *bc, const uint8_t *buffer, | |
102 | unsigned int bit_size) | ||
103 | { | ||
104 | unsigned int buffer_size; | ||
105 | |||
106 |
2/4✓ Branch 0 taken 3175 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3175 times.
|
3897 | if (bit_size > INT_MAX - 7 || !buffer) { |
107 | ✗ | bc->buffer = NULL; | |
108 | ✗ | bc->ptr = NULL; | |
109 | ✗ | bc->bits_valid = 0; | |
110 | ✗ | return AVERROR_INVALIDDATA; | |
111 | } | ||
112 | |||
113 | 3897 | buffer_size = (bit_size + 7) >> 3; | |
114 | |||
115 | 3897 | bc->buffer = buffer; | |
116 | 3897 | bc->buffer_end = buffer + buffer_size; | |
117 | 3897 | bc->ptr = bc->buffer; | |
118 | 3897 | bc->size_in_bits = bit_size; | |
119 | 3897 | bc->bits_valid = 0; | |
120 | 3897 | bc->bits = 0; | |
121 | |||
122 | 3897 | BS_FUNC(priv_refill_64)(bc); | |
123 | |||
124 | 3897 | return 0; | |
125 | } | ||
126 | |||
127 | /** | ||
128 | * Initialize BitstreamContext. | ||
129 | * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes | ||
130 | * larger than the actual read bits because some optimized bitstream | ||
131 | * readers read 32 or 64 bits at once and could read over the end | ||
132 | * @param byte_size the size of the buffer in bytes | ||
133 | * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow | ||
134 | */ | ||
135 | 2453 | static inline int BS_FUNC(init8)(BSCTX *bc, const uint8_t *buffer, | |
136 | unsigned int byte_size) | ||
137 | { | ||
138 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2453 times.
|
2453 | if (byte_size > INT_MAX / 8) |
139 | ✗ | return AVERROR_INVALIDDATA; | |
140 | 2453 | return BS_FUNC(init)(bc, buffer, byte_size * 8); | |
141 | } | ||
142 | |||
143 | /** | ||
144 | * Return number of bits already read. | ||
145 | */ | ||
146 | 514 | static inline int BS_FUNC(tell)(const BSCTX *bc) | |
147 | { | ||
148 | 514 | return (bc->ptr - bc->buffer) * 8 - bc->bits_valid; | |
149 | } | ||
150 | |||
151 | /** | ||
152 | * Return buffer size in bits. | ||
153 | */ | ||
154 | static inline int BS_FUNC(size)(const BSCTX *bc) | ||
155 | { | ||
156 | return bc->size_in_bits; | ||
157 | } | ||
158 | |||
159 | /** | ||
160 | * Return buffer size in bytes. | ||
161 | */ | ||
162 | static inline int BS_FUNC(bytesize)(const BSCTX *bc, int round_up) | ||
163 | { | ||
164 | return (bc->size_in_bits + (round_up ? 7 : 0)) >> 3; | ||
165 | } | ||
166 | |||
167 | /** | ||
168 | * Return the number of the bits left in a buffer. | ||
169 | */ | ||
170 | 51459168 | static inline int BS_FUNC(left)(const BSCTX *bc) | |
171 | { | ||
172 | 51459168 | return (bc->buffer - bc->ptr) * 8 + bc->size_in_bits + bc->bits_valid; | |
173 | } | ||
174 | |||
175 | 61176523 | static inline uint64_t BS_FUNC(priv_val_show)(BSCTX *bc, unsigned int n) | |
176 | { | ||
177 |
2/4✓ Branch 0 taken 315 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 315 times.
|
315 | av_assert2(n > 0 && n <= 64); |
178 | |||
179 | #ifdef BITSTREAM_TEMPLATE_LE | ||
180 | 1561136 | return bc->bits & (UINT64_MAX >> (64 - n)); | |
181 | #else | ||
182 | 59615387 | return bc->bits >> (64 - n); | |
183 | #endif | ||
184 | } | ||
185 | |||
186 | 61176551 | static inline void BS_FUNC(priv_skip_remaining)(BSCTX *bc, unsigned int n) | |
187 | { | ||
188 | #ifdef BITSTREAM_TEMPLATE_LE | ||
189 | 1561223 | bc->bits >>= n; | |
190 | #else | ||
191 | 59615328 | bc->bits <<= n; | |
192 | #endif | ||
193 | 61176551 | bc->bits_valid -= n; | |
194 | 61176551 | } | |
195 | |||
196 | 1561186 | static inline uint64_t BS_FUNC(priv_val_get)(BSCTX *bc, unsigned int n) | |
197 | { | ||
198 | uint64_t ret; | ||
199 | |||
200 |
2/4✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 198 times.
|
198 | av_assert2(n > 0 && n < 64); |
201 | |||
202 | 1561186 | ret = BS_FUNC(priv_val_show)(bc, n); | |
203 | 1561186 | BS_FUNC(priv_skip_remaining)(bc, n); | |
204 | |||
205 | 1561186 | return ret; | |
206 | } | ||
207 | |||
208 | /** | ||
209 | * Return one bit from the buffer. | ||
210 | */ | ||
211 | 686458 | static inline unsigned int BS_FUNC(read_bit)(BSCTX *bc) | |
212 | { | ||
213 |
3/4✓ Branch 0 taken 19462 times.
✓ Branch 1 taken 666996 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 19462 times.
|
686458 | if (!bc->bits_valid && BS_FUNC(priv_refill_64)(bc) < 0) |
214 | ✗ | return 0; | |
215 | |||
216 | 686458 | return BS_FUNC(priv_val_get)(bc, 1); | |
217 | } | ||
218 | |||
219 | /** | ||
220 | * Return n bits from the buffer, n has to be in the 1-32 range. | ||
221 | * May be faster than bits_read() when n is not a compile-time constant and is | ||
222 | * known to be non-zero; | ||
223 | */ | ||
224 | 874633 | static inline uint32_t BS_FUNC(read_nz)(BSCTX *bc, unsigned int n) | |
225 | { | ||
226 |
2/4✓ Branch 0 taken 119 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 119 times.
|
119 | av_assert2(n > 0 && n <= 32); |
227 | |||
228 |
2/2✓ Branch 0 taken 217940 times.
✓ Branch 1 taken 656693 times.
|
874633 | if (n > bc->bits_valid) { |
229 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 217940 times.
|
217940 | if (BS_FUNC(priv_refill_32)(bc) < 0) |
230 | ✗ | bc->bits_valid = n; | |
231 | } | ||
232 | |||
233 | 874633 | return BS_FUNC(priv_val_get)(bc, n); | |
234 | } | ||
235 | |||
236 | /** | ||
237 | * Return n bits from the buffer, n has to be in the 0-32 range. | ||
238 | */ | ||
239 | 860022 | static inline uint32_t BS_FUNC(read)(BSCTX *bc, unsigned int n) | |
240 | { | ||
241 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 41 times.
|
41 | av_assert2(n <= 32); |
242 | |||
243 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 860021 times.
|
860022 | if (!n) |
244 | 1 | return 0; | |
245 | |||
246 | 860021 | return BS_FUNC(read_nz)(bc, n); | |
247 | } | ||
248 | |||
249 | /** | ||
250 | * Return n bits from the buffer, n has to be in the 0-63 range. | ||
251 | */ | ||
252 | 60 | static inline uint64_t BS_FUNC(read_63)(BSCTX *bc, unsigned int n) | |
253 | { | ||
254 | 60 | uint64_t ret = 0; | |
255 | 60 | unsigned left = 0; | |
256 | |||
257 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
|
37 | av_assert2(n <= 63); |
258 | |||
259 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 59 times.
|
60 | if (!n) |
260 | 1 | return 0; | |
261 | |||
262 |
2/2✓ Branch 0 taken 36 times.
✓ Branch 1 taken 23 times.
|
59 | if (n > bc->bits_valid) { |
263 | 36 | left = bc->bits_valid; | |
264 | 36 | n -= left; | |
265 | |||
266 |
1/2✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
|
36 | if (left) |
267 | 36 | ret = BS_FUNC(priv_val_get)(bc, left); | |
268 | |||
269 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
|
36 | if (BS_FUNC(priv_refill_64)(bc) < 0) |
270 | ✗ | bc->bits_valid = n; | |
271 | |||
272 | } | ||
273 | |||
274 | #ifdef BITSTREAM_TEMPLATE_LE | ||
275 | 45 | ret = BS_FUNC(priv_val_get)(bc, n) << left | ret; | |
276 | #else | ||
277 | 14 | ret = BS_FUNC(priv_val_get)(bc, n) | ret << n; | |
278 | #endif | ||
279 | |||
280 | 59 | return ret; | |
281 | } | ||
282 | |||
283 | /** | ||
284 | * Return n bits from the buffer, n has to be in the 0-64 range. | ||
285 | */ | ||
286 | 40 | static inline uint64_t BS_FUNC(read_64)(BSCTX *bc, unsigned int n) | |
287 | { | ||
288 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
|
17 | av_assert2(n <= 64); |
289 | |||
290 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 40 times.
|
40 | if (n == 64) { |
291 | ✗ | uint64_t ret = BS_FUNC(read_63)(bc, 63); | |
292 | #ifdef BITSTREAM_TEMPLATE_LE | ||
293 | ✗ | return ret | ((uint64_t)BS_FUNC(read_bit)(bc) << 63); | |
294 | #else | ||
295 | ✗ | return (ret << 1) | (uint64_t)BS_FUNC(read_bit)(bc); | |
296 | #endif | ||
297 | } | ||
298 | 40 | return BS_FUNC(read_63)(bc, n); | |
299 | } | ||
300 | |||
301 | /** | ||
302 | * Return n bits from the buffer as a signed integer, n has to be in the 1-32 | ||
303 | * range. May be faster than bits_read_signed() when n is not a compile-time | ||
304 | * constant and is known to be non-zero; | ||
305 | */ | ||
306 | 10426 | static inline int32_t BS_FUNC(read_signed_nz)(BSCTX *bc, unsigned int n) | |
307 | { | ||
308 |
2/4✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 66 times.
|
66 | av_assert2(n > 0 && n <= 32); |
309 | 10426 | return sign_extend(BS_FUNC(read_nz)(bc, n), n); | |
310 | } | ||
311 | |||
312 | /** | ||
313 | * Return n bits from the buffer as a signed integer. | ||
314 | * n has to be in the 0-32 range. | ||
315 | */ | ||
316 | 42 | static inline int32_t BS_FUNC(read_signed)(BSCTX *bc, unsigned int n) | |
317 | { | ||
318 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 42 times.
|
42 | av_assert2(n <= 32); |
319 | |||
320 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 42 times.
|
42 | if (!n) |
321 | ✗ | return 0; | |
322 | |||
323 | 42 | return BS_FUNC(read_signed_nz)(bc, n); | |
324 | } | ||
325 | |||
326 | /** | ||
327 | * Return n bits from the buffer but do not change the buffer state. | ||
328 | * n has to be in the 1-32 range. May | ||
329 | */ | ||
330 | 51742538 | static inline uint32_t BS_FUNC(peek_nz)(BSCTX *bc, unsigned int n) | |
331 | { | ||
332 |
2/4✓ Branch 0 taken 117 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 117 times.
|
117 | av_assert2(n > 0 && n <= 32); |
333 | |||
334 |
2/2✓ Branch 0 taken 7593864 times.
✓ Branch 1 taken 44148674 times.
|
51742538 | if (n > bc->bits_valid) |
335 | 7593864 | BS_FUNC(priv_refill_32)(bc); | |
336 | |||
337 | 51742538 | return BS_FUNC(priv_val_show)(bc, n); | |
338 | } | ||
339 | |||
340 | /** | ||
341 | * Return n bits from the buffer but do not change the buffer state. | ||
342 | * n has to be in the 0-32 range. | ||
343 | */ | ||
344 | 51742486 | static inline uint32_t BS_FUNC(peek)(BSCTX *bc, unsigned int n) | |
345 | { | ||
346 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 65 times.
|
65 | av_assert2(n <= 32); |
347 | |||
348 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 51742481 times.
|
51742486 | if (!n) |
349 | 5 | return 0; | |
350 | |||
351 | 51742481 | return BS_FUNC(peek_nz)(bc, n); | |
352 | } | ||
353 | |||
354 | /** | ||
355 | * Return n bits from the buffer as a signed integer, do not change the buffer | ||
356 | * state. n has to be in the 1-32 range. May be faster than bits_peek_signed() | ||
357 | * when n is not a compile-time constant and is known to be non-zero; | ||
358 | */ | ||
359 | 44 | static inline int BS_FUNC(peek_signed_nz)(BSCTX *bc, unsigned int n) | |
360 | { | ||
361 |
2/4✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 44 times.
|
44 | av_assert2(n > 0 && n <= 32); |
362 | 44 | return sign_extend(BS_FUNC(peek_nz)(bc, n), n); | |
363 | } | ||
364 | |||
365 | /** | ||
366 | * Return n bits from the buffer as a signed integer, | ||
367 | * do not change the buffer state. | ||
368 | * n has to be in the 0-32 range. | ||
369 | */ | ||
370 | 20 | static inline int BS_FUNC(peek_signed)(BSCTX *bc, unsigned int n) | |
371 | { | ||
372 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
|
20 | av_assert2(n <= 32); |
373 | |||
374 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
|
20 | if (!n) |
375 | ✗ | return 0; | |
376 | |||
377 | 20 | return BS_FUNC(peek_signed_nz)(bc, n); | |
378 | } | ||
379 | |||
380 | /** | ||
381 | * Skip n bits in the buffer. | ||
382 | */ | ||
383 | 275 | static inline void BS_FUNC(skip)(BSCTX *bc, unsigned int n) | |
384 | { | ||
385 |
2/2✓ Branch 0 taken 104 times.
✓ Branch 1 taken 171 times.
|
275 | if (n < bc->bits_valid) |
386 | 104 | BS_FUNC(priv_skip_remaining)(bc, n); | |
387 | else { | ||
388 | 171 | n -= bc->bits_valid; | |
389 | 171 | bc->bits = 0; | |
390 | 171 | bc->bits_valid = 0; | |
391 | |||
392 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 171 times.
|
171 | if (n >= 64) { |
393 | ✗ | unsigned int skip = n / 8; | |
394 | |||
395 | ✗ | n -= skip * 8; | |
396 | ✗ | bc->ptr += skip; | |
397 | } | ||
398 | 171 | BS_FUNC(priv_refill_64)(bc); | |
399 |
2/2✓ Branch 0 taken 41 times.
✓ Branch 1 taken 130 times.
|
171 | if (n) |
400 | 41 | BS_FUNC(priv_skip_remaining)(bc, n); | |
401 | } | ||
402 | 275 | } | |
403 | |||
404 | /** | ||
405 | * Seek to the given bit position. | ||
406 | */ | ||
407 | static inline void BS_FUNC(seek)(BSCTX *bc, unsigned pos) | ||
408 | { | ||
409 | bc->ptr = bc->buffer; | ||
410 | bc->bits = 0; | ||
411 | bc->bits_valid = 0; | ||
412 | |||
413 | BS_FUNC(skip)(bc, pos); | ||
414 | } | ||
415 | |||
416 | /** | ||
417 | * Skip bits to a byte boundary. | ||
418 | */ | ||
419 | 83 | static inline const uint8_t *BS_FUNC(align)(BSCTX *bc) | |
420 | { | ||
421 | 83 | unsigned int n = -BS_FUNC(tell)(bc) & 7; | |
422 |
2/2✓ Branch 0 taken 75 times.
✓ Branch 1 taken 8 times.
|
83 | if (n) |
423 | 75 | BS_FUNC(skip)(bc, n); | |
424 | 83 | return bc->buffer + (BS_FUNC(tell)(bc) >> 3); | |
425 | } | ||
426 | |||
427 | /** | ||
428 | * Read MPEG-1 dc-style VLC (sign bit + mantissa with no MSB). | ||
429 | * If MSB not set it is negative. | ||
430 | * @param n length in bits | ||
431 | */ | ||
432 | static inline int BS_FUNC(read_xbits)(BSCTX *bc, unsigned int n) | ||
433 | { | ||
434 | int32_t cache = BS_FUNC(peek)(bc, 32); | ||
435 | int sign = ~cache >> 31; | ||
436 | BS_FUNC(priv_skip_remaining)(bc, n); | ||
437 | |||
438 | return ((((uint32_t)(sign ^ cache)) >> (32 - n)) ^ sign) - sign; | ||
439 | } | ||
440 | |||
441 | /** | ||
442 | * Return decoded truncated unary code for the values 0, 1, 2. | ||
443 | */ | ||
444 | static inline int BS_FUNC(decode012)(BSCTX *bc) | ||
445 | { | ||
446 | if (!BS_FUNC(read_bit)(bc)) | ||
447 | return 0; | ||
448 | else | ||
449 | return BS_FUNC(read_bit)(bc) + 1; | ||
450 | } | ||
451 | |||
452 | /** | ||
453 | * Return decoded truncated unary code for the values 2, 1, 0. | ||
454 | */ | ||
455 | static inline int BS_FUNC(decode210)(BSCTX *bc) | ||
456 | { | ||
457 | if (BS_FUNC(read_bit)(bc)) | ||
458 | return 0; | ||
459 | else | ||
460 | return 2 - BS_FUNC(read_bit)(bc); | ||
461 | } | ||
462 | |||
463 | /* Read sign bit and flip the sign of the provided value accordingly. */ | ||
464 | 22 | static inline int BS_FUNC(apply_sign)(BSCTX *bc, int val) | |
465 | { | ||
466 | 22 | int sign = BS_FUNC(read_signed)(bc, 1); | |
467 | 22 | return (val ^ sign) - sign; | |
468 | } | ||
469 | |||
470 | static inline int BS_FUNC(skip_1stop_8data)(BSCTX *s) | ||
471 | { | ||
472 | if (BS_FUNC(left)(s) <= 0) | ||
473 | return AVERROR_INVALIDDATA; | ||
474 | |||
475 | while (BS_FUNC(read_bit)(s)) { | ||
476 | BS_FUNC(skip)(s, 8); | ||
477 | if (BS_FUNC(left)(s) <= 0) | ||
478 | return AVERROR_INVALIDDATA; | ||
479 | } | ||
480 | |||
481 | return 0; | ||
482 | } | ||
483 | |||
484 | /** | ||
485 | * Return the LUT element for the given bitstream configuration. | ||
486 | */ | ||
487 | 284862 | static inline int BS_FUNC(priv_set_idx)(BSCTX *bc, int code, int *n, | |
488 | int *nb_bits, const VLCElem *table) | ||
489 | { | ||
490 | unsigned idx; | ||
491 | |||
492 | 284862 | *nb_bits = -*n; | |
493 | 284862 | idx = BS_FUNC(peek)(bc, *nb_bits) + code; | |
494 | 284862 | *n = table[idx].len; | |
495 | |||
496 | 284862 | return table[idx].sym; | |
497 | } | ||
498 | |||
499 | /** | ||
500 | * Parse a vlc code. | ||
501 | * @param bits is the number of bits which will be read at once, must be | ||
502 | * identical to nb_bits in vlc_init() | ||
503 | * @param max_depth is the number of times bits bits must be read to completely | ||
504 | * read the longest vlc code | ||
505 | * = (max_vlc_length + bits - 1) / bits | ||
506 | * If the vlc code is invalid and max_depth=1, then no bits will be removed. | ||
507 | * If the vlc code is invalid and max_depth>1, then the number of bits removed | ||
508 | * is undefined. | ||
509 | */ | ||
510 | 30302187 | static inline int BS_FUNC(read_vlc)(BSCTX *bc, const VLCElem *table, | |
511 | int bits, int max_depth) | ||
512 | { | ||
513 | int nb_bits; | ||
514 | 30302187 | unsigned idx = BS_FUNC(peek)(bc, bits); | |
515 | 30302187 | int code = table[idx].sym; | |
516 | 30302187 | int n = table[idx].len; | |
517 | |||
518 |
3/4✓ Branch 0 taken 30302187 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 201847 times.
✓ Branch 3 taken 30100340 times.
|
30302187 | if (max_depth > 1 && n < 0) { |
519 | 201847 | BS_FUNC(priv_skip_remaining)(bc, bits); | |
520 | 201847 | code = BS_FUNC(priv_set_idx)(bc, code, &n, &nb_bits, table); | |
521 |
3/4✓ Branch 0 taken 201847 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 57 times.
✓ Branch 3 taken 201790 times.
|
201847 | if (max_depth > 2 && n < 0) { |
522 | 57 | BS_FUNC(priv_skip_remaining)(bc, nb_bits); | |
523 | 57 | code = BS_FUNC(priv_set_idx)(bc, code, &n, &nb_bits, table); | |
524 | } | ||
525 | } | ||
526 | 30302187 | BS_FUNC(priv_skip_remaining)(bc, n); | |
527 | |||
528 | 30302187 | return code; | |
529 | } | ||
530 | |||
531 | /** | ||
532 | * Parse a vlc / vlc_multi code. | ||
533 | * @param bits is the number of bits which will be read at once, must be | ||
534 | * identical to nb_bits in vlc_init() | ||
535 | * @param max_depth is the number of times bits bits must be read to completely | ||
536 | * read the longest vlc code | ||
537 | * = (max_vlc_length + bits - 1) / bits | ||
538 | * @param dst the parsed symbol(s) will be stored here. Up to 8 bytes are written | ||
539 | * @returns number of symbols parsed | ||
540 | * If the vlc code is invalid and max_depth=1, then no bits will be removed. | ||
541 | * If the vlc code is invalid and max_depth>1, then the number of bits removed | ||
542 | * is undefined. | ||
543 | */ | ||
544 | 21155372 | static inline int BS_FUNC(read_vlc_multi)(BSCTX *bc, uint8_t dst[8], | |
545 | const VLC_MULTI_ELEM *const Jtable, | ||
546 | const VLCElem *const table, | ||
547 | const int bits, const int max_depth, | ||
548 | const int symbols_size) | ||
549 | { | ||
550 | 21155372 | unsigned idx = BS_FUNC(peek)(bc, bits); | |
551 | 21155372 | int ret, nb_bits, code, n = Jtable[idx].len; | |
552 |
2/2✓ Branch 0 taken 21072414 times.
✓ Branch 1 taken 82958 times.
|
21155372 | if (Jtable[idx].num) { |
553 | 21072414 | AV_COPY64U(dst, Jtable[idx].val8); | |
554 | 21072414 | ret = Jtable[idx].num; | |
555 | } else { | ||
556 | 82958 | code = table[idx].sym; | |
557 | 82958 | n = table[idx].len; | |
558 |
2/4✓ Branch 0 taken 82958 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 82958 times.
✗ Branch 3 not taken.
|
82958 | if (max_depth > 1 && n < 0) { |
559 | 82958 | BS_FUNC(priv_skip_remaining)(bc, bits); | |
560 | 82958 | code = BS_FUNC(priv_set_idx)(bc, code, &n, &nb_bits, table); | |
561 |
2/4✓ Branch 0 taken 82958 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 82958 times.
|
82958 | if (max_depth > 2 && n < 0) { |
562 | ✗ | BS_FUNC(priv_skip_remaining)(bc, nb_bits); | |
563 | ✗ | code = BS_FUNC(priv_set_idx)(bc, code, &n, &nb_bits, table); | |
564 | } | ||
565 | } | ||
566 |
1/2✓ Branch 0 taken 82958 times.
✗ Branch 1 not taken.
|
82958 | if (symbols_size == 1) |
567 | 82958 | *dst = code; | |
568 | else | ||
569 | ✗ | AV_WN16(dst, code); | |
570 | 82958 | ret = n > 0; | |
571 | } | ||
572 | 21155372 | BS_FUNC(priv_skip_remaining)(bc, n); | |
573 | |||
574 | 21155372 | return ret; | |
575 | } | ||
576 | |||
577 | #undef BSCTX | ||
578 | #undef BS_FUNC | ||
579 | #undef BS_JOIN3 | ||
580 | #undef BS_JOIN | ||
581 | #undef BS_SUFFIX_UPPER | ||
582 | #undef BS_SUFFIX_LOWER | ||
583 |