1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * exp golomb vlc stuff 3cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> 4cabdff1aSopenharmony_ci * Copyright (c) 2004 Alex Beregszaszi 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci/** 24cabdff1aSopenharmony_ci * @file 25cabdff1aSopenharmony_ci * @brief 26cabdff1aSopenharmony_ci * exp golomb vlc stuff 27cabdff1aSopenharmony_ci * @author Michael Niedermayer <michaelni@gmx.at> and Alex Beregszaszi 28cabdff1aSopenharmony_ci */ 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#ifndef AVCODEC_GOLOMB_H 31cabdff1aSopenharmony_ci#define AVCODEC_GOLOMB_H 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci#include <stdint.h> 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci#include "get_bits.h" 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ci#define INVALID_VLC 0x80000000 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_ciextern const uint8_t ff_golomb_vlc_len[512]; 40cabdff1aSopenharmony_ciextern const uint8_t ff_ue_golomb_vlc_code[512]; 41cabdff1aSopenharmony_ciextern const int8_t ff_se_golomb_vlc_code[512]; 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ciextern const uint8_t ff_interleaved_golomb_vlc_len[256]; 44cabdff1aSopenharmony_ciextern const uint8_t ff_interleaved_ue_golomb_vlc_code[256]; 45cabdff1aSopenharmony_ciextern const int8_t ff_interleaved_se_golomb_vlc_code[256]; 46cabdff1aSopenharmony_ciextern const uint8_t ff_interleaved_dirac_golomb_vlc_code[256]; 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci/** 49cabdff1aSopenharmony_ci * Read an unsigned Exp-Golomb code in the range 0 to 8190. 50cabdff1aSopenharmony_ci * 51cabdff1aSopenharmony_ci * @returns the read value or a negative error code. 52cabdff1aSopenharmony_ci */ 53cabdff1aSopenharmony_cistatic inline int get_ue_golomb(GetBitContext *gb) 54cabdff1aSopenharmony_ci{ 55cabdff1aSopenharmony_ci unsigned int buf; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER 58cabdff1aSopenharmony_ci buf = show_bits_long(gb, 32); 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci if (buf >= (1 << 27)) { 61cabdff1aSopenharmony_ci buf >>= 32 - 9; 62cabdff1aSopenharmony_ci skip_bits_long(gb, ff_golomb_vlc_len[buf]); 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci return ff_ue_golomb_vlc_code[buf]; 65cabdff1aSopenharmony_ci } else { 66cabdff1aSopenharmony_ci int log = 2 * av_log2(buf) - 31; 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_ci skip_bits_long(gb, 32 - log); 69cabdff1aSopenharmony_ci if (log < 7) 70cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 71cabdff1aSopenharmony_ci buf >>= log; 72cabdff1aSopenharmony_ci buf--; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci return buf; 75cabdff1aSopenharmony_ci } 76cabdff1aSopenharmony_ci#else 77cabdff1aSopenharmony_ci OPEN_READER(re, gb); 78cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 79cabdff1aSopenharmony_ci buf = GET_CACHE(re, gb); 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_ci if (buf >= (1 << 27)) { 82cabdff1aSopenharmony_ci buf >>= 32 - 9; 83cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]); 84cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci return ff_ue_golomb_vlc_code[buf]; 87cabdff1aSopenharmony_ci } else { 88cabdff1aSopenharmony_ci int log = 2 * av_log2(buf) - 31; 89cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 32 - log); 90cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 91cabdff1aSopenharmony_ci if (log < 7) 92cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 93cabdff1aSopenharmony_ci buf >>= log; 94cabdff1aSopenharmony_ci buf--; 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_ci return buf; 97cabdff1aSopenharmony_ci } 98cabdff1aSopenharmony_ci#endif 99cabdff1aSopenharmony_ci} 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci/** 102cabdff1aSopenharmony_ci * Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1. 103cabdff1aSopenharmony_ci */ 104cabdff1aSopenharmony_cistatic inline unsigned get_ue_golomb_long(GetBitContext *gb) 105cabdff1aSopenharmony_ci{ 106cabdff1aSopenharmony_ci unsigned buf, log; 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci buf = show_bits_long(gb, 32); 109cabdff1aSopenharmony_ci log = 31 - av_log2(buf); 110cabdff1aSopenharmony_ci skip_bits_long(gb, log); 111cabdff1aSopenharmony_ci 112cabdff1aSopenharmony_ci return get_bits_long(gb, log + 1) - 1; 113cabdff1aSopenharmony_ci} 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci/** 116cabdff1aSopenharmony_ci * read unsigned exp golomb code, constraint to a max of 31. 117cabdff1aSopenharmony_ci * If the value encountered is not in 0..31, the return value 118cabdff1aSopenharmony_ci * is outside the range 0..30. 119cabdff1aSopenharmony_ci */ 120cabdff1aSopenharmony_cistatic inline int get_ue_golomb_31(GetBitContext *gb) 121cabdff1aSopenharmony_ci{ 122cabdff1aSopenharmony_ci unsigned int buf; 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER 125cabdff1aSopenharmony_ci buf = show_bits_long(gb, 32); 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_ci buf >>= 32 - 9; 128cabdff1aSopenharmony_ci skip_bits_long(gb, ff_golomb_vlc_len[buf]); 129cabdff1aSopenharmony_ci#else 130cabdff1aSopenharmony_ci 131cabdff1aSopenharmony_ci OPEN_READER(re, gb); 132cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 133cabdff1aSopenharmony_ci buf = GET_CACHE(re, gb); 134cabdff1aSopenharmony_ci 135cabdff1aSopenharmony_ci buf >>= 32 - 9; 136cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]); 137cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 138cabdff1aSopenharmony_ci#endif 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci return ff_ue_golomb_vlc_code[buf]; 141cabdff1aSopenharmony_ci} 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_cistatic inline unsigned get_interleaved_ue_golomb(GetBitContext *gb) 144cabdff1aSopenharmony_ci{ 145cabdff1aSopenharmony_ci uint32_t buf; 146cabdff1aSopenharmony_ci 147cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER 148cabdff1aSopenharmony_ci buf = show_bits_long(gb, 32); 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_ci if (buf & 0xAA800000) { 151cabdff1aSopenharmony_ci buf >>= 32 - 8; 152cabdff1aSopenharmony_ci skip_bits_long(gb, ff_interleaved_golomb_vlc_len[buf]); 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ci return ff_interleaved_ue_golomb_vlc_code[buf]; 155cabdff1aSopenharmony_ci } else { 156cabdff1aSopenharmony_ci unsigned ret = 1; 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci do { 159cabdff1aSopenharmony_ci buf >>= 32 - 8; 160cabdff1aSopenharmony_ci skip_bits_long(gb, FFMIN(ff_interleaved_golomb_vlc_len[buf], 8)); 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ci if (ff_interleaved_golomb_vlc_len[buf] != 9) { 163cabdff1aSopenharmony_ci ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1; 164cabdff1aSopenharmony_ci ret |= ff_interleaved_dirac_golomb_vlc_code[buf]; 165cabdff1aSopenharmony_ci break; 166cabdff1aSopenharmony_ci } 167cabdff1aSopenharmony_ci ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf]; 168cabdff1aSopenharmony_ci buf = show_bits_long(gb, 32); 169cabdff1aSopenharmony_ci } while (get_bits_left(gb) > 0); 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci return ret - 1; 172cabdff1aSopenharmony_ci } 173cabdff1aSopenharmony_ci#else 174cabdff1aSopenharmony_ci OPEN_READER(re, gb); 175cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 176cabdff1aSopenharmony_ci buf = GET_CACHE(re, gb); 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci if (buf & 0xAA800000) { 179cabdff1aSopenharmony_ci buf >>= 32 - 8; 180cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]); 181cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 182cabdff1aSopenharmony_ci 183cabdff1aSopenharmony_ci return ff_interleaved_ue_golomb_vlc_code[buf]; 184cabdff1aSopenharmony_ci } else { 185cabdff1aSopenharmony_ci unsigned ret = 1; 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci do { 188cabdff1aSopenharmony_ci buf >>= 32 - 8; 189cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 190cabdff1aSopenharmony_ci FFMIN(ff_interleaved_golomb_vlc_len[buf], 8)); 191cabdff1aSopenharmony_ci 192cabdff1aSopenharmony_ci if (ff_interleaved_golomb_vlc_len[buf] != 9) { 193cabdff1aSopenharmony_ci ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1; 194cabdff1aSopenharmony_ci ret |= ff_interleaved_dirac_golomb_vlc_code[buf]; 195cabdff1aSopenharmony_ci break; 196cabdff1aSopenharmony_ci } 197cabdff1aSopenharmony_ci ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf]; 198cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 199cabdff1aSopenharmony_ci buf = GET_CACHE(re, gb); 200cabdff1aSopenharmony_ci } while (ret<0x8000000U && BITS_AVAILABLE(re, gb)); 201cabdff1aSopenharmony_ci 202cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 203cabdff1aSopenharmony_ci return ret - 1; 204cabdff1aSopenharmony_ci } 205cabdff1aSopenharmony_ci#endif 206cabdff1aSopenharmony_ci} 207cabdff1aSopenharmony_ci 208cabdff1aSopenharmony_ci/** 209cabdff1aSopenharmony_ci * read unsigned truncated exp golomb code. 210cabdff1aSopenharmony_ci */ 211cabdff1aSopenharmony_cistatic inline int get_te0_golomb(GetBitContext *gb, int range) 212cabdff1aSopenharmony_ci{ 213cabdff1aSopenharmony_ci av_assert2(range >= 1); 214cabdff1aSopenharmony_ci 215cabdff1aSopenharmony_ci if (range == 1) 216cabdff1aSopenharmony_ci return 0; 217cabdff1aSopenharmony_ci else if (range == 2) 218cabdff1aSopenharmony_ci return get_bits1(gb) ^ 1; 219cabdff1aSopenharmony_ci else 220cabdff1aSopenharmony_ci return get_ue_golomb(gb); 221cabdff1aSopenharmony_ci} 222cabdff1aSopenharmony_ci 223cabdff1aSopenharmony_ci/** 224cabdff1aSopenharmony_ci * read unsigned truncated exp golomb code. 225cabdff1aSopenharmony_ci */ 226cabdff1aSopenharmony_cistatic inline int get_te_golomb(GetBitContext *gb, int range) 227cabdff1aSopenharmony_ci{ 228cabdff1aSopenharmony_ci av_assert2(range >= 1); 229cabdff1aSopenharmony_ci 230cabdff1aSopenharmony_ci if (range == 2) 231cabdff1aSopenharmony_ci return get_bits1(gb) ^ 1; 232cabdff1aSopenharmony_ci else 233cabdff1aSopenharmony_ci return get_ue_golomb(gb); 234cabdff1aSopenharmony_ci} 235cabdff1aSopenharmony_ci 236cabdff1aSopenharmony_ci/** 237cabdff1aSopenharmony_ci * read signed exp golomb code. 238cabdff1aSopenharmony_ci */ 239cabdff1aSopenharmony_cistatic inline int get_se_golomb(GetBitContext *gb) 240cabdff1aSopenharmony_ci{ 241cabdff1aSopenharmony_ci unsigned int buf; 242cabdff1aSopenharmony_ci 243cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER 244cabdff1aSopenharmony_ci buf = show_bits_long(gb, 32); 245cabdff1aSopenharmony_ci 246cabdff1aSopenharmony_ci if (buf >= (1 << 27)) { 247cabdff1aSopenharmony_ci buf >>= 32 - 9; 248cabdff1aSopenharmony_ci skip_bits_long(gb, ff_golomb_vlc_len[buf]); 249cabdff1aSopenharmony_ci 250cabdff1aSopenharmony_ci return ff_se_golomb_vlc_code[buf]; 251cabdff1aSopenharmony_ci } else { 252cabdff1aSopenharmony_ci int log = 2 * av_log2(buf) - 31; 253cabdff1aSopenharmony_ci buf >>= log; 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci skip_bits_long(gb, 32 - log); 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci if (buf & 1) 258cabdff1aSopenharmony_ci buf = -(buf >> 1); 259cabdff1aSopenharmony_ci else 260cabdff1aSopenharmony_ci buf = (buf >> 1); 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci return buf; 263cabdff1aSopenharmony_ci } 264cabdff1aSopenharmony_ci#else 265cabdff1aSopenharmony_ci OPEN_READER(re, gb); 266cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 267cabdff1aSopenharmony_ci buf = GET_CACHE(re, gb); 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci if (buf >= (1 << 27)) { 270cabdff1aSopenharmony_ci buf >>= 32 - 9; 271cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]); 272cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 273cabdff1aSopenharmony_ci 274cabdff1aSopenharmony_ci return ff_se_golomb_vlc_code[buf]; 275cabdff1aSopenharmony_ci } else { 276cabdff1aSopenharmony_ci int log = av_log2(buf), sign; 277cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 31 - log); 278cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 279cabdff1aSopenharmony_ci buf = GET_CACHE(re, gb); 280cabdff1aSopenharmony_ci 281cabdff1aSopenharmony_ci buf >>= log; 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 32 - log); 284cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 285cabdff1aSopenharmony_ci 286cabdff1aSopenharmony_ci sign = -(buf & 1); 287cabdff1aSopenharmony_ci buf = ((buf >> 1) ^ sign) - sign; 288cabdff1aSopenharmony_ci 289cabdff1aSopenharmony_ci return buf; 290cabdff1aSopenharmony_ci } 291cabdff1aSopenharmony_ci#endif 292cabdff1aSopenharmony_ci} 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_cistatic inline int get_se_golomb_long(GetBitContext *gb) 295cabdff1aSopenharmony_ci{ 296cabdff1aSopenharmony_ci unsigned int buf = get_ue_golomb_long(gb); 297cabdff1aSopenharmony_ci int sign = (buf & 1) - 1; 298cabdff1aSopenharmony_ci return ((buf >> 1) ^ sign) + 1; 299cabdff1aSopenharmony_ci} 300cabdff1aSopenharmony_ci 301cabdff1aSopenharmony_cistatic inline int get_interleaved_se_golomb(GetBitContext *gb) 302cabdff1aSopenharmony_ci{ 303cabdff1aSopenharmony_ci unsigned int buf; 304cabdff1aSopenharmony_ci 305cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER 306cabdff1aSopenharmony_ci buf = show_bits_long(gb, 32); 307cabdff1aSopenharmony_ci 308cabdff1aSopenharmony_ci if (buf & 0xAA800000) { 309cabdff1aSopenharmony_ci buf >>= 32 - 8; 310cabdff1aSopenharmony_ci skip_bits_long(gb, ff_interleaved_golomb_vlc_len[buf]); 311cabdff1aSopenharmony_ci 312cabdff1aSopenharmony_ci return ff_interleaved_se_golomb_vlc_code[buf]; 313cabdff1aSopenharmony_ci } else { 314cabdff1aSopenharmony_ci int log; 315cabdff1aSopenharmony_ci skip_bits(gb, 8); 316cabdff1aSopenharmony_ci buf |= 1 | show_bits(gb, 24); 317cabdff1aSopenharmony_ci 318cabdff1aSopenharmony_ci if ((buf & 0xAAAAAAAA) == 0) 319cabdff1aSopenharmony_ci return INVALID_VLC; 320cabdff1aSopenharmony_ci 321cabdff1aSopenharmony_ci for (log = 31; (buf & 0x80000000) == 0; log--) 322cabdff1aSopenharmony_ci buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30); 323cabdff1aSopenharmony_ci 324cabdff1aSopenharmony_ci skip_bits_long(gb, 63 - 2 * log - 8); 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ci return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1; 327cabdff1aSopenharmony_ci } 328cabdff1aSopenharmony_ci#else 329cabdff1aSopenharmony_ci OPEN_READER(re, gb); 330cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 331cabdff1aSopenharmony_ci buf = GET_CACHE(re, gb); 332cabdff1aSopenharmony_ci 333cabdff1aSopenharmony_ci if (buf & 0xAA800000) { 334cabdff1aSopenharmony_ci buf >>= 32 - 8; 335cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]); 336cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 337cabdff1aSopenharmony_ci 338cabdff1aSopenharmony_ci return ff_interleaved_se_golomb_vlc_code[buf]; 339cabdff1aSopenharmony_ci } else { 340cabdff1aSopenharmony_ci int log; 341cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 8); 342cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 343cabdff1aSopenharmony_ci buf |= 1 | (GET_CACHE(re, gb) >> 8); 344cabdff1aSopenharmony_ci 345cabdff1aSopenharmony_ci if ((buf & 0xAAAAAAAA) == 0) 346cabdff1aSopenharmony_ci return INVALID_VLC; 347cabdff1aSopenharmony_ci 348cabdff1aSopenharmony_ci for (log = 31; (buf & 0x80000000) == 0; log--) 349cabdff1aSopenharmony_ci buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30); 350cabdff1aSopenharmony_ci 351cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 63 - 2 * log - 8); 352cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 353cabdff1aSopenharmony_ci 354cabdff1aSopenharmony_ci return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1; 355cabdff1aSopenharmony_ci } 356cabdff1aSopenharmony_ci#endif 357cabdff1aSopenharmony_ci} 358cabdff1aSopenharmony_ci 359cabdff1aSopenharmony_cistatic inline int dirac_get_se_golomb(GetBitContext *gb) 360cabdff1aSopenharmony_ci{ 361cabdff1aSopenharmony_ci uint32_t ret = get_interleaved_ue_golomb(gb); 362cabdff1aSopenharmony_ci 363cabdff1aSopenharmony_ci if (ret) { 364cabdff1aSopenharmony_ci int sign = -get_bits1(gb); 365cabdff1aSopenharmony_ci ret = (ret ^ sign) - sign; 366cabdff1aSopenharmony_ci } 367cabdff1aSopenharmony_ci 368cabdff1aSopenharmony_ci return ret; 369cabdff1aSopenharmony_ci} 370cabdff1aSopenharmony_ci 371cabdff1aSopenharmony_ci/** 372cabdff1aSopenharmony_ci * read unsigned golomb rice code (ffv1). 373cabdff1aSopenharmony_ci */ 374cabdff1aSopenharmony_cistatic inline int get_ur_golomb(GetBitContext *gb, int k, int limit, 375cabdff1aSopenharmony_ci int esc_len) 376cabdff1aSopenharmony_ci{ 377cabdff1aSopenharmony_ci unsigned int buf; 378cabdff1aSopenharmony_ci int log; 379cabdff1aSopenharmony_ci 380cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER 381cabdff1aSopenharmony_ci buf = show_bits_long(gb, 32); 382cabdff1aSopenharmony_ci 383cabdff1aSopenharmony_ci log = av_log2(buf); 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_ci if (log > 31 - limit) { 386cabdff1aSopenharmony_ci buf >>= log - k; 387cabdff1aSopenharmony_ci buf += (30 - log) << k; 388cabdff1aSopenharmony_ci skip_bits_long(gb, 32 + k - log); 389cabdff1aSopenharmony_ci 390cabdff1aSopenharmony_ci return buf; 391cabdff1aSopenharmony_ci } else { 392cabdff1aSopenharmony_ci skip_bits_long(gb, limit); 393cabdff1aSopenharmony_ci buf = get_bits_long(gb, esc_len); 394cabdff1aSopenharmony_ci 395cabdff1aSopenharmony_ci return buf + limit - 1; 396cabdff1aSopenharmony_ci } 397cabdff1aSopenharmony_ci#else 398cabdff1aSopenharmony_ci OPEN_READER(re, gb); 399cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 400cabdff1aSopenharmony_ci buf = GET_CACHE(re, gb); 401cabdff1aSopenharmony_ci 402cabdff1aSopenharmony_ci log = av_log2(buf); 403cabdff1aSopenharmony_ci 404cabdff1aSopenharmony_ci if (log > 31 - limit) { 405cabdff1aSopenharmony_ci buf >>= log - k; 406cabdff1aSopenharmony_ci buf += (30U - log) << k; 407cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 32 + k - log); 408cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 409cabdff1aSopenharmony_ci 410cabdff1aSopenharmony_ci return buf; 411cabdff1aSopenharmony_ci } else { 412cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, limit); 413cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 414cabdff1aSopenharmony_ci 415cabdff1aSopenharmony_ci buf = SHOW_UBITS(re, gb, esc_len); 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, esc_len); 418cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 419cabdff1aSopenharmony_ci 420cabdff1aSopenharmony_ci return buf + limit - 1; 421cabdff1aSopenharmony_ci } 422cabdff1aSopenharmony_ci#endif 423cabdff1aSopenharmony_ci} 424cabdff1aSopenharmony_ci 425cabdff1aSopenharmony_ci/** 426cabdff1aSopenharmony_ci * read unsigned golomb rice code (jpegls). 427cabdff1aSopenharmony_ci */ 428cabdff1aSopenharmony_cistatic inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, 429cabdff1aSopenharmony_ci int esc_len) 430cabdff1aSopenharmony_ci{ 431cabdff1aSopenharmony_ci unsigned int buf; 432cabdff1aSopenharmony_ci int log; 433cabdff1aSopenharmony_ci 434cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER 435cabdff1aSopenharmony_ci buf = show_bits_long(gb, 32); 436cabdff1aSopenharmony_ci 437cabdff1aSopenharmony_ci log = av_log2(buf); 438cabdff1aSopenharmony_ci 439cabdff1aSopenharmony_ci if (log - k >= 1 && 32 - log < limit) { 440cabdff1aSopenharmony_ci buf >>= log - k; 441cabdff1aSopenharmony_ci buf += (30 - log) << k; 442cabdff1aSopenharmony_ci skip_bits_long(gb, 32 + k - log); 443cabdff1aSopenharmony_ci 444cabdff1aSopenharmony_ci return buf; 445cabdff1aSopenharmony_ci } else { 446cabdff1aSopenharmony_ci int i; 447cabdff1aSopenharmony_ci for (i = 0; 448cabdff1aSopenharmony_ci i < limit && get_bits1(gb) == 0 && get_bits_left(gb) > 0; 449cabdff1aSopenharmony_ci i++); 450cabdff1aSopenharmony_ci 451cabdff1aSopenharmony_ci if (i < limit - 1) { 452cabdff1aSopenharmony_ci buf = get_bits_long(gb, k); 453cabdff1aSopenharmony_ci 454cabdff1aSopenharmony_ci return buf + (i << k); 455cabdff1aSopenharmony_ci } else if (i == limit - 1) { 456cabdff1aSopenharmony_ci buf = get_bits_long(gb, esc_len); 457cabdff1aSopenharmony_ci 458cabdff1aSopenharmony_ci return buf + 1; 459cabdff1aSopenharmony_ci } else 460cabdff1aSopenharmony_ci return -1; 461cabdff1aSopenharmony_ci } 462cabdff1aSopenharmony_ci#else 463cabdff1aSopenharmony_ci OPEN_READER(re, gb); 464cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 465cabdff1aSopenharmony_ci buf = GET_CACHE(re, gb); 466cabdff1aSopenharmony_ci 467cabdff1aSopenharmony_ci log = av_log2(buf); 468cabdff1aSopenharmony_ci 469cabdff1aSopenharmony_ci av_assert2(k <= 31); 470cabdff1aSopenharmony_ci 471cabdff1aSopenharmony_ci if (log - k >= 32 - MIN_CACHE_BITS + (MIN_CACHE_BITS == 32) && 472cabdff1aSopenharmony_ci 32 - log < limit) { 473cabdff1aSopenharmony_ci buf >>= log - k; 474cabdff1aSopenharmony_ci buf += (30U - log) << k; 475cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 32 + k - log); 476cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 477cabdff1aSopenharmony_ci 478cabdff1aSopenharmony_ci return buf; 479cabdff1aSopenharmony_ci } else { 480cabdff1aSopenharmony_ci int i; 481cabdff1aSopenharmony_ci for (i = 0; i + MIN_CACHE_BITS <= limit && SHOW_UBITS(re, gb, MIN_CACHE_BITS) == 0; i += MIN_CACHE_BITS) { 482cabdff1aSopenharmony_ci if (gb->size_in_bits <= re_index) { 483cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 484cabdff1aSopenharmony_ci return -1; 485cabdff1aSopenharmony_ci } 486cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, MIN_CACHE_BITS); 487cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 488cabdff1aSopenharmony_ci } 489cabdff1aSopenharmony_ci for (; i < limit && SHOW_UBITS(re, gb, 1) == 0; i++) { 490cabdff1aSopenharmony_ci SKIP_BITS(re, gb, 1); 491cabdff1aSopenharmony_ci } 492cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 1); 493cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 494cabdff1aSopenharmony_ci 495cabdff1aSopenharmony_ci if (i < limit - 1) { 496cabdff1aSopenharmony_ci if (k) { 497cabdff1aSopenharmony_ci if (k > MIN_CACHE_BITS - 1) { 498cabdff1aSopenharmony_ci buf = SHOW_UBITS(re, gb, 16) << (k-16); 499cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, 16); 500cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 501cabdff1aSopenharmony_ci buf |= SHOW_UBITS(re, gb, k-16); 502cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, k-16); 503cabdff1aSopenharmony_ci } else { 504cabdff1aSopenharmony_ci buf = SHOW_UBITS(re, gb, k); 505cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, k); 506cabdff1aSopenharmony_ci } 507cabdff1aSopenharmony_ci } else { 508cabdff1aSopenharmony_ci buf = 0; 509cabdff1aSopenharmony_ci } 510cabdff1aSopenharmony_ci 511cabdff1aSopenharmony_ci buf += ((SUINT)i << k); 512cabdff1aSopenharmony_ci } else if (i == limit - 1) { 513cabdff1aSopenharmony_ci buf = SHOW_UBITS(re, gb, esc_len); 514cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, esc_len); 515cabdff1aSopenharmony_ci 516cabdff1aSopenharmony_ci buf ++; 517cabdff1aSopenharmony_ci } else { 518cabdff1aSopenharmony_ci buf = -1; 519cabdff1aSopenharmony_ci } 520cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 521cabdff1aSopenharmony_ci return buf; 522cabdff1aSopenharmony_ci } 523cabdff1aSopenharmony_ci#endif 524cabdff1aSopenharmony_ci} 525cabdff1aSopenharmony_ci 526cabdff1aSopenharmony_ci/** 527cabdff1aSopenharmony_ci * read signed golomb rice code (ffv1). 528cabdff1aSopenharmony_ci */ 529cabdff1aSopenharmony_cistatic inline int get_sr_golomb(GetBitContext *gb, int k, int limit, 530cabdff1aSopenharmony_ci int esc_len) 531cabdff1aSopenharmony_ci{ 532cabdff1aSopenharmony_ci unsigned v = get_ur_golomb(gb, k, limit, esc_len); 533cabdff1aSopenharmony_ci return (v >> 1) ^ -(v & 1); 534cabdff1aSopenharmony_ci} 535cabdff1aSopenharmony_ci 536cabdff1aSopenharmony_ci/** 537cabdff1aSopenharmony_ci * read signed golomb rice code (flac). 538cabdff1aSopenharmony_ci */ 539cabdff1aSopenharmony_cistatic inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, 540cabdff1aSopenharmony_ci int esc_len) 541cabdff1aSopenharmony_ci{ 542cabdff1aSopenharmony_ci unsigned v = get_ur_golomb_jpegls(gb, k, limit, esc_len); 543cabdff1aSopenharmony_ci return (v >> 1) ^ -(v & 1); 544cabdff1aSopenharmony_ci} 545cabdff1aSopenharmony_ci 546cabdff1aSopenharmony_ci/** 547cabdff1aSopenharmony_ci * read unsigned golomb rice code (shorten). 548cabdff1aSopenharmony_ci */ 549cabdff1aSopenharmony_cistatic inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k) 550cabdff1aSopenharmony_ci{ 551cabdff1aSopenharmony_ci return get_ur_golomb_jpegls(gb, k, INT_MAX, 0); 552cabdff1aSopenharmony_ci} 553cabdff1aSopenharmony_ci 554cabdff1aSopenharmony_ci/** 555cabdff1aSopenharmony_ci * read signed golomb rice code (shorten). 556cabdff1aSopenharmony_ci */ 557cabdff1aSopenharmony_cistatic inline int get_sr_golomb_shorten(GetBitContext *gb, int k) 558cabdff1aSopenharmony_ci{ 559cabdff1aSopenharmony_ci int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0); 560cabdff1aSopenharmony_ci return (uvar >> 1) ^ -(uvar & 1); 561cabdff1aSopenharmony_ci} 562cabdff1aSopenharmony_ci 563cabdff1aSopenharmony_ci#ifdef TRACE 564cabdff1aSopenharmony_ci 565cabdff1aSopenharmony_cistatic inline int get_ue(GetBitContext *s, const char *file, const char *func, 566cabdff1aSopenharmony_ci int line) 567cabdff1aSopenharmony_ci{ 568cabdff1aSopenharmony_ci int show = show_bits(s, 24); 569cabdff1aSopenharmony_ci int pos = get_bits_count(s); 570cabdff1aSopenharmony_ci int i = get_ue_golomb(s); 571cabdff1aSopenharmony_ci int len = get_bits_count(s) - pos; 572cabdff1aSopenharmony_ci int bits = show >> (24 - len); 573cabdff1aSopenharmony_ci 574cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue @%5d in %s %s:%d\n", 575cabdff1aSopenharmony_ci bits, len, i, pos, file, func, line); 576cabdff1aSopenharmony_ci 577cabdff1aSopenharmony_ci return i; 578cabdff1aSopenharmony_ci} 579cabdff1aSopenharmony_ci 580cabdff1aSopenharmony_cistatic inline int get_se(GetBitContext *s, const char *file, const char *func, 581cabdff1aSopenharmony_ci int line) 582cabdff1aSopenharmony_ci{ 583cabdff1aSopenharmony_ci int show = show_bits(s, 24); 584cabdff1aSopenharmony_ci int pos = get_bits_count(s); 585cabdff1aSopenharmony_ci int i = get_se_golomb(s); 586cabdff1aSopenharmony_ci int len = get_bits_count(s) - pos; 587cabdff1aSopenharmony_ci int bits = show >> (24 - len); 588cabdff1aSopenharmony_ci 589cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se @%5d in %s %s:%d\n", 590cabdff1aSopenharmony_ci bits, len, i, pos, file, func, line); 591cabdff1aSopenharmony_ci 592cabdff1aSopenharmony_ci return i; 593cabdff1aSopenharmony_ci} 594cabdff1aSopenharmony_ci 595cabdff1aSopenharmony_cistatic inline int get_te(GetBitContext *s, int r, char *file, const char *func, 596cabdff1aSopenharmony_ci int line) 597cabdff1aSopenharmony_ci{ 598cabdff1aSopenharmony_ci int show = show_bits(s, 24); 599cabdff1aSopenharmony_ci int pos = get_bits_count(s); 600cabdff1aSopenharmony_ci int i = get_te0_golomb(s, r); 601cabdff1aSopenharmony_ci int len = get_bits_count(s) - pos; 602cabdff1aSopenharmony_ci int bits = show >> (24 - len); 603cabdff1aSopenharmony_ci 604cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te @%5d in %s %s:%d\n", 605cabdff1aSopenharmony_ci bits, len, i, pos, file, func, line); 606cabdff1aSopenharmony_ci 607cabdff1aSopenharmony_ci return i; 608cabdff1aSopenharmony_ci} 609cabdff1aSopenharmony_ci 610cabdff1aSopenharmony_ci#define get_ue_golomb(a) get_ue(a, __FILE__, __func__, __LINE__) 611cabdff1aSopenharmony_ci#define get_se_golomb(a) get_se(a, __FILE__, __func__, __LINE__) 612cabdff1aSopenharmony_ci#define get_te_golomb(a, r) get_te(a, r, __FILE__, __func__, __LINE__) 613cabdff1aSopenharmony_ci#define get_te0_golomb(a, r) get_te(a, r, __FILE__, __func__, __LINE__) 614cabdff1aSopenharmony_ci 615cabdff1aSopenharmony_ci#endif /* TRACE */ 616cabdff1aSopenharmony_ci#endif /* AVCODEC_GOLOMB_H */ 617