[FFmpeg-devel] [PATCH] avformat/file: add seekable option to disallow seeking

Marton Balint cus at passwd.hu
Thu Apr 4 00:13:05 EEST 2019



On Wed, 3 Apr 2019, Hendrik Leppkes wrote:

> On Wed, Apr 3, 2019 at 10:42 PM Marton Balint <cus at passwd.hu> wrote:
>>
>> Signed-off-by: Marton Balint <cus at 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).
>> +
>> + at 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


More information about the ffmpeg-devel mailing list