summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2023-12-17 14:42:38 +0100
committerAnton Khirnov <anton@khirnov.net>2023-12-22 11:39:57 +0100
commit148fac277a173473eed4ea6b03c7575e5696b3fa (patch)
tree95fdf8bd09e01f15b5cfd277be1eff18deaab9e2
parent0ba70a679216a504ed4ea6f50c37283cf099e8ae (diff)
fftools/ffmpeg: change the MATCH_PER_TYPE_OPT macro into a function
There is no reason for it to be a macro anymore, this makes the code using it cleaner and simpler.
-rw-r--r--fftools/cmdutils.c6
-rw-r--r--fftools/cmdutils.h2
-rw-r--r--fftools/ffmpeg.h11
-rw-r--r--fftools/ffmpeg_demux.c16
-rw-r--r--fftools/ffmpeg_mux_init.c4
-rw-r--r--fftools/ffmpeg_opt.c17
6 files changed, 33 insertions, 23 deletions
diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index f53c4b7aec..26e5e6e986 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -239,14 +239,15 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt,
* a global var*/
void *dst = po->flags & OPT_FLAG_OFFSET ?
(uint8_t *)optctx + po->u.off : po->u.dst_ptr;
+ SpecifierOptList *sol = NULL;
double num;
int ret;
if (po->flags & OPT_FLAG_SPEC) {
- SpecifierOptList *sol = dst;
char *p = strchr(opt, ':');
char *str;
+ sol = dst;
ret = GROW_ARRAY(sol->opt, sol->nb_opt);
if (ret < 0)
return ret;
@@ -312,6 +313,9 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt,
if (po->flags & OPT_EXIT)
return AVERROR_EXIT;
+ if (sol)
+ sol->type = po->type;
+
return 0;
}
diff --git a/fftools/cmdutils.h b/fftools/cmdutils.h
index 8ef9a07e9e..db91b788f8 100644
--- a/fftools/cmdutils.h
+++ b/fftools/cmdutils.h
@@ -117,6 +117,8 @@ typedef struct SpecifierOpt {
typedef struct SpecifierOptList {
SpecifierOpt *opt;
int nb_opt;
+
+ enum OptionType type;
} SpecifierOptList;
typedef struct OptionDef {
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 111d3ef8de..3af929ee43 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -803,15 +803,8 @@ void update_benchmark(const char *fmt, ...);
WARN_MULTIPLE_OPT_USAGE(name, type, so, st);\
}
-#define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
-{\
- int i;\
- for (i = 0; i < o->name.nb_opt; i++) {\
- char *spec = o->name.opt[i].specifier;\
- if (!strcmp(spec, mediatype))\
- outvar = o->name.opt[i].u.type;\
- }\
-}
+const char *opt_match_per_type_str(const SpecifierOptList *sol,
+ char mediatype);
extern const char * const opt_name_codec_names[];
extern const char * const opt_name_codec_tags[];
diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c
index 238b37ad93..515271fda0 100644
--- a/fftools/ffmpeg_demux.c
+++ b/fftools/ffmpeg_demux.c
@@ -1333,10 +1333,10 @@ int ifile_open(const OptionsContext *o, const char *filename, Scheduler *sch)
int64_t timestamp;
AVDictionary *unused_opts = NULL;
const AVDictionaryEntry *e = NULL;
- char * video_codec_name = NULL;
- char * audio_codec_name = NULL;
- char *subtitle_codec_name = NULL;
- char * data_codec_name = NULL;
+ const char* video_codec_name = NULL;
+ const char* audio_codec_name = NULL;
+ const char* subtitle_codec_name = NULL;
+ const char* data_codec_name = NULL;
int scan_all_pmts_set = 0;
int64_t start_time = o->start_time;
@@ -1426,10 +1426,10 @@ int ifile_open(const OptionsContext *o, const char *filename, Scheduler *sch)
if (o->frame_pix_fmts.nb_opt)
av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts.opt[o->frame_pix_fmts.nb_opt - 1].u.str, 0);
- MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
- MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
- MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
- MATCH_PER_TYPE_OPT(codec_names, str, data_codec_name, ic, "d");
+ video_codec_name = opt_match_per_type_str(&o->codec_names, 'v');
+ audio_codec_name = opt_match_per_type_str(&o->codec_names, 'a');
+ subtitle_codec_name = opt_match_per_type_str(&o->codec_names, 's');
+ data_codec_name = opt_match_per_type_str(&o->codec_names, 'd');
if (video_codec_name)
ret = err_merge(ret, find_codec(NULL, video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
index 4917b5c4e3..90bdd3a5fb 100644
--- a/fftools/ffmpeg_mux_init.c
+++ b/fftools/ffmpeg_mux_init.c
@@ -1612,10 +1612,10 @@ static int map_auto_audio(Muxer *mux, const OptionsContext *o)
static int map_auto_subtitle(Muxer *mux, const OptionsContext *o)
{
AVFormatContext *oc = mux->fc;
- char *subtitle_codec_name = NULL;
+ const char *subtitle_codec_name = NULL;
/* subtitles: pick first */
- MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
+ subtitle_codec_name = opt_match_per_type_str(&o->codec_names, 's');
if (!avcodec_find_encoder(oc->oformat->subtitle_codec) && !subtitle_codec_name)
return 0;
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 606a08ce30..7c2e58e59b 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -182,6 +182,19 @@ AVDictionary *strip_specifiers(const AVDictionary *dict)
return ret;
}
+const char *opt_match_per_type_str(const SpecifierOptList *sol,
+ char mediatype)
+{
+ av_assert0(!sol->nb_opt || sol->type == OPT_TYPE_STRING);
+
+ for (int i = 0; i < sol->nb_opt; i++) {
+ const char *spec = sol->opt[i].specifier;
+ if (spec[0] == mediatype && !spec[1])
+ return sol->opt[i].u.str;
+ }
+ return NULL;
+}
+
int parse_and_set_vsync(const char *arg, int *vsync_var, int file_idx, int st_idx, int is_global)
{
if (!av_strcasecmp(arg, "cfr")) *vsync_var = VSYNC_CFR;
@@ -1019,9 +1032,7 @@ static int opt_preset(void *optctx, const char *opt, const char *arg)
const char *codec_name = NULL;
int ret = 0;
- tmp_line[0] = *opt;
- tmp_line[1] = 0;
- MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
+ codec_name = opt_match_per_type_str(&o->codec_names, *opt);
if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){