]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/img2dec.c
Merge commit 'b9ee5f2cab3ffe1c962e542346b1ed61394864ec'
[ffmpeg] / libavformat / img2dec.c
index c3f5bdbd01e667bcc4b9e6de0efffe1b81f58a8b..882abb98589a077705852eee390c13e59443df4a 100644 (file)
@@ -46,6 +46,7 @@ typedef struct {
     int img_first;
     int img_last;
     int img_number;
+    int64_t pts;
     int img_count;
     int is_pipe;
     int split_planes;       /**< use independent file for each Y, U, V plane */
@@ -393,8 +394,8 @@ 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 && !s->loop)
-        pkt->pts      = s->img_number - s->img_first;
+    if (!s->is_pipe)
+        pkt->pts      = s->pts;
 
     pkt->size = 0;
     for (i = 0; i < 3; i++) {
@@ -413,6 +414,7 @@ static int img_read_packet(AVFormatContext *s1, AVPacket *pkt)
     } else {
         s->img_count++;
         s->img_number++;
+        s->pts++;
         return 0;
     }
 }
@@ -432,9 +434,10 @@ static int img_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
 {
     VideoDemuxData *s1 = s->priv_data;
 
-    if (timestamp < 0 || timestamp > s1->img_last - s1->img_first)
+    if (timestamp < 0 || !s1->loop && timestamp > s1->img_last - s1->img_first)
         return -1;
-    s1->img_number = timestamp + s1->img_first;
+    s1->img_number = timestamp%(s1->img_last - s1->img_first + 1) + s1->img_first;
+    s1->pts = timestamp;
     return 0;
 }
 
@@ -445,9 +448,9 @@ static const AVOption options[] = {
     { "loop",         "force loop over input file sequence", OFFSET(loop),         AV_OPT_TYPE_INT,    {.i64 = 0   }, 0, 1,       DEC },
 
     { "pattern_type", "set pattern type",                    OFFSET(pattern_type), AV_OPT_TYPE_INT,    {.i64=PT_GLOB_SEQUENCE}, 0,       INT_MAX, DEC, "pattern_type"},
-    { "glob_sequence","glob/sequence pattern type",          0,                    AV_OPT_TYPE_CONST,  {.i64=PT_GLOB_SEQUENCE}, INT_MIN, INT_MAX, DEC, "pattern_type" },
-    { "glob",         "glob pattern type",                   0,                    AV_OPT_TYPE_CONST,  {.i64=PT_GLOB         }, INT_MIN, INT_MAX, DEC, "pattern_type" },
-    { "sequence",     "glob pattern type",                   0,                    AV_OPT_TYPE_CONST,  {.i64=PT_SEQUENCE     }, INT_MIN, INT_MAX, DEC, "pattern_type" },
+    { "glob_sequence","select glob/sequence pattern type",   0, AV_OPT_TYPE_CONST,  {.i64=PT_GLOB_SEQUENCE}, INT_MIN, INT_MAX, DEC, "pattern_type" },
+    { "glob",         "select glob pattern type",            0, AV_OPT_TYPE_CONST,  {.i64=PT_GLOB         }, INT_MIN, INT_MAX, DEC, "pattern_type" },
+    { "sequence",     "select sequence pattern type",        0, AV_OPT_TYPE_CONST,  {.i64=PT_SEQUENCE     }, INT_MIN, INT_MAX, DEC, "pattern_type" },
 
     { "pixel_format", "set video pixel format",              OFFSET(pixel_format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0,       DEC },
     { "start_number", "set first number in the sequence",    OFFSET(start_number), AV_OPT_TYPE_INT,    {.i64 = 0   }, 0, INT_MAX, DEC },