annotate libavcodec/golomb.h @ 9:ea1ba68cf0ed

update to match api changes + add sscc produced source
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Wed, 05 Jun 2013 14:43:26 +0200
parents
children
rev   line source
nengel@2 1 /*
nengel@2 2 * exp golomb vlc stuff
nengel@2 3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
nengel@2 4 * Copyright (c) 2004 Alex Beregszaszi
nengel@2 5 *
nengel@2 6 * This file is part of FFmpeg.
nengel@2 7 *
nengel@2 8 * FFmpeg is free software; you can redistribute it and/or
nengel@2 9 * modify it under the terms of the GNU Lesser General Public
nengel@2 10 * License as published by the Free Software Foundation; either
nengel@2 11 * version 2.1 of the License, or (at your option) any later version.
nengel@2 12 *
nengel@2 13 * FFmpeg is distributed in the hope that it will be useful,
nengel@2 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nengel@2 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
nengel@2 16 * Lesser General Public License for more details.
nengel@2 17 *
nengel@2 18 * You should have received a copy of the GNU Lesser General Public
nengel@2 19 * License along with FFmpeg; if not, write to the Free Software
nengel@2 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
nengel@2 21 */
nengel@2 22
nengel@2 23 /**
nengel@2 24 * @file
nengel@2 25 * @brief
nengel@2 26 * exp golomb vlc stuff
nengel@2 27 * @author Michael Niedermayer <michaelni@gmx.at> and Alex Beregszaszi
nengel@2 28 */
nengel@2 29
nengel@2 30 #ifndef AVCODEC_GOLOMB_H
nengel@2 31 #define AVCODEC_GOLOMB_H
nengel@2 32
nengel@2 33 #include <stdint.h>
nengel@2 34 #include "get_bits.h"
nengel@2 35
nengel@2 36 #define INVALID_VLC 0x80000000
nengel@2 37
nengel@2 38 extern const uint8_t ff_golomb_vlc_len[512];
nengel@2 39 extern const uint8_t ff_ue_golomb_vlc_code[512];
nengel@2 40 extern const int8_t ff_se_golomb_vlc_code[512];
nengel@2 41 extern const uint8_t ff_ue_golomb_len[256];
nengel@2 42
nengel@2 43 extern const uint8_t ff_interleaved_golomb_vlc_len[256];
nengel@2 44 extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
nengel@2 45 extern const int8_t ff_interleaved_se_golomb_vlc_code[256];
nengel@2 46 extern const uint8_t ff_interleaved_dirac_golomb_vlc_code[256];
nengel@2 47
nengel@2 48
nengel@2 49 /**
nengel@2 50 * read unsigned exp golomb code.
nengel@2 51 */
nengel@2 52 static inline int get_ue_golomb(GetBitContext *gb){
nengel@2 53 unsigned int buf;
nengel@2 54 int log;
nengel@2 55
nengel@2 56 OPEN_READER(re, gb);
nengel@2 57 UPDATE_CACHE(re, gb);
nengel@2 58 buf=GET_CACHE(re, gb);
nengel@2 59
nengel@2 60 if(buf >= (1<<27)){
nengel@2 61 buf >>= 32 - 9;
nengel@2 62 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
nengel@2 63 CLOSE_READER(re, gb);
nengel@2 64
nengel@2 65 return ff_ue_golomb_vlc_code[buf];
nengel@2 66 }else{
nengel@2 67 log= 2*av_log2_c(buf) - 31;
nengel@2 68 buf>>= log;
nengel@2 69 buf--;
nengel@2 70 LAST_SKIP_BITS(re, gb, 32 - log);
nengel@2 71 CLOSE_READER(re, gb);
nengel@2 72
nengel@2 73 return buf;
nengel@2 74 }
nengel@2 75 }
nengel@2 76
nengel@2 77 /**
nengel@2 78 * read unsigned exp golomb code, constraint to a max of 31.
nengel@2 79 * the return value is undefined if the stored value exceeds 31.
nengel@2 80 */
nengel@2 81 static inline int get_ue_golomb_31(GetBitContext *gb){
nengel@2 82 unsigned int buf;
nengel@2 83
nengel@2 84 OPEN_READER(re, gb);
nengel@2 85 UPDATE_CACHE(re, gb);
nengel@2 86 buf=GET_CACHE(re, gb);
nengel@2 87
nengel@2 88 buf >>= 32 - 9;
nengel@2 89 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
nengel@2 90 CLOSE_READER(re, gb);
nengel@2 91
nengel@2 92 return ff_ue_golomb_vlc_code[buf];
nengel@2 93 }
nengel@2 94
nengel@2 95 static inline int svq3_get_ue_golomb(GetBitContext *gb){
nengel@2 96 uint32_t buf;
nengel@2 97
nengel@2 98 OPEN_READER(re, gb);
nengel@2 99 UPDATE_CACHE(re, gb);
nengel@2 100 buf=GET_CACHE(re, gb);
nengel@2 101
nengel@2 102 if(buf&0xAA800000){
nengel@2 103 buf >>= 32 - 8;
nengel@2 104 LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
nengel@2 105 CLOSE_READER(re, gb);
nengel@2 106
nengel@2 107 return ff_interleaved_ue_golomb_vlc_code[buf];
nengel@2 108 }else{
nengel@2 109 int ret = 1;
nengel@2 110
nengel@2 111 while (1) {
nengel@2 112 buf >>= 32 - 8;
nengel@2 113 LAST_SKIP_BITS(re, gb, FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
nengel@2 114
nengel@2 115 if (ff_interleaved_golomb_vlc_len[buf] != 9){
nengel@2 116 ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
nengel@2 117 ret |= ff_interleaved_dirac_golomb_vlc_code[buf];
nengel@2 118 break;
nengel@2 119 }
nengel@2 120 ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
nengel@2 121 UPDATE_CACHE(re, gb);
nengel@2 122 buf = GET_CACHE(re, gb);
nengel@2 123 }
nengel@2 124
nengel@2 125 CLOSE_READER(re, gb);
nengel@2 126 return ret - 1;
nengel@2 127 }
nengel@2 128 }
nengel@2 129
nengel@2 130 /**
nengel@2 131 * read unsigned truncated exp golomb code.
nengel@2 132 */
nengel@2 133 static inline int get_te0_golomb(GetBitContext *gb, int range){
nengel@2 134 assert(range >= 1);
nengel@2 135
nengel@2 136 if(range==1) return 0;
nengel@2 137 else if(range==2) return get_bits1(gb)^1;
nengel@2 138 else return get_ue_golomb(gb);
nengel@2 139 }
nengel@2 140
nengel@2 141 /**
nengel@2 142 * read unsigned truncated exp golomb code.
nengel@2 143 */
nengel@2 144 static inline int get_te_golomb(GetBitContext *gb, int range){
nengel@2 145 assert(range >= 1);
nengel@2 146
nengel@2 147 if(range==2) return get_bits1(gb)^1;
nengel@2 148 else return get_ue_golomb(gb);
nengel@2 149 }
nengel@2 150
nengel@2 151
nengel@2 152 /**
nengel@2 153 * read signed exp golomb code.
nengel@2 154 */
nengel@2 155 static inline int get_se_golomb(GetBitContext *gb){
nengel@2 156 unsigned int buf;
nengel@2 157 int log;
nengel@2 158
nengel@2 159 OPEN_READER(re, gb);
nengel@2 160 UPDATE_CACHE(re, gb);
nengel@2 161 buf=GET_CACHE(re, gb);
nengel@2 162
nengel@2 163 if(buf >= (1<<27)){
nengel@2 164 buf >>= 32 - 9;
nengel@2 165 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
nengel@2 166 CLOSE_READER(re, gb);
nengel@2 167
nengel@2 168 return ff_se_golomb_vlc_code[buf];
nengel@2 169 }else{
nengel@2 170 log= 2*av_log2_c(buf) - 31;
nengel@2 171 buf>>= log;
nengel@2 172
nengel@2 173 LAST_SKIP_BITS(re, gb, 32 - log);
nengel@2 174 CLOSE_READER(re, gb);
nengel@2 175
nengel@2 176 if(buf&1) buf= -(buf>>1);
nengel@2 177 else buf= (buf>>1);
nengel@2 178
nengel@2 179 return buf;
nengel@2 180 }
nengel@2 181 }
nengel@2 182
nengel@2 183 static inline int svq3_get_se_golomb(GetBitContext *gb){
nengel@2 184 unsigned int buf;
nengel@2 185 int log;
nengel@2 186
nengel@2 187 OPEN_READER(re, gb);
nengel@2 188 UPDATE_CACHE(re, gb);
nengel@2 189 buf=GET_CACHE(re, gb);
nengel@2 190
nengel@2 191 if(buf&0xAA800000){
nengel@2 192 buf >>= 32 - 8;
nengel@2 193 LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
nengel@2 194 CLOSE_READER(re, gb);
nengel@2 195
nengel@2 196 return ff_interleaved_se_golomb_vlc_code[buf];
nengel@2 197 }else{
nengel@2 198 LAST_SKIP_BITS(re, gb, 8);
nengel@2 199 UPDATE_CACHE(re, gb);
nengel@2 200 buf |= 1 | (GET_CACHE(re, gb) >> 8);
nengel@2 201
nengel@2 202 if((buf & 0xAAAAAAAA) == 0)
nengel@2 203 return INVALID_VLC;
nengel@2 204
nengel@2 205 for(log=31; (buf & 0x80000000) == 0; log--){
nengel@2 206 buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
nengel@2 207 }
nengel@2 208
nengel@2 209 LAST_SKIP_BITS(re, gb, 63 - 2*log - 8);
nengel@2 210 CLOSE_READER(re, gb);
nengel@2 211
nengel@2 212 return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
nengel@2 213 }
nengel@2 214 }
nengel@2 215
nengel@2 216 static inline int dirac_get_se_golomb(GetBitContext *gb){
nengel@2 217 uint32_t buf;
nengel@2 218 uint32_t ret;
nengel@2 219
nengel@2 220 ret = svq3_get_ue_golomb(gb);
nengel@2 221
nengel@2 222 if (ret) {
nengel@2 223 OPEN_READER(re, gb);
nengel@2 224 UPDATE_CACHE(re, gb);
nengel@2 225 buf = SHOW_SBITS(re, gb, 1);
nengel@2 226 LAST_SKIP_BITS(re, gb, 1);
nengel@2 227 ret = (ret ^ buf) - buf;
nengel@2 228 CLOSE_READER(re, gb);
nengel@2 229 }
nengel@2 230
nengel@2 231 return ret;
nengel@2 232 }
nengel@2 233
nengel@2 234 /**
nengel@2 235 * read unsigned golomb rice code (ffv1).
nengel@2 236 */
nengel@2 237 static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len){
nengel@2 238 unsigned int buf;
nengel@2 239 int log;
nengel@2 240
nengel@2 241 OPEN_READER(re, gb);
nengel@2 242 UPDATE_CACHE(re, gb);
nengel@2 243 buf=GET_CACHE(re, gb);
nengel@2 244
nengel@2 245 log= av_log2_c(buf);
nengel@2 246
nengel@2 247 if(log > 31-limit){
nengel@2 248 buf >>= log - k;
nengel@2 249 buf += (30-log)<<k;
nengel@2 250 LAST_SKIP_BITS(re, gb, 32 + k - log);
nengel@2 251 CLOSE_READER(re, gb);
nengel@2 252
nengel@2 253 return buf;
nengel@2 254 }else{
nengel@2 255 LAST_SKIP_BITS(re, gb, limit);
nengel@2 256 UPDATE_CACHE(re, gb);
nengel@2 257
nengel@2 258 buf = SHOW_UBITS(re, gb, esc_len);
nengel@2 259
nengel@2 260 LAST_SKIP_BITS(re, gb, esc_len);
nengel@2 261 CLOSE_READER(re, gb);
nengel@2 262
nengel@2 263 return buf + limit - 1;
nengel@2 264 }
nengel@2 265 }
nengel@2 266
nengel@2 267 /**
nengel@2 268 * read unsigned golomb rice code (jpegls).
nengel@2 269 */
nengel@2 270 static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int esc_len){
nengel@2 271 unsigned int buf;
nengel@2 272 int log;
nengel@2 273
nengel@2 274 OPEN_READER(re, gb);
nengel@2 275 UPDATE_CACHE(re, gb);
nengel@2 276 buf=GET_CACHE(re, gb);
nengel@2 277
nengel@2 278 log= av_log2_c(buf);
nengel@2 279
nengel@2 280 if(log - k >= 32-MIN_CACHE_BITS+(MIN_CACHE_BITS==32) && 32-log < limit){
nengel@2 281 buf >>= log - k;
nengel@2 282 buf += (30-log)<<k;
nengel@2 283 LAST_SKIP_BITS(re, gb, 32 + k - log);
nengel@2 284 CLOSE_READER(re, gb);
nengel@2 285
nengel@2 286 return buf;
nengel@2 287 }else{
nengel@2 288 int i;
nengel@2 289 for(i=0; SHOW_UBITS(re, gb, 1) == 0; i++){
nengel@2 290 LAST_SKIP_BITS(re, gb, 1);
nengel@2 291 UPDATE_CACHE(re, gb);
nengel@2 292 }
nengel@2 293 SKIP_BITS(re, gb, 1);
nengel@2 294
nengel@2 295 if(i < limit - 1){
nengel@2 296 if(k){
nengel@2 297 buf = SHOW_UBITS(re, gb, k);
nengel@2 298 LAST_SKIP_BITS(re, gb, k);
nengel@2 299 }else{
nengel@2 300 buf=0;
nengel@2 301 }
nengel@2 302
nengel@2 303 CLOSE_READER(re, gb);
nengel@2 304 return buf + (i<<k);
nengel@2 305 }else if(i == limit - 1){
nengel@2 306 buf = SHOW_UBITS(re, gb, esc_len);
nengel@2 307 LAST_SKIP_BITS(re, gb, esc_len);
nengel@2 308 CLOSE_READER(re, gb);
nengel@2 309
nengel@2 310 return buf + 1;
nengel@2 311 }else
nengel@2 312 return -1;
nengel@2 313 }
nengel@2 314 }
nengel@2 315
nengel@2 316 /**
nengel@2 317 * read signed golomb rice code (ffv1).
nengel@2 318 */
nengel@2 319 static inline int get_sr_golomb(GetBitContext *gb, int k, int limit, int esc_len){
nengel@2 320 int v= get_ur_golomb(gb, k, limit, esc_len);
nengel@2 321
nengel@2 322 v++;
nengel@2 323 if (v&1) return v>>1;
nengel@2 324 else return -(v>>1);
nengel@2 325
nengel@2 326 // return (v>>1) ^ -(v&1);
nengel@2 327 }
nengel@2 328
nengel@2 329 /**
nengel@2 330 * read signed golomb rice code (flac).
nengel@2 331 */
nengel@2 332 static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, int esc_len){
nengel@2 333 int v= get_ur_golomb_jpegls(gb, k, limit, esc_len);
nengel@2 334 return (v>>1) ^ -(v&1);
nengel@2 335 }
nengel@2 336
nengel@2 337 /**
nengel@2 338 * read unsigned golomb rice code (shorten).
nengel@2 339 */
nengel@2 340 static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k){
nengel@2 341 return get_ur_golomb_jpegls(gb, k, INT_MAX, 0);
nengel@2 342 }
nengel@2 343
nengel@2 344 /**
nengel@2 345 * read signed golomb rice code (shorten).
nengel@2 346 */
nengel@2 347 static inline int get_sr_golomb_shorten(GetBitContext* gb, int k)
nengel@2 348 {
nengel@2 349 int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0);
nengel@2 350 if (uvar & 1)
nengel@2 351 return ~(uvar >> 1);
nengel@2 352 else
nengel@2 353 return uvar >> 1;
nengel@2 354 }
nengel@2 355
nengel@2 356
nengel@2 357
nengel@2 358 #ifdef TRACE
nengel@2 359
nengel@2 360 static inline int get_ue(GetBitContext *s, char *file, const char *func, int line){
nengel@2 361 int show= show_bits(s, 24);
nengel@2 362 int pos= get_bits_count(s);
nengel@2 363 int i= get_ue_golomb(s);
nengel@2 364 int len= get_bits_count(s) - pos;
nengel@2 365 int bits= show>>(24-len);
nengel@2 366
nengel@2 367 print_bin(bits, len);
nengel@2 368
nengel@2 369 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
nengel@2 370
nengel@2 371 return i;
nengel@2 372 }
nengel@2 373
nengel@2 374 static inline int get_se(GetBitContext *s, char *file, const char *func, int line){
nengel@2 375 int show= show_bits(s, 24);
nengel@2 376 int pos= get_bits_count(s);
nengel@2 377 int i= get_se_golomb(s);
nengel@2 378 int len= get_bits_count(s) - pos;
nengel@2 379 int bits= show>>(24-len);
nengel@2 380
nengel@2 381 print_bin(bits, len);
nengel@2 382
nengel@2 383 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
nengel@2 384
nengel@2 385 return i;
nengel@2 386 }
nengel@2 387
nengel@2 388 static inline int get_te(GetBitContext *s, int r, char *file, const char *func, int line){
nengel@2 389 int show= show_bits(s, 24);
nengel@2 390 int pos= get_bits_count(s);
nengel@2 391 int i= get_te0_golomb(s, r);
nengel@2 392 int len= get_bits_count(s) - pos;
nengel@2 393 int bits= show>>(24-len);
nengel@2 394
nengel@2 395 print_bin(bits, len);
nengel@2 396
nengel@2 397 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
nengel@2 398
nengel@2 399 return i;
nengel@2 400 }
nengel@2 401
nengel@2 402 #define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
nengel@2 403 #define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
nengel@2 404 #define get_te_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
nengel@2 405 #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
nengel@2 406
nengel@2 407 #endif
nengel@2 408
nengel@2 409
nengel@2 410 #endif /* AVCODEC_GOLOMB_H */