From 70fbfd75c39bdb6bfc197348b29ce40c57042925 Mon Sep 17 00:00:00 2001 From: Andrey Utkin Date: Fri, 24 May 2013 16:50:36 +0300 Subject: img2dec: Add ts_from_file option Signed-off-by: Michael Niedermayer --- doc/demuxers.texi | 4 ++++ libavformat/img2dec.c | 18 ++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/doc/demuxers.texi b/doc/demuxers.texi index c75e1abd8d..9cfa954bc4 100644 --- a/doc/demuxers.texi +++ b/doc/demuxers.texi @@ -210,6 +210,10 @@ to read from. Default value is 0. Set the index interval range to check when looking for the first image file in the sequence, starting from @var{start_number}. Default value is 5. +@item ts_from_file +If set to 1, will set frame timestamp to modification time of image file. Note +that monotonity of timestamps is not provided: images go in the same order as +without this option. Default value is 0. @item video_size Set the video size of the images to read. If not specified the video size is guessed from the first image file in the sequence. diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c index e32c951a85..5eea2df4f4 100644 --- a/libavformat/img2dec.c +++ b/libavformat/img2dec.c @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "libavutil/avstring.h" #include "libavutil/log.h" #include "libavutil/opt.h" @@ -63,6 +64,7 @@ typedef struct { int start_number; int start_number_range; int frame_size; + int ts_from_file; } VideoDemuxData; static const int sizes[][2] = { @@ -223,7 +225,10 @@ static int img_read_header(AVFormatContext *s1) st->need_parsing = AVSTREAM_PARSE_FULL; } - avpriv_set_pts_info(st, 60, s->framerate.den, s->framerate.num); + if (s->ts_from_file) + avpriv_set_pts_info(st, 60, 1, 1); + else + avpriv_set_pts_info(st, 60, s->framerate.den, s->framerate.num); if (s->width && s->height) { st->codec->width = s->width; @@ -381,8 +386,14 @@ static int img_read_packet(AVFormatContext *s1, AVPacket *pkt) return AVERROR(ENOMEM); pkt->stream_index = 0; pkt->flags |= AV_PKT_FLAG_KEY; - if (!s->is_pipe) + if (s->ts_from_file) { + struct stat img_stat; + if (stat(filename, &img_stat)) + return AVERROR(EIO); + pkt->pts = (int64_t)img_stat.st_mtime; + } else if (!s->is_pipe) { pkt->pts = s->pts; + } pkt->size = 0; for (i = 0; i < 3; i++) { @@ -420,6 +431,8 @@ static int img_read_close(struct AVFormatContext* s1) static int img_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { VideoDemuxData *s1 = s->priv_data; + if (s1->ts_from_file) /* Seeking is not supported in this case */ + return AVERROR(ESPIPE); if (timestamp < 0 || !s1->loop && timestamp > s1->img_last - s1->img_first) return -1; @@ -444,6 +457,7 @@ static const AVOption options[] = { { "start_number_range", "set range for looking at the first sequence number", OFFSET(start_number_range), AV_OPT_TYPE_INT, {.i64 = 5}, 1, INT_MAX, DEC }, { "video_size", "set video size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, DEC }, { "frame_size", "force frame size in bytes", OFFSET(frame_size), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, DEC }, + { "ts_from_file", "set frame timestamp from file's one", OFFSET(ts_from_file), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, DEC }, { NULL }, }; -- cgit v1.2.3