diff options
author | Andrey Utkin <andrey.krieger.utkin@gmail.com> | 2013-05-24 17:50:36 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-05-25 13:42:28 +0400 |
commit | 70fbfd75c39bdb6bfc197348b29ce40c57042925 (patch) | |
tree | 6544096e8b92dda83cce920a1d65d2c045cc1662 /libavformat/img2dec.c | |
parent | 2c2e69b3a2b99a27e998e115649149ae6a23dccd (diff) |
img2dec: Add ts_from_file option
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/img2dec.c')
-rw-r--r-- | libavformat/img2dec.c | 18 |
1 files changed, 16 insertions, 2 deletions
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 <sys/stat.h> #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 }, }; |