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