/* * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at> * * 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
*/
/* * Safe bitstream reading: * optionally, the get_bits API can check to ensure that we * don't read past input buffer boundaries. This is protected * with CONFIG_SAFE_BITSTREAM_READER at the global level, and * then below that with UNCHECKED_BITSTREAM_READER at the per- * decoder level. This means that decoders that check internally * can "#define UNCHECKED_BITSTREAM_READER 1" to disable * overread checks. * Boundary checking causes a minor performance penalty so for * applications that won't want/need this, it can be disabled * globally using "#define CONFIG_SAFE_BITSTREAM_READER 0".
*/ #ifndef UNCHECKED_BITSTREAM_READER #define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER #endif
typedefstruct GetBitContext { const uint8_t *buffer, *buffer_end; int index; int size_in_bits; int size_in_bits_plus8;
} GetBitContext;
staticinlineunsignedint get_bits(GetBitContext *s, int n); staticinlinevoid skip_bits(GetBitContext *s, int n); staticinlineunsignedint show_bits(GetBitContext *s, int n);
/* Bitstream reader API docs: * name * arbitrary name which is used as prefix for the internal variables * * gb * getbitcontext * * OPEN_READER(name, gb) * load gb into local variables * * CLOSE_READER(name, gb) * store local vars in gb * * UPDATE_CACHE(name, gb) * Refill the internal cache from the bitstream. * After this call at least MIN_CACHE_BITS will be available. * * GET_CACHE(name, gb) * Will output the contents of the internal cache, * next bit is MSB of 32 or 64 bits (FIXME 64 bits). * * SHOW_UBITS(name, gb, num) * Will return the next num bits. * * SHOW_SBITS(name, gb, num) * Will return the next num bits and do sign extension. * * SKIP_BITS(name, gb, num) * Will skip over the next num bits. * Note, this is equivalent to SKIP_CACHE; SKIP_COUNTER. * * SKIP_CACHE(name, gb, num) * Will remove the next num bits from the cache (note SKIP_COUNTER * MUST be called before UPDATE_CACHE / CLOSE_READER). * * SKIP_COUNTER(name, gb, num) * Will increment the internal bit counter (see SKIP_CACHE & SKIP_BITS). * * LAST_SKIP_BITS(name, gb, num) * Like SKIP_BITS, to be used if next call is UPDATE_CACHE or CLOSE_READER. * * BITS_LEFT(name, gb) * Return the number of bits left * * For examples see get_bits, show_bits, skip_bits, get_vlc.
*/
/** * Skips the specified number of bits. * @param n the number of bits to skip, * For the UNCHECKED_BITSTREAM_READER this must not cause the distance * from the start to overflow int32_t. Staying within the bitstream + padding * is sufficient, too.
*/ staticinlinevoid skip_bits_long(GetBitContext *s, int n)
{ #if UNCHECKED_BITSTREAM_READER
s->index += n; #else
s->index += av_clip(n, -s->index, s->size_in_bits_plus8 - s->index); #endif
}
/** * Read MPEG-1 dc-style VLC (sign bit + mantissa with no MSB). * if MSB not set it is negative * @param n length in bits
*/ staticinlineint get_xbits(GetBitContext *s, int n)
{ registerint sign; register int32_t cache;
OPEN_READER(re, s);
av_assert2(n>0 && n<=25);
UPDATE_CACHE(re, s);
cache = GET_CACHE(re, s);
sign = ~cache >> 31;
LAST_SKIP_BITS(re, s, n);
CLOSE_READER(re, s); return (NEG_USR32(sign ^ cache, n) ^ sign) - sign;
}
/** * Read 0-64 bits.
*/ staticinline uint64_t get_bits64(GetBitContext *s, int n)
{ if (n <= 32) { return get_bits_long(s, n);
} else { #ifdef BITSTREAM_READER_LE
uint64_t ret = get_bits_long(s, 32); return ret | (uint64_t) get_bits_long(s, n - 32) << 32; #else
uint64_t ret = (uint64_t) get_bits_long(s, n - 32) << 32; return ret | get_bits_long(s, 32); #endif
}
}
/** * Read 0-32 bits as a signed integer.
*/ staticinlineint get_sbits_long(GetBitContext *s, int n)
{ // sign_extend(x, 0) is undefined if (!n) return 0;
return sign_extend(get_bits_long(s, n), n);
}
/** * Read 0-64 bits as a signed integer.
*/ staticinline int64_t get_sbits64(GetBitContext *s, int n)
{ // sign_extend(x, 0) is undefined if (!n) return 0;
/** * Initialize GetBitContext. * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes * larger than the actual read bits because some optimized bitstream * readers read 32 or 64 bit at once and could read over the end * @param bit_size the size of the buffer in bits * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
*/ staticinlineint init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
{ int buffer_size; int ret = 0;
/** * Initialize GetBitContext. * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes * larger than the actual read bits because some optimized bitstream * readers read 32 or 64 bit at once and could read over the end * @param byte_size the size of the buffer in bytes * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
*/ staticinlineint init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
{ if (byte_size > INT_MAX / 8 || byte_size < 0)
byte_size = -1; return init_get_bits(s, buffer, byte_size * 8);
}
staticinlineconst uint8_t *align_get_bits(GetBitContext *s)
{ int n = -get_bits_count(s) & 7; if (n)
skip_bits(s, n); return s->buffer + (s->index >> 3);
}
/** * If the vlc code is invalid and max_depth=1, then no bits will be removed. * If the vlc code is invalid and max_depth>1, then the number of bits removed * is undefined.
*/ #define GET_VLC(code, name, gb, table, bits, max_depth) \ do { \ int n, nb_bits; \ unsignedint index; \
\
index = SHOW_UBITS(name, gb, bits); \
code = table[index].sym; \
n = table[index].len; \
\ if (max_depth > 1 && n < 0) { \
LAST_SKIP_BITS(name, gb, bits); \
UPDATE_CACHE(name, gb); \
\
nb_bits = -n; \
\
index = SHOW_UBITS(name, gb, nb_bits) + code; \
code = table[index].sym; \
n = table[index].len; \ if (max_depth > 2 && n < 0) { \
LAST_SKIP_BITS(name, gb, nb_bits); \
UPDATE_CACHE(name, gb); \
\
nb_bits = -n; \
\
index = SHOW_UBITS(name, gb, nb_bits) + code; \
code = table[index].sym; \
n = table[index].len; \
} \
} \
SKIP_BITS(name, gb, n); \
} while (0)
#define GET_RL_VLC(level, run, name, gb, table, bits, \
max_depth, need_update) \ do { \ int n, nb_bits; \ unsignedint index; \
\
index = SHOW_UBITS(name, gb, bits); \
level = table[index].level; \
n = table[index].len; \
\ if (max_depth > 1 && n < 0) { \
SKIP_BITS(name, gb, bits); \ if (need_update) { \
UPDATE_CACHE(name, gb); \
} \
\
nb_bits = -n; \
\
index = SHOW_UBITS(name, gb, nb_bits) + level; \
level = table[index].level; \
n = table[index].len; \ if (max_depth > 2 && n < 0) { \
LAST_SKIP_BITS(name, gb, nb_bits); \ if (need_update) { \
UPDATE_CACHE(name, gb); \
} \
nb_bits = -n; \
\
index = SHOW_UBITS(name, gb, nb_bits) + level; \
level = table[index].level; \
n = table[index].len; \
} \
} \
run = table[index].run; \
SKIP_BITS(name, gb, n); \
} while (0)
/** * Parse a vlc code. * @param bits is the number of bits which will be read at once, must be * identical to nb_bits in vlc_init() * @param max_depth is the number of times bits bits must be read to completely * read the longest vlc code * = (max_vlc_length + bits - 1) / bits * @returns the code parsed or -1 if no vlc matches
*/ static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
{ int code;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.