1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
3cabdff1aSopenharmony_ci * Copyright (c) 2016 Alexandra Hájková
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci/**
23cabdff1aSopenharmony_ci * @file
24cabdff1aSopenharmony_ci * bitstream reader API header.
25cabdff1aSopenharmony_ci */
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci#ifndef AVCODEC_GET_BITS_H
28cabdff1aSopenharmony_ci#define AVCODEC_GET_BITS_H
29cabdff1aSopenharmony_ci
30cabdff1aSopenharmony_ci#include <stdint.h>
31cabdff1aSopenharmony_ci
32cabdff1aSopenharmony_ci#include "libavutil/common.h"
33cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h"
34cabdff1aSopenharmony_ci#include "libavutil/avassert.h"
35cabdff1aSopenharmony_ci
36cabdff1aSopenharmony_ci#include "defs.h"
37cabdff1aSopenharmony_ci#include "mathops.h"
38cabdff1aSopenharmony_ci#include "vlc.h"
39cabdff1aSopenharmony_ci
40cabdff1aSopenharmony_ci/*
41cabdff1aSopenharmony_ci * Safe bitstream reading:
42cabdff1aSopenharmony_ci * optionally, the get_bits API can check to ensure that we
43cabdff1aSopenharmony_ci * don't read past input buffer boundaries. This is protected
44cabdff1aSopenharmony_ci * with CONFIG_SAFE_BITSTREAM_READER at the global level, and
45cabdff1aSopenharmony_ci * then below that with UNCHECKED_BITSTREAM_READER at the per-
46cabdff1aSopenharmony_ci * decoder level. This means that decoders that check internally
47cabdff1aSopenharmony_ci * can "#define UNCHECKED_BITSTREAM_READER 1" to disable
48cabdff1aSopenharmony_ci * overread checks.
49cabdff1aSopenharmony_ci * Boundary checking causes a minor performance penalty so for
50cabdff1aSopenharmony_ci * applications that won't want/need this, it can be disabled
51cabdff1aSopenharmony_ci * globally using "#define CONFIG_SAFE_BITSTREAM_READER 0".
52cabdff1aSopenharmony_ci */
53cabdff1aSopenharmony_ci#ifndef UNCHECKED_BITSTREAM_READER
54cabdff1aSopenharmony_ci#define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER
55cabdff1aSopenharmony_ci#endif
56cabdff1aSopenharmony_ci
57cabdff1aSopenharmony_ci#ifndef CACHED_BITSTREAM_READER
58cabdff1aSopenharmony_ci#define CACHED_BITSTREAM_READER 0
59cabdff1aSopenharmony_ci#endif
60cabdff1aSopenharmony_ci
61cabdff1aSopenharmony_citypedef struct GetBitContext {
62cabdff1aSopenharmony_ci    const uint8_t *buffer, *buffer_end;
63cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
64cabdff1aSopenharmony_ci    uint64_t cache;
65cabdff1aSopenharmony_ci    unsigned bits_left;
66cabdff1aSopenharmony_ci#endif
67cabdff1aSopenharmony_ci    int index;
68cabdff1aSopenharmony_ci    int size_in_bits;
69cabdff1aSopenharmony_ci    int size_in_bits_plus8;
70cabdff1aSopenharmony_ci} GetBitContext;
71cabdff1aSopenharmony_ci
72cabdff1aSopenharmony_cistatic inline unsigned int get_bits(GetBitContext *s, int n);
73cabdff1aSopenharmony_cistatic inline void skip_bits(GetBitContext *s, int n);
74cabdff1aSopenharmony_cistatic inline unsigned int show_bits(GetBitContext *s, int n);
75cabdff1aSopenharmony_ci
76cabdff1aSopenharmony_ci/* Bitstream reader API docs:
77cabdff1aSopenharmony_ci * name
78cabdff1aSopenharmony_ci *   arbitrary name which is used as prefix for the internal variables
79cabdff1aSopenharmony_ci *
80cabdff1aSopenharmony_ci * gb
81cabdff1aSopenharmony_ci *   getbitcontext
82cabdff1aSopenharmony_ci *
83cabdff1aSopenharmony_ci * OPEN_READER(name, gb)
84cabdff1aSopenharmony_ci *   load gb into local variables
85cabdff1aSopenharmony_ci *
86cabdff1aSopenharmony_ci * CLOSE_READER(name, gb)
87cabdff1aSopenharmony_ci *   store local vars in gb
88cabdff1aSopenharmony_ci *
89cabdff1aSopenharmony_ci * UPDATE_CACHE(name, gb)
90cabdff1aSopenharmony_ci *   Refill the internal cache from the bitstream.
91cabdff1aSopenharmony_ci *   After this call at least MIN_CACHE_BITS will be available.
92cabdff1aSopenharmony_ci *
93cabdff1aSopenharmony_ci * GET_CACHE(name, gb)
94cabdff1aSopenharmony_ci *   Will output the contents of the internal cache,
95cabdff1aSopenharmony_ci *   next bit is MSB of 32 or 64 bits (FIXME 64 bits).
96cabdff1aSopenharmony_ci *
97cabdff1aSopenharmony_ci * SHOW_UBITS(name, gb, num)
98cabdff1aSopenharmony_ci *   Will return the next num bits.
99cabdff1aSopenharmony_ci *
100cabdff1aSopenharmony_ci * SHOW_SBITS(name, gb, num)
101cabdff1aSopenharmony_ci *   Will return the next num bits and do sign extension.
102cabdff1aSopenharmony_ci *
103cabdff1aSopenharmony_ci * SKIP_BITS(name, gb, num)
104cabdff1aSopenharmony_ci *   Will skip over the next num bits.
105cabdff1aSopenharmony_ci *   Note, this is equivalent to SKIP_CACHE; SKIP_COUNTER.
106cabdff1aSopenharmony_ci *
107cabdff1aSopenharmony_ci * SKIP_CACHE(name, gb, num)
108cabdff1aSopenharmony_ci *   Will remove the next num bits from the cache (note SKIP_COUNTER
109cabdff1aSopenharmony_ci *   MUST be called before UPDATE_CACHE / CLOSE_READER).
110cabdff1aSopenharmony_ci *
111cabdff1aSopenharmony_ci * SKIP_COUNTER(name, gb, num)
112cabdff1aSopenharmony_ci *   Will increment the internal bit counter (see SKIP_CACHE & SKIP_BITS).
113cabdff1aSopenharmony_ci *
114cabdff1aSopenharmony_ci * LAST_SKIP_BITS(name, gb, num)
115cabdff1aSopenharmony_ci *   Like SKIP_BITS, to be used if next call is UPDATE_CACHE or CLOSE_READER.
116cabdff1aSopenharmony_ci *
117cabdff1aSopenharmony_ci * BITS_LEFT(name, gb)
118cabdff1aSopenharmony_ci *   Return the number of bits left
119cabdff1aSopenharmony_ci *
120cabdff1aSopenharmony_ci * For examples see get_bits, show_bits, skip_bits, get_vlc.
121cabdff1aSopenharmony_ci */
122cabdff1aSopenharmony_ci
123cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
124cabdff1aSopenharmony_ci#   define MIN_CACHE_BITS 64
125cabdff1aSopenharmony_ci#elif defined LONG_BITSTREAM_READER
126cabdff1aSopenharmony_ci#   define MIN_CACHE_BITS 32
127cabdff1aSopenharmony_ci#else
128cabdff1aSopenharmony_ci#   define MIN_CACHE_BITS 25
129cabdff1aSopenharmony_ci#endif
130cabdff1aSopenharmony_ci
131cabdff1aSopenharmony_ci#if !CACHED_BITSTREAM_READER
132cabdff1aSopenharmony_ci
133cabdff1aSopenharmony_ci#define OPEN_READER_NOSIZE(name, gb)            \
134cabdff1aSopenharmony_ci    unsigned int name ## _index = (gb)->index;  \
135cabdff1aSopenharmony_ci    unsigned int av_unused name ## _cache
136cabdff1aSopenharmony_ci
137cabdff1aSopenharmony_ci#if UNCHECKED_BITSTREAM_READER
138cabdff1aSopenharmony_ci#define OPEN_READER(name, gb) OPEN_READER_NOSIZE(name, gb)
139cabdff1aSopenharmony_ci
140cabdff1aSopenharmony_ci#define BITS_AVAILABLE(name, gb) 1
141cabdff1aSopenharmony_ci#else
142cabdff1aSopenharmony_ci#define OPEN_READER(name, gb)                   \
143cabdff1aSopenharmony_ci    OPEN_READER_NOSIZE(name, gb);               \
144cabdff1aSopenharmony_ci    unsigned int name ## _size_plus8 = (gb)->size_in_bits_plus8
145cabdff1aSopenharmony_ci
146cabdff1aSopenharmony_ci#define BITS_AVAILABLE(name, gb) name ## _index < name ## _size_plus8
147cabdff1aSopenharmony_ci#endif
148cabdff1aSopenharmony_ci
149cabdff1aSopenharmony_ci#define CLOSE_READER(name, gb) (gb)->index = name ## _index
150cabdff1aSopenharmony_ci
151cabdff1aSopenharmony_ci# ifdef LONG_BITSTREAM_READER
152cabdff1aSopenharmony_ci
153cabdff1aSopenharmony_ci# define UPDATE_CACHE_LE(name, gb) name ## _cache = \
154cabdff1aSopenharmony_ci      AV_RL64((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7)
155cabdff1aSopenharmony_ci
156cabdff1aSopenharmony_ci# define UPDATE_CACHE_BE(name, gb) name ## _cache = \
157cabdff1aSopenharmony_ci      AV_RB64((gb)->buffer + (name ## _index >> 3)) >> (32 - (name ## _index & 7))
158cabdff1aSopenharmony_ci
159cabdff1aSopenharmony_ci#else
160cabdff1aSopenharmony_ci
161cabdff1aSopenharmony_ci# define UPDATE_CACHE_LE(name, gb) name ## _cache = \
162cabdff1aSopenharmony_ci      AV_RL32((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7)
163cabdff1aSopenharmony_ci
164cabdff1aSopenharmony_ci# define UPDATE_CACHE_BE(name, gb) name ## _cache = \
165cabdff1aSopenharmony_ci      AV_RB32((gb)->buffer + (name ## _index >> 3)) << (name ## _index & 7)
166cabdff1aSopenharmony_ci
167cabdff1aSopenharmony_ci#endif
168cabdff1aSopenharmony_ci
169cabdff1aSopenharmony_ci
170cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
171cabdff1aSopenharmony_ci
172cabdff1aSopenharmony_ci# define UPDATE_CACHE(name, gb) UPDATE_CACHE_LE(name, gb)
173cabdff1aSopenharmony_ci
174cabdff1aSopenharmony_ci# define SKIP_CACHE(name, gb, num) name ## _cache >>= (num)
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_ci#else
177cabdff1aSopenharmony_ci
178cabdff1aSopenharmony_ci# define UPDATE_CACHE(name, gb) UPDATE_CACHE_BE(name, gb)
179cabdff1aSopenharmony_ci
180cabdff1aSopenharmony_ci# define SKIP_CACHE(name, gb, num) name ## _cache <<= (num)
181cabdff1aSopenharmony_ci
182cabdff1aSopenharmony_ci#endif
183cabdff1aSopenharmony_ci
184cabdff1aSopenharmony_ci#if UNCHECKED_BITSTREAM_READER
185cabdff1aSopenharmony_ci#   define SKIP_COUNTER(name, gb, num) name ## _index += (num)
186cabdff1aSopenharmony_ci#else
187cabdff1aSopenharmony_ci#   define SKIP_COUNTER(name, gb, num) \
188cabdff1aSopenharmony_ci    name ## _index = FFMIN(name ## _size_plus8, name ## _index + (num))
189cabdff1aSopenharmony_ci#endif
190cabdff1aSopenharmony_ci
191cabdff1aSopenharmony_ci#define BITS_LEFT(name, gb) ((int)((gb)->size_in_bits - name ## _index))
192cabdff1aSopenharmony_ci
193cabdff1aSopenharmony_ci#define SKIP_BITS(name, gb, num)                \
194cabdff1aSopenharmony_ci    do {                                        \
195cabdff1aSopenharmony_ci        SKIP_CACHE(name, gb, num);              \
196cabdff1aSopenharmony_ci        SKIP_COUNTER(name, gb, num);            \
197cabdff1aSopenharmony_ci    } while (0)
198cabdff1aSopenharmony_ci
199cabdff1aSopenharmony_ci#define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num)
200cabdff1aSopenharmony_ci
201cabdff1aSopenharmony_ci#define SHOW_UBITS_LE(name, gb, num) zero_extend(name ## _cache, num)
202cabdff1aSopenharmony_ci#define SHOW_SBITS_LE(name, gb, num) sign_extend(name ## _cache, num)
203cabdff1aSopenharmony_ci
204cabdff1aSopenharmony_ci#define SHOW_UBITS_BE(name, gb, num) NEG_USR32(name ## _cache, num)
205cabdff1aSopenharmony_ci#define SHOW_SBITS_BE(name, gb, num) NEG_SSR32(name ## _cache, num)
206cabdff1aSopenharmony_ci
207cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
208cabdff1aSopenharmony_ci#   define SHOW_UBITS(name, gb, num) SHOW_UBITS_LE(name, gb, num)
209cabdff1aSopenharmony_ci#   define SHOW_SBITS(name, gb, num) SHOW_SBITS_LE(name, gb, num)
210cabdff1aSopenharmony_ci#else
211cabdff1aSopenharmony_ci#   define SHOW_UBITS(name, gb, num) SHOW_UBITS_BE(name, gb, num)
212cabdff1aSopenharmony_ci#   define SHOW_SBITS(name, gb, num) SHOW_SBITS_BE(name, gb, num)
213cabdff1aSopenharmony_ci#endif
214cabdff1aSopenharmony_ci
215cabdff1aSopenharmony_ci#define GET_CACHE(name, gb) ((uint32_t) name ## _cache)
216cabdff1aSopenharmony_ci
217cabdff1aSopenharmony_ci#endif
218cabdff1aSopenharmony_ci
219cabdff1aSopenharmony_cistatic inline int get_bits_count(const GetBitContext *s)
220cabdff1aSopenharmony_ci{
221cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
222cabdff1aSopenharmony_ci    return s->index - s->bits_left;
223cabdff1aSopenharmony_ci#else
224cabdff1aSopenharmony_ci    return s->index;
225cabdff1aSopenharmony_ci#endif
226cabdff1aSopenharmony_ci}
227cabdff1aSopenharmony_ci
228cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
229cabdff1aSopenharmony_cistatic inline void refill_32(GetBitContext *s, int is_le)
230cabdff1aSopenharmony_ci{
231cabdff1aSopenharmony_ci#if !UNCHECKED_BITSTREAM_READER
232cabdff1aSopenharmony_ci    if (s->index >> 3 >= s->buffer_end - s->buffer)
233cabdff1aSopenharmony_ci        return;
234cabdff1aSopenharmony_ci#endif
235cabdff1aSopenharmony_ci
236cabdff1aSopenharmony_ci    if (is_le)
237cabdff1aSopenharmony_ci        s->cache = (uint64_t)AV_RL32(s->buffer + (s->index >> 3)) << s->bits_left | s->cache;
238cabdff1aSopenharmony_ci    else
239cabdff1aSopenharmony_ci        s->cache = s->cache | (uint64_t)AV_RB32(s->buffer + (s->index >> 3)) << (32 - s->bits_left);
240cabdff1aSopenharmony_ci    s->index     += 32;
241cabdff1aSopenharmony_ci    s->bits_left += 32;
242cabdff1aSopenharmony_ci}
243cabdff1aSopenharmony_ci
244cabdff1aSopenharmony_cistatic inline void refill_64(GetBitContext *s, int is_le)
245cabdff1aSopenharmony_ci{
246cabdff1aSopenharmony_ci#if !UNCHECKED_BITSTREAM_READER
247cabdff1aSopenharmony_ci    if (s->index >> 3 >= s->buffer_end - s->buffer)
248cabdff1aSopenharmony_ci        return;
249cabdff1aSopenharmony_ci#endif
250cabdff1aSopenharmony_ci
251cabdff1aSopenharmony_ci    if (is_le)
252cabdff1aSopenharmony_ci        s->cache = AV_RL64(s->buffer + (s->index >> 3));
253cabdff1aSopenharmony_ci    else
254cabdff1aSopenharmony_ci        s->cache = AV_RB64(s->buffer + (s->index >> 3));
255cabdff1aSopenharmony_ci    s->index += 64;
256cabdff1aSopenharmony_ci    s->bits_left = 64;
257cabdff1aSopenharmony_ci}
258cabdff1aSopenharmony_ci
259cabdff1aSopenharmony_cistatic inline uint64_t get_val(GetBitContext *s, unsigned n, int is_le)
260cabdff1aSopenharmony_ci{
261cabdff1aSopenharmony_ci    uint64_t ret;
262cabdff1aSopenharmony_ci    av_assert2(n>0 && n<=63);
263cabdff1aSopenharmony_ci    if (is_le) {
264cabdff1aSopenharmony_ci        ret = s->cache & ((UINT64_C(1) << n) - 1);
265cabdff1aSopenharmony_ci        s->cache >>= n;
266cabdff1aSopenharmony_ci    } else {
267cabdff1aSopenharmony_ci        ret = s->cache >> (64 - n);
268cabdff1aSopenharmony_ci        s->cache <<= n;
269cabdff1aSopenharmony_ci    }
270cabdff1aSopenharmony_ci    s->bits_left -= n;
271cabdff1aSopenharmony_ci    return ret;
272cabdff1aSopenharmony_ci}
273cabdff1aSopenharmony_ci
274cabdff1aSopenharmony_cistatic inline unsigned show_val(const GetBitContext *s, unsigned n)
275cabdff1aSopenharmony_ci{
276cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
277cabdff1aSopenharmony_ci    return s->cache & ((UINT64_C(1) << n) - 1);
278cabdff1aSopenharmony_ci#else
279cabdff1aSopenharmony_ci    return s->cache >> (64 - n);
280cabdff1aSopenharmony_ci#endif
281cabdff1aSopenharmony_ci}
282cabdff1aSopenharmony_ci#endif
283cabdff1aSopenharmony_ci
284cabdff1aSopenharmony_ci/**
285cabdff1aSopenharmony_ci * Skips the specified number of bits.
286cabdff1aSopenharmony_ci * @param n the number of bits to skip,
287cabdff1aSopenharmony_ci *          For the UNCHECKED_BITSTREAM_READER this must not cause the distance
288cabdff1aSopenharmony_ci *          from the start to overflow int32_t. Staying within the bitstream + padding
289cabdff1aSopenharmony_ci *          is sufficient, too.
290cabdff1aSopenharmony_ci */
291cabdff1aSopenharmony_cistatic inline void skip_bits_long(GetBitContext *s, int n)
292cabdff1aSopenharmony_ci{
293cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
294cabdff1aSopenharmony_ci    skip_bits(s, n);
295cabdff1aSopenharmony_ci#else
296cabdff1aSopenharmony_ci#if UNCHECKED_BITSTREAM_READER
297cabdff1aSopenharmony_ci    s->index += n;
298cabdff1aSopenharmony_ci#else
299cabdff1aSopenharmony_ci    s->index += av_clip(n, -s->index, s->size_in_bits_plus8 - s->index);
300cabdff1aSopenharmony_ci#endif
301cabdff1aSopenharmony_ci#endif
302cabdff1aSopenharmony_ci}
303cabdff1aSopenharmony_ci
304cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
305cabdff1aSopenharmony_cistatic inline void skip_remaining(GetBitContext *s, unsigned n)
306cabdff1aSopenharmony_ci{
307cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
308cabdff1aSopenharmony_ci    s->cache >>= n;
309cabdff1aSopenharmony_ci#else
310cabdff1aSopenharmony_ci    s->cache <<= n;
311cabdff1aSopenharmony_ci#endif
312cabdff1aSopenharmony_ci    s->bits_left -= n;
313cabdff1aSopenharmony_ci}
314cabdff1aSopenharmony_ci#endif
315cabdff1aSopenharmony_ci
316cabdff1aSopenharmony_ci/**
317cabdff1aSopenharmony_ci * Read MPEG-1 dc-style VLC (sign bit + mantissa with no MSB).
318cabdff1aSopenharmony_ci * if MSB not set it is negative
319cabdff1aSopenharmony_ci * @param n length in bits
320cabdff1aSopenharmony_ci */
321cabdff1aSopenharmony_cistatic inline int get_xbits(GetBitContext *s, int n)
322cabdff1aSopenharmony_ci{
323cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
324cabdff1aSopenharmony_ci    int32_t cache = show_bits(s, 32);
325cabdff1aSopenharmony_ci    int sign = ~cache >> 31;
326cabdff1aSopenharmony_ci    skip_remaining(s, n);
327cabdff1aSopenharmony_ci
328cabdff1aSopenharmony_ci    return ((((uint32_t)(sign ^ cache)) >> (32 - n)) ^ sign) - sign;
329cabdff1aSopenharmony_ci#else
330cabdff1aSopenharmony_ci    register int sign;
331cabdff1aSopenharmony_ci    register int32_t cache;
332cabdff1aSopenharmony_ci    OPEN_READER(re, s);
333cabdff1aSopenharmony_ci    av_assert2(n>0 && n<=25);
334cabdff1aSopenharmony_ci    UPDATE_CACHE(re, s);
335cabdff1aSopenharmony_ci    cache = GET_CACHE(re, s);
336cabdff1aSopenharmony_ci    sign  = ~cache >> 31;
337cabdff1aSopenharmony_ci    LAST_SKIP_BITS(re, s, n);
338cabdff1aSopenharmony_ci    CLOSE_READER(re, s);
339cabdff1aSopenharmony_ci    return (NEG_USR32(sign ^ cache, n) ^ sign) - sign;
340cabdff1aSopenharmony_ci#endif
341cabdff1aSopenharmony_ci}
342cabdff1aSopenharmony_ci
343cabdff1aSopenharmony_ci#if !CACHED_BITSTREAM_READER
344cabdff1aSopenharmony_cistatic inline int get_xbits_le(GetBitContext *s, int n)
345cabdff1aSopenharmony_ci{
346cabdff1aSopenharmony_ci    register int sign;
347cabdff1aSopenharmony_ci    register int32_t cache;
348cabdff1aSopenharmony_ci    OPEN_READER(re, s);
349cabdff1aSopenharmony_ci    av_assert2(n>0 && n<=25);
350cabdff1aSopenharmony_ci    UPDATE_CACHE_LE(re, s);
351cabdff1aSopenharmony_ci    cache = GET_CACHE(re, s);
352cabdff1aSopenharmony_ci    sign  = sign_extend(~cache, n) >> 31;
353cabdff1aSopenharmony_ci    LAST_SKIP_BITS(re, s, n);
354cabdff1aSopenharmony_ci    CLOSE_READER(re, s);
355cabdff1aSopenharmony_ci    return (zero_extend(sign ^ cache, n) ^ sign) - sign;
356cabdff1aSopenharmony_ci}
357cabdff1aSopenharmony_ci#endif
358cabdff1aSopenharmony_ci
359cabdff1aSopenharmony_cistatic inline int get_sbits(GetBitContext *s, int n)
360cabdff1aSopenharmony_ci{
361cabdff1aSopenharmony_ci    register int tmp;
362cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
363cabdff1aSopenharmony_ci    av_assert2(n>0 && n<=25);
364cabdff1aSopenharmony_ci    tmp = sign_extend(get_bits(s, n), n);
365cabdff1aSopenharmony_ci#else
366cabdff1aSopenharmony_ci    OPEN_READER(re, s);
367cabdff1aSopenharmony_ci    av_assert2(n>0 && n<=25);
368cabdff1aSopenharmony_ci    UPDATE_CACHE(re, s);
369cabdff1aSopenharmony_ci    tmp = SHOW_SBITS(re, s, n);
370cabdff1aSopenharmony_ci    LAST_SKIP_BITS(re, s, n);
371cabdff1aSopenharmony_ci    CLOSE_READER(re, s);
372cabdff1aSopenharmony_ci#endif
373cabdff1aSopenharmony_ci    return tmp;
374cabdff1aSopenharmony_ci}
375cabdff1aSopenharmony_ci
376cabdff1aSopenharmony_ci/**
377cabdff1aSopenharmony_ci * Read 1-25 bits.
378cabdff1aSopenharmony_ci */
379cabdff1aSopenharmony_cistatic inline unsigned int get_bits(GetBitContext *s, int n)
380cabdff1aSopenharmony_ci{
381cabdff1aSopenharmony_ci    register unsigned int tmp;
382cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
383cabdff1aSopenharmony_ci
384cabdff1aSopenharmony_ci    av_assert2(n>0 && n<=32);
385cabdff1aSopenharmony_ci    if (n > s->bits_left) {
386cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
387cabdff1aSopenharmony_ci        refill_32(s, 1);
388cabdff1aSopenharmony_ci#else
389cabdff1aSopenharmony_ci        refill_32(s, 0);
390cabdff1aSopenharmony_ci#endif
391cabdff1aSopenharmony_ci        if (s->bits_left < 32)
392cabdff1aSopenharmony_ci            s->bits_left = n;
393cabdff1aSopenharmony_ci    }
394cabdff1aSopenharmony_ci
395cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
396cabdff1aSopenharmony_ci    tmp = get_val(s, n, 1);
397cabdff1aSopenharmony_ci#else
398cabdff1aSopenharmony_ci    tmp = get_val(s, n, 0);
399cabdff1aSopenharmony_ci#endif
400cabdff1aSopenharmony_ci#else
401cabdff1aSopenharmony_ci    OPEN_READER(re, s);
402cabdff1aSopenharmony_ci    av_assert2(n>0 && n<=25);
403cabdff1aSopenharmony_ci    UPDATE_CACHE(re, s);
404cabdff1aSopenharmony_ci    tmp = SHOW_UBITS(re, s, n);
405cabdff1aSopenharmony_ci    LAST_SKIP_BITS(re, s, n);
406cabdff1aSopenharmony_ci    CLOSE_READER(re, s);
407cabdff1aSopenharmony_ci#endif
408cabdff1aSopenharmony_ci    av_assert2(tmp < UINT64_C(1) << n);
409cabdff1aSopenharmony_ci    return tmp;
410cabdff1aSopenharmony_ci}
411cabdff1aSopenharmony_ci
412cabdff1aSopenharmony_ci/**
413cabdff1aSopenharmony_ci * Read 0-25 bits.
414cabdff1aSopenharmony_ci */
415cabdff1aSopenharmony_cistatic av_always_inline int get_bitsz(GetBitContext *s, int n)
416cabdff1aSopenharmony_ci{
417cabdff1aSopenharmony_ci    return n ? get_bits(s, n) : 0;
418cabdff1aSopenharmony_ci}
419cabdff1aSopenharmony_ci
420cabdff1aSopenharmony_cistatic inline unsigned int get_bits_le(GetBitContext *s, int n)
421cabdff1aSopenharmony_ci{
422cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
423cabdff1aSopenharmony_ci    av_assert2(n>0 && n<=32);
424cabdff1aSopenharmony_ci    if (n > s->bits_left) {
425cabdff1aSopenharmony_ci        refill_32(s, 1);
426cabdff1aSopenharmony_ci        if (s->bits_left < 32)
427cabdff1aSopenharmony_ci            s->bits_left = n;
428cabdff1aSopenharmony_ci    }
429cabdff1aSopenharmony_ci
430cabdff1aSopenharmony_ci    return get_val(s, n, 1);
431cabdff1aSopenharmony_ci#else
432cabdff1aSopenharmony_ci    register int tmp;
433cabdff1aSopenharmony_ci    OPEN_READER(re, s);
434cabdff1aSopenharmony_ci    av_assert2(n>0 && n<=25);
435cabdff1aSopenharmony_ci    UPDATE_CACHE_LE(re, s);
436cabdff1aSopenharmony_ci    tmp = SHOW_UBITS_LE(re, s, n);
437cabdff1aSopenharmony_ci    LAST_SKIP_BITS(re, s, n);
438cabdff1aSopenharmony_ci    CLOSE_READER(re, s);
439cabdff1aSopenharmony_ci    return tmp;
440cabdff1aSopenharmony_ci#endif
441cabdff1aSopenharmony_ci}
442cabdff1aSopenharmony_ci
443cabdff1aSopenharmony_ci/**
444cabdff1aSopenharmony_ci * Show 1-25 bits.
445cabdff1aSopenharmony_ci */
446cabdff1aSopenharmony_cistatic inline unsigned int show_bits(GetBitContext *s, int n)
447cabdff1aSopenharmony_ci{
448cabdff1aSopenharmony_ci    register unsigned int tmp;
449cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
450cabdff1aSopenharmony_ci    if (n > s->bits_left)
451cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
452cabdff1aSopenharmony_ci        refill_32(s, 1);
453cabdff1aSopenharmony_ci#else
454cabdff1aSopenharmony_ci        refill_32(s, 0);
455cabdff1aSopenharmony_ci#endif
456cabdff1aSopenharmony_ci
457cabdff1aSopenharmony_ci    tmp = show_val(s, n);
458cabdff1aSopenharmony_ci#else
459cabdff1aSopenharmony_ci    OPEN_READER_NOSIZE(re, s);
460cabdff1aSopenharmony_ci    av_assert2(n>0 && n<=25);
461cabdff1aSopenharmony_ci    UPDATE_CACHE(re, s);
462cabdff1aSopenharmony_ci    tmp = SHOW_UBITS(re, s, n);
463cabdff1aSopenharmony_ci#endif
464cabdff1aSopenharmony_ci    return tmp;
465cabdff1aSopenharmony_ci}
466cabdff1aSopenharmony_ci
467cabdff1aSopenharmony_cistatic inline void skip_bits(GetBitContext *s, int n)
468cabdff1aSopenharmony_ci{
469cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
470cabdff1aSopenharmony_ci    if (n < s->bits_left)
471cabdff1aSopenharmony_ci        skip_remaining(s, n);
472cabdff1aSopenharmony_ci    else {
473cabdff1aSopenharmony_ci        n -= s->bits_left;
474cabdff1aSopenharmony_ci        s->cache = 0;
475cabdff1aSopenharmony_ci        s->bits_left = 0;
476cabdff1aSopenharmony_ci
477cabdff1aSopenharmony_ci        if (n >= 64) {
478cabdff1aSopenharmony_ci            unsigned skip = (n / 8) * 8;
479cabdff1aSopenharmony_ci
480cabdff1aSopenharmony_ci            n -= skip;
481cabdff1aSopenharmony_ci            s->index += skip;
482cabdff1aSopenharmony_ci        }
483cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
484cabdff1aSopenharmony_ci        refill_64(s, 1);
485cabdff1aSopenharmony_ci#else
486cabdff1aSopenharmony_ci        refill_64(s, 0);
487cabdff1aSopenharmony_ci#endif
488cabdff1aSopenharmony_ci        if (n)
489cabdff1aSopenharmony_ci            skip_remaining(s, n);
490cabdff1aSopenharmony_ci    }
491cabdff1aSopenharmony_ci#else
492cabdff1aSopenharmony_ci    OPEN_READER(re, s);
493cabdff1aSopenharmony_ci    LAST_SKIP_BITS(re, s, n);
494cabdff1aSopenharmony_ci    CLOSE_READER(re, s);
495cabdff1aSopenharmony_ci#endif
496cabdff1aSopenharmony_ci}
497cabdff1aSopenharmony_ci
498cabdff1aSopenharmony_cistatic inline unsigned int get_bits1(GetBitContext *s)
499cabdff1aSopenharmony_ci{
500cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
501cabdff1aSopenharmony_ci    if (!s->bits_left)
502cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
503cabdff1aSopenharmony_ci        refill_64(s, 1);
504cabdff1aSopenharmony_ci#else
505cabdff1aSopenharmony_ci        refill_64(s, 0);
506cabdff1aSopenharmony_ci#endif
507cabdff1aSopenharmony_ci
508cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
509cabdff1aSopenharmony_ci    return get_val(s, 1, 1);
510cabdff1aSopenharmony_ci#else
511cabdff1aSopenharmony_ci    return get_val(s, 1, 0);
512cabdff1aSopenharmony_ci#endif
513cabdff1aSopenharmony_ci#else
514cabdff1aSopenharmony_ci    unsigned int index = s->index;
515cabdff1aSopenharmony_ci    uint8_t result     = s->buffer[index >> 3];
516cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
517cabdff1aSopenharmony_ci    result >>= index & 7;
518cabdff1aSopenharmony_ci    result  &= 1;
519cabdff1aSopenharmony_ci#else
520cabdff1aSopenharmony_ci    result <<= index & 7;
521cabdff1aSopenharmony_ci    result >>= 8 - 1;
522cabdff1aSopenharmony_ci#endif
523cabdff1aSopenharmony_ci#if !UNCHECKED_BITSTREAM_READER
524cabdff1aSopenharmony_ci    if (s->index < s->size_in_bits_plus8)
525cabdff1aSopenharmony_ci#endif
526cabdff1aSopenharmony_ci        index++;
527cabdff1aSopenharmony_ci    s->index = index;
528cabdff1aSopenharmony_ci
529cabdff1aSopenharmony_ci    return result;
530cabdff1aSopenharmony_ci#endif
531cabdff1aSopenharmony_ci}
532cabdff1aSopenharmony_ci
533cabdff1aSopenharmony_cistatic inline unsigned int show_bits1(GetBitContext *s)
534cabdff1aSopenharmony_ci{
535cabdff1aSopenharmony_ci    return show_bits(s, 1);
536cabdff1aSopenharmony_ci}
537cabdff1aSopenharmony_ci
538cabdff1aSopenharmony_cistatic inline void skip_bits1(GetBitContext *s)
539cabdff1aSopenharmony_ci{
540cabdff1aSopenharmony_ci    skip_bits(s, 1);
541cabdff1aSopenharmony_ci}
542cabdff1aSopenharmony_ci
543cabdff1aSopenharmony_ci/**
544cabdff1aSopenharmony_ci * Read 0-32 bits.
545cabdff1aSopenharmony_ci */
546cabdff1aSopenharmony_cistatic inline unsigned int get_bits_long(GetBitContext *s, int n)
547cabdff1aSopenharmony_ci{
548cabdff1aSopenharmony_ci    av_assert2(n>=0 && n<=32);
549cabdff1aSopenharmony_ci    if (!n) {
550cabdff1aSopenharmony_ci        return 0;
551cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
552cabdff1aSopenharmony_ci    }
553cabdff1aSopenharmony_ci    return get_bits(s, n);
554cabdff1aSopenharmony_ci#else
555cabdff1aSopenharmony_ci    } else if (n <= MIN_CACHE_BITS) {
556cabdff1aSopenharmony_ci        return get_bits(s, n);
557cabdff1aSopenharmony_ci    } else {
558cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
559cabdff1aSopenharmony_ci        unsigned ret = get_bits(s, 16);
560cabdff1aSopenharmony_ci        return ret | (get_bits(s, n - 16) << 16);
561cabdff1aSopenharmony_ci#else
562cabdff1aSopenharmony_ci        unsigned ret = get_bits(s, 16) << (n - 16);
563cabdff1aSopenharmony_ci        return ret | get_bits(s, n - 16);
564cabdff1aSopenharmony_ci#endif
565cabdff1aSopenharmony_ci    }
566cabdff1aSopenharmony_ci#endif
567cabdff1aSopenharmony_ci}
568cabdff1aSopenharmony_ci
569cabdff1aSopenharmony_ci/**
570cabdff1aSopenharmony_ci * Read 0-64 bits.
571cabdff1aSopenharmony_ci */
572cabdff1aSopenharmony_cistatic inline uint64_t get_bits64(GetBitContext *s, int n)
573cabdff1aSopenharmony_ci{
574cabdff1aSopenharmony_ci    if (n <= 32) {
575cabdff1aSopenharmony_ci        return get_bits_long(s, n);
576cabdff1aSopenharmony_ci    } else {
577cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
578cabdff1aSopenharmony_ci        uint64_t ret = get_bits_long(s, 32);
579cabdff1aSopenharmony_ci        return ret | (uint64_t) get_bits_long(s, n - 32) << 32;
580cabdff1aSopenharmony_ci#else
581cabdff1aSopenharmony_ci        uint64_t ret = (uint64_t) get_bits_long(s, n - 32) << 32;
582cabdff1aSopenharmony_ci        return ret | get_bits_long(s, 32);
583cabdff1aSopenharmony_ci#endif
584cabdff1aSopenharmony_ci    }
585cabdff1aSopenharmony_ci}
586cabdff1aSopenharmony_ci
587cabdff1aSopenharmony_ci/**
588cabdff1aSopenharmony_ci * Read 0-32 bits as a signed integer.
589cabdff1aSopenharmony_ci */
590cabdff1aSopenharmony_cistatic inline int get_sbits_long(GetBitContext *s, int n)
591cabdff1aSopenharmony_ci{
592cabdff1aSopenharmony_ci    // sign_extend(x, 0) is undefined
593cabdff1aSopenharmony_ci    if (!n)
594cabdff1aSopenharmony_ci        return 0;
595cabdff1aSopenharmony_ci
596cabdff1aSopenharmony_ci    return sign_extend(get_bits_long(s, n), n);
597cabdff1aSopenharmony_ci}
598cabdff1aSopenharmony_ci
599cabdff1aSopenharmony_ci/**
600cabdff1aSopenharmony_ci * Show 0-32 bits.
601cabdff1aSopenharmony_ci */
602cabdff1aSopenharmony_cistatic inline unsigned int show_bits_long(GetBitContext *s, int n)
603cabdff1aSopenharmony_ci{
604cabdff1aSopenharmony_ci    if (n <= MIN_CACHE_BITS) {
605cabdff1aSopenharmony_ci        return show_bits(s, n);
606cabdff1aSopenharmony_ci    } else {
607cabdff1aSopenharmony_ci        GetBitContext gb = *s;
608cabdff1aSopenharmony_ci        return get_bits_long(&gb, n);
609cabdff1aSopenharmony_ci    }
610cabdff1aSopenharmony_ci}
611cabdff1aSopenharmony_ci
612cabdff1aSopenharmony_cistatic inline int init_get_bits_xe(GetBitContext *s, const uint8_t *buffer,
613cabdff1aSopenharmony_ci                                   int bit_size, int is_le)
614cabdff1aSopenharmony_ci{
615cabdff1aSopenharmony_ci    int buffer_size;
616cabdff1aSopenharmony_ci    int ret = 0;
617cabdff1aSopenharmony_ci
618cabdff1aSopenharmony_ci    if (bit_size >= INT_MAX - FFMAX(7, AV_INPUT_BUFFER_PADDING_SIZE*8) || bit_size < 0 || !buffer) {
619cabdff1aSopenharmony_ci        bit_size    = 0;
620cabdff1aSopenharmony_ci        buffer      = NULL;
621cabdff1aSopenharmony_ci        ret         = AVERROR_INVALIDDATA;
622cabdff1aSopenharmony_ci    }
623cabdff1aSopenharmony_ci
624cabdff1aSopenharmony_ci    buffer_size = (bit_size + 7) >> 3;
625cabdff1aSopenharmony_ci
626cabdff1aSopenharmony_ci    s->buffer             = buffer;
627cabdff1aSopenharmony_ci    s->size_in_bits       = bit_size;
628cabdff1aSopenharmony_ci    s->size_in_bits_plus8 = bit_size + 8;
629cabdff1aSopenharmony_ci    s->buffer_end         = buffer + buffer_size;
630cabdff1aSopenharmony_ci    s->index              = 0;
631cabdff1aSopenharmony_ci
632cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
633cabdff1aSopenharmony_ci    s->cache              = 0;
634cabdff1aSopenharmony_ci    s->bits_left          = 0;
635cabdff1aSopenharmony_ci    refill_64(s, is_le);
636cabdff1aSopenharmony_ci#endif
637cabdff1aSopenharmony_ci
638cabdff1aSopenharmony_ci    return ret;
639cabdff1aSopenharmony_ci}
640cabdff1aSopenharmony_ci
641cabdff1aSopenharmony_ci/**
642cabdff1aSopenharmony_ci * Initialize GetBitContext.
643cabdff1aSopenharmony_ci * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
644cabdff1aSopenharmony_ci *        larger than the actual read bits because some optimized bitstream
645cabdff1aSopenharmony_ci *        readers read 32 or 64 bit at once and could read over the end
646cabdff1aSopenharmony_ci * @param bit_size the size of the buffer in bits
647cabdff1aSopenharmony_ci * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
648cabdff1aSopenharmony_ci */
649cabdff1aSopenharmony_cistatic inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
650cabdff1aSopenharmony_ci                                int bit_size)
651cabdff1aSopenharmony_ci{
652cabdff1aSopenharmony_ci#ifdef BITSTREAM_READER_LE
653cabdff1aSopenharmony_ci    return init_get_bits_xe(s, buffer, bit_size, 1);
654cabdff1aSopenharmony_ci#else
655cabdff1aSopenharmony_ci    return init_get_bits_xe(s, buffer, bit_size, 0);
656cabdff1aSopenharmony_ci#endif
657cabdff1aSopenharmony_ci}
658cabdff1aSopenharmony_ci
659cabdff1aSopenharmony_ci/**
660cabdff1aSopenharmony_ci * Initialize GetBitContext.
661cabdff1aSopenharmony_ci * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
662cabdff1aSopenharmony_ci *        larger than the actual read bits because some optimized bitstream
663cabdff1aSopenharmony_ci *        readers read 32 or 64 bit at once and could read over the end
664cabdff1aSopenharmony_ci * @param byte_size the size of the buffer in bytes
665cabdff1aSopenharmony_ci * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
666cabdff1aSopenharmony_ci */
667cabdff1aSopenharmony_cistatic inline int init_get_bits8(GetBitContext *s, const uint8_t *buffer,
668cabdff1aSopenharmony_ci                                 int byte_size)
669cabdff1aSopenharmony_ci{
670cabdff1aSopenharmony_ci    if (byte_size > INT_MAX / 8 || byte_size < 0)
671cabdff1aSopenharmony_ci        byte_size = -1;
672cabdff1aSopenharmony_ci    return init_get_bits(s, buffer, byte_size * 8);
673cabdff1aSopenharmony_ci}
674cabdff1aSopenharmony_ci
675cabdff1aSopenharmony_cistatic inline int init_get_bits8_le(GetBitContext *s, const uint8_t *buffer,
676cabdff1aSopenharmony_ci                                    int byte_size)
677cabdff1aSopenharmony_ci{
678cabdff1aSopenharmony_ci    if (byte_size > INT_MAX / 8 || byte_size < 0)
679cabdff1aSopenharmony_ci        byte_size = -1;
680cabdff1aSopenharmony_ci    return init_get_bits_xe(s, buffer, byte_size * 8, 1);
681cabdff1aSopenharmony_ci}
682cabdff1aSopenharmony_ci
683cabdff1aSopenharmony_cistatic inline const uint8_t *align_get_bits(GetBitContext *s)
684cabdff1aSopenharmony_ci{
685cabdff1aSopenharmony_ci    int n = -get_bits_count(s) & 7;
686cabdff1aSopenharmony_ci    if (n)
687cabdff1aSopenharmony_ci        skip_bits(s, n);
688cabdff1aSopenharmony_ci    return s->buffer + (s->index >> 3);
689cabdff1aSopenharmony_ci}
690cabdff1aSopenharmony_ci
691cabdff1aSopenharmony_ci/**
692cabdff1aSopenharmony_ci * If the vlc code is invalid and max_depth=1, then no bits will be removed.
693cabdff1aSopenharmony_ci * If the vlc code is invalid and max_depth>1, then the number of bits removed
694cabdff1aSopenharmony_ci * is undefined.
695cabdff1aSopenharmony_ci */
696cabdff1aSopenharmony_ci#define GET_VLC(code, name, gb, table, bits, max_depth)         \
697cabdff1aSopenharmony_ci    do {                                                        \
698cabdff1aSopenharmony_ci        int n, nb_bits;                                         \
699cabdff1aSopenharmony_ci        unsigned int index;                                     \
700cabdff1aSopenharmony_ci                                                                \
701cabdff1aSopenharmony_ci        index = SHOW_UBITS(name, gb, bits);                     \
702cabdff1aSopenharmony_ci        code  = table[index].sym;                               \
703cabdff1aSopenharmony_ci        n     = table[index].len;                               \
704cabdff1aSopenharmony_ci                                                                \
705cabdff1aSopenharmony_ci        if (max_depth > 1 && n < 0) {                           \
706cabdff1aSopenharmony_ci            LAST_SKIP_BITS(name, gb, bits);                     \
707cabdff1aSopenharmony_ci            UPDATE_CACHE(name, gb);                             \
708cabdff1aSopenharmony_ci                                                                \
709cabdff1aSopenharmony_ci            nb_bits = -n;                                       \
710cabdff1aSopenharmony_ci                                                                \
711cabdff1aSopenharmony_ci            index = SHOW_UBITS(name, gb, nb_bits) + code;       \
712cabdff1aSopenharmony_ci            code  = table[index].sym;                           \
713cabdff1aSopenharmony_ci            n     = table[index].len;                           \
714cabdff1aSopenharmony_ci            if (max_depth > 2 && n < 0) {                       \
715cabdff1aSopenharmony_ci                LAST_SKIP_BITS(name, gb, nb_bits);              \
716cabdff1aSopenharmony_ci                UPDATE_CACHE(name, gb);                         \
717cabdff1aSopenharmony_ci                                                                \
718cabdff1aSopenharmony_ci                nb_bits = -n;                                   \
719cabdff1aSopenharmony_ci                                                                \
720cabdff1aSopenharmony_ci                index = SHOW_UBITS(name, gb, nb_bits) + code;   \
721cabdff1aSopenharmony_ci                code  = table[index].sym;                       \
722cabdff1aSopenharmony_ci                n     = table[index].len;                       \
723cabdff1aSopenharmony_ci            }                                                   \
724cabdff1aSopenharmony_ci        }                                                       \
725cabdff1aSopenharmony_ci        SKIP_BITS(name, gb, n);                                 \
726cabdff1aSopenharmony_ci    } while (0)
727cabdff1aSopenharmony_ci
728cabdff1aSopenharmony_ci#define GET_RL_VLC(level, run, name, gb, table, bits,  \
729cabdff1aSopenharmony_ci                   max_depth, need_update)                      \
730cabdff1aSopenharmony_ci    do {                                                        \
731cabdff1aSopenharmony_ci        int n, nb_bits;                                         \
732cabdff1aSopenharmony_ci        unsigned int index;                                     \
733cabdff1aSopenharmony_ci                                                                \
734cabdff1aSopenharmony_ci        index = SHOW_UBITS(name, gb, bits);                     \
735cabdff1aSopenharmony_ci        level = table[index].level;                             \
736cabdff1aSopenharmony_ci        n     = table[index].len;                               \
737cabdff1aSopenharmony_ci                                                                \
738cabdff1aSopenharmony_ci        if (max_depth > 1 && n < 0) {                           \
739cabdff1aSopenharmony_ci            SKIP_BITS(name, gb, bits);                          \
740cabdff1aSopenharmony_ci            if (need_update) {                                  \
741cabdff1aSopenharmony_ci                UPDATE_CACHE(name, gb);                         \
742cabdff1aSopenharmony_ci            }                                                   \
743cabdff1aSopenharmony_ci                                                                \
744cabdff1aSopenharmony_ci            nb_bits = -n;                                       \
745cabdff1aSopenharmony_ci                                                                \
746cabdff1aSopenharmony_ci            index = SHOW_UBITS(name, gb, nb_bits) + level;      \
747cabdff1aSopenharmony_ci            level = table[index].level;                         \
748cabdff1aSopenharmony_ci            n     = table[index].len;                           \
749cabdff1aSopenharmony_ci            if (max_depth > 2 && n < 0) {                       \
750cabdff1aSopenharmony_ci                LAST_SKIP_BITS(name, gb, nb_bits);              \
751cabdff1aSopenharmony_ci                if (need_update) {                              \
752cabdff1aSopenharmony_ci                    UPDATE_CACHE(name, gb);                     \
753cabdff1aSopenharmony_ci                }                                               \
754cabdff1aSopenharmony_ci                nb_bits = -n;                                   \
755cabdff1aSopenharmony_ci                                                                \
756cabdff1aSopenharmony_ci                index = SHOW_UBITS(name, gb, nb_bits) + level;  \
757cabdff1aSopenharmony_ci                level = table[index].level;                     \
758cabdff1aSopenharmony_ci                n     = table[index].len;                       \
759cabdff1aSopenharmony_ci            }                                                   \
760cabdff1aSopenharmony_ci        }                                                       \
761cabdff1aSopenharmony_ci        run = table[index].run;                                 \
762cabdff1aSopenharmony_ci        SKIP_BITS(name, gb, n);                                 \
763cabdff1aSopenharmony_ci    } while (0)
764cabdff1aSopenharmony_ci
765cabdff1aSopenharmony_ci/* Return the LUT element for the given bitstream configuration. */
766cabdff1aSopenharmony_cistatic inline int set_idx(GetBitContext *s, int code, int *n, int *nb_bits,
767cabdff1aSopenharmony_ci                          const VLCElem *table)
768cabdff1aSopenharmony_ci{
769cabdff1aSopenharmony_ci    unsigned idx;
770cabdff1aSopenharmony_ci
771cabdff1aSopenharmony_ci    *nb_bits = -*n;
772cabdff1aSopenharmony_ci    idx = show_bits(s, *nb_bits) + code;
773cabdff1aSopenharmony_ci    *n = table[idx].len;
774cabdff1aSopenharmony_ci
775cabdff1aSopenharmony_ci    return table[idx].sym;
776cabdff1aSopenharmony_ci}
777cabdff1aSopenharmony_ci
778cabdff1aSopenharmony_ci/**
779cabdff1aSopenharmony_ci * Parse a vlc code.
780cabdff1aSopenharmony_ci * @param bits is the number of bits which will be read at once, must be
781cabdff1aSopenharmony_ci *             identical to nb_bits in init_vlc()
782cabdff1aSopenharmony_ci * @param max_depth is the number of times bits bits must be read to completely
783cabdff1aSopenharmony_ci *                  read the longest vlc code
784cabdff1aSopenharmony_ci *                  = (max_vlc_length + bits - 1) / bits
785cabdff1aSopenharmony_ci * @returns the code parsed or -1 if no vlc matches
786cabdff1aSopenharmony_ci */
787cabdff1aSopenharmony_cistatic av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table,
788cabdff1aSopenharmony_ci                                     int bits, int max_depth)
789cabdff1aSopenharmony_ci{
790cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
791cabdff1aSopenharmony_ci    int nb_bits;
792cabdff1aSopenharmony_ci    unsigned idx = show_bits(s, bits);
793cabdff1aSopenharmony_ci    int code = table[idx].sym;
794cabdff1aSopenharmony_ci    int n    = table[idx].len;
795cabdff1aSopenharmony_ci
796cabdff1aSopenharmony_ci    if (max_depth > 1 && n < 0) {
797cabdff1aSopenharmony_ci        skip_remaining(s, bits);
798cabdff1aSopenharmony_ci        code = set_idx(s, code, &n, &nb_bits, table);
799cabdff1aSopenharmony_ci        if (max_depth > 2 && n < 0) {
800cabdff1aSopenharmony_ci            skip_remaining(s, nb_bits);
801cabdff1aSopenharmony_ci            code = set_idx(s, code, &n, &nb_bits, table);
802cabdff1aSopenharmony_ci        }
803cabdff1aSopenharmony_ci    }
804cabdff1aSopenharmony_ci    skip_remaining(s, n);
805cabdff1aSopenharmony_ci
806cabdff1aSopenharmony_ci    return code;
807cabdff1aSopenharmony_ci#else
808cabdff1aSopenharmony_ci    int code;
809cabdff1aSopenharmony_ci
810cabdff1aSopenharmony_ci    OPEN_READER(re, s);
811cabdff1aSopenharmony_ci    UPDATE_CACHE(re, s);
812cabdff1aSopenharmony_ci
813cabdff1aSopenharmony_ci    GET_VLC(code, re, s, table, bits, max_depth);
814cabdff1aSopenharmony_ci
815cabdff1aSopenharmony_ci    CLOSE_READER(re, s);
816cabdff1aSopenharmony_ci
817cabdff1aSopenharmony_ci    return code;
818cabdff1aSopenharmony_ci#endif
819cabdff1aSopenharmony_ci}
820cabdff1aSopenharmony_ci
821cabdff1aSopenharmony_cistatic inline int decode012(GetBitContext *gb)
822cabdff1aSopenharmony_ci{
823cabdff1aSopenharmony_ci    int n;
824cabdff1aSopenharmony_ci    n = get_bits1(gb);
825cabdff1aSopenharmony_ci    if (n == 0)
826cabdff1aSopenharmony_ci        return 0;
827cabdff1aSopenharmony_ci    else
828cabdff1aSopenharmony_ci        return get_bits1(gb) + 1;
829cabdff1aSopenharmony_ci}
830cabdff1aSopenharmony_ci
831cabdff1aSopenharmony_cistatic inline int decode210(GetBitContext *gb)
832cabdff1aSopenharmony_ci{
833cabdff1aSopenharmony_ci    if (get_bits1(gb))
834cabdff1aSopenharmony_ci        return 0;
835cabdff1aSopenharmony_ci    else
836cabdff1aSopenharmony_ci        return 2 - get_bits1(gb);
837cabdff1aSopenharmony_ci}
838cabdff1aSopenharmony_ci
839cabdff1aSopenharmony_cistatic inline int get_bits_left(GetBitContext *gb)
840cabdff1aSopenharmony_ci{
841cabdff1aSopenharmony_ci    return gb->size_in_bits - get_bits_count(gb);
842cabdff1aSopenharmony_ci}
843cabdff1aSopenharmony_ci
844cabdff1aSopenharmony_cistatic inline int skip_1stop_8data_bits(GetBitContext *gb)
845cabdff1aSopenharmony_ci{
846cabdff1aSopenharmony_ci    if (get_bits_left(gb) <= 0)
847cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
848cabdff1aSopenharmony_ci
849cabdff1aSopenharmony_ci    while (get_bits1(gb)) {
850cabdff1aSopenharmony_ci        skip_bits(gb, 8);
851cabdff1aSopenharmony_ci        if (get_bits_left(gb) <= 0)
852cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
853cabdff1aSopenharmony_ci    }
854cabdff1aSopenharmony_ci
855cabdff1aSopenharmony_ci    return 0;
856cabdff1aSopenharmony_ci}
857cabdff1aSopenharmony_ci
858cabdff1aSopenharmony_ci#endif /* AVCODEC_GET_BITS_H */
859