Mercurial > libavcodec.hg
annotate get_bits.h @ 11032:01bd040f8607 libavcodec
Unroll main loop so the edge==0 case is seperate.
This allows many things to be simplified away.
h264 decoder is overall 1% faster with a mbaff sample and
0.1% slower with the cathedral sample, probably because the slow loop
filter code must be loaded into the code cache for each first MB of each
row but isnt used for the following MBs.
| author | michael |
|---|---|
| date | Thu, 28 Jan 2010 01:24:25 +0000 |
| parents | 9bd48e510bef |
| children | 87bcae769ee7 |
| rev | line source |
|---|---|
| 9428 | 1 /* |
| 2 * copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at> | |
| 3 * | |
| 4 * This file is part of FFmpeg. | |
| 5 * | |
| 6 * FFmpeg is free software; you can redistribute it and/or | |
| 7 * modify it under the terms of the GNU Lesser General Public | |
| 8 * License as published by the Free Software Foundation; either | |
| 9 * version 2.1 of the License, or (at your option) any later version. | |
| 10 * | |
| 11 * FFmpeg is distributed in the hope that it will be useful, | |
| 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 14 * Lesser General Public License for more details. | |
| 15 * | |
| 16 * You should have received a copy of the GNU Lesser General Public | |
| 17 * License along with FFmpeg; if not, write to the Free Software | |
| 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| 19 */ | |
| 20 | |
| 21 /** | |
| 22 * @file libavcodec/get_bits.h | |
| 23 * bitstream reader API header. | |
| 24 */ | |
| 25 | |
| 26 #ifndef AVCODEC_GET_BITS_H | |
| 27 #define AVCODEC_GET_BITS_H | |
| 28 | |
| 29 #include <stdint.h> | |
| 30 #include <stdlib.h> | |
| 31 #include <assert.h> | |
| 32 #include "libavutil/bswap.h" | |
| 33 #include "libavutil/common.h" | |
| 34 #include "libavutil/intreadwrite.h" | |
| 35 #include "libavutil/log.h" | |
| 36 #include "mathops.h" | |
| 37 | |
| 38 #if defined(ALT_BITSTREAM_READER_LE) && !defined(ALT_BITSTREAM_READER) | |
| 39 # define ALT_BITSTREAM_READER | |
| 40 #endif | |
| 41 | |
| 42 #if !defined(LIBMPEG2_BITSTREAM_READER) && !defined(A32_BITSTREAM_READER) && !defined(ALT_BITSTREAM_READER) | |
|
10703
3be801dcc8a1
ARM: use ALT_BITSTREAM_READER on cores with fast unaligned access
mru
parents:
10504
diff
changeset
|
43 # if ARCH_ARM && !HAVE_FAST_UNALIGNED |
| 9428 | 44 # define A32_BITSTREAM_READER |
| 45 # else | |
| 46 # define ALT_BITSTREAM_READER | |
| 47 //#define LIBMPEG2_BITSTREAM_READER | |
| 48 //#define A32_BITSTREAM_READER | |
| 49 # endif | |
| 50 #endif | |
| 51 | |
| 52 #if ARCH_X86 | |
| 53 // avoid +32 for shift optimization (gcc should do that ...) | |
| 54 static inline int32_t NEG_SSR32( int32_t a, int8_t s){ | |
| 55 __asm__ ("sarl %1, %0\n\t" | |
| 56 : "+r" (a) | |
| 57 : "ic" ((uint8_t)(-s)) | |
| 58 ); | |
| 59 return a; | |
| 60 } | |
| 61 static inline uint32_t NEG_USR32(uint32_t a, int8_t s){ | |
| 62 __asm__ ("shrl %1, %0\n\t" | |
| 63 : "+r" (a) | |
| 64 : "ic" ((uint8_t)(-s)) | |
| 65 ); | |
| 66 return a; | |
| 67 } | |
| 68 #else | |
| 69 # define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s))) | |
| 70 # define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s))) | |
| 71 #endif | |
| 72 | |
| 73 /* bit input */ | |
| 74 /* buffer, buffer_end and size_in_bits must be present and used by every reader */ | |
| 75 typedef struct GetBitContext { | |
| 76 const uint8_t *buffer, *buffer_end; | |
| 77 #ifdef ALT_BITSTREAM_READER | |
| 78 int index; | |
| 79 #elif defined LIBMPEG2_BITSTREAM_READER | |
| 80 uint8_t *buffer_ptr; | |
| 81 uint32_t cache; | |
| 82 int bit_count; | |
| 83 #elif defined A32_BITSTREAM_READER | |
| 84 uint32_t *buffer_ptr; | |
| 85 uint32_t cache0; | |
| 86 uint32_t cache1; | |
| 87 int bit_count; | |
| 88 #endif | |
| 89 int size_in_bits; | |
| 90 } GetBitContext; | |
| 91 | |
| 92 #define VLC_TYPE int16_t | |
| 93 | |
| 94 typedef struct VLC { | |
| 95 int bits; | |
| 96 VLC_TYPE (*table)[2]; ///< code, bits | |
| 97 int table_size, table_allocated; | |
| 98 } VLC; | |
| 99 | |
| 100 typedef struct RL_VLC_ELEM { | |
| 101 int16_t level; | |
| 102 int8_t len; | |
| 103 uint8_t run; | |
| 104 } RL_VLC_ELEM; | |
| 105 | |
| 106 /* Bitstream reader API docs: | |
| 107 name | |
| 108 arbitrary name which is used as prefix for the internal variables | |
| 109 | |
| 110 gb | |
| 111 getbitcontext | |
| 112 | |
| 113 OPEN_READER(name, gb) | |
| 114 loads gb into local variables | |
| 115 | |
| 116 CLOSE_READER(name, gb) | |
| 117 stores local vars in gb | |
| 118 | |
| 119 UPDATE_CACHE(name, gb) | |
| 120 refills the internal cache from the bitstream | |
| 121 after this call at least MIN_CACHE_BITS will be available, | |
| 122 | |
| 123 GET_CACHE(name, gb) | |
| 124 will output the contents of the internal cache, next bit is MSB of 32 or 64 bit (FIXME 64bit) | |
| 125 | |
| 126 SHOW_UBITS(name, gb, num) | |
| 127 will return the next num bits | |
| 128 | |
| 129 SHOW_SBITS(name, gb, num) | |
| 130 will return the next num bits and do sign extension | |
| 131 | |
| 132 SKIP_BITS(name, gb, num) | |
| 133 will skip over the next num bits | |
| 134 note, this is equivalent to SKIP_CACHE; SKIP_COUNTER | |
| 135 | |
| 136 SKIP_CACHE(name, gb, num) | |
| 137 will remove the next num bits from the cache (note SKIP_COUNTER MUST be called before UPDATE_CACHE / CLOSE_READER) | |
| 138 | |
| 139 SKIP_COUNTER(name, gb, num) | |
| 140 will increment the internal bit counter (see SKIP_CACHE & SKIP_BITS) | |
| 141 | |
| 142 LAST_SKIP_CACHE(name, gb, num) | |
| 143 will remove the next num bits from the cache if it is needed for UPDATE_CACHE otherwise it will do nothing | |
| 144 | |
| 145 LAST_SKIP_BITS(name, gb, num) | |
| 10163 | 146 is equivalent to LAST_SKIP_CACHE; SKIP_COUNTER |
| 9428 | 147 |
| 148 for examples see get_bits, show_bits, skip_bits, get_vlc | |
| 149 */ | |
| 150 | |
| 151 #ifdef ALT_BITSTREAM_READER | |
| 152 # define MIN_CACHE_BITS 25 | |
| 153 | |
| 154 # define OPEN_READER(name, gb)\ | |
|
10997
9bd48e510bef
Mark index as unsigend so gcc knows it doesnt need a sign extension on x86_64.
michael
parents:
10986
diff
changeset
|
155 unsigned int name##_index= (gb)->index;\ |
| 9428 | 156 int name##_cache= 0;\ |
| 157 | |
| 158 # define CLOSE_READER(name, gb)\ | |
| 159 (gb)->index= name##_index;\ | |
| 160 | |
| 161 # ifdef ALT_BITSTREAM_READER_LE | |
| 162 # define UPDATE_CACHE(name, gb)\ | |
| 163 name##_cache= AV_RL32( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) >> (name##_index&0x07);\ | |
| 164 | |
| 165 # define SKIP_CACHE(name, gb, num)\ | |
| 166 name##_cache >>= (num); | |
| 167 # else | |
| 168 # define UPDATE_CACHE(name, gb)\ | |
| 169 name##_cache= AV_RB32( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) << (name##_index&0x07);\ | |
| 170 | |
| 171 # define SKIP_CACHE(name, gb, num)\ | |
| 172 name##_cache <<= (num); | |
| 173 # endif | |
| 174 | |
| 175 // FIXME name? | |
| 176 # define SKIP_COUNTER(name, gb, num)\ | |
| 177 name##_index += (num);\ | |
| 178 | |
| 179 # define SKIP_BITS(name, gb, num)\ | |
| 180 {\ | |
| 181 SKIP_CACHE(name, gb, num)\ | |
| 182 SKIP_COUNTER(name, gb, num)\ | |
| 183 }\ | |
| 184 | |
| 185 # define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) | |
| 186 # define LAST_SKIP_CACHE(name, gb, num) ; | |
| 187 | |
| 188 # ifdef ALT_BITSTREAM_READER_LE | |
| 189 # define SHOW_UBITS(name, gb, num)\ | |
| 190 ((name##_cache) & (NEG_USR32(0xffffffff,num))) | |
| 191 | |
| 192 # define SHOW_SBITS(name, gb, num)\ | |
| 193 NEG_SSR32((name##_cache)<<(32-(num)), num) | |
| 194 # else | |
| 195 # define SHOW_UBITS(name, gb, num)\ | |
| 196 NEG_USR32(name##_cache, num) | |
| 197 | |
| 198 # define SHOW_SBITS(name, gb, num)\ | |
| 199 NEG_SSR32(name##_cache, num) | |
| 200 # endif | |
| 201 | |
| 202 # define GET_CACHE(name, gb)\ | |
| 203 ((uint32_t)name##_cache) | |
| 204 | |
| 10986 | 205 static inline int get_bits_count(const GetBitContext *s){ |
| 9428 | 206 return s->index; |
| 207 } | |
| 208 | |
| 209 static inline void skip_bits_long(GetBitContext *s, int n){ | |
| 210 s->index += n; | |
| 211 } | |
| 212 | |
| 213 #elif defined LIBMPEG2_BITSTREAM_READER | |
| 214 //libmpeg2 like reader | |
| 215 | |
| 216 # define MIN_CACHE_BITS 17 | |
| 217 | |
| 218 # define OPEN_READER(name, gb)\ | |
| 219 int name##_bit_count=(gb)->bit_count;\ | |
| 220 int name##_cache= (gb)->cache;\ | |
| 221 uint8_t * name##_buffer_ptr=(gb)->buffer_ptr;\ | |
| 222 | |
| 223 # define CLOSE_READER(name, gb)\ | |
| 224 (gb)->bit_count= name##_bit_count;\ | |
| 225 (gb)->cache= name##_cache;\ | |
| 226 (gb)->buffer_ptr= name##_buffer_ptr;\ | |
| 227 | |
| 228 # define UPDATE_CACHE(name, gb)\ | |
| 229 if(name##_bit_count >= 0){\ | |
| 230 name##_cache+= AV_RB16(name##_buffer_ptr) << name##_bit_count; \ | |
| 231 name##_buffer_ptr+=2;\ | |
| 232 name##_bit_count-= 16;\ | |
| 233 }\ | |
| 234 | |
| 235 # define SKIP_CACHE(name, gb, num)\ | |
| 236 name##_cache <<= (num);\ | |
| 237 | |
| 238 # define SKIP_COUNTER(name, gb, num)\ | |
| 239 name##_bit_count += (num);\ | |
| 240 | |
| 241 # define SKIP_BITS(name, gb, num)\ | |
| 242 {\ | |
| 243 SKIP_CACHE(name, gb, num)\ | |
| 244 SKIP_COUNTER(name, gb, num)\ | |
| 245 }\ | |
| 246 | |
| 247 # define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num) | |
| 248 # define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num) | |
| 249 | |
| 250 # define SHOW_UBITS(name, gb, num)\ | |
| 251 NEG_USR32(name##_cache, num) | |
| 252 | |
| 253 # define SHOW_SBITS(name, gb, num)\ | |
| 254 NEG_SSR32(name##_cache, num) | |
| 255 | |
| 256 # define GET_CACHE(name, gb)\ | |
| 257 ((uint32_t)name##_cache) | |
| 258 | |
| 10986 | 259 static inline int get_bits_count(const GetBitContext *s){ |
| 9428 | 260 return (s->buffer_ptr - s->buffer)*8 - 16 + s->bit_count; |
| 261 } | |
| 262 | |
| 263 static inline void skip_bits_long(GetBitContext *s, int n){ | |
| 264 OPEN_READER(re, s) | |
| 265 re_bit_count += n; | |
| 266 re_buffer_ptr += 2*(re_bit_count>>4); | |
| 267 re_bit_count &= 15; | |
| 268 re_cache = ((re_buffer_ptr[-2]<<8) + re_buffer_ptr[-1]) << (16+re_bit_count); | |
| 269 UPDATE_CACHE(re, s) | |
| 270 CLOSE_READER(re, s) | |
| 271 } | |
| 272 | |
| 273 #elif defined A32_BITSTREAM_READER | |
| 274 | |
| 275 # define MIN_CACHE_BITS 32 | |
| 276 | |
| 277 # define OPEN_READER(name, gb)\ | |
| 278 int name##_bit_count=(gb)->bit_count;\ | |
| 279 uint32_t name##_cache0= (gb)->cache0;\ | |
| 280 uint32_t name##_cache1= (gb)->cache1;\ | |
| 281 uint32_t * name##_buffer_ptr=(gb)->buffer_ptr;\ | |
| 282 | |
| 283 # define CLOSE_READER(name, gb)\ | |
| 284 (gb)->bit_count= name##_bit_count;\ | |
| 285 (gb)->cache0= name##_cache0;\ | |
| 286 (gb)->cache1= name##_cache1;\ | |
| 287 (gb)->buffer_ptr= name##_buffer_ptr;\ | |
| 288 | |
| 289 # define UPDATE_CACHE(name, gb)\ | |
| 290 if(name##_bit_count > 0){\ | |
| 291 const uint32_t next= be2me_32( *name##_buffer_ptr );\ | |
| 292 name##_cache0 |= NEG_USR32(next,name##_bit_count);\ | |
| 293 name##_cache1 |= next<<name##_bit_count;\ | |
| 294 name##_buffer_ptr++;\ | |
| 295 name##_bit_count-= 32;\ | |
| 296 }\ | |
| 297 | |
| 298 #if ARCH_X86 | |
| 299 # define SKIP_CACHE(name, gb, num)\ | |
| 300 __asm__(\ | |
| 301 "shldl %2, %1, %0 \n\t"\ | |
| 302 "shll %2, %1 \n\t"\ | |
| 303 : "+r" (name##_cache0), "+r" (name##_cache1)\ | |
| 304 : "Ic" ((uint8_t)(num))\ | |
| 305 ); | |
| 306 #else | |
| 307 # define SKIP_CACHE(name, gb, num)\ | |
| 308 name##_cache0 <<= (num);\ | |
| 309 name##_cache0 |= NEG_USR32(name##_cache1,num);\ | |
| 310 name##_cache1 <<= (num); | |
| 311 #endif | |
| 312 | |
| 313 # define SKIP_COUNTER(name, gb, num)\ | |
| 314 name##_bit_count += (num);\ | |
| 315 | |
| 316 # define SKIP_BITS(name, gb, num)\ | |
| 317 {\ | |
| 318 SKIP_CACHE(name, gb, num)\ | |
| 319 SKIP_COUNTER(name, gb, num)\ | |
| 320 }\ | |
| 321 | |
| 322 # define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num) | |
| 323 # define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num) | |
| 324 | |
| 325 # define SHOW_UBITS(name, gb, num)\ | |
| 326 NEG_USR32(name##_cache0, num) | |
| 327 | |
| 328 # define SHOW_SBITS(name, gb, num)\ | |
| 329 NEG_SSR32(name##_cache0, num) | |
| 330 | |
| 331 # define GET_CACHE(name, gb)\ | |
| 332 (name##_cache0) | |
| 333 | |
| 10986 | 334 static inline int get_bits_count(const GetBitContext *s){ |
| 9428 | 335 return ((uint8_t*)s->buffer_ptr - s->buffer)*8 - 32 + s->bit_count; |
| 336 } | |
| 337 | |
| 338 static inline void skip_bits_long(GetBitContext *s, int n){ | |
| 339 OPEN_READER(re, s) | |
| 340 re_bit_count += n; | |
| 341 re_buffer_ptr += re_bit_count>>5; | |
| 342 re_bit_count &= 31; | |
| 343 re_cache0 = be2me_32( re_buffer_ptr[-1] ) << re_bit_count; | |
| 344 re_cache1 = 0; | |
| 345 UPDATE_CACHE(re, s) | |
| 346 CLOSE_READER(re, s) | |
| 347 } | |
| 348 | |
| 349 #endif | |
| 350 | |
| 351 /** | |
| 352 * read mpeg1 dc style vlc (sign bit + mantisse with no MSB). | |
| 353 * if MSB not set it is negative | |
| 354 * @param n length in bits | |
| 355 * @author BERO | |
| 356 */ | |
| 357 static inline int get_xbits(GetBitContext *s, int n){ | |
| 358 register int sign; | |
| 359 register int32_t cache; | |
| 360 OPEN_READER(re, s) | |
| 361 UPDATE_CACHE(re, s) | |
| 362 cache = GET_CACHE(re,s); | |
| 363 sign=(~cache)>>31; | |
| 364 LAST_SKIP_BITS(re, s, n) | |
| 365 CLOSE_READER(re, s) | |
| 366 return (NEG_USR32(sign ^ cache, n) ^ sign) - sign; | |
| 367 } | |
| 368 | |
| 369 static inline int get_sbits(GetBitContext *s, int n){ | |
| 370 register int tmp; | |
| 371 OPEN_READER(re, s) | |
| 372 UPDATE_CACHE(re, s) | |
| 373 tmp= SHOW_SBITS(re, s, n); | |
| 374 LAST_SKIP_BITS(re, s, n) | |
| 375 CLOSE_READER(re, s) | |
| 376 return tmp; | |
| 377 } | |
| 378 | |
| 379 /** | |
| 380 * reads 1-17 bits. | |
| 381 * Note, the alt bitstream reader can read up to 25 bits, but the libmpeg2 reader can't | |
| 382 */ | |
| 383 static inline unsigned int get_bits(GetBitContext *s, int n){ | |
| 384 register int tmp; | |
| 385 OPEN_READER(re, s) | |
| 386 UPDATE_CACHE(re, s) | |
| 387 tmp= SHOW_UBITS(re, s, n); | |
| 388 LAST_SKIP_BITS(re, s, n) | |
| 389 CLOSE_READER(re, s) | |
| 390 return tmp; | |
| 391 } | |
| 392 | |
| 393 /** | |
| 394 * shows 1-17 bits. | |
| 395 * Note, the alt bitstream reader can read up to 25 bits, but the libmpeg2 reader can't | |
| 396 */ | |
| 397 static inline unsigned int show_bits(GetBitContext *s, int n){ | |
| 398 register int tmp; | |
| 399 OPEN_READER(re, s) | |
| 400 UPDATE_CACHE(re, s) | |
| 401 tmp= SHOW_UBITS(re, s, n); | |
| 402 // CLOSE_READER(re, s) | |
| 403 return tmp; | |
| 404 } | |
| 405 | |
| 406 static inline void skip_bits(GetBitContext *s, int n){ | |
| 407 //Note gcc seems to optimize this to s->index+=n for the ALT_READER :)) | |
| 408 OPEN_READER(re, s) | |
| 409 UPDATE_CACHE(re, s) | |
| 410 LAST_SKIP_BITS(re, s, n) | |
| 411 CLOSE_READER(re, s) | |
| 412 } | |
| 413 | |
| 414 static inline unsigned int get_bits1(GetBitContext *s){ | |
| 415 #ifdef ALT_BITSTREAM_READER | |
|
10997
9bd48e510bef
Mark index as unsigend so gcc knows it doesnt need a sign extension on x86_64.
michael
parents:
10986
diff
changeset
|
416 unsigned int index= s->index; |
| 9428 | 417 uint8_t result= s->buffer[ index>>3 ]; |
| 418 #ifdef ALT_BITSTREAM_READER_LE | |
| 419 result>>= (index&0x07); | |
| 420 result&= 1; | |
| 421 #else | |
| 422 result<<= (index&0x07); | |
| 423 result>>= 8 - 1; | |
| 424 #endif | |
| 425 index++; | |
| 426 s->index= index; | |
| 427 | |
| 428 return result; | |
| 429 #else | |
| 430 return get_bits(s, 1); | |
| 431 #endif | |
| 432 } | |
| 433 | |
| 434 static inline unsigned int show_bits1(GetBitContext *s){ | |
| 435 return show_bits(s, 1); | |
| 436 } | |
| 437 | |
| 438 static inline void skip_bits1(GetBitContext *s){ | |
| 439 skip_bits(s, 1); | |
| 440 } | |
| 441 | |
| 442 /** | |
| 443 * reads 0-32 bits. | |
| 444 */ | |
| 445 static inline unsigned int get_bits_long(GetBitContext *s, int n){ | |
| 446 if(n<=17) return get_bits(s, n); | |
| 447 else{ | |
| 448 #ifdef ALT_BITSTREAM_READER_LE | |
| 449 int ret= get_bits(s, 16); | |
| 450 return ret | (get_bits(s, n-16) << 16); | |
| 451 #else | |
| 452 int ret= get_bits(s, 16) << (n-16); | |
| 453 return ret | get_bits(s, n-16); | |
| 454 #endif | |
| 455 } | |
| 456 } | |
| 457 | |
| 458 /** | |
| 459 * reads 0-32 bits as a signed integer. | |
| 460 */ | |
| 461 static inline int get_sbits_long(GetBitContext *s, int n) { | |
| 462 return sign_extend(get_bits_long(s, n), n); | |
| 463 } | |
| 464 | |
| 465 /** | |
| 466 * shows 0-32 bits. | |
| 467 */ | |
| 468 static inline unsigned int show_bits_long(GetBitContext *s, int n){ | |
| 469 if(n<=17) return show_bits(s, n); | |
| 470 else{ | |
| 471 GetBitContext gb= *s; | |
| 472 return get_bits_long(&gb, n); | |
| 473 } | |
| 474 } | |
| 475 | |
| 476 static inline int check_marker(GetBitContext *s, const char *msg) | |
| 477 { | |
| 478 int bit= get_bits1(s); | |
| 479 if(!bit) | |
| 480 av_log(NULL, AV_LOG_INFO, "Marker bit missing %s\n", msg); | |
| 481 | |
| 482 return bit; | |
| 483 } | |
| 484 | |
| 485 /** | |
| 486 * init GetBitContext. | |
| 487 * @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes larger then the actual read bits | |
| 488 * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end | |
| 489 * @param bit_size the size of the buffer in bits | |
|
10148
732dfbf67524
Try to clarify that anyone using get_bits must check for buffer overrun
reimar
parents:
9428
diff
changeset
|
490 * |
|
732dfbf67524
Try to clarify that anyone using get_bits must check for buffer overrun
reimar
parents:
9428
diff
changeset
|
491 * While GetBitContext stores the buffer size, for performance reasons you are |
|
732dfbf67524
Try to clarify that anyone using get_bits must check for buffer overrun
reimar
parents:
9428
diff
changeset
|
492 * responsible for checking for the buffer end yourself (take advantage of the padding)! |
| 9428 | 493 */ |
| 494 static inline void init_get_bits(GetBitContext *s, | |
| 495 const uint8_t *buffer, int bit_size) | |
| 496 { | |
| 497 int buffer_size= (bit_size+7)>>3; | |
| 498 if(buffer_size < 0 || bit_size < 0) { | |
| 499 buffer_size = bit_size = 0; | |
| 500 buffer = NULL; | |
| 501 } | |
| 502 | |
| 503 s->buffer= buffer; | |
| 504 s->size_in_bits= bit_size; | |
| 505 s->buffer_end= buffer + buffer_size; | |
| 506 #ifdef ALT_BITSTREAM_READER | |
| 507 s->index=0; | |
| 508 #elif defined LIBMPEG2_BITSTREAM_READER | |
| 509 s->buffer_ptr = (uint8_t*)((intptr_t)buffer&(~1)); | |
| 510 s->bit_count = 16 + 8*((intptr_t)buffer&1); | |
| 511 skip_bits_long(s, 0); | |
| 512 #elif defined A32_BITSTREAM_READER | |
| 513 s->buffer_ptr = (uint32_t*)((intptr_t)buffer&(~3)); | |
| 514 s->bit_count = 32 + 8*((intptr_t)buffer&3); | |
| 515 skip_bits_long(s, 0); | |
| 516 #endif | |
| 517 } | |
| 518 | |
| 519 static inline void align_get_bits(GetBitContext *s) | |
| 520 { | |
| 521 int n= (-get_bits_count(s)) & 7; | |
| 522 if(n) skip_bits(s, n); | |
| 523 } | |
| 524 | |
| 525 #define init_vlc(vlc, nb_bits, nb_codes,\ | |
| 526 bits, bits_wrap, bits_size,\ | |
| 527 codes, codes_wrap, codes_size,\ | |
| 528 flags)\ | |
| 529 init_vlc_sparse(vlc, nb_bits, nb_codes,\ | |
| 530 bits, bits_wrap, bits_size,\ | |
| 531 codes, codes_wrap, codes_size,\ | |
| 532 NULL, 0, 0, flags) | |
| 533 | |
| 534 int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, | |
| 535 const void *bits, int bits_wrap, int bits_size, | |
| 536 const void *codes, int codes_wrap, int codes_size, | |
| 537 const void *symbols, int symbols_wrap, int symbols_size, | |
| 538 int flags); | |
| 539 #define INIT_VLC_LE 2 | |
| 540 #define INIT_VLC_USE_NEW_STATIC 4 | |
| 541 void free_vlc(VLC *vlc); | |
| 542 | |
| 543 #define INIT_VLC_STATIC(vlc, bits, a,b,c,d,e,f,g, static_size)\ | |
| 544 {\ | |
| 545 static VLC_TYPE table[static_size][2];\ | |
| 546 (vlc)->table= table;\ | |
| 547 (vlc)->table_allocated= static_size;\ | |
| 548 init_vlc(vlc, bits, a,b,c,d,e,f,g, INIT_VLC_USE_NEW_STATIC);\ | |
| 549 } | |
| 550 | |
| 551 | |
| 552 /** | |
| 553 * | |
| 554 * if the vlc code is invalid and max_depth=1 than no bits will be removed | |
| 555 * if the vlc code is invalid and max_depth>1 than the number of bits removed | |
| 556 * is undefined | |
| 557 */ | |
| 558 #define GET_VLC(code, name, gb, table, bits, max_depth)\ | |
| 559 {\ | |
|
10997
9bd48e510bef
Mark index as unsigend so gcc knows it doesnt need a sign extension on x86_64.
michael
parents:
10986
diff
changeset
|
560 int n, nb_bits;\ |
|
9bd48e510bef
Mark index as unsigend so gcc knows it doesnt need a sign extension on x86_64.
michael
parents:
10986
diff
changeset
|
561 unsigned int index;\ |
| 9428 | 562 \ |
| 563 index= SHOW_UBITS(name, gb, bits);\ | |
| 564 code = table[index][0];\ | |
| 565 n = table[index][1];\ | |
| 566 \ | |
| 567 if(max_depth > 1 && n < 0){\ | |
| 568 LAST_SKIP_BITS(name, gb, bits)\ | |
| 569 UPDATE_CACHE(name, gb)\ | |
| 570 \ | |
| 571 nb_bits = -n;\ | |
| 572 \ | |
| 573 index= SHOW_UBITS(name, gb, nb_bits) + code;\ | |
| 574 code = table[index][0];\ | |
| 575 n = table[index][1];\ | |
| 576 if(max_depth > 2 && n < 0){\ | |
| 577 LAST_SKIP_BITS(name, gb, nb_bits)\ | |
| 578 UPDATE_CACHE(name, gb)\ | |
| 579 \ | |
| 580 nb_bits = -n;\ | |
| 581 \ | |
| 582 index= SHOW_UBITS(name, gb, nb_bits) + code;\ | |
| 583 code = table[index][0];\ | |
| 584 n = table[index][1];\ | |
| 585 }\ | |
| 586 }\ | |
| 587 SKIP_BITS(name, gb, n)\ | |
| 588 } | |
| 589 | |
| 590 #define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update)\ | |
| 591 {\ | |
|
10997
9bd48e510bef
Mark index as unsigend so gcc knows it doesnt need a sign extension on x86_64.
michael
parents:
10986
diff
changeset
|
592 int n, nb_bits;\ |
|
9bd48e510bef
Mark index as unsigend so gcc knows it doesnt need a sign extension on x86_64.
michael
parents:
10986
diff
changeset
|
593 unsigned int index;\ |
| 9428 | 594 \ |
| 595 index= SHOW_UBITS(name, gb, bits);\ | |
| 596 level = table[index].level;\ | |
| 597 n = table[index].len;\ | |
| 598 \ | |
| 599 if(max_depth > 1 && n < 0){\ | |
| 600 SKIP_BITS(name, gb, bits)\ | |
| 601 if(need_update){\ | |
| 602 UPDATE_CACHE(name, gb)\ | |
| 603 }\ | |
| 604 \ | |
| 605 nb_bits = -n;\ | |
| 606 \ | |
| 607 index= SHOW_UBITS(name, gb, nb_bits) + level;\ | |
| 608 level = table[index].level;\ | |
| 609 n = table[index].len;\ | |
| 610 }\ | |
| 611 run= table[index].run;\ | |
| 612 SKIP_BITS(name, gb, n)\ | |
| 613 } | |
| 614 | |
| 615 | |
| 616 /** | |
| 617 * parses a vlc code, faster then get_vlc() | |
| 618 * @param bits is the number of bits which will be read at once, must be | |
| 619 * identical to nb_bits in init_vlc() | |
| 620 * @param max_depth is the number of times bits bits must be read to completely | |
| 621 * read the longest vlc code | |
| 622 * = (max_vlc_length + bits - 1) / bits | |
| 623 */ | |
| 624 static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], | |
| 625 int bits, int max_depth) | |
| 626 { | |
| 627 int code; | |
| 628 | |
| 629 OPEN_READER(re, s) | |
| 630 UPDATE_CACHE(re, s) | |
| 631 | |
| 632 GET_VLC(code, re, s, table, bits, max_depth) | |
| 633 | |
| 634 CLOSE_READER(re, s) | |
| 635 return code; | |
| 636 } | |
| 637 | |
| 638 //#define TRACE | |
| 639 | |
| 640 #ifdef TRACE | |
| 641 static inline void print_bin(int bits, int n){ | |
| 642 int i; | |
| 643 | |
| 644 for(i=n-1; i>=0; i--){ | |
| 645 av_log(NULL, AV_LOG_DEBUG, "%d", (bits>>i)&1); | |
| 646 } | |
| 647 for(i=n; i<24; i++) | |
| 648 av_log(NULL, AV_LOG_DEBUG, " "); | |
| 649 } | |
| 650 | |
| 651 static inline int get_bits_trace(GetBitContext *s, int n, char *file, const char *func, int line){ | |
| 652 int r= get_bits(s, n); | |
| 653 | |
| 654 print_bin(r, n); | |
| 655 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d bit @%5d in %s %s:%d\n", r, n, r, get_bits_count(s)-n, file, func, line); | |
| 656 return r; | |
| 657 } | |
| 658 static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], int bits, int max_depth, char *file, const char *func, int line){ | |
| 659 int show= show_bits(s, 24); | |
| 660 int pos= get_bits_count(s); | |
| 661 int r= get_vlc2(s, table, bits, max_depth); | |
| 662 int len= get_bits_count(s) - pos; | |
| 663 int bits2= show>>(24-len); | |
| 664 | |
| 665 print_bin(bits2, len); | |
| 666 | |
| 667 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d vlc @%5d in %s %s:%d\n", bits2, len, r, pos, file, func, line); | |
| 668 return r; | |
| 669 } | |
| 670 static inline int get_xbits_trace(GetBitContext *s, int n, char *file, const char *func, int line){ | |
| 671 int show= show_bits(s, n); | |
| 672 int r= get_xbits(s, n); | |
| 673 | |
| 674 print_bin(show, n); | |
| 675 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d xbt @%5d in %s %s:%d\n", show, n, r, get_bits_count(s)-n, file, func, line); | |
| 676 return r; | |
| 677 } | |
| 678 | |
| 679 #define get_bits(s, n) get_bits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__) | |
| 680 #define get_bits1(s) get_bits_trace(s, 1, __FILE__, __PRETTY_FUNCTION__, __LINE__) | |
| 681 #define get_xbits(s, n) get_xbits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__) | |
| 682 #define get_vlc(s, vlc) get_vlc_trace(s, (vlc)->table, (vlc)->bits, 3, __FILE__, __PRETTY_FUNCTION__, __LINE__) | |
| 683 #define get_vlc2(s, tab, bits, max) get_vlc_trace(s, tab, bits, max, __FILE__, __PRETTY_FUNCTION__, __LINE__) | |
| 684 | |
| 685 #define tprintf(p, ...) av_log(p, AV_LOG_DEBUG, __VA_ARGS__) | |
| 686 | |
| 687 #else //TRACE | |
| 688 #define tprintf(p, ...) {} | |
| 689 #endif | |
| 690 | |
| 691 static inline int decode012(GetBitContext *gb){ | |
| 692 int n; | |
| 693 n = get_bits1(gb); | |
| 694 if (n == 0) | |
| 695 return 0; | |
| 696 else | |
| 697 return get_bits1(gb) + 1; | |
| 698 } | |
| 699 | |
| 700 static inline int decode210(GetBitContext *gb){ | |
| 701 if (get_bits1(gb)) | |
| 702 return 0; | |
| 703 else | |
| 704 return 2 - get_bits1(gb); | |
| 705 } | |
| 706 | |
|
10504
9f16f997c41b
Make get_bits_left() available for use in libavcodec (was previously held
rbultje
parents:
10501
diff
changeset
|
707 static inline int get_bits_left(GetBitContext *gb) |
|
9f16f997c41b
Make get_bits_left() available for use in libavcodec (was previously held
rbultje
parents:
10501
diff
changeset
|
708 { |
|
9f16f997c41b
Make get_bits_left() available for use in libavcodec (was previously held
rbultje
parents:
10501
diff
changeset
|
709 return gb->size_in_bits - get_bits_count(gb); |
|
9f16f997c41b
Make get_bits_left() available for use in libavcodec (was previously held
rbultje
parents:
10501
diff
changeset
|
710 } |
|
9f16f997c41b
Make get_bits_left() available for use in libavcodec (was previously held
rbultje
parents:
10501
diff
changeset
|
711 |
| 9428 | 712 #endif /* AVCODEC_GET_BITS_H */ |
