FFmpeg
Loading...
Searching...
No Matches
bitstream.h
Go to the documentation of this file.
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/**
22 * @file
23 * bitstream reader API header.
24 */
25
26/*
27 * Bit order (endianness) is controlled by #defining BITSTREAM_BE and/or
28 * BITSTREAM_LE before #including this header. The corresponding bitreading
29 * functions are provided as bits_*_be()/bits_*_le() respectively.
30 *
31 * If neither or only BITSTREAM_BE is defined, then the default (unsuffixed)
32 * bits_*() will resolve to the big-endian implementation. If only BITSTREAM_LE
33 * is defined, little-endian will be the default.
34 *
35 * If both are defined, then the default can be controlled by defining at most
36 * one of BITSTREAM_DEFAULT_LE/BE. When BITSTREAM_DEFAULT_* is not defined, no
37 * default is provided and you must always explicitly use the _be() or _le()
38 * variants.
39 */
40
41#ifndef AVCODEC_BITSTREAM_H
42#define AVCODEC_BITSTREAM_H
43
44#include <stdint.h>
45
46#include "config.h"
47
48#include "libavutil/avassert.h"
49#include "libavutil/common.h"
51#include "libavutil/log.h"
52
53#include "mathops.h"
54#include "vlc.h"
55
56#ifndef UNCHECKED_BITSTREAM_READER
57#define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER
58#endif
59
60// select the default endianness, if any
61#if defined(BITSTREAM_LE) && defined(BITSTREAM_BE)
62
63# if defined(BITSTREAM_DEFAULT_BE) && defined(BITSTREAM_DEFAULT_LE)
64# error "At most one of BITSTREAM_DEFAULT_BE/LE must be defined"
65# elif defined(BITSTREAM_DEFAULT_BE)
66# define BITS_DEFAULT_BE
67# elif defined(BITSTREAM_DEFAULT_LE)
68# define BITS_DEFAULT_LE
69# endif
70
71#elif defined(BITSTREAM_LE)
72# define BITS_DEFAULT_LE
73#else // select BE if nothing is requested explicitly
74# define BITS_DEFAULT_BE
75# define BITSTREAM_WANT_BE
76#endif
77
78#if defined(BITS_DEFAULT_LE)
79
80# define BitstreamContext BitstreamContextLE
81# define bits_init bits_init_le
82# define bits_init8 bits_init8_le
83# define bits_tell bits_tell_le
84# define bits_size bits_size_le
85# define bits_bytesize bits_bytesize_le
86# define bits_left bits_left_le
87# define bits_read_bit bits_read_bit_le
88# define bits_read_nz bits_read_nz_le
89# define bits_read bits_read_le
90# define bits_read_63 bits_read_63_le
91# define bits_read_64 bits_read_64_le
92# define bits_read_signed bits_read_signed_le
93# define bits_read_signed_nz bits_read_signed_nz_le
94# define bits_peek_nz bits_peek_nz_le
95# define bits_peek bits_peek_le
96# define bits_peek_signed bits_peek_signed_le
97# define bits_peek_signed_nz bits_peek_signed_nz_le
98# define bits_skip bits_skip_le
99# define bits_seek bits_seek_le
100# define bits_align bits_align_le
101# define bits_read_xbits bits_read_xbits_le
102# define bits_decode012 bits_decode012_le
103# define bits_decode210 bits_decode210_le
104# define bits_apply_sign bits_apply_sign_le
105# define bits_read_vlc bits_read_vlc_le
106# define bits_read_vlc_multi bits_read_vlc_multi_le
107
108#elif defined(BITS_DEFAULT_BE)
109
110# define BitstreamContext BitstreamContextBE
111# define bits_init bits_init_be
112# define bits_init8 bits_init8_be
113# define bits_tell bits_tell_be
114# define bits_size bits_size_be
115# define bits_bytesize bits_bytesize_be
116# define bits_left bits_left_be
117# define bits_read_bit bits_read_bit_be
118# define bits_read_nz bits_read_nz_be
119# define bits_read bits_read_be
120# define bits_read_63 bits_read_63_be
121# define bits_read_64 bits_read_64_be
122# define bits_read_signed bits_read_signed_be
123# define bits_read_signed_nz bits_read_signed_nz_be
124# define bits_peek_nz bits_peek_nz_be
125# define bits_peek bits_peek_be
126# define bits_peek_signed bits_peek_signed_be
127# define bits_peek_signed_nz bits_peek_signed_nz_be
128# define bits_skip bits_skip_be
129# define bits_seek bits_seek_be
130# define bits_align bits_align_be
131# define bits_read_xbits bits_read_xbits_be
132# define bits_decode012 bits_decode012_be
133# define bits_decode210 bits_decode210_be
134# define bits_apply_sign bits_apply_sign_be
135# define bits_read_vlc bits_read_vlc_be
136# define bits_read_vlc_multi bits_read_vlc_multi_be
137
138#endif
139
140#undef BITS_DEFAULT_LE
141#undef BITS_DEFAULT_BE
142
143#define BITS_RL_VLC(level, run, bc, table, bits, max_depth) \
144 do { \
145 int n, nb_bits; \
146 unsigned int index = bits_peek(bc, bits); \
147 level = table[index].level; \
148 n = table[index].len; \
149 \
150 if (max_depth > 1 && n < 0) { \
151 bits_skip(bc, bits); \
152 \
153 nb_bits = -n; \
154 \
155 index = bits_peek(bc, nb_bits) + level; \
156 level = table[index].level; \
157 n = table[index].len; \
158 if (max_depth > 2 && n < 0) { \
159 bits_skip(bc, nb_bits); \
160 nb_bits = -n; \
161 \
162 index = bits_peek(bc, nb_bits) + level; \
163 level = table[index].level; \
164 n = table[index].len; \
165 } \
166 } \
167 run = table[index].run; \
168 bits_skip(bc, n); \
169 } while (0)
170
171#endif /* AVCODEC_BITSTREAM_H */
172
173// the following is deliberately outside of the standard #include guards
174
175#if defined(BITSTREAM_LE) && !defined(BITSTREAM_WANT_LE)
176# define BITSTREAM_WANT_LE
177#endif
178
179#if defined(BITSTREAM_BE) && !defined(BITSTREAM_WANT_BE)
180# define BITSTREAM_WANT_BE
181#endif
182
183#if defined(BITSTREAM_WANT_LE) && !defined(AVCODEC_BITSTREAM_LE)
184#define AVCODEC_BITSTREAM_LE
185
186#define BITSTREAM_TEMPLATE_LE
187#include "bitstream_template.h"
188#undef BITSTREAM_TEMPLATE_LE
189
190#endif
191
192#if defined(BITSTREAM_WANT_BE) && !defined(AVCODEC_BITSTREAM_BE)
193#define AVCODEC_BITSTREAM_BE
194
195#include "bitstream_template.h"
196
197#endif
198
199#undef BITSTREAM_WANT_LE
200#undef BITSTREAM_WANT_BE
simple assert() macros that are a bit more flexible than ISO C assert().
common internal and external API header