Re: [FFmpeg-devel] cache: read ahead to avoid excessive small requests

2018-09-25 Thread Robert Nagy
This is to resolve https://trac.ffmpeg.org/ticket/5080
On Mon, Sep 24, 2018 at 10:01 PM Michael Niedermayer
 wrote:
>
> On Sun, Sep 23, 2018 at 08:52:06PM +0200, Robert Nagy wrote:
> > On Sun, Sep 23, 2018 at 1:40 PM Michael Niedermayer
> >  wrote:
> > >
> > > On Sat, Sep 22, 2018 at 07:32:28PM +0200, Robert Nagy wrote:
> > > > diff --git a/libavformat/cache.c b/libavformat/cache.c
> > > > index 66bbbf54c9..48ff5ab363 100644
> > > > --- a/libavformat/cache.c
> > > > +++ b/libavformat/cache.c
> > > > @@ -153,6 +153,38 @@ fail:
> > > >  return ret;
> > > >  }
> > > >
> > > > +static int cache_read_ahead(URLContext *h)
> > > > +{
> > > > +Context *c= h->priv_data;
> > > > +int64_t r, read_ahead, pos;
> > > > +uint8_t buf[32768];
> > > > +
> > > > +pos = c->logical_pos;
> > > > +read_ahead = c->read_ahead_limit < 0
> > > > +? 512 * 512
> > > > +: FFMIN(512 * 512, c->read_ahead_limit);
> > > > +
> > > > +while (read_ahead > 0) {
> > > > +r = ffurl_read(c->inner, buf, FFMIN(read_ahead, sizeof(buf)));
> > > > +if (r == AVERROR_EOF) {
> > > > +c->is_true_eof = 1;
> > > > +av_assert0(c->end >= c->logical_pos);
> > > > +}
> > > > +if (r<=0)
> > > > +break;
> > > > +c->inner_pos += r;
> > > > +
> > > > +add_entry(h, buf, r);
> > > > +c->logical_pos += r;
> > > > +c->end = FFMAX(c->end, c->logical_pos);
> > > > +read_ahead -= r;
> > > > +}
> > > > +
> > > > +c->logical_pos = pos;
> > > > +
> > > > +return r < 0 ? r : 0;
> > > > +}
> > > > +
> > > >  static int cache_read(URLContext *h, unsigned char *buf, int size)
> > > >  {
> > > >  Context *c= h->priv_data;
> > >
> > > > @@ -215,6 +247,10 @@ static int cache_read(URLContext *h, unsigned
> > > > char *buf, int size)
> > >
> > > still not cleanly applying (due to new lines)
> > >
> > > Applying: cache: read ahead to avoid excessive small requests
> > > error: corrupt patch at line 45
> > > error: could not build fake ancestor
> > > Patch failed at 0001 cache: read ahead to avoid excessive small requests
> > > hint: Use 'git am --show-current-patch' to see the failed patch
> > > When you have resolved this problem, run "git am --continue".
> > > If you prefer to skip this patch, run "git am --skip" instead.
> > > To restore the original branch and stop patching, run "git am --abort".
> > >
> > >
> > > [...]
> > >
> > > --
> > > Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
> > >
> > > The greatest way to live with honor in this world is to be what we pretend
> > > to be. -- Socrates
> > > ___
> > > ffmpeg-devel mailing list
> > > ffmpeg-devel@ffmpeg.org
> > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> >  cache.c |  111 
> > 
> >  1 file changed, 84 insertions(+), 27 deletions(-)
> > 5a1f791cd8dd72085fc27c9cdbf2d41a87f24fee  
> > 0001-cache-read-ahead-to-avoid-excessive-small-requests.patch
> > From 17be70d9ffbfd1f55770e81958b597994abf2c99 Mon Sep 17 00:00:00 2001
> > From: Robert Nagy 
> > Date: Sat, 22 Sep 2018 19:18:54 +0200
> > Subject: [PATCH] cache: read ahead to avoid excessive small requests
> >
>
> > This "fakes" a filler thread for reading ahead.
>
> applies cleanly now, but why fake ?
> reading alot more than requested would cause extra latency even if the user
> application runs the format code in a seperate thread
> It would be better to avoid this and not block a request for "block 1" any
> longer than it takes to read "block 1"
>
>
> [...]
>
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Observe your enemies, for they first find out your faults. -- Antisthenes
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] cache: read ahead to avoid excessive small requests

2018-09-24 Thread Michael Niedermayer
On Sun, Sep 23, 2018 at 08:52:06PM +0200, Robert Nagy wrote:
> On Sun, Sep 23, 2018 at 1:40 PM Michael Niedermayer
>  wrote:
> >
> > On Sat, Sep 22, 2018 at 07:32:28PM +0200, Robert Nagy wrote:
> > > diff --git a/libavformat/cache.c b/libavformat/cache.c
> > > index 66bbbf54c9..48ff5ab363 100644
> > > --- a/libavformat/cache.c
> > > +++ b/libavformat/cache.c
> > > @@ -153,6 +153,38 @@ fail:
> > >  return ret;
> > >  }
> > >
> > > +static int cache_read_ahead(URLContext *h)
> > > +{
> > > +Context *c= h->priv_data;
> > > +int64_t r, read_ahead, pos;
> > > +uint8_t buf[32768];
> > > +
> > > +pos = c->logical_pos;
> > > +read_ahead = c->read_ahead_limit < 0
> > > +? 512 * 512
> > > +: FFMIN(512 * 512, c->read_ahead_limit);
> > > +
> > > +while (read_ahead > 0) {
> > > +r = ffurl_read(c->inner, buf, FFMIN(read_ahead, sizeof(buf)));
> > > +if (r == AVERROR_EOF) {
> > > +c->is_true_eof = 1;
> > > +av_assert0(c->end >= c->logical_pos);
> > > +}
> > > +if (r<=0)
> > > +break;
> > > +c->inner_pos += r;
> > > +
> > > +add_entry(h, buf, r);
> > > +c->logical_pos += r;
> > > +c->end = FFMAX(c->end, c->logical_pos);
> > > +read_ahead -= r;
> > > +}
> > > +
> > > +c->logical_pos = pos;
> > > +
> > > +return r < 0 ? r : 0;
> > > +}
> > > +
> > >  static int cache_read(URLContext *h, unsigned char *buf, int size)
> > >  {
> > >  Context *c= h->priv_data;
> >
> > > @@ -215,6 +247,10 @@ static int cache_read(URLContext *h, unsigned
> > > char *buf, int size)
> >
> > still not cleanly applying (due to new lines)
> >
> > Applying: cache: read ahead to avoid excessive small requests
> > error: corrupt patch at line 45
> > error: could not build fake ancestor
> > Patch failed at 0001 cache: read ahead to avoid excessive small requests
> > hint: Use 'git am --show-current-patch' to see the failed patch
> > When you have resolved this problem, run "git am --continue".
> > If you prefer to skip this patch, run "git am --skip" instead.
> > To restore the original branch and stop patching, run "git am --abort".
> >
> >
> > [...]
> >
> > --
> > Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
> >
> > The greatest way to live with honor in this world is to be what we pretend
> > to be. -- Socrates
> > ___
> > ffmpeg-devel mailing list
> > ffmpeg-devel@ffmpeg.org
> > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

>  cache.c |  111 
> 
>  1 file changed, 84 insertions(+), 27 deletions(-)
> 5a1f791cd8dd72085fc27c9cdbf2d41a87f24fee  
> 0001-cache-read-ahead-to-avoid-excessive-small-requests.patch
> From 17be70d9ffbfd1f55770e81958b597994abf2c99 Mon Sep 17 00:00:00 2001
> From: Robert Nagy 
> Date: Sat, 22 Sep 2018 19:18:54 +0200
> Subject: [PATCH] cache: read ahead to avoid excessive small requests
> 

> This "fakes" a filler thread for reading ahead.

applies cleanly now, but why fake ?
reading alot more than requested would cause extra latency even if the user
application runs the format code in a seperate thread
It would be better to avoid this and not block a request for "block 1" any
longer than it takes to read "block 1"


[...]

-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Observe your enemies, for they first find out your faults. -- Antisthenes


signature.asc
Description: PGP signature
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] cache: read ahead to avoid excessive small requests

2018-09-23 Thread Robert Nagy
On Sun, Sep 23, 2018 at 1:40 PM Michael Niedermayer
 wrote:
>
> On Sat, Sep 22, 2018 at 07:32:28PM +0200, Robert Nagy wrote:
> > diff --git a/libavformat/cache.c b/libavformat/cache.c
> > index 66bbbf54c9..48ff5ab363 100644
> > --- a/libavformat/cache.c
> > +++ b/libavformat/cache.c
> > @@ -153,6 +153,38 @@ fail:
> >  return ret;
> >  }
> >
> > +static int cache_read_ahead(URLContext *h)
> > +{
> > +Context *c= h->priv_data;
> > +int64_t r, read_ahead, pos;
> > +uint8_t buf[32768];
> > +
> > +pos = c->logical_pos;
> > +read_ahead = c->read_ahead_limit < 0
> > +? 512 * 512
> > +: FFMIN(512 * 512, c->read_ahead_limit);
> > +
> > +while (read_ahead > 0) {
> > +r = ffurl_read(c->inner, buf, FFMIN(read_ahead, sizeof(buf)));
> > +if (r == AVERROR_EOF) {
> > +c->is_true_eof = 1;
> > +av_assert0(c->end >= c->logical_pos);
> > +}
> > +if (r<=0)
> > +break;
> > +c->inner_pos += r;
> > +
> > +add_entry(h, buf, r);
> > +c->logical_pos += r;
> > +c->end = FFMAX(c->end, c->logical_pos);
> > +read_ahead -= r;
> > +}
> > +
> > +c->logical_pos = pos;
> > +
> > +return r < 0 ? r : 0;
> > +}
> > +
> >  static int cache_read(URLContext *h, unsigned char *buf, int size)
> >  {
> >  Context *c= h->priv_data;
>
> > @@ -215,6 +247,10 @@ static int cache_read(URLContext *h, unsigned
> > char *buf, int size)
>
> still not cleanly applying (due to new lines)
>
> Applying: cache: read ahead to avoid excessive small requests
> error: corrupt patch at line 45
> error: could not build fake ancestor
> Patch failed at 0001 cache: read ahead to avoid excessive small requests
> hint: Use 'git am --show-current-patch' to see the failed patch
> When you have resolved this problem, run "git am --continue".
> If you prefer to skip this patch, run "git am --skip" instead.
> To restore the original branch and stop patching, run "git am --abort".
>
>
> [...]
>
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> The greatest way to live with honor in this world is to be what we pretend
> to be. -- Socrates
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


0001-cache-read-ahead-to-avoid-excessive-small-requests.patch
Description: Binary data
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] cache: read ahead to avoid excessive small requests

2018-09-23 Thread Michael Niedermayer
On Sat, Sep 22, 2018 at 07:32:28PM +0200, Robert Nagy wrote:
> diff --git a/libavformat/cache.c b/libavformat/cache.c
> index 66bbbf54c9..48ff5ab363 100644
> --- a/libavformat/cache.c
> +++ b/libavformat/cache.c
> @@ -153,6 +153,38 @@ fail:
>  return ret;
>  }
> 
> +static int cache_read_ahead(URLContext *h)
> +{
> +Context *c= h->priv_data;
> +int64_t r, read_ahead, pos;
> +uint8_t buf[32768];
> +
> +pos = c->logical_pos;
> +read_ahead = c->read_ahead_limit < 0
> +? 512 * 512
> +: FFMIN(512 * 512, c->read_ahead_limit);
> +
> +while (read_ahead > 0) {
> +r = ffurl_read(c->inner, buf, FFMIN(read_ahead, sizeof(buf)));
> +if (r == AVERROR_EOF) {
> +c->is_true_eof = 1;
> +av_assert0(c->end >= c->logical_pos);
> +}
> +if (r<=0)
> +break;
> +c->inner_pos += r;
> +
> +add_entry(h, buf, r);
> +c->logical_pos += r;
> +c->end = FFMAX(c->end, c->logical_pos);
> +read_ahead -= r;
> +}
> +
> +c->logical_pos = pos;
> +
> +return r < 0 ? r : 0;
> +}
> +
>  static int cache_read(URLContext *h, unsigned char *buf, int size)
>  {
>  Context *c= h->priv_data;

> @@ -215,6 +247,10 @@ static int cache_read(URLContext *h, unsigned
> char *buf, int size)

still not cleanly applying (due to new lines)

Applying: cache: read ahead to avoid excessive small requests
error: corrupt patch at line 45
error: could not build fake ancestor
Patch failed at 0001 cache: read ahead to avoid excessive small requests
hint: Use 'git am --show-current-patch' to see the failed patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".


[...]

-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The greatest way to live with honor in this world is to be what we pretend
to be. -- Socrates


signature.asc
Description: PGP signature
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] cache: read ahead to avoid excessive small requests

2018-09-22 Thread Robert Nagy
*diff --git a/libavformat/cache.c b/libavformat/cache.c*

*index 66bbbf54c9..48ff5ab363 100644*

*--- a/libavformat/cache.c*

*+++ b/libavformat/cache.c*

@@ -153,6 +153,38 @@ fail:

 return ret;

 }



+static int cache_read_ahead(URLContext *h)

+{

+Context *c= h->priv_data;

+int64_t r, read_ahead, pos;

+uint8_t buf[32768];

+

+pos = c->logical_pos;

+read_ahead = c->read_ahead_limit < 0

+? 512 * 512

+: FFMIN(512 * 512, c->read_ahead_limit);

+

+while (read_ahead > 0) {

+r = ffurl_read(c->inner, buf, FFMIN(read_ahead, sizeof(buf)));

+if (r == AVERROR_EOF) {

+c->is_true_eof = 1;

+av_assert0(c->end >= c->logical_pos);

+}

+if (r<=0)

+break;

+c->inner_pos += r;

+

+add_entry(h, buf, r);

+c->logical_pos += r;

+c->end = FFMAX(c->end, c->logical_pos);

+read_ahead -= r;

+}

+

+c->logical_pos = pos;

+

+return r < 0 ? r : 0;

+}

+

 static int cache_read(URLContext *h, unsigned char *buf, int size)

 {

 Context *c= h->priv_data;

@@ -215,6 +247,10 @@ static int cache_read(URLContext *h, unsigned char
*buf, int size)

 c->logical_pos += r;

 c->end = FFMAX(c->end, c->logical_pos);



+// Fake filling thread to avoid excessive

+// small reads.

+cache_read_ahead(h);

+

 return r;

 }
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] cache: read ahead to avoid excessive small requests

2018-09-22 Thread Robert Nagy
diff --git a/libavformat/cache.c b/libavformat/cache.c
index 66bbbf54c9..48ff5ab363 100644
--- a/libavformat/cache.c
+++ b/libavformat/cache.c
@@ -153,6 +153,38 @@ fail:
 return ret;
 }

+static int cache_read_ahead(URLContext *h)
+{
+Context *c= h->priv_data;
+int64_t r, read_ahead, pos;
+uint8_t buf[32768];
+
+pos = c->logical_pos;
+read_ahead = c->read_ahead_limit < 0
+? 512 * 512
+: FFMIN(512 * 512, c->read_ahead_limit);
+
+while (read_ahead > 0) {
+r = ffurl_read(c->inner, buf, FFMIN(read_ahead, sizeof(buf)));
+if (r == AVERROR_EOF) {
+c->is_true_eof = 1;
+av_assert0(c->end >= c->logical_pos);
+}
+if (r<=0)
+break;
+c->inner_pos += r;
+
+add_entry(h, buf, r);
+c->logical_pos += r;
+c->end = FFMAX(c->end, c->logical_pos);
+read_ahead -= r;
+}
+
+c->logical_pos = pos;
+
+return r < 0 ? r : 0;
+}
+
 static int cache_read(URLContext *h, unsigned char *buf, int size)
 {
 Context *c= h->priv_data;
@@ -215,6 +247,10 @@ static int cache_read(URLContext *h, unsigned
char *buf, int size)
 c->logical_pos += r;
 c->end = FFMAX(c->end, c->logical_pos);

+// Fake filling thread to avoid excessive
+// small reads.
+cache_read_ahead(h);
+
 return r;
 }
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel