Re: [libav-devel] [PATCH] cabac: split cabac.h into declarations and function definitions

2012-01-12 Thread Ronald S. Bultje
Hi,

On Thu, Jan 12, 2012 at 2:41 PM, Diego Biurrun  wrote:
> 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.

Still OK.

Ronald
___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel


[libav-devel] [PATCH] cabac: split cabac.h into declarations and function definitions

2012-01-12 Thread Diego Biurrun
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