198 lines · 7.0 KB · C
RawDownload
/* * 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_read_signed_nz bits_read_signed_nz_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_peek_signed_nz bits_peek_signed_nz_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# define bits_read_vlc_multi bits_read_vlc_multi_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_read_signed_nz bits_read_signed_nz_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_peek_signed_nz bits_peek_signed_nz_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# define bits_read_vlc_multi bits_read_vlc_multi_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

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t