[FFmpeg-devel] [PATCH] avformat/cache: Separate read and seek return-values within cache_read
Bryan Huh
bryan at box.com
Mon Nov 2 19:33:22 CET 2015
Ok. Will push a separate patch with a one-line type-change and abandon this.
I wanted to avoid coercing "r" into a 32-bit int when add_entry is called.
I thought the compiler would give me warnings about it, but it doesn't seem
to be after all.
On Mon, Nov 2, 2015 at 7:04 AM, Michael Niedermayer <michael at niedermayer.cc>
wrote:
> On Sun, Nov 01, 2015 at 10:56:45PM -0800, Bryan Huh wrote:
> > Fixes an issue where an int64_t ffurl_seek return-value was being stored
> > in a generic int "r" variable, leading to integer overflow when seeking
> > into a large file (>2GB), and ultimately a "Failed to perform internal
> > seek" error mesage. The "r" variable was used both for storing the
> > result of any seeks and for the result of any reads. Instead, I separate
> > the variable into an int64_t seek-variable and int read-variable.
> >
> > To test, try running `ffprobe 'cache:http://<something>'` on a file that
> > is ~3GB large, whose moov atom is at the end of the file
> > ---
> > libavformat/cache.c | 49
> +++++++++++++++++++++++++------------------------
> > 1 files changed, 25 insertions(+), 24 deletions(-)
> >
> > diff --git a/libavformat/cache.c b/libavformat/cache.c
> > index a762aa9..b654f45 100644
> > --- a/libavformat/cache.c
> > +++ b/libavformat/cache.c
> > @@ -156,7 +156,8 @@ static int cache_read(URLContext *h, unsigned char
> *buf, int size)
> > {
> > Context *c= h->priv_data;
> > CacheEntry *entry, *next[2] = {NULL, NULL};
>
> > - int r;
> > + int64_t off;
> > + int bytes_read = 0;
>
> renaming the variable is unrelated (its not neccessary)
> but if you want to rename/split it, i dont mind but it should be in
> a seperate patch
>
>
> >
> > entry = av_tree_find(c->root, &c->logical_pos, cmp, (void**)next);
> >
> > @@ -169,21 +170,21 @@ static int cache_read(URLContext *h, unsigned char
> *buf, int size)
> > if (in_block_pos < entry->size) {
> > int64_t physical_target = entry->physical_pos +
> in_block_pos;
> >
>
> > - if (c->cache_pos != physical_target) {
> > + if (c->cache_pos != physical_target)
>
> removing {} is not needed, without it the change is smaller and
> simpeler to read (for example when someone reads git log changes)
>
>
> [...]
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Avoid a single point of failure, be that a person or equipment.
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>
More information about the ffmpeg-devel
mailing list