| 
									
										
										
										
											2006-09-10 14:02:42 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at> | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * This file is part of Libav. | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * Libav is free software; you can redistribute it and/or | 
					
						
							| 
									
										
										
										
											2006-09-10 14:02:42 +00:00
										 |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2006-09-10 14:02:42 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * Libav is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2006-09-10 14:02:42 +00:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * License along with Libav; if not, write to the Free Software | 
					
						
							| 
									
										
										
										
											2006-09-10 14:02:42 +00:00
										 |  |  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-04-20 14:45:34 +00:00
										 |  |  |  * @file | 
					
						
							| 
									
										
										
										
											2009-04-13 16:20:26 +00:00
										 |  |  |  * bitstream reader API header. | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-13 16:20:26 +00:00
										 |  |  | #ifndef AVCODEC_GET_BITS_H
 | 
					
						
							|  |  |  | #define AVCODEC_GET_BITS_H
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-06-16 22:59:13 +00:00
										 |  |  | #include <stdint.h>
 | 
					
						
							| 
									
										
										
										
											2008-05-09 11:56:36 +00:00
										 |  |  | #include "libavutil/common.h"
 | 
					
						
							|  |  |  | #include "libavutil/intreadwrite.h"
 | 
					
						
							|  |  |  | #include "libavutil/log.h"
 | 
					
						
							| 
									
										
										
										
											2009-03-03 02:00:47 +00:00
										 |  |  | #include "mathops.h"
 | 
					
						
							| 
									
										
										
										
											2006-08-28 18:44:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-16 21:42:04 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Safe bitstream reading: | 
					
						
							|  |  |  |  * optionally, the get_bits API can check to ensure that we | 
					
						
							|  |  |  |  * don't read past input buffer boundaries. This is protected | 
					
						
							|  |  |  |  * with CONFIG_SAFE_BITSTREAM_READER at the global level, and | 
					
						
							|  |  |  |  * then below that with UNCHECKED_BITSTREAM_READER at the per- | 
					
						
							|  |  |  |  * decoder level. This means that decoders that check internally | 
					
						
							|  |  |  |  * can "#define UNCHECKED_BITSTREAM_READER 1" to disable | 
					
						
							|  |  |  |  * overread checks. | 
					
						
							|  |  |  |  * Boundary checking causes a minor performance penalty so for | 
					
						
							|  |  |  |  * applications that won't want/need this, it can be disabled | 
					
						
							|  |  |  |  * globally using "#define CONFIG_SAFE_BITSTREAM_READER 0". | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifndef UNCHECKED_BITSTREAM_READER
 | 
					
						
							|  |  |  | #define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | typedef struct GetBitContext { | 
					
						
							|  |  |  |     const uint8_t *buffer, *buffer_end; | 
					
						
							|  |  |  |     int index; | 
					
						
							|  |  |  |     int size_in_bits; | 
					
						
							| 
									
										
										
										
											2011-12-16 21:42:04 +00:00
										 |  |  | #if !UNCHECKED_BITSTREAM_READER
 | 
					
						
							|  |  |  |     int size_in_bits_plus8; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | } GetBitContext; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define VLC_TYPE int16_t
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct VLC { | 
					
						
							|  |  |  |     int bits; | 
					
						
							|  |  |  |     VLC_TYPE (*table)[2]; ///< code, bits
 | 
					
						
							|  |  |  |     int table_size, table_allocated; | 
					
						
							|  |  |  | } VLC; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct RL_VLC_ELEM { | 
					
						
							|  |  |  |     int16_t level; | 
					
						
							|  |  |  |     int8_t len; | 
					
						
							|  |  |  |     uint8_t run; | 
					
						
							|  |  |  | } RL_VLC_ELEM; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Bitstream reader API docs:
 | 
					
						
							|  |  |  | name | 
					
						
							| 
									
										
										
										
											2008-08-29 18:43:20 +00:00
										 |  |  |     arbitrary name which is used as prefix for the internal variables | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | gb | 
					
						
							|  |  |  |     getbitcontext | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OPEN_READER(name, gb) | 
					
						
							| 
									
										
										
										
											2011-12-07 13:03:53 +01:00
										 |  |  |     load gb into local variables | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | CLOSE_READER(name, gb) | 
					
						
							| 
									
										
										
										
											2011-12-07 13:03:53 +01:00
										 |  |  |     store local vars in gb | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | UPDATE_CACHE(name, gb) | 
					
						
							| 
									
										
										
										
											2011-12-07 13:03:53 +01:00
										 |  |  |     refill the internal cache from the bitstream | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     after this call at least MIN_CACHE_BITS will be available, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GET_CACHE(name, gb) | 
					
						
							|  |  |  |     will output the contents of the internal cache, next bit is MSB of 32 or 64 bit (FIXME 64bit) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SHOW_UBITS(name, gb, num) | 
					
						
							| 
									
										
										
										
											2005-06-17 15:02:53 +00:00
										 |  |  |     will return the next num bits | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | SHOW_SBITS(name, gb, num) | 
					
						
							| 
									
										
										
										
											2005-06-17 15:02:53 +00:00
										 |  |  |     will return the next num bits and do sign extension | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | SKIP_BITS(name, gb, num) | 
					
						
							|  |  |  |     will skip over the next num bits | 
					
						
							| 
									
										
										
										
											2005-06-17 15:02:53 +00:00
										 |  |  |     note, this is equivalent to SKIP_CACHE; SKIP_COUNTER | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | SKIP_CACHE(name, gb, num) | 
					
						
							|  |  |  |     will remove the next num bits from the cache (note SKIP_COUNTER MUST be called before UPDATE_CACHE / CLOSE_READER) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SKIP_COUNTER(name, gb, num) | 
					
						
							|  |  |  |     will increment the internal bit counter (see SKIP_CACHE & SKIP_BITS) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | LAST_SKIP_BITS(name, gb, num) | 
					
						
							| 
									
										
										
										
											2011-12-17 19:40:16 +00:00
										 |  |  |     like SKIP_BITS, to be used if next call is UPDATE_CACHE or CLOSE_READER | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | for examples see get_bits, show_bits, skip_bits, get_vlc | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-16 21:19:50 +00:00
										 |  |  | #ifdef LONG_BITSTREAM_READER
 | 
					
						
							|  |  |  | #   define MIN_CACHE_BITS 32
 | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | #   define MIN_CACHE_BITS 25
 | 
					
						
							| 
									
										
										
										
											2011-12-16 21:19:50 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #define OPEN_READER(name, gb)                   \
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     unsigned int name##_index = (gb)->index;    \ | 
					
						
							| 
									
										
										
										
											2011-05-28 15:46:55 +01:00
										 |  |  |     unsigned int av_unused name##_cache = 0 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #define CLOSE_READER(name, gb) (gb)->index = name##_index
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-22 16:33:31 +01:00
										 |  |  | #ifdef BITSTREAM_READER_LE
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-16 21:19:50 +00:00
										 |  |  | # ifdef LONG_BITSTREAM_READER
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #   define UPDATE_CACHE(name, gb) name##_cache = \
 | 
					
						
							|  |  |  |         AV_RL64((gb)->buffer + (name##_index >> 3)) >> (name##_index & 7) | 
					
						
							| 
									
										
										
										
											2011-12-16 21:19:50 +00:00
										 |  |  | # else
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #   define UPDATE_CACHE(name, gb) name##_cache = \
 | 
					
						
							|  |  |  |         AV_RL32((gb)->buffer + (name##_index >> 3)) >> (name##_index & 7) | 
					
						
							| 
									
										
										
										
											2011-12-16 21:19:50 +00:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2005-05-11 01:46:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | # define SKIP_CACHE(name, gb, num) name##_cache >>= (num)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-16 21:19:50 +00:00
										 |  |  | # ifdef LONG_BITSTREAM_READER
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #   define UPDATE_CACHE(name, gb) name##_cache = \
 | 
					
						
							|  |  |  |         AV_RB64((gb)->buffer + (name##_index >> 3)) >> (32 - (name##_index & 7)) | 
					
						
							| 
									
										
										
										
											2011-12-16 21:19:50 +00:00
										 |  |  | # else
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #   define UPDATE_CACHE(name, gb) name##_cache = \
 | 
					
						
							|  |  |  |         AV_RB32((gb)->buffer + (name##_index >> 3)) << (name##_index & 7) | 
					
						
							| 
									
										
										
										
											2011-12-16 21:19:50 +00:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | # define SKIP_CACHE(name, gb, num) name##_cache <<= (num)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-16 21:42:04 +00:00
										 |  |  | #if UNCHECKED_BITSTREAM_READER
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  | #   define SKIP_COUNTER(name, gb, num) name##_index += (num)
 | 
					
						
							| 
									
										
										
										
											2011-12-16 21:42:04 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #   define SKIP_COUNTER(name, gb, num) \
 | 
					
						
							|  |  |  |     name##_index = FFMIN((gb)->size_in_bits_plus8, name##_index + (num)) | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #define SKIP_BITS(name, gb, num) do {           \
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |         SKIP_CACHE(name, gb, num);              \ | 
					
						
							|  |  |  |         SKIP_COUNTER(name, gb, num);            \ | 
					
						
							|  |  |  |     } while (0) | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num)
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-22 16:33:31 +01:00
										 |  |  | #ifdef BITSTREAM_READER_LE
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  | #   define SHOW_UBITS(name, gb, num) zero_extend(name##_cache, num)
 | 
					
						
							|  |  |  | #   define SHOW_SBITS(name, gb, num) sign_extend(name##_cache, num)
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  | #   define SHOW_UBITS(name, gb, num) NEG_USR32(name##_cache, num)
 | 
					
						
							|  |  |  | #   define SHOW_SBITS(name, gb, num) NEG_SSR32(name##_cache, num)
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #define GET_CACHE(name, gb) ((uint32_t)name##_cache)
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline int get_bits_count(const GetBitContext *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     return s->index; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2006-08-26 10:26:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static inline void skip_bits_long(GetBitContext *s, int n){ | 
					
						
							| 
									
										
										
										
											2011-12-16 21:42:04 +00:00
										 |  |  | #if UNCHECKED_BITSTREAM_READER
 | 
					
						
							| 
									
										
										
										
											2006-08-26 11:50:23 +00:00
										 |  |  |     s->index += n; | 
					
						
							| 
									
										
										
										
											2011-12-16 21:42:04 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     s->index += av_clip(n, -s->index, s->size_in_bits_plus8 - s->index); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-08-26 10:26:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * read mpeg1 dc style vlc (sign bit + mantisse with no MSB). | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |  * if MSB not set it is negative | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |  * @param n length in bits | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline int get_xbits(GetBitContext *s, int n) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-03-31 20:40:22 +00:00
										 |  |  |     register int sign; | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     register int32_t cache; | 
					
						
							| 
									
										
										
										
											2011-01-23 01:24:46 +00:00
										 |  |  |     OPEN_READER(re, s); | 
					
						
							|  |  |  |     UPDATE_CACHE(re, s); | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     cache = GET_CACHE(re, s); | 
					
						
							|  |  |  |     sign = ~cache >> 31; | 
					
						
							| 
									
										
										
										
											2011-01-23 01:24:46 +00:00
										 |  |  |     LAST_SKIP_BITS(re, s, n); | 
					
						
							|  |  |  |     CLOSE_READER(re, s); | 
					
						
							| 
									
										
										
										
											2006-03-31 20:40:22 +00:00
										 |  |  |     return (NEG_USR32(sign ^ cache, n) ^ sign) - sign; | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline int get_sbits(GetBitContext *s, int n) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     register int tmp; | 
					
						
							| 
									
										
										
										
											2011-01-23 01:24:46 +00:00
										 |  |  |     OPEN_READER(re, s); | 
					
						
							|  |  |  |     UPDATE_CACHE(re, s); | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     tmp = SHOW_SBITS(re, s, n); | 
					
						
							| 
									
										
										
										
											2011-01-23 01:24:46 +00:00
										 |  |  |     LAST_SKIP_BITS(re, s, n); | 
					
						
							|  |  |  |     CLOSE_READER(re, s); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     return tmp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:18:13 +00:00
										 |  |  |  * Read 1-25 bits. | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline unsigned int get_bits(GetBitContext *s, int n) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     register int tmp; | 
					
						
							| 
									
										
										
										
											2011-01-23 01:24:46 +00:00
										 |  |  |     OPEN_READER(re, s); | 
					
						
							|  |  |  |     UPDATE_CACHE(re, s); | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     tmp = SHOW_UBITS(re, s, n); | 
					
						
							| 
									
										
										
										
											2011-01-23 01:24:46 +00:00
										 |  |  |     LAST_SKIP_BITS(re, s, n); | 
					
						
							|  |  |  |     CLOSE_READER(re, s); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     return tmp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2011-12-07 13:03:53 +01:00
										 |  |  |  * Show 1-25 bits. | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline unsigned int show_bits(GetBitContext *s, int n) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     register int tmp; | 
					
						
							| 
									
										
										
										
											2011-01-23 01:24:46 +00:00
										 |  |  |     OPEN_READER(re, s); | 
					
						
							|  |  |  |     UPDATE_CACHE(re, s); | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     tmp = SHOW_UBITS(re, s, n); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     return tmp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline void skip_bits(GetBitContext *s, int n) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-23 01:24:46 +00:00
										 |  |  |     OPEN_READER(re, s); | 
					
						
							|  |  |  |     UPDATE_CACHE(re, s); | 
					
						
							|  |  |  |     LAST_SKIP_BITS(re, s, n); | 
					
						
							|  |  |  |     CLOSE_READER(re, s); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline unsigned int get_bits1(GetBitContext *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     unsigned int index = s->index; | 
					
						
							|  |  |  |     uint8_t result = s->buffer[index>>3]; | 
					
						
							| 
									
										
										
										
											2011-12-22 16:33:31 +01:00
										 |  |  | #ifdef BITSTREAM_READER_LE
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     result >>= index & 7; | 
					
						
							|  |  |  |     result &= 1; | 
					
						
							| 
									
										
										
										
											2005-05-11 01:46:13 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     result <<= index & 7; | 
					
						
							|  |  |  |     result >>= 8 - 1; | 
					
						
							| 
									
										
										
										
											2005-05-11 01:46:13 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-12-16 21:42:04 +00:00
										 |  |  | #if !UNCHECKED_BITSTREAM_READER
 | 
					
						
							|  |  |  |     if (s->index < s->size_in_bits_plus8) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |         index++; | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     s->index = index; | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline unsigned int show_bits1(GetBitContext *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     return show_bits(s, 1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline void skip_bits1(GetBitContext *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     skip_bits(s, 1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-28 18:44:49 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2011-12-07 13:03:53 +01:00
										 |  |  |  * Read 0-32 bits. | 
					
						
							| 
									
										
										
										
											2006-08-28 18:44:49 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline unsigned int get_bits_long(GetBitContext *s, int n) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (n <= MIN_CACHE_BITS) | 
					
						
							|  |  |  |         return get_bits(s, n); | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2011-12-22 16:33:31 +01:00
										 |  |  | #ifdef BITSTREAM_READER_LE
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |         int ret = get_bits(s, 16); | 
					
						
							| 
									
										
										
										
											2006-09-25 22:47:55 +00:00
										 |  |  |         return ret | (get_bits(s, n-16) << 16); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |         int ret = get_bits(s, 16) << (n-16); | 
					
						
							| 
									
										
										
										
											2006-08-28 18:44:49 +00:00
										 |  |  |         return ret | get_bits(s, n-16); | 
					
						
							| 
									
										
										
										
											2006-09-25 22:47:55 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-08-28 18:44:49 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-03 02:00:47 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2011-12-07 13:03:53 +01:00
										 |  |  |  * Read 0-32 bits as a signed integer. | 
					
						
							| 
									
										
										
										
											2009-03-03 02:00:47 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline int get_sbits_long(GetBitContext *s, int n) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-03 02:00:47 +00:00
										 |  |  |     return sign_extend(get_bits_long(s, n), n); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-28 18:44:49 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2011-12-07 13:03:53 +01:00
										 |  |  |  * Show 0-32 bits. | 
					
						
							| 
									
										
										
										
											2006-08-28 18:44:49 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline unsigned int show_bits_long(GetBitContext *s, int n) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (n <= MIN_CACHE_BITS) | 
					
						
							|  |  |  |         return show_bits(s, n); | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     else { | 
					
						
							|  |  |  |         GetBitContext gb = *s; | 
					
						
							| 
									
										
										
										
											2009-03-02 19:42:31 +00:00
										 |  |  |         return get_bits_long(&gb, n); | 
					
						
							| 
									
										
										
										
											2006-08-28 18:44:49 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int check_marker(GetBitContext *s, const char *msg) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     int bit = get_bits1(s); | 
					
						
							|  |  |  |     if (!bit) | 
					
						
							| 
									
										
										
										
											2006-08-28 18:44:49 +00:00
										 |  |  |         av_log(NULL, AV_LOG_INFO, "Marker bit missing %s\n", msg); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return bit; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2011-12-07 13:03:53 +01:00
										 |  |  |  * Inititalize GetBitContext. | 
					
						
							| 
									
										
										
										
											2011-06-30 20:53:59 +02:00
										 |  |  |  * @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes larger than the actual read bits | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |  * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end | 
					
						
							|  |  |  |  * @param bit_size the size of the buffer in bits | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline void init_get_bits(GetBitContext *s, const uint8_t *buffer, | 
					
						
							|  |  |  |                                  int bit_size) | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     int buffer_size = (bit_size+7)>>3; | 
					
						
							|  |  |  |     if (buffer_size < 0 || bit_size < 0) { | 
					
						
							| 
									
										
										
										
											2005-09-21 23:18:52 +00:00
										 |  |  |         buffer_size = bit_size = 0; | 
					
						
							|  |  |  |         buffer = NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     s->buffer       = buffer; | 
					
						
							|  |  |  |     s->size_in_bits = bit_size; | 
					
						
							| 
									
										
										
										
											2011-12-16 21:42:04 +00:00
										 |  |  | #if !UNCHECKED_BITSTREAM_READER
 | 
					
						
							|  |  |  |     s->size_in_bits_plus8 = bit_size + 8; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     s->buffer_end   = buffer + buffer_size; | 
					
						
							|  |  |  |     s->index        = 0; | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-04 17:25:38 +00:00
										 |  |  | static inline void align_get_bits(GetBitContext *s) | 
					
						
							| 
									
										
										
										
											2006-08-26 10:26:14 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     int n = -get_bits_count(s) & 7; | 
					
						
							|  |  |  |     if (n) skip_bits(s, n); | 
					
						
							| 
									
										
										
										
											2006-08-26 10:26:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  | #define init_vlc(vlc, nb_bits, nb_codes,                \
 | 
					
						
							|  |  |  |                  bits, bits_wrap, bits_size,            \ | 
					
						
							|  |  |  |                  codes, codes_wrap, codes_size,         \ | 
					
						
							|  |  |  |                  flags)                                 \ | 
					
						
							|  |  |  |         init_vlc_sparse(vlc, nb_bits, nb_codes,         \ | 
					
						
							|  |  |  |                         bits, bits_wrap, bits_size,     \ | 
					
						
							|  |  |  |                         codes, codes_wrap, codes_size,  \ | 
					
						
							|  |  |  |                         NULL, 0, 0, flags) | 
					
						
							| 
									
										
										
										
											2007-05-24 17:38:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |              const void *bits, int bits_wrap, int bits_size, | 
					
						
							|  |  |  |              const void *codes, int codes_wrap, int codes_size, | 
					
						
							| 
									
										
										
										
											2007-05-24 17:38:56 +00:00
										 |  |  |              const void *symbols, int symbols_wrap, int symbols_size, | 
					
						
							| 
									
										
										
										
											2005-05-11 01:46:13 +00:00
										 |  |  |              int flags); | 
					
						
							|  |  |  | #define INIT_VLC_LE         2
 | 
					
						
							| 
									
										
										
										
											2008-05-30 19:48:02 +00:00
										 |  |  | #define INIT_VLC_USE_NEW_STATIC 4
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | void free_vlc(VLC *vlc); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  | #define INIT_VLC_STATIC(vlc, bits, a,b,c,d,e,f,g, static_size) do {     \
 | 
					
						
							|  |  |  |         static VLC_TYPE table[static_size][2];                          \ | 
					
						
							|  |  |  |         (vlc)->table = table;                                           \ | 
					
						
							|  |  |  |         (vlc)->table_allocated = static_size;                           \ | 
					
						
							|  |  |  |         init_vlc(vlc, bits, a,b,c,d,e,f,g, INIT_VLC_USE_NEW_STATIC);    \ | 
					
						
							|  |  |  |     } while (0) | 
					
						
							| 
									
										
										
										
											2008-05-30 20:00:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-02-17 21:20:43 +00:00
										 |  |  |  * If the vlc code is invalid and max_depth=1, then no bits will be removed. | 
					
						
							|  |  |  |  * If the vlc code is invalid and max_depth>1, then the number of bits removed | 
					
						
							|  |  |  |  * is undefined. | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #define GET_VLC(code, name, gb, table, bits, max_depth)         \
 | 
					
						
							|  |  |  |     do {                                                        \ | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |         int n, nb_bits;                                         \ | 
					
						
							|  |  |  |         unsigned int index;                                     \ | 
					
						
							|  |  |  |                                                                 \ | 
					
						
							|  |  |  |         index = SHOW_UBITS(name, gb, bits);                     \ | 
					
						
							|  |  |  |         code  = table[index][0];                                \ | 
					
						
							|  |  |  |         n     = table[index][1];                                \ | 
					
						
							|  |  |  |                                                                 \ | 
					
						
							|  |  |  |         if (max_depth > 1 && n < 0) {                           \ | 
					
						
							|  |  |  |             LAST_SKIP_BITS(name, gb, bits);                     \ | 
					
						
							|  |  |  |             UPDATE_CACHE(name, gb);                             \ | 
					
						
							|  |  |  |                                                                 \ | 
					
						
							|  |  |  |             nb_bits = -n;                                       \ | 
					
						
							|  |  |  |                                                                 \ | 
					
						
							|  |  |  |             index = SHOW_UBITS(name, gb, nb_bits) + code;       \ | 
					
						
							|  |  |  |             code  = table[index][0];                            \ | 
					
						
							|  |  |  |             n     = table[index][1];                            \ | 
					
						
							|  |  |  |             if (max_depth > 2 && n < 0) {                       \ | 
					
						
							|  |  |  |                 LAST_SKIP_BITS(name, gb, nb_bits);              \ | 
					
						
							|  |  |  |                 UPDATE_CACHE(name, gb);                         \ | 
					
						
							|  |  |  |                                                                 \ | 
					
						
							|  |  |  |                 nb_bits = -n;                                   \ | 
					
						
							|  |  |  |                                                                 \ | 
					
						
							|  |  |  |                 index = SHOW_UBITS(name, gb, nb_bits) + code;   \ | 
					
						
							|  |  |  |                 code  = table[index][0];                        \ | 
					
						
							|  |  |  |                 n     = table[index][1];                        \ | 
					
						
							|  |  |  |             }                                                   \ | 
					
						
							|  |  |  |         }                                                       \ | 
					
						
							|  |  |  |         SKIP_BITS(name, gb, n);                                 \ | 
					
						
							|  |  |  |     } while (0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | #define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update) \
 | 
					
						
							|  |  |  |     do {                                                                \ | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |         int n, nb_bits;                                                 \ | 
					
						
							|  |  |  |         unsigned int index;                                             \ | 
					
						
							|  |  |  |                                                                         \ | 
					
						
							|  |  |  |         index = SHOW_UBITS(name, gb, bits);                             \ | 
					
						
							|  |  |  |         level = table[index].level;                                     \ | 
					
						
							|  |  |  |         n     = table[index].len;                                       \ | 
					
						
							|  |  |  |                                                                         \ | 
					
						
							|  |  |  |         if (max_depth > 1 && n < 0) {                                   \ | 
					
						
							|  |  |  |             SKIP_BITS(name, gb, bits);                                  \ | 
					
						
							|  |  |  |             if (need_update) {                                          \ | 
					
						
							|  |  |  |                 UPDATE_CACHE(name, gb);                                 \ | 
					
						
							|  |  |  |             }                                                           \ | 
					
						
							|  |  |  |                                                                         \ | 
					
						
							|  |  |  |             nb_bits = -n;                                               \ | 
					
						
							|  |  |  |                                                                         \ | 
					
						
							|  |  |  |             index = SHOW_UBITS(name, gb, nb_bits) + level;              \ | 
					
						
							|  |  |  |             level = table[index].level;                                 \ | 
					
						
							|  |  |  |             n     = table[index].len;                                   \ | 
					
						
							|  |  |  |         }                                                               \ | 
					
						
							|  |  |  |         run = table[index].run;                                         \ | 
					
						
							|  |  |  |         SKIP_BITS(name, gb, n);                                         \ | 
					
						
							|  |  |  |     } while (0) | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:07:32 +00:00
										 |  |  |  * Parse a vlc code. | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |  * @param bits is the number of bits which will be read at once, must be | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |  *             identical to nb_bits in init_vlc() | 
					
						
							| 
									
										
										
										
											2007-04-07 14:09:20 +00:00
										 |  |  |  * @param max_depth is the number of times bits bits must be read to completely | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |  *                  read the longest vlc code | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |  *                  = (max_vlc_length + bits - 1) / bits | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2006-12-08 00:35:08 +00:00
										 |  |  | static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  |                                      int bits, int max_depth) | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int code; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:24:46 +00:00
										 |  |  |     OPEN_READER(re, s); | 
					
						
							|  |  |  |     UPDATE_CACHE(re, s); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:24:46 +00:00
										 |  |  |     GET_VLC(code, re, s, table, bits, max_depth); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:24:46 +00:00
										 |  |  |     CLOSE_READER(re, s); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     return code; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline int decode012(GetBitContext *gb) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-23 14:01:43 +00:00
										 |  |  |     int n; | 
					
						
							|  |  |  |     n = get_bits1(gb); | 
					
						
							|  |  |  |     if (n == 0) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         return get_bits1(gb) + 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline int decode210(GetBitContext *gb) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-23 14:01:43 +00:00
										 |  |  |     if (get_bits1(gb)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         return 2 - get_bits1(gb); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int get_bits_left(GetBitContext *gb) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return gb->size_in_bits - get_bits_count(gb); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | //#define TRACE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef TRACE
 | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  | static inline void print_bin(int bits, int n) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     for (i = n-1; i >= 0; i--) { | 
					
						
							| 
									
										
										
										
											2005-01-19 12:58:34 +00:00
										 |  |  |         av_log(NULL, AV_LOG_DEBUG, "%d", (bits>>i)&1); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     for (i = n; i < 24; i++) | 
					
						
							| 
									
										
										
										
											2005-01-19 12:58:34 +00:00
										 |  |  |         av_log(NULL, AV_LOG_DEBUG, " "); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  | static inline int get_bits_trace(GetBitContext *s, int n, char *file, | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  |                                  const char *func, int line) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     int r = get_bits(s, n); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     print_bin(r, n); | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     return r; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  | static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], | 
					
						
							|  |  |  |                                 int bits, int max_depth, char *file, | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  |                                 const char *func, int line) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     int show  = show_bits(s, 24); | 
					
						
							|  |  |  |     int pos   = get_bits_count(s); | 
					
						
							|  |  |  |     int r     = get_vlc2(s, table, bits, max_depth); | 
					
						
							|  |  |  |     int len   = get_bits_count(s) - pos; | 
					
						
							|  |  |  |     int bits2 = show >> (24-len); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     print_bin(bits2, len); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d vlc @%5d in %s %s:%d\n", | 
					
						
							|  |  |  |            bits2, len, r, pos, file, func, line); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     return r; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  | static inline int get_xbits_trace(GetBitContext *s, int n, char *file, | 
					
						
							| 
									
										
										
										
											2011-12-17 01:05:35 +00:00
										 |  |  |                                   const char *func, int line) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     int show = show_bits(s, n); | 
					
						
							|  |  |  |     int r    = get_xbits(s, n); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     print_bin(show, n); | 
					
						
							| 
									
										
										
										
											2011-01-23 01:56:27 +00:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  |     return r; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define get_bits(s, n)  get_bits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__)
 | 
					
						
							|  |  |  | #define get_bits1(s)    get_bits_trace(s, 1, __FILE__, __PRETTY_FUNCTION__, __LINE__)
 | 
					
						
							|  |  |  | #define get_xbits(s, n) get_xbits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__)
 | 
					
						
							|  |  |  | #define get_vlc(s, vlc)            get_vlc_trace(s, (vlc)->table, (vlc)->bits, 3, __FILE__, __PRETTY_FUNCTION__, __LINE__)
 | 
					
						
							|  |  |  | #define get_vlc2(s, tab, bits, max) get_vlc_trace(s, tab, bits, max, __FILE__, __PRETTY_FUNCTION__, __LINE__)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-27 09:39:04 +00:00
										 |  |  | #define tprintf(p, ...) av_log(p, AV_LOG_DEBUG, __VA_ARGS__)
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #else //TRACE
 | 
					
						
							| 
									
										
										
										
											2007-02-27 09:39:04 +00:00
										 |  |  | #define tprintf(p, ...) {}
 | 
					
						
							| 
									
										
										
										
											2004-12-29 17:50:25 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-13 16:20:26 +00:00
										 |  |  | #endif /* AVCODEC_GET_BITS_H */
 |