From: "Ronald S. Bultje" <[email protected]>

Based on work (for GCI) by Aneesh Dogra <[email protected]>, and
inspired by patch in Chromium by Chris Evans <[email protected]>.

When turned on, H264/CAVLC gets ~15% (CVPCMNL1_SVA_C.264) slower for
ultra-high-bitrate files, or ~2.5% (CVFI1_SVA_C.264) for lower-bitrate
files. Other codecs are affected to a lower extend because they are
less optimized; e.g., VC-1 slows down by less than 1% (all on x86).
The patch generated 3 extra instructions (cmp, cmovae and mov) per
call to get_bits().
---
 libavcodec/get_bits.h |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/libavcodec/get_bits.h b/libavcodec/get_bits.h
index dd56308..e408e06 100644
--- a/libavcodec/get_bits.h
+++ b/libavcodec/get_bits.h
@@ -77,7 +77,7 @@ typedef struct GetBitContext {
     uint32_t cache1;
     int bit_count;
 #endif
-    int size_in_bits;
+    int size_in_bits, size_in_bits_plus1;
 } GetBitContext;
 
 #define VLC_TYPE int16_t
@@ -165,8 +165,8 @@ for examples see get_bits, show_bits, skip_bits, get_vlc
 #   define SKIP_COUNTER(name, gb, num) name##_index += (num)
 #else
 #   define SKIP_COUNTER(name, gb, num) name##_index = \
-                                       (gb)->size_in_bits - name##_index <= 
(num) ? \
-                                       (gb)->size_in_bits + 1 : name##_index + 
(num)
+               (gb)->size_in_bits_plus1 - name##_index < (num) ? \
+               (gb)->size_in_bits_plus1 : name##_index + (num)
 #endif
 
 #   define SKIP_BITS(name, gb, num) do {        \
@@ -197,8 +197,8 @@ static inline void skip_bits_long(GetBitContext *s, int n){
 #if UNCHECKED_BITSTREAM_READER
     s->index += n;
 #else
-    s->index = s->size_in_bits - s->index <= n ?
-               s->size_in_bits + 1 : s->index + n;
+    s->index = s->size_in_bits_plus1 - s->index < n ?
+               s->size_in_bits_plus1 : s->index + n;
 #endif
 }
 
@@ -346,7 +346,7 @@ static inline unsigned int get_bits1(GetBitContext *s){
     result <<= index & 7;
     result >>= 8 - 1;
 #endif
-    if (UNCHECKED_BITSTREAM_READER || s->index <= s->size_in_bits)
+    if (UNCHECKED_BITSTREAM_READER || s->index < s->size_in_bits_plus1)
         index++;
     s->index = index;
 
@@ -427,6 +427,7 @@ static inline void init_get_bits(GetBitContext *s,
 
     s->buffer       = buffer;
     s->size_in_bits = bit_size;
+    s->size_in_bits_plus1 = bit_size + 1;
     s->buffer_end   = buffer + buffer_size;
 #ifdef ALT_BITSTREAM_READER
     s->index        = 0;
-- 
1.7.6

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to