mirror of https://github.com/FFmpeg/FFmpeg.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
6.7 KiB
192 lines
6.7 KiB
/* |
|
* Copyright (c) 2016 Alexandra Hájková |
|
* |
|
* This file is part of FFmpeg. |
|
* |
|
* FFmpeg is free software; you can redistribute it and/or |
|
* modify it under the terms of the GNU Lesser General Public |
|
* License as published by the Free Software Foundation; either |
|
* version 2.1 of the License, or (at your option) any later version. |
|
* |
|
* FFmpeg is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
* Lesser General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU Lesser General Public |
|
* License along with FFmpeg; if not, write to the Free Software |
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
*/ |
|
|
|
/** |
|
* @file |
|
* bitstream reader API header. |
|
*/ |
|
|
|
/* |
|
* Bit order (endianness) is controlled by #defining BITSTREAM_BE and/or |
|
* BITSTREAM_LE before #including this header. The corresponding bitreading |
|
* functions are provided as bits_*_be()/bits_*_le() respectively. |
|
* |
|
* If neither or only BITSTREAM_BE is defined, then the default (unsuffixed) |
|
* bits_*() will resolve to the big-endian implementation. If only BITSTREAM_LE |
|
* is defined, little-endian will be the default. |
|
* |
|
* If both are defined, then the default can be controlled by defining at most |
|
* one of BITSTREAM_DEFAULT_LE/BE. When BITSTREAM_DEFAULT_* is not defined, no |
|
* default is provided and you must always explicitly use the _be() or _le() |
|
* variants. |
|
*/ |
|
|
|
#ifndef AVCODEC_BITSTREAM_H |
|
#define AVCODEC_BITSTREAM_H |
|
|
|
#include <stdint.h> |
|
|
|
#include "config.h" |
|
|
|
#include "libavutil/avassert.h" |
|
#include "libavutil/common.h" |
|
#include "libavutil/intreadwrite.h" |
|
#include "libavutil/log.h" |
|
|
|
#include "mathops.h" |
|
#include "vlc.h" |
|
|
|
#ifndef UNCHECKED_BITSTREAM_READER |
|
#define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER |
|
#endif |
|
|
|
// select the default endianness, if any |
|
#if defined(BITSTREAM_LE) && defined(BITSTREAM_BE) |
|
|
|
# if defined(BITSTREAM_DEFAULT_BE) && defined(BITSTREAM_DEFAULT_LE) |
|
# error "At most one of BITSTREAM_DEFAULT_BE/LE must be defined" |
|
# elif defined(BITSTREAM_DEFAULT_BE) |
|
# define BITS_DEFAULT_BE |
|
# elif defined(BITSTREAM_DEFAULT_LE) |
|
# define BITS_DEFAULT_LE |
|
# endif |
|
|
|
#elif defined(BITSTREAM_LE) |
|
# define BITS_DEFAULT_LE |
|
#else // select BE if nothing is requested explicitly |
|
# define BITS_DEFAULT_BE |
|
# define BITSTREAM_WANT_BE |
|
#endif |
|
|
|
#if defined(BITS_DEFAULT_LE) |
|
|
|
# define BitstreamContext BitstreamContextLE |
|
# define bits_init bits_init_le |
|
# define bits_init8 bits_init8_le |
|
# define bits_tell bits_tell_le |
|
# define bits_size bits_size_le |
|
# define bits_left bits_left_le |
|
# define bits_read_bit bits_read_bit_le |
|
# define bits_read_nz bits_read_nz_le |
|
# define bits_read bits_read_le |
|
# define bits_read_63 bits_read_63_le |
|
# define bits_read_64 bits_read_64_le |
|
# define bits_read_signed bits_read_signed_le |
|
# define bits_peek_nz bits_peek_nz_le |
|
# define bits_peek bits_peek_le |
|
# define bits_peek_signed bits_peek_signed_le |
|
# define bits_skip bits_skip_le |
|
# define bits_seek bits_seek_le |
|
# define bits_align bits_align_le |
|
# define bits_read_xbits bits_read_xbits_le |
|
# define bits_decode012 bits_decode012_le |
|
# define bits_decode210 bits_decode210_le |
|
# define bits_apply_sign bits_apply_sign_le |
|
# define bits_read_vlc bits_read_vlc_le |
|
|
|
#elif defined(BITS_DEFAULT_BE) |
|
|
|
# define BitstreamContext BitstreamContextBE |
|
# define bits_init bits_init_be |
|
# define bits_init8 bits_init8_be |
|
# define bits_tell bits_tell_be |
|
# define bits_size bits_size_be |
|
# define bits_left bits_left_be |
|
# define bits_read_bit bits_read_bit_be |
|
# define bits_read_nz bits_read_nz_be |
|
# define bits_read bits_read_be |
|
# define bits_read_63 bits_read_63_be |
|
# define bits_read_64 bits_read_64_be |
|
# define bits_read_signed bits_read_signed_be |
|
# define bits_peek_nz bits_peek_nz_be |
|
# define bits_peek bits_peek_be |
|
# define bits_peek_signed bits_peek_signed_be |
|
# define bits_skip bits_skip_be |
|
# define bits_seek bits_seek_be |
|
# define bits_align bits_align_be |
|
# define bits_read_xbits bits_read_xbits_be |
|
# define bits_decode012 bits_decode012_be |
|
# define bits_decode210 bits_decode210_be |
|
# define bits_apply_sign bits_apply_sign_be |
|
# define bits_read_vlc bits_read_vlc_be |
|
|
|
#endif |
|
|
|
#undef BITS_DEFAULT_LE |
|
#undef BITS_DEFAULT_BE |
|
|
|
#define BITS_RL_VLC(level, run, bc, table, bits, max_depth) \ |
|
do { \ |
|
int n, nb_bits; \ |
|
unsigned int index = bits_peek(bc, bits); \ |
|
level = table[index].level; \ |
|
n = table[index].len; \ |
|
\ |
|
if (max_depth > 1 && n < 0) { \ |
|
bits_skip(bc, bits); \ |
|
\ |
|
nb_bits = -n; \ |
|
\ |
|
index = bits_peek(bc, nb_bits) + level; \ |
|
level = table[index].level; \ |
|
n = table[index].len; \ |
|
if (max_depth > 2 && n < 0) { \ |
|
bits_skip(bc, nb_bits); \ |
|
nb_bits = -n; \ |
|
\ |
|
index = bits_peek(bc, nb_bits) + level; \ |
|
level = table[index].level; \ |
|
n = table[index].len; \ |
|
} \ |
|
} \ |
|
run = table[index].run; \ |
|
bits_skip(bc, n); \ |
|
} while (0) |
|
|
|
#endif /* AVCODEC_BITSTREAM_H */ |
|
|
|
// the following is deliberately outside of the standard #include guards |
|
|
|
#if defined(BITSTREAM_LE) && !defined(BITSTREAM_WANT_LE) |
|
# define BITSTREAM_WANT_LE |
|
#endif |
|
|
|
#if defined(BITSTREAM_BE) && !defined(BITSTREAM_WANT_BE) |
|
# define BITSTREAM_WANT_BE |
|
#endif |
|
|
|
#if defined(BITSTREAM_WANT_LE) && !defined(AVCODEC_BITSTREAM_LE) |
|
#define AVCODEC_BITSTREAM_LE |
|
|
|
#define BITSTREAM_TEMPLATE_LE |
|
#include "bitstream_template.h" |
|
#undef BITSTREAM_TEMPLATE_LE |
|
|
|
#endif |
|
|
|
#if defined(BITSTREAM_WANT_BE) && !defined(AVCODEC_BITSTREAM_BE) |
|
#define AVCODEC_BITSTREAM_BE |
|
|
|
#include "bitstream_template.h" |
|
|
|
#endif |
|
|
|
#undef BITSTREAM_WANT_LE |
|
#undef BITSTREAM_WANT_BE
|
|
|