diff options
author | Diego Biurrun <diego@biurrun.de> | 2012-01-12 21:56:02 +0100 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2012-01-12 23:08:23 +0100 |
commit | 55b9ef18e4a139fc24a3b695cb3c176f3ced09b8 (patch) | |
tree | 8bf5602225fd9201124d905f83a03ec4b4d45ca5 /libavcodec/cabac.h | |
parent | 0a60780c7fe72e2f9cc41efc152b3807954b7820 (diff) | |
download | ffmpeg-55b9ef18e4a139fc24a3b695cb3c176f3ced09b8.tar.gz |
cabac: split cabac.h into declarations and function definitions
This fixes standalone compilation of some decoders with --disable-optimizations.
cabac.h defines some inline functions that use symbols from cabac.c. Without
optimizations these inline functions are not eliminated and linking fails with
references to non-existing symbols.
Splitting the inline functions off into their own header and only #including
it in the places where the inline functions are used allows #including cabac.h
from anywhere without ill effects.
Diffstat (limited to 'libavcodec/cabac.h')
-rw-r--r-- | libavcodec/cabac.h | 131 |
1 files changed, 1 insertions, 130 deletions
diff --git a/libavcodec/cabac.h b/libavcodec/cabac.h index ab835f921f..5a99f0b2fe 100644 --- a/libavcodec/cabac.h +++ b/libavcodec/cabac.h @@ -27,13 +27,10 @@ #ifndef AVCODEC_CABAC_H #define AVCODEC_CABAC_H -#include <stddef.h> +#include <stdint.h> #include "put_bits.h" -//#undef NDEBUG -#include <assert.h> - #define CABAC_BITS 16 #define CABAC_MASK ((1<<CABAC_BITS)-1) @@ -47,134 +44,8 @@ typedef struct CABACContext{ PutBitContext pb; }CABACContext; -extern uint8_t ff_h264_mlps_state[4*64]; -extern uint8_t ff_h264_lps_range[4*2*64]; ///< rangeTabLPS -extern const uint8_t ff_h264_norm_shift[512]; - -#if ARCH_X86 -# include "x86/cabac.h" -#endif - void ff_init_cabac_encoder(CABACContext *c, uint8_t *buf, int buf_size); void ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size); void ff_init_cabac_states(CABACContext *c); - -static void refill(CABACContext *c){ -#if CABAC_BITS == 16 - c->low+= (c->bytestream[0]<<9) + (c->bytestream[1]<<1); -#else - c->low+= c->bytestream[0]<<1; -#endif - c->low -= CABAC_MASK; - c->bytestream+= CABAC_BITS/8; -} - -static inline void renorm_cabac_decoder_once(CABACContext *c){ - int shift= (uint32_t)(c->range - 0x100)>>31; - c->range<<= shift; - c->low <<= shift; - if(!(c->low & CABAC_MASK)) - refill(c); -} - -#ifndef get_cabac_inline -static void refill2(CABACContext *c){ - int i, x; - - x= c->low ^ (c->low-1); - i= 7 - ff_h264_norm_shift[x>>(CABAC_BITS-1)]; - - x= -CABAC_MASK; - -#if CABAC_BITS == 16 - x+= (c->bytestream[0]<<9) + (c->bytestream[1]<<1); -#else - x+= c->bytestream[0]<<1; -#endif - - c->low += x<<i; - c->bytestream+= CABAC_BITS/8; -} - -static av_always_inline int get_cabac_inline(CABACContext *c, uint8_t * const state){ - int s = *state; - int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + s]; - int bit, lps_mask; - - c->range -= RangeLPS; - lps_mask= ((c->range<<(CABAC_BITS+1)) - c->low)>>31; - - c->low -= (c->range<<(CABAC_BITS+1)) & lps_mask; - c->range += (RangeLPS - c->range) & lps_mask; - - s^=lps_mask; - *state= (ff_h264_mlps_state+128)[s]; - bit= s&1; - - lps_mask= ff_h264_norm_shift[c->range]; - c->range<<= lps_mask; - c->low <<= lps_mask; - if(!(c->low & CABAC_MASK)) - refill2(c); - return bit; -} -#endif - -static int av_noinline av_unused get_cabac_noinline(CABACContext *c, uint8_t * const state){ - return get_cabac_inline(c,state); -} - -static int av_unused get_cabac(CABACContext *c, uint8_t * const state){ - return get_cabac_inline(c,state); -} - -static int av_unused get_cabac_bypass(CABACContext *c){ - int range; - c->low += c->low; - - if(!(c->low & CABAC_MASK)) - refill(c); - - range= c->range<<(CABAC_BITS+1); - if(c->low < range){ - return 0; - }else{ - c->low -= range; - return 1; - } -} - - -#ifndef get_cabac_bypass_sign -static av_always_inline int get_cabac_bypass_sign(CABACContext *c, int val){ - int range, mask; - c->low += c->low; - - if(!(c->low & CABAC_MASK)) - refill(c); - - range= c->range<<(CABAC_BITS+1); - c->low -= range; - mask= c->low >> 31; - range &= mask; - c->low += range; - return (val^mask)-mask; -} -#endif - -/** - * - * @return the number of bytes read or 0 if no end - */ -static int av_unused get_cabac_terminate(CABACContext *c){ - c->range -= 2; - if(c->low < c->range<<(CABAC_BITS+1)){ - renorm_cabac_decoder_once(c); - return 0; - }else{ - return c->bytestream - c->bytestream_start; - } -} - #endif /* AVCODEC_CABAC_H */ |