On Fri, Jul 14, 2017 at 4:08 PM, foo86 <fooba...@gmail.com> wrote:
> On Thu, Jul 13, 2017 at 12:27:03PM +0200, Paul B Mahol wrote:
>> +static inline unsigned int get_bits(GetBitContext *s, int n)
>>  {
>> +#ifdef CACHED_BITSTREAM_READER
>> +    register int tmp = 0;
>> +#ifdef BITSTREAM_READER_LE
>> +    uint64_t left = 0;
>> +#endif
>> +
>> +    av_assert2(n>0 && n<=32);
>> +    if (n > s->bits_left) {
>> +        n -= s->bits_left;
>> +#ifdef BITSTREAM_READER_LE
>> +        left = s->bits_left;
>> +#endif
>> +        tmp = get_val(s, s->bits_left);
> This triggers an assert in get_val() if s->bits_left == 0.
>
>> +        refill_32(s);
>> +    }
>> +
>> +#ifdef BITSTREAM_READER_LE
>> +    tmp = get_val(s, n) << left | tmp;
>> +#else
>> +    tmp = get_val(s, n) | tmp << n;
> This causes undefined behavior if n > 30.

get_bits is only valid until n = 25 in the "non-cached" case, so its
not a problem to impose the same limitation on the cached reader.
In fact, if they are to share the exact same API, it should probably
follow that they also share the same constraints, so that we can do
proper performance comparisons between the two, instead of having to
re-write the using code.

- Hendrik
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to