[FFmpeg-devel] Fix for aviobuf.c::fill_buffer
codebythepound at gmail.com
Thu Jul 21 20:20:01 EEST 2016
I will see if I can put together a test case that exposes the problem. The
comment for this block says "make buffer smaller in case it ended up large
after probing" - I'm not 100% certain what that means. I put prints inside
this block and after the ffio_set_buf_size() call, this block is never
executed again. In my custom case I am streaming an MPEG.TS file and I
don't know if this involves this extra "probing" or not.
Even so, there is nothing in the code above that would limit 'len' to be
greater than the size of s->orig_buffer_size, so the assert doesn't seem
like the right way to handle this here.
On Wed, Jul 20, 2016 at 4:41 PM Michael Niedermayer <michael at niedermayer.cc>
> On Wed, Jul 20, 2016 at 03:59:39PM +0000, code bythepound wrote:
> > My app seems to hit the av_assert0(len >= s->orig_buffer_size) (line 535
> > my sources) in aviobuf.c::fill_buffer. FWIW I have registered a custom
> > AVIOContext that will consistently not fill the entire buffer when the
> > callback is called.
> > The outcome is that 'len' in fill_buffer is decremented with each call
> > until it is less than s->orig_buffer_size and will assert fail. It seems
> > that instead of the assertion failure, the method should be:
> > if( len >= s->orig_buffer_size )
> > len = s->orig_buffer_size
> > // otherwise, len is < than orig_buffer_size, but is sized correctly to
> > fill remainder of buffer.
> > On the next iteration, the previous clause (dst == s->buffer) is executed
> > and the buffer is reset. After that, this block is never executed again.
> > With the above fix in, my app seems to work fine.
> > Since the fill_buffer code has been the same for many releases of ffmpeg,
> > I'm wondering how I could be the first to notice it, and if there is
> > something else I could be doing wrong to cause this?
> is there some easy way to reproduce this ?
> i tried
> diff --git a/libavformat/file.c b/libavformat/file.c
> index 264542a..529a975 100644
> --- a/libavformat/file.c
> +++ b/libavformat/file.c
> @@ -108,6 +108,7 @@ static int file_read(URLContext *h, unsigned char
> *buf, int size)
> FileContext *c = h->priv_data;
> int ret;
> + size = FFMIN(size, size/5 + 1);
> size = FFMIN(size, c->blocksize);
> ret = read(c->fd, buf, size);
> if (ret == 0 && c->follow)
> but it doesnt trigger the assert
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
> Modern terrorism, a quick summary: Need oil, start war with country that
> has oil, kill hundread thousand in war. Let country fall into chaos,
> be surprised about raise of fundamantalists. Drop more bombs, kill more
> people, be surprised about them taking revenge and drop even more bombs
> and strip your own citizens of their rights and freedoms. to be continued
More information about the ffmpeg-devel