[FFmpeg-devel] [PATCH 1/3] avcodec/get_bits: add cached bitstream reader
Michael Niedermayer
michael at niedermayer.cc
Sat Jul 8 03:00:43 EEST 2017
On Fri, Jul 07, 2017 at 08:48:46PM +0200, Paul B Mahol wrote:
> Signed-off-by: Paul B Mahol <onemda at gmail.com>
> ---
> libavcodec/get_bits.h | 205 +++++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 196 insertions(+), 9 deletions(-)
>
> diff --git a/libavcodec/get_bits.h b/libavcodec/get_bits.h
> index c530015..8a9021a 100644
> --- a/libavcodec/get_bits.h
> +++ b/libavcodec/get_bits.h
> @@ -1,5 +1,6 @@
> /*
> - * copyright (c) 2004 Michael Niedermayer <michaelni at gmx.at>
> + * Copyright (c) 2004 Michael Niedermayer <michaelni at gmx.at>
> + * Copyright (c) 2016 Alexandra Hájková
> *
> * This file is part of FFmpeg.
> *
> @@ -54,6 +55,10 @@
>
> typedef struct GetBitContext {
> const uint8_t *buffer, *buffer_end;
> +#ifdef CACHED_BITSTREAM_READER
> + uint64_t cache;
> + unsigned bits_left;
> +#endif
> int index;
> int size_in_bits;
> int size_in_bits_plus8;
> @@ -106,7 +111,9 @@ typedef struct GetBitContext {
> * For examples see get_bits, show_bits, skip_bits, get_vlc.
> */
>
> -#ifdef LONG_BITSTREAM_READER
> +#ifdef CACHED_BITSTREAM_READER
> +# define MIN_CACHE_BITS 64
> +#elif defined LONG_BITSTREAM_READER
> # define MIN_CACHE_BITS 32
> #else
> # define MIN_CACHE_BITS 25
> @@ -198,7 +205,11 @@ typedef struct GetBitContext {
>
> static inline int get_bits_count(const GetBitContext *s)
> {
> +#ifdef CACHED_BITSTREAM_READER
> + return s->index - s->bits_left;
> +#else
> return s->index;
> +#endif
> }
>
> static inline void skip_bits_long(GetBitContext *s, int n)
> @@ -210,6 +221,68 @@ static inline void skip_bits_long(GetBitContext *s, int n)
> #endif
> }
>
> +static inline void refill_32(GetBitContext *s)
> +{
> +#ifdef CACHED_BITSTREAM_READER
> + if (s->buffer + (s->index >> 3) >= s->buffer_end)
> + return;
should be under !UNCHECKED_BITSTREAM_READER
also this looks like it can result in intermediate invalid pointers
this should avoid that:
s->index >> 3 >= s->buffer_end - s->buffer
same issue in refill_64()
patch overall is nice
thanks
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Asymptotically faster algorithms should always be preferred if you have
asymptotical amounts of data
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20170708/75f4487b/attachment.sig>
More information about the ffmpeg-devel
mailing list