Merge commit '933dec0e29ec4d2cb83474279a6c52d62fdb7310'
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>
Tue, 19 Apr 2016 13:41:19 +0000 (14:41 +0100)
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>
Tue, 19 Apr 2016 13:41:19 +0000 (14:41 +0100)
* commit '933dec0e29ec4d2cb83474279a6c52d62fdb7310':
  file: Add an option for following a file that is being written

Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
1  2 
doc/protocols.texi
libavformat/file.c
libavformat/version.h

@@@ -156,74 -57,29 +156,85 @@@ ffmpeg -i "data:image/gif;base64,R0lGOD
  
  File access protocol.
  
 -Allow to read from or read to a file.
 +Read from or write to a file.
 +
 +A file URL can have the form:
 +@example
 +file:@var{filename}
 +@end example
 +
 +where @var{filename} is the path of the file to read.
 +
 +An URL that does not have a protocol prefix will be assumed to be a
 +file URL. Depending on the build, an URL that looks like a Windows
 +path with the drive letter at the beginning will also be assumed to be
 +a file URL (usually not the case in builds for unix-like systems).
  
 -For example to read from a file @file{input.mpeg} with @command{avconv}
 +For example to read from a file @file{input.mpeg} with @command{ffmpeg}
  use the command:
  @example
 -avconv -i file:input.mpeg output.mpeg
 +ffmpeg -i file:input.mpeg output.mpeg
 +@end example
 +
 +This protocol accepts the following options:
 +
 +@table @option
 +@item truncate
 +Truncate existing files on write, if set to 1. A value of 0 prevents
 +truncating. Default value is 1.
 +
 +@item blocksize
 +Set I/O operation maximum block size, in bytes. Default value is
 +@code{INT_MAX}, which results in not limiting the requested block size.
 +Setting this value reasonably low improves user termination request reaction
 +time, which is valuable for files on slow medium.
 +@end table
 +
 +@section ftp
 +
 +FTP (File Transfer Protocol).
 +
 +Read from or write to remote resources using FTP protocol.
 +
 +Following syntax is required.
 +@example
 +ftp://[user[:password]@@]server[:port]/path/to/remote/resource.mpeg
  @end example
  
 -The av* tools default to the file protocol, that is a resource
 -specified with the name "FILE.mpeg" is interpreted as the URL
 -"file:FILE.mpeg".
 +This protocol accepts the following options.
 +
 +@table @option
 +@item timeout
 +Set timeout in microseconds of socket I/O operations used by the underlying low level
 +operation. By default it is set to -1, which means that the timeout is
 +not specified.
 +
 +@item ftp-anonymous-password
 +Password used when login as anonymous user. Typically an e-mail address
 +should be used.
 +
 +@item ftp-write-seekable
 +Control seekability of connection during encoding. If set to 1 the
 +resource is supposed to be seekable, if set to 0 it is assumed not
 +to be seekable. Default value is 0.
 +@end table
 +
 +NOTE: Protocol can be used as output, but it is recommended to not do
 +it, unless special care is taken (tests, customized server configuration
 +etc.). Different FTP servers behave in different way during seek
 +operation. ff* tools may produce incomplete content due to server limitations.
  
+ This protocol accepts the following options:
+ @table @option
+ @item follow
+ 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).
+ @end table
  @section gopher
  
  Gopher protocol.
@@@ -71,15 -42,12 +71,17 @@@ typedef struct FileContext 
      const AVClass *class;
      int fd;
      int trunc;
 +    int blocksize;
+     int follow;
 +#if HAVE_DIRENT_H
 +    DIR *dir;
 +#endif
  } FileContext;
  
  static const AVOption file_options[] = {
 -    { "truncate", "Truncate existing files on write", offsetof(FileContext, trunc), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
 +    { "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 },
      { NULL }
  };
  
@@@ -105,9 -61,9 +107,11 @@@ static const AVClass pipe_class = 
  static int file_read(URLContext *h, unsigned char *buf, int size)
  {
      FileContext *c = h->priv_data;
 -    int ret = read(c->fd, buf, size);
 +    int ret;
 +    size = FFMIN(size, c->blocksize);
 +    ret = read(c->fd, buf, size);
+     if (ret == 0 && c->follow)
+         return AVERROR(EAGAIN);
      return (ret == -1) ? AVERROR(errno) : ret;
  }
  
@@@ -29,9 -29,9 +29,9 @@@
  
  #include "libavutil/version.h"
  
 -#define LIBAVFORMAT_VERSION_MAJOR 57
 -#define LIBAVFORMAT_VERSION_MINOR  5
 -#define LIBAVFORMAT_VERSION_MICRO  2
 +#define LIBAVFORMAT_VERSION_MAJOR  57
 +#define LIBAVFORMAT_VERSION_MINOR  34
- #define LIBAVFORMAT_VERSION_MICRO 102
++#define LIBAVFORMAT_VERSION_MICRO 103
  
  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                 LIBAVFORMAT_VERSION_MINOR, \