mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
ffmpeg: use a AVDictionary instead of the context to move swr parameters around
This avoids per parameter changes in ffmpeg at the cost of making access somewhat more annoying. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
f3abdf4392
commit
ad899522ff
21
cmdutils.c
21
cmdutils.c
@ -62,7 +62,7 @@
|
|||||||
static int init_report(const char *env);
|
static int init_report(const char *env);
|
||||||
|
|
||||||
struct SwsContext *sws_opts;
|
struct SwsContext *sws_opts;
|
||||||
SwrContext *swr_opts;
|
AVDictionary *swr_opts;
|
||||||
AVDictionary *format_opts, *codec_opts, *resample_opts;
|
AVDictionary *format_opts, *codec_opts, *resample_opts;
|
||||||
|
|
||||||
const int this_year = 2013;
|
const int this_year = 2013;
|
||||||
@ -75,9 +75,6 @@ void init_opts(void)
|
|||||||
if(CONFIG_SWSCALE)
|
if(CONFIG_SWSCALE)
|
||||||
sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC,
|
sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC,
|
||||||
NULL, NULL, NULL);
|
NULL, NULL, NULL);
|
||||||
|
|
||||||
if(CONFIG_SWRESAMPLE)
|
|
||||||
swr_opts = swr_alloc();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void uninit_opts(void)
|
void uninit_opts(void)
|
||||||
@ -87,9 +84,7 @@ void uninit_opts(void)
|
|||||||
sws_opts = NULL;
|
sws_opts = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(CONFIG_SWRESAMPLE)
|
av_dict_free(&swr_opts);
|
||||||
swr_free(&swr_opts);
|
|
||||||
|
|
||||||
av_dict_free(&format_opts);
|
av_dict_free(&format_opts);
|
||||||
av_dict_free(&codec_opts);
|
av_dict_free(&codec_opts);
|
||||||
av_dict_free(&resample_opts);
|
av_dict_free(&resample_opts);
|
||||||
@ -518,13 +513,16 @@ int opt_default(void *optctx, const char *opt, const char *arg)
|
|||||||
#endif
|
#endif
|
||||||
#if CONFIG_SWRESAMPLE
|
#if CONFIG_SWRESAMPLE
|
||||||
swr_class = swr_get_class();
|
swr_class = swr_get_class();
|
||||||
if (!consumed && av_opt_find(&swr_class, opt, NULL, 0,
|
if (!consumed && (o=av_opt_find(&swr_class, opt, NULL, 0,
|
||||||
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)) {
|
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
|
||||||
int ret = av_opt_set(swr_opts, opt, arg, 0);
|
struct SwrContext *swr = swr_alloc();
|
||||||
|
int ret = av_opt_set(swr, opt, arg, 0);
|
||||||
|
swr_free(&swr);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
|
av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
av_dict_set(&swr_opts, opt, arg, FLAGS);
|
||||||
consumed = 1;
|
consumed = 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -651,8 +649,7 @@ void uninit_parse_context(OptionParseContext *octx)
|
|||||||
#if CONFIG_SWSCALE
|
#if CONFIG_SWSCALE
|
||||||
sws_freeContext(l->groups[j].sws_opts);
|
sws_freeContext(l->groups[j].sws_opts);
|
||||||
#endif
|
#endif
|
||||||
if(CONFIG_SWRESAMPLE)
|
av_dict_free(&l->groups[j].swr_opts);
|
||||||
swr_free(&l->groups[j].swr_opts);
|
|
||||||
}
|
}
|
||||||
av_freep(&l->groups);
|
av_freep(&l->groups);
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ extern const int this_year;
|
|||||||
extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB];
|
extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB];
|
||||||
extern AVFormatContext *avformat_opts;
|
extern AVFormatContext *avformat_opts;
|
||||||
extern struct SwsContext *sws_opts;
|
extern struct SwsContext *sws_opts;
|
||||||
extern struct SwrContext *swr_opts;
|
extern AVDictionary *swr_opts;
|
||||||
extern AVDictionary *format_opts, *codec_opts, *resample_opts;
|
extern AVDictionary *format_opts, *codec_opts, *resample_opts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -255,7 +255,7 @@ typedef struct OptionGroup {
|
|||||||
AVDictionary *format_opts;
|
AVDictionary *format_opts;
|
||||||
AVDictionary *resample_opts;
|
AVDictionary *resample_opts;
|
||||||
struct SwsContext *sws_opts;
|
struct SwsContext *sws_opts;
|
||||||
struct SwrContext *swr_opts;
|
AVDictionary *swr_opts;
|
||||||
} OptionGroup;
|
} OptionGroup;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
1
ffmpeg.c
1
ffmpeg.c
@ -3212,6 +3212,7 @@ static int transcode(void)
|
|||||||
av_freep(&ost->st->codec->subtitle_header);
|
av_freep(&ost->st->codec->subtitle_header);
|
||||||
av_free(ost->forced_kf_pts);
|
av_free(ost->forced_kf_pts);
|
||||||
av_dict_free(&ost->opts);
|
av_dict_free(&ost->opts);
|
||||||
|
av_dict_free(&ost->swr_opts);
|
||||||
av_dict_free(&ost->resample_opts);
|
av_dict_free(&ost->resample_opts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
4
ffmpeg.h
4
ffmpeg.h
@ -346,10 +346,8 @@ typedef struct OutputStream {
|
|||||||
char *avfilter;
|
char *avfilter;
|
||||||
|
|
||||||
int64_t sws_flags;
|
int64_t sws_flags;
|
||||||
int64_t swr_filter_type;
|
|
||||||
int64_t swr_dither_method;
|
|
||||||
double swr_dither_scale;
|
|
||||||
AVDictionary *opts;
|
AVDictionary *opts;
|
||||||
|
AVDictionary *swr_opts;
|
||||||
AVDictionary *resample_opts;
|
AVDictionary *resample_opts;
|
||||||
int finished; /* no more packets should be written for this stream */
|
int finished; /* no more packets should be written for this stream */
|
||||||
int unavailable; /* true if the steram is unavailable (possibly temporarily) */
|
int unavailable; /* true if the steram is unavailable (possibly temporarily) */
|
||||||
|
@ -739,12 +739,10 @@ int configure_filtergraph(FilterGraph *fg)
|
|||||||
fg->graph->scale_sws_opts = av_strdup(args);
|
fg->graph->scale_sws_opts = av_strdup(args);
|
||||||
|
|
||||||
args[0] = 0;
|
args[0] = 0;
|
||||||
if (ost->swr_filter_type != SWR_FILTER_TYPE_KAISER)
|
while ((e = av_dict_get(ost->swr_opts, "", e,
|
||||||
av_strlcatf(args, sizeof(args), "filter_type=%d:", (int)ost->swr_filter_type);
|
AV_DICT_IGNORE_SUFFIX))) {
|
||||||
if (ost->swr_dither_method)
|
av_strlcatf(args, sizeof(args), "%s=%s:", e->key, e->value);
|
||||||
av_strlcatf(args, sizeof(args), "dither_method=%d:", (int)ost->swr_dither_method);
|
}
|
||||||
if (ost->swr_dither_scale != 1.0)
|
|
||||||
av_strlcatf(args, sizeof(args), "dither_scale=%f:", ost->swr_dither_scale);
|
|
||||||
if (strlen(args))
|
if (strlen(args))
|
||||||
args[strlen(args)-1] = 0;
|
args[strlen(args)-1] = 0;
|
||||||
av_opt_set(fg->graph, "aresample_swr_opts", args, 0);
|
av_opt_set(fg->graph, "aresample_swr_opts", args, 0);
|
||||||
|
@ -1002,11 +1002,10 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
|||||||
st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||||
|
|
||||||
av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
|
av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
|
||||||
av_opt_get_int (o->g->swr_opts, "filter_type" , 0, &ost->swr_filter_type);
|
|
||||||
av_opt_get_int (o->g->swr_opts, "dither_method", 0, &ost->swr_dither_method);
|
av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
|
||||||
av_opt_get_double(o->g->swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
|
|
||||||
if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
|
if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
|
||||||
ost->swr_dither_scale = ost->swr_dither_scale*256;
|
av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
|
||||||
|
|
||||||
av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
|
av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user