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

> 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 lesser extent 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().
> ---
>  configure             |    2 ++
>  libavcodec/get_bits.h |   48 ++++++++++++++++++++++++++++++++++++++++++++++--
>  libavcodec/wmavoice.c |    2 ++
>  3 files changed, 50 insertions(+), 2 deletions(-)

[...]

>  // FIXME name?
> +#if UNCHECKED_BITSTREAM_READER
>  #   define SKIP_COUNTER(name, gb, num) name##_index += (num)
> +#else
> +#   define SKIP_COUNTER(name, gb, num) name##_index = \
> +               (gb)->size_in_bits_plus1 - name##_index < (num) ? \
> +               (gb)->size_in_bits_plus1 : name##_index + (num)
> +#endif

Why +1?  Is this for the hypothetical decoders that require overreading?
Which are those, and why don't we fix them?

>  #   define SKIP_BITS(name, gb, num) do {        \
>          SKIP_CACHE(name, gb, num);              \
> @@ -171,7 +197,12 @@ static inline int get_bits_count(const GetBitContext *s){
>  }
>
>  static inline void skip_bits_long(GetBitContext *s, int n){
> +#if UNCHECKED_BITSTREAM_READER
>      s->index += n;
> +#else
> +    s->index = s->size_in_bits_plus1 - s->index < n ?
> +               s->size_in_bits_plus1 : s->index + n;
> +#endif
>  }
>
>  #elif defined A32_BITSTREAM_READER
> @@ -196,7 +227,9 @@ static inline void skip_bits_long(GetBitContext *s, int 
> n){
>              const uint32_t next = av_be2ne32(*name##_buffer_ptr);       \
>              name##_cache0 |= NEG_USR32(next, name##_bit_count);         \
>              name##_cache1 |= next << name##_bit_count;                  \
> -            name##_buffer_ptr++;                                        \
> +            if (UNCHECKED_BITSTREAM_READER ||                           \
> +                name##_buffer_ptr < (const uint32_t *)(gb)->buffer_end) \
> +                name##_buffer_ptr++;                                    \
>              name##_bit_count -= 32;                                     \
>          }                                                               \
>      } while (0)
> @@ -230,7 +263,12 @@ static inline int get_bits_count(const GetBitContext *s) 
> {
>  static inline void skip_bits_long(GetBitContext *s, int n){
>      OPEN_READER(re, s);
>      re_bit_count += n;
> +#if UNCHECKED_BITSTREAM_READER
>      re_buffer_ptr += re_bit_count>>5;
> +#else
> +    re_buffer_ptr = FFMIN(re_buffer_ptr + (re_bit_count >> 5),
> +                          (const uint32_t *) s->buffer_end);
> +#endif

This addition can overflow.

-- 
Måns Rullgård
[email protected]
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to