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.
---
libavcodec/cabac.c |1 +
libavcodec/cabac.h | 131 +--
libavcodec/cabac_functions.h | 160 ++
libavcodec/h264.c|4 +-
libavcodec/h264_cabac.c |4 +-
5 files changed, 167 insertions(+), 133 deletions(-)
create mode 100644 libavcodec/cabac_functions.h
Update sent to account for small #include changes.
diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c
index 11971f5..4afcafb 100644
--- a/libavcodec/cabac.c
+++ b/libavcodec/cabac.c
@@ -29,6 +29,7 @@
#include "libavutil/common.h"
#include "get_bits.h"
#include "cabac.h"
+#include "cabac_functions.h"
static const uint8_t lps_range[64][4]= {
{128,176,208,240}, {128,167,197,227}, {128,158,187,216}, {123,150,178,205},
diff --git a/libavcodec/cabac.h b/libavcodec/cabac.h
index ab835f9..5a99f0b 100644
--- a/libavcodec/cabac.h
+++ b/libavcodec/cabac.h
@@ -27,13 +27,10 @@
#ifndef AVCODEC_CABAC_H
#define AVCODEC_CABAC_H
-#include
+#include
#include "put_bits.h"
-//#undef NDEBUG
-#include
-
#define CABAC_BITS 16
#define CABAC_MASK ((1bytestream[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 += xrange&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 */
diff --git a/libavcodec/cabac_functions.h b/libavcodec/cabac_functions.h
new file mode 100644
index 000..b150aab
--- /dev/null
+++ b/libavcodec/cabac_functions.h
@@ -0,0 +1,160 @@
+/*
+ * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
+ * Copyright (c) 2003 Michael Niedermayer
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without ev