mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-12-13 10:30:05 +01:00
avconv: pass libavresample options to AVFilterGraph
This commit is contained in:
1
avconv.c
1
avconv.c
@@ -2303,6 +2303,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->resample_opts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
avconv.h
1
avconv.h
@@ -293,6 +293,7 @@ typedef struct OutputStream {
|
|||||||
|
|
||||||
int64_t sws_flags;
|
int64_t sws_flags;
|
||||||
AVDictionary *opts;
|
AVDictionary *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 stream_copy;
|
int stream_copy;
|
||||||
const char *attachment_filename;
|
const char *attachment_filename;
|
||||||
|
|||||||
@@ -23,8 +23,12 @@
|
|||||||
#include "libavfilter/avfilter.h"
|
#include "libavfilter/avfilter.h"
|
||||||
#include "libavfilter/avfiltergraph.h"
|
#include "libavfilter/avfiltergraph.h"
|
||||||
|
|
||||||
|
#include "libavresample/avresample.h"
|
||||||
|
|
||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
|
#include "libavutil/avstring.h"
|
||||||
#include "libavutil/channel_layout.h"
|
#include "libavutil/channel_layout.h"
|
||||||
|
#include "libavutil/opt.h"
|
||||||
#include "libavutil/pixdesc.h"
|
#include "libavutil/pixdesc.h"
|
||||||
#include "libavutil/pixfmt.h"
|
#include "libavutil/pixfmt.h"
|
||||||
#include "libavutil/samplefmt.h"
|
#include "libavutil/samplefmt.h"
|
||||||
@@ -501,9 +505,21 @@ int configure_filtergraph(FilterGraph *fg)
|
|||||||
|
|
||||||
if (simple) {
|
if (simple) {
|
||||||
OutputStream *ost = fg->outputs[0]->ost;
|
OutputStream *ost = fg->outputs[0]->ost;
|
||||||
char args[255];
|
char args[512];
|
||||||
|
AVDictionaryEntry *e = NULL;
|
||||||
|
const AVClass *rc = avresample_get_class();
|
||||||
|
|
||||||
snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
|
snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
|
||||||
fg->graph->scale_sws_opts = av_strdup(args);
|
fg->graph->scale_sws_opts = av_strdup(args);
|
||||||
|
|
||||||
|
args[0] = '\0';
|
||||||
|
while ((e = av_dict_get(fg->outputs[0]->ost->resample_opts, "", e,
|
||||||
|
AV_DICT_IGNORE_SUFFIX))) {
|
||||||
|
av_strlcatf(args, sizeof(args), "%s=%s:", e->key, e->value);
|
||||||
|
}
|
||||||
|
if (strlen(args))
|
||||||
|
args[strlen(args) - 1] = '\0';
|
||||||
|
fg->graph->resample_lavr_opts = av_strdup(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
|
if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
|
||||||
|
|||||||
@@ -844,6 +844,8 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
|||||||
|
|
||||||
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_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
|
||||||
|
|
||||||
ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
|
ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
|
||||||
|
|
||||||
return ost;
|
return ost;
|
||||||
|
|||||||
12
cmdutils.c
12
cmdutils.c
@@ -54,7 +54,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct SwsContext *sws_opts;
|
struct SwsContext *sws_opts;
|
||||||
AVDictionary *format_opts, *codec_opts;
|
AVDictionary *format_opts, *codec_opts, *resample_opts;
|
||||||
|
|
||||||
static const int this_year = 2013;
|
static const int this_year = 2013;
|
||||||
|
|
||||||
@@ -74,6 +74,7 @@ void uninit_opts(void)
|
|||||||
#endif
|
#endif
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_callback_help(void *ptr, int level, const char *fmt, va_list vl)
|
void log_callback_help(void *ptr, int level, const char *fmt, va_list vl)
|
||||||
@@ -405,6 +406,7 @@ int opt_default(void *optctx, const char *opt, const char *arg)
|
|||||||
char opt_stripped[128];
|
char opt_stripped[128];
|
||||||
const char *p;
|
const char *p;
|
||||||
const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class();
|
const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class();
|
||||||
|
const AVClass *rc = avresample_get_class();
|
||||||
#if CONFIG_SWSCALE
|
#if CONFIG_SWSCALE
|
||||||
const AVClass *sc = sws_get_class();
|
const AVClass *sc = sws_get_class();
|
||||||
#endif
|
#endif
|
||||||
@@ -421,6 +423,9 @@ int opt_default(void *optctx, const char *opt, const char *arg)
|
|||||||
else if ((o = av_opt_find(&fc, opt, NULL, 0,
|
else if ((o = av_opt_find(&fc, opt, NULL, 0,
|
||||||
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)))
|
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)))
|
||||||
av_dict_set(&format_opts, opt, arg, FLAGS);
|
av_dict_set(&format_opts, opt, arg, FLAGS);
|
||||||
|
else if ((o = av_opt_find(&rc, opt, NULL, 0,
|
||||||
|
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)))
|
||||||
|
av_dict_set(&resample_opts, opt, arg, FLAGS);
|
||||||
#if CONFIG_SWSCALE
|
#if CONFIG_SWSCALE
|
||||||
else if ((o = av_opt_find(&sc, opt, NULL, 0,
|
else if ((o = av_opt_find(&sc, opt, NULL, 0,
|
||||||
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
|
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
|
||||||
@@ -480,9 +485,11 @@ static void finish_group(OptionParseContext *octx, int group_idx,
|
|||||||
#endif
|
#endif
|
||||||
g->codec_opts = codec_opts;
|
g->codec_opts = codec_opts;
|
||||||
g->format_opts = format_opts;
|
g->format_opts = format_opts;
|
||||||
|
g->resample_opts = resample_opts;
|
||||||
|
|
||||||
codec_opts = NULL;
|
codec_opts = NULL;
|
||||||
format_opts = NULL;
|
format_opts = NULL;
|
||||||
|
resample_opts = NULL;
|
||||||
#if CONFIG_SWSCALE
|
#if CONFIG_SWSCALE
|
||||||
sws_opts = NULL;
|
sws_opts = NULL;
|
||||||
#endif
|
#endif
|
||||||
@@ -539,6 +546,7 @@ void uninit_parse_context(OptionParseContext *octx)
|
|||||||
av_freep(&l->groups[j].opts);
|
av_freep(&l->groups[j].opts);
|
||||||
av_dict_free(&l->groups[j].codec_opts);
|
av_dict_free(&l->groups[j].codec_opts);
|
||||||
av_dict_free(&l->groups[j].format_opts);
|
av_dict_free(&l->groups[j].format_opts);
|
||||||
|
av_dict_free(&l->groups[j].resample_opts);
|
||||||
#if CONFIG_SWSCALE
|
#if CONFIG_SWSCALE
|
||||||
sws_freeContext(l->groups[j].sws_opts);
|
sws_freeContext(l->groups[j].sws_opts);
|
||||||
#endif
|
#endif
|
||||||
@@ -645,7 +653,7 @@ do { \
|
|||||||
return AVERROR_OPTION_NOT_FOUND;
|
return AVERROR_OPTION_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (octx->cur_group.nb_opts || codec_opts || format_opts)
|
if (octx->cur_group.nb_opts || codec_opts || format_opts || resample_opts)
|
||||||
av_log(NULL, AV_LOG_WARNING, "Trailing options were found on the "
|
av_log(NULL, AV_LOG_WARNING, "Trailing options were found on the "
|
||||||
"commandline.\n");
|
"commandline.\n");
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ extern const int program_birth_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 AVDictionary *format_opts, *codec_opts;
|
extern AVDictionary *format_opts, *codec_opts, *resample_opts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the cmdutils option system, in particular
|
* Initialize the cmdutils option system, in particular
|
||||||
@@ -235,6 +235,7 @@ typedef struct OptionGroup {
|
|||||||
|
|
||||||
AVDictionary *codec_opts;
|
AVDictionary *codec_opts;
|
||||||
AVDictionary *format_opts;
|
AVDictionary *format_opts;
|
||||||
|
AVDictionary *resample_opts;
|
||||||
struct SwsContext *sws_opts;
|
struct SwsContext *sws_opts;
|
||||||
} OptionGroup;
|
} OptionGroup;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user