[FFmpeg-devel] [PATCH] lavf/img2dec: add -pattern_type option

Stefano Sabatini stefasab at gmail.com
Mon Aug 6 14:58:18 CEST 2012


Allow to override the default 'glob_sequence' value, which is deprecated
in favor of the new 'glob' and 'sequence' options.

The new pattern types should be easier on the user since they are more
predictable than 'glob_sequence', and do not require awkward escaping.

FIXME: bump micro before pushing
---
 libavformat/img2dec.c |   34 +++++++++++++++++++++++++++++++++-
 1 files changed, 33 insertions(+), 1 deletions(-)

diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
index 0443b1a..a108656 100644
--- a/libavformat/img2dec.c
+++ b/libavformat/img2dec.c
@@ -41,6 +41,8 @@
 
 #endif /* HAVE_GLOB */
 
+enum PatternType { PT_GLOB_SEQUENCE, PT_GLOB, PT_SEQUENCE };
+
 typedef struct {
     const AVClass *class;  /**< Class for private options. */
     int img_first;
@@ -54,6 +56,7 @@ typedef struct {
     char *video_size;       /**< Set by a private option. */
     char *framerate;        /**< Set by a private option. */
     int loop;
+    enum PatternType pattern_type;
     int use_glob;
 #if HAVE_GLOB
     glob_t globstate;
@@ -233,6 +236,9 @@ static int read_header(AVFormatContext *s1)
     }
 
     if (!s->is_pipe) {
+        if (s->pattern_type == PT_GLOB_SEQUENCE) {
+            av_log(s1, AV_LOG_WARNING, "Pattern type 'glob_sequence' is deprecated: "
+                   "use -pattern_type 'glob' or 'sequence' instead\n");
         s->use_glob = is_glob(s->path);
         if (s->use_glob) {
 #if HAVE_GLOB
@@ -260,7 +266,9 @@ static int read_header(AVFormatContext *s1)
             first_index = 0;
             last_index = s->globstate.gl_pathc - 1;
 #endif
-        } else {
+        }
+        }
+        if ((s->pattern_type == PT_GLOB_SEQUENCE && !s->use_glob) || s->pattern_type == PT_SEQUENCE) {
             if (find_image_range(&first_index, &last_index, s->path,
                                  s->start_number, s->start_number_range) < 0) {
                 av_log(s1, AV_LOG_ERROR,
@@ -268,7 +276,25 @@ static int read_header(AVFormatContext *s1)
                        s->path, s->start_number, s->start_number + s->start_number_range - 1);
                 return AVERROR(ENOENT);
             }
+        } else if (s->pattern_type == PT_GLOB) {
+            int gerr;
+            if (!HAVE_GLOB) {
+                av_log(s1, AV_LOG_ERROR, "Pattern type 'glob' was selected but is not supported by libavformat\n");
+                return AVERROR(ENOSYS);
+            }
+            gerr = glob(s->path, GLOB_NOCHECK|GLOB_BRACE|GLOB_NOMAGIC, NULL, &s->globstate);
+            if (gerr != 0) {
+                return AVERROR(ENOENT);
+            }
+            first_index = 0;
+            last_index = s->globstate.gl_pathc - 1;
+            s->use_glob = 1;
+        } else if (s->pattern_type != PT_GLOB_SEQUENCE) {
+            av_log(s1, AV_LOG_ERROR,
+                   "Unknown value '%d' for pattern_type option\n", s->pattern_type);
+            return AVERROR(EINVAL);
         }
+
         s->img_first = first_index;
         s->img_last = last_index;
         s->img_number = first_index;
@@ -388,6 +414,12 @@ static int read_close(struct AVFormatContext* s1)
 static const AVOption options[] = {
     { "framerate",    "set the video framerate",             OFFSET(framerate),    AV_OPT_TYPE_STRING, {.str = "25"}, 0, 0, DEC },
     { "loop",         "force loop over input file sequence", OFFSET(loop),         AV_OPT_TYPE_INT,    {.dbl = 0},    0, 1, DEC },
+
+    { "pattern_type", "set pattern type",                    OFFSET(pattern_type), AV_OPT_TYPE_INT, {.dbl=PT_GLOB_SEQUENCE}, 0, INT_MAX, DEC, "pattern_type"},
+    { "glob_sequence","glob/sequence pattern type",          0, AV_OPT_TYPE_CONST, {.dbl=PT_GLOB_SEQUENCE}, INT_MIN, INT_MAX, DEC, "pattern_type" },
+    { "glob",         "glob pattern type",                   0, AV_OPT_TYPE_CONST, {.dbl=PT_GLOB},          INT_MIN, INT_MAX, DEC, "pattern_type" },
+    { "sequence",     "glob pattern type",                   0, AV_OPT_TYPE_CONST, {.dbl=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,    {.dbl = 0},    0, INT_MAX, DEC },
     { "start_number_range", "set range for looking at the first sequence number", OFFSET(start_number_range), AV_OPT_TYPE_INT, {.dbl = 5}, 1, INT_MAX, DEC },
-- 
1.7.5.4



More information about the ffmpeg-devel mailing list