[FFmpeg-cvslog] fftools/ffmpeg_opt: reimplement -streamid using a dictionary

Anton Khirnov git at videolan.org
Thu Jul 20 21:57:07 EEST 2023


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Thu Jul 13 17:36:57 2023 +0200| [26e1e80152beccb12919cc1078f5f42e3a6774c9] | committer: Anton Khirnov

fftools/ffmpeg_opt: reimplement -streamid using a dictionary

This does not require an arbitrary limit on the number of streams.

Also, return error codes from opt_streamid() instead of aborting.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=26e1e80152beccb12919cc1078f5f42e3a6774c9
---

 fftools/ffmpeg.h          |  7 ++-----
 fftools/ffmpeg_mux_init.c | 18 +++++++++++++++---
 fftools/ffmpeg_opt.c      | 12 +++++-------
 3 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index fc953be911..0e5e1561f5 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -72,8 +72,6 @@ enum EncTimeBase {
     ENC_TIME_BASE_FILTER = -2,
 };
 
-#define MAX_STREAMS 1024    /* arbitrary sanity check value */
-
 enum HWAccelID {
     HWACCEL_NONE = 0,
     HWACCEL_AUTO,
@@ -183,9 +181,8 @@ typedef struct OptionsContext {
     int subtitle_disable;
     int data_disable;
 
-    /* indexed by output file stream index */
-    int   *streamid_map;
-    int nb_streamid_map;
+    // keys are stream indices
+    AVDictionary *streamid;
 
     SpecifierOpt *metadata;
     int        nb_metadata;
diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
index 4580f4af41..8552febce8 100644
--- a/fftools/ffmpeg_mux_init.c
+++ b/fftools/ffmpeg_mux_init.c
@@ -1100,12 +1100,24 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type,
     if (!st)
         return AVERROR(ENOMEM);
 
-    if (oc->nb_streams - 1 < o->nb_streamid_map)
-        st->id = o->streamid_map[oc->nb_streams - 1];
-
     ms  = mux_stream_alloc(mux, type);
     ost = &ms->ost;
 
+    if (o->streamid) {
+        AVDictionaryEntry *e;
+        char idx[16], *p;
+        snprintf(idx, sizeof(idx), "%d", ost->index);
+
+        e = av_dict_get(o->streamid, idx, NULL, 0);
+        if (e) {
+            st->id = strtol(e->value, &p, 0);
+            if (!e->value[0] || *p) {
+                av_log(ost, AV_LOG_FATAL, "Invalid stream id: %s\n", e->value);
+                return AVERROR(EINVAL);
+            }
+        }
+    }
+
     ost->par_in = avcodec_parameters_alloc();
     if (!ost->par_in)
         return AVERROR(ENOMEM);
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 25a1083366..7002986369 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -128,8 +128,9 @@ static void uninit_options(OptionsContext *o)
 #if FFMPEG_OPT_MAP_CHANNEL
     av_freep(&o->audio_channel_maps);
 #endif
-    av_freep(&o->streamid_map);
     av_freep(&o->attachments);
+
+    av_dict_free(&o->streamid);
 }
 
 static void init_options(OptionsContext *o)
@@ -727,7 +728,6 @@ char *file_read(const char *filename)
 static int opt_streamid(void *optctx, const char *opt, const char *arg)
 {
     OptionsContext *o = optctx;
-    int idx;
     char *p;
     char idx_str[16];
 
@@ -737,13 +737,11 @@ static int opt_streamid(void *optctx, const char *opt, const char *arg)
         av_log(NULL, AV_LOG_FATAL,
                "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
                arg, opt);
-        exit_program(1);
+        return AVERROR(EINVAL);
     }
     *p++ = '\0';
-    idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
-    o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
-    o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
-    return 0;
+
+    return av_dict_set(&o->streamid, idx_str, p, 0);
 }
 
 static int init_complex_filters(void)



More information about the ffmpeg-cvslog mailing list