Merge commit '9f1223562e134bac6345a465870b9d56ff7d60cf'
* commit '9f1223562e134bac6345a465870b9d56ff7d60cf': lavfi: connect libavresample options to af_resample via AVFilterGraph Conflicts: doc/APIchanges libavfilter/avfiltergraph.c libavfilter/avfiltergraph.h libavfilter/version.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
71cf094e1b
@ -138,6 +138,10 @@ API changes, most recent first:
|
|||||||
2012-03-26 - a67d9cf - lavfi 2.66.100
|
2012-03-26 - a67d9cf - lavfi 2.66.100
|
||||||
Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions.
|
Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions.
|
||||||
|
|
||||||
|
2013-xx-xx - xxxxxxx - lavfi 3.4.0 - avfiltergraph.h
|
||||||
|
Add resample_lavr_opts to AVFilterGraph for setting libavresample options
|
||||||
|
for auto-inserted resample filters.
|
||||||
|
|
||||||
2013-xx-xx - xxxxxxx - lavu 52.7.0 - dict.h
|
2013-xx-xx - xxxxxxx - lavu 52.7.0 - dict.h
|
||||||
Add av_dict_parse_string() to set multiple key/value pairs at once from a
|
Add av_dict_parse_string() to set multiple key/value pairs at once from a
|
||||||
string.
|
string.
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
#include "libavutil/common.h"
|
#include "libavutil/common.h"
|
||||||
|
#include "libavutil/dict.h"
|
||||||
#include "libavutil/mathematics.h"
|
#include "libavutil/mathematics.h"
|
||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
|
|
||||||
@ -37,6 +38,7 @@
|
|||||||
|
|
||||||
typedef struct ResampleContext {
|
typedef struct ResampleContext {
|
||||||
AVAudioResampleContext *avr;
|
AVAudioResampleContext *avr;
|
||||||
|
AVDictionary *options;
|
||||||
|
|
||||||
int64_t next_pts;
|
int64_t next_pts;
|
||||||
|
|
||||||
@ -44,6 +46,29 @@ typedef struct ResampleContext {
|
|||||||
int got_output;
|
int got_output;
|
||||||
} ResampleContext;
|
} ResampleContext;
|
||||||
|
|
||||||
|
static av_cold int init(AVFilterContext *ctx, const char *args)
|
||||||
|
{
|
||||||
|
ResampleContext *s = ctx->priv;
|
||||||
|
|
||||||
|
if (args) {
|
||||||
|
int ret = av_dict_parse_string(&s->options, args, "=", ":", 0);
|
||||||
|
if (ret < 0) {
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "error setting option string: %s\n", args);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* do not allow the user to override basic format options */
|
||||||
|
av_dict_set(&s->options, "in_channel_layout", NULL, 0);
|
||||||
|
av_dict_set(&s->options, "out_channel_layout", NULL, 0);
|
||||||
|
av_dict_set(&s->options, "in_sample_fmt", NULL, 0);
|
||||||
|
av_dict_set(&s->options, "out_sample_fmt", NULL, 0);
|
||||||
|
av_dict_set(&s->options, "in_sample_rate", NULL, 0);
|
||||||
|
av_dict_set(&s->options, "out_sample_rate", NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static av_cold void uninit(AVFilterContext *ctx)
|
static av_cold void uninit(AVFilterContext *ctx)
|
||||||
{
|
{
|
||||||
ResampleContext *s = ctx->priv;
|
ResampleContext *s = ctx->priv;
|
||||||
@ -52,6 +77,7 @@ static av_cold void uninit(AVFilterContext *ctx)
|
|||||||
avresample_close(s->avr);
|
avresample_close(s->avr);
|
||||||
avresample_free(&s->avr);
|
avresample_free(&s->avr);
|
||||||
}
|
}
|
||||||
|
av_dict_free(&s->options);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int query_formats(AVFilterContext *ctx)
|
static int query_formats(AVFilterContext *ctx)
|
||||||
@ -103,6 +129,14 @@ static int config_output(AVFilterLink *outlink)
|
|||||||
if (!(s->avr = avresample_alloc_context()))
|
if (!(s->avr = avresample_alloc_context()))
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
|
if (s->options) {
|
||||||
|
AVDictionaryEntry *e = NULL;
|
||||||
|
while ((e = av_dict_get(s->options, "", e, AV_DICT_IGNORE_SUFFIX)))
|
||||||
|
av_log(ctx, AV_LOG_VERBOSE, "lavr option: %s=%s\n", e->key, e->value);
|
||||||
|
|
||||||
|
av_opt_set_dict(s->avr, &s->options);
|
||||||
|
}
|
||||||
|
|
||||||
av_opt_set_int(s->avr, "in_channel_layout", inlink ->channel_layout, 0);
|
av_opt_set_int(s->avr, "in_channel_layout", inlink ->channel_layout, 0);
|
||||||
av_opt_set_int(s->avr, "out_channel_layout", outlink->channel_layout, 0);
|
av_opt_set_int(s->avr, "out_channel_layout", outlink->channel_layout, 0);
|
||||||
av_opt_set_int(s->avr, "in_sample_fmt", inlink ->format, 0);
|
av_opt_set_int(s->avr, "in_sample_fmt", inlink ->format, 0);
|
||||||
@ -264,6 +298,7 @@ AVFilter avfilter_af_resample = {
|
|||||||
.description = NULL_IF_CONFIG_SMALL("Audio resampling and conversion."),
|
.description = NULL_IF_CONFIG_SMALL("Audio resampling and conversion."),
|
||||||
.priv_size = sizeof(ResampleContext),
|
.priv_size = sizeof(ResampleContext),
|
||||||
|
|
||||||
|
.init = init,
|
||||||
.uninit = uninit,
|
.uninit = uninit,
|
||||||
.query_formats = query_formats,
|
.query_formats = query_formats,
|
||||||
|
|
||||||
|
@ -68,6 +68,7 @@ void avfilter_graph_free(AVFilterGraph **graph)
|
|||||||
av_freep(&(*graph)->sink_links);
|
av_freep(&(*graph)->sink_links);
|
||||||
av_freep(&(*graph)->scale_sws_opts);
|
av_freep(&(*graph)->scale_sws_opts);
|
||||||
av_freep(&(*graph)->aresample_swr_opts);
|
av_freep(&(*graph)->aresample_swr_opts);
|
||||||
|
av_freep(&(*graph)->resample_lavr_opts);
|
||||||
av_freep(&(*graph)->filters);
|
av_freep(&(*graph)->filters);
|
||||||
av_freep(graph);
|
av_freep(graph);
|
||||||
}
|
}
|
||||||
@ -323,8 +324,13 @@ static int query_formats(AVFilterGraph *graph, AVClass *log_ctx)
|
|||||||
|
|
||||||
snprintf(inst_name, sizeof(inst_name), "auto-inserted resampler %d",
|
snprintf(inst_name, sizeof(inst_name), "auto-inserted resampler %d",
|
||||||
resampler_count++);
|
resampler_count++);
|
||||||
|
scale_args[0] = '\0';
|
||||||
|
if (graph->aresample_swr_opts)
|
||||||
|
snprintf(scale_args, sizeof(scale_args), "%s",
|
||||||
|
graph->aresample_swr_opts);
|
||||||
if ((ret = avfilter_graph_create_filter(&convert, filter,
|
if ((ret = avfilter_graph_create_filter(&convert, filter,
|
||||||
inst_name, graph->aresample_swr_opts, NULL, graph)) < 0)
|
inst_name, graph->aresample_swr_opts,
|
||||||
|
NULL, graph)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -45,6 +45,7 @@ typedef struct AVFilterGraph {
|
|||||||
int sink_links_count;
|
int sink_links_count;
|
||||||
|
|
||||||
unsigned disable_auto_convert;
|
unsigned disable_auto_convert;
|
||||||
|
char *resample_lavr_opts; ///< libavresample options to use for the auto-inserted resample filters
|
||||||
} AVFilterGraph;
|
} AVFilterGraph;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -29,8 +29,8 @@
|
|||||||
#include "libavutil/avutil.h"
|
#include "libavutil/avutil.h"
|
||||||
|
|
||||||
#define LIBAVFILTER_VERSION_MAJOR 3
|
#define LIBAVFILTER_VERSION_MAJOR 3
|
||||||
#define LIBAVFILTER_VERSION_MINOR 39
|
#define LIBAVFILTER_VERSION_MINOR 40
|
||||||
#define LIBAVFILTER_VERSION_MICRO 101
|
#define LIBAVFILTER_VERSION_MICRO 100
|
||||||
|
|
||||||
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
||||||
LIBAVFILTER_VERSION_MINOR, \
|
LIBAVFILTER_VERSION_MINOR, \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user