[FFmpeg-devel] [PATCH 1/3] avcodec/get_bits: add cached bitstream reader

Hendrik Leppkes h.leppkes at gmail.com
Sat Jul 8 21:07:49 EEST 2017


On Sat, Jul 8, 2017 at 7:09 PM, foo86 <foobaz86 at gmail.com> wrote:
> On Sat, Jul 08, 2017 at 11:12:06AM +0200, Paul B Mahol wrote:
>> [...]
>
>>  static inline void skip_bits(GetBitContext *s, int n)
>>  {
>> +#ifdef CACHED_BITSTREAM_READER
>> +    if (n <= s->bits_left)
>> +        skip_remaining(s, n);
>> +    else {
>> +        n -= s->bits_left;
>> +        skip_remaining(s, s->bits_left);
> This causes undefined behavior if s->bits_left == 64.
>
>> +        if (n >= 64) {
>> +            unsigned skip = n;
>> +
>> +            n -= skip;
>> +            s->index += skip;
>> +        }
> This block looks strange.
>
>> +        refill_32(s);
>> +        if (n)
>> +            skip_remaining(s, n);
>> +    }
>> +#else
>>      OPEN_READER(re, s);
>>      LAST_SKIP_BITS(re, s, n);
>>      CLOSE_READER(re, s);
>> +#endif
>> +}
>> +
>> +static inline void skip_bits_long(GetBitContext *s, int n)
>> +{
>> +#ifdef CACHED_BITSTREAM_READER
>> +    skip_bits(s, n);
>> +#else
>> +#if UNCHECKED_BITSTREAM_READER
>> +    s->index += n;
>> +#else
>> +    s->index += av_clip(n, -s->index, s->size_in_bits_plus8 - s->index);
> Uncached bitstream reader allows seeking back by passing negative n
> here. If cached bitstream reader disallows this, there should be a
> comment saying so (and possibly an assert).

This seems like an undocumented and possibly insecure/invalid use of
the API, maybe we should just generally discourage such use.

Why would you need to skip backwards anyway? Usually code uses
show_bits, or creates a copy of the reader so it can revert to the
original if needed.

- Hendrik


More information about the ffmpeg-devel mailing list