Message ID | 20190403204146.12634-1-cus@passwd.hu |
---|---|
State | Superseded |
Headers | show |
On Wed, Apr 3, 2019 at 10:42 PM Marton Balint <cus@passwd.hu> wrote: > > Signed-off-by: Marton Balint <cus@passwd.hu> > --- > doc/protocols.texi | 9 +++++++++ > libavformat/file.c | 5 +++++ > 2 files changed, 14 insertions(+) > > diff --git a/doc/protocols.texi b/doc/protocols.texi > index e1caa049a5..34967ff5e2 100644 > --- a/doc/protocols.texi > +++ b/doc/protocols.texi > @@ -199,6 +199,15 @@ If set to 1, the protocol will retry reading at the end of the file, allowing > reading files that still are being written. In order for this to terminate, > you either need to use the rw_timeout option, or use the interrupt callback > (for API users). > + > +@item seekable > +Controls if seekability is advertised on the file. 1 means seekable, 0 means > +non-seekable, -1 means auto (seekable for normal files, non-seekable for named > +pipes). > + > +Many demuxers handle seekable and non-seekable resources differently, > +overriding this might speed up opening certain files at the cost of losing some > +features (e.g. accurate seeking). > @end table > > @section ftp > diff --git a/libavformat/file.c b/libavformat/file.c > index e613b91010..e46596fed1 100644 > --- a/libavformat/file.c > +++ b/libavformat/file.c > @@ -73,6 +73,7 @@ typedef struct FileContext { > int trunc; > int blocksize; > int follow; > + int seekable; > #if HAVE_DIRENT_H > DIR *dir; > #endif > @@ -82,6 +83,7 @@ static const AVOption file_options[] = { > { "truncate", "truncate existing files on write", offsetof(FileContext, trunc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, > { "blocksize", "set I/O operation maximum block size", offsetof(FileContext, blocksize), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, > { "follow", "Follow a file as it is being written", offsetof(FileContext, follow), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, > + { "seekable", "Sets if the file is seekable", offsetof(FileContext, seekable), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, > { NULL } > }; > > @@ -238,6 +240,9 @@ static int file_open(URLContext *h, const char *filename, int flags) > if (!h->is_streamed && flags & AVIO_FLAG_WRITE) > h->min_packet_size = h->max_packet_size = 262144; > > + if (c->seekable >= 0) > + h->is_streamed = !c->seekable; > + You should probably not let a user enable seeking if the resource doesn't allow it. - Hendrik
On Wed, 3 Apr 2019, Hendrik Leppkes wrote: > On Wed, Apr 3, 2019 at 10:42 PM Marton Balint <cus@passwd.hu> wrote: >> >> Signed-off-by: Marton Balint <cus@passwd.hu> >> --- >> doc/protocols.texi | 9 +++++++++ >> libavformat/file.c | 5 +++++ >> 2 files changed, 14 insertions(+) >> >> diff --git a/doc/protocols.texi b/doc/protocols.texi >> index e1caa049a5..34967ff5e2 100644 >> --- a/doc/protocols.texi >> +++ b/doc/protocols.texi >> @@ -199,6 +199,15 @@ If set to 1, the protocol will retry reading at the end of the file, allowing >> reading files that still are being written. In order for this to terminate, >> you either need to use the rw_timeout option, or use the interrupt callback >> (for API users). >> + >> +@item seekable >> +Controls if seekability is advertised on the file. 1 means seekable, 0 means >> +non-seekable, -1 means auto (seekable for normal files, non-seekable for named >> +pipes). >> + >> +Many demuxers handle seekable and non-seekable resources differently, >> +overriding this might speed up opening certain files at the cost of losing some >> +features (e.g. accurate seeking). >> @end table >> >> @section ftp >> diff --git a/libavformat/file.c b/libavformat/file.c >> index e613b91010..e46596fed1 100644 >> --- a/libavformat/file.c >> +++ b/libavformat/file.c >> @@ -73,6 +73,7 @@ typedef struct FileContext { >> int trunc; >> int blocksize; >> int follow; >> + int seekable; >> #if HAVE_DIRENT_H >> DIR *dir; >> #endif >> @@ -82,6 +83,7 @@ static const AVOption file_options[] = { >> { "truncate", "truncate existing files on write", offsetof(FileContext, trunc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, >> { "blocksize", "set I/O operation maximum block size", offsetof(FileContext, blocksize), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, >> { "follow", "Follow a file as it is being written", offsetof(FileContext, follow), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, >> + { "seekable", "Sets if the file is seekable", offsetof(FileContext, seekable), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, >> { NULL } >> }; >> >> @@ -238,6 +240,9 @@ static int file_open(URLContext *h, const char *filename, int flags) >> if (!h->is_streamed && flags & AVIO_FLAG_WRITE) >> h->min_packet_size = h->max_packet_size = 262144; >> >> + if (c->seekable >= 0) >> + h->is_streamed = !c->seekable; >> + > > You should probably not let a user enable seeking if the resource > doesn't allow it. lseek will fail anyway for those, so I am not sure if we should handle it specially. I can change it if you prefer, although in this case using -seekable 1 will have no effect, so the parameter maximum should be reduced to 0. Let me know what you think. Thanks, Marton
diff --git a/doc/protocols.texi b/doc/protocols.texi index e1caa049a5..34967ff5e2 100644 --- a/doc/protocols.texi +++ b/doc/protocols.texi @@ -199,6 +199,15 @@ If set to 1, the protocol will retry reading at the end of the file, allowing reading files that still are being written. In order for this to terminate, you either need to use the rw_timeout option, or use the interrupt callback (for API users). + +@item seekable +Controls if seekability is advertised on the file. 1 means seekable, 0 means +non-seekable, -1 means auto (seekable for normal files, non-seekable for named +pipes). + +Many demuxers handle seekable and non-seekable resources differently, +overriding this might speed up opening certain files at the cost of losing some +features (e.g. accurate seeking). @end table @section ftp diff --git a/libavformat/file.c b/libavformat/file.c index e613b91010..e46596fed1 100644 --- a/libavformat/file.c +++ b/libavformat/file.c @@ -73,6 +73,7 @@ typedef struct FileContext { int trunc; int blocksize; int follow; + int seekable; #if HAVE_DIRENT_H DIR *dir; #endif @@ -82,6 +83,7 @@ static const AVOption file_options[] = { { "truncate", "truncate existing files on write", offsetof(FileContext, trunc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, { "blocksize", "set I/O operation maximum block size", offsetof(FileContext, blocksize), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, { "follow", "Follow a file as it is being written", offsetof(FileContext, follow), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, + { "seekable", "Sets if the file is seekable", offsetof(FileContext, seekable), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, { NULL } }; @@ -238,6 +240,9 @@ static int file_open(URLContext *h, const char *filename, int flags) if (!h->is_streamed && flags & AVIO_FLAG_WRITE) h->min_packet_size = h->max_packet_size = 262144; + if (c->seekable >= 0) + h->is_streamed = !c->seekable; + return 0; }
Signed-off-by: Marton Balint <cus@passwd.hu> --- doc/protocols.texi | 9 +++++++++ libavformat/file.c | 5 +++++ 2 files changed, 14 insertions(+)