diff options
Diffstat (limited to 'audio/filter/af_lavfi.c')
-rw-r--r-- | audio/filter/af_lavfi.c | 46 |
1 files changed, 19 insertions, 27 deletions
diff --git a/audio/filter/af_lavfi.c b/audio/filter/af_lavfi.c index af521abd9c..bc4a687487 100644 --- a/audio/filter/af_lavfi.c +++ b/audio/filter/af_lavfi.c @@ -3,18 +3,18 @@ * * Filter graph creation code taken from FFmpeg ffplay.c (LGPL 2.1 or later) * - * mpv is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * mpv is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. * * mpv is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with mpv. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU Lesser General Public + * License along with mpv. If not, see <http://www.gnu.org/licenses/>. */ #include <stdlib.h> @@ -50,6 +50,7 @@ #if LIBAVFILTER_VERSION_MICRO < 100 #define graph_parse(graph, filters, inputs, outputs, log_ctx) \ avfilter_graph_parse(graph, filters, inputs, outputs, log_ctx) +#define avfilter_graph_send_command(a, b, c, d, e, f, g) -1 #else #define graph_parse(graph, filters, inputs, outputs, log_ctx) \ avfilter_graph_parse_ptr(graph, filters, &(inputs), &(outputs), log_ctx) @@ -222,6 +223,14 @@ static int control(struct af_instance *af, int cmd, void *arg) return mp_audio_config_equals(in, &orig_in) ? AF_OK : AF_FALSE; } + case AF_CONTROL_COMMAND: { + if (!p->graph) + break; + char **args = arg; + return avfilter_graph_send_command(p->graph, "all", + args[0], args[1], &(char){0}, 0, 0) + >= 0 ? CONTROL_OK : CONTROL_ERROR; + } case AF_CONTROL_GET_METADATA: if (p->metadata) { *(struct mp_tags *)arg = *p->metadata; @@ -257,32 +266,15 @@ static int filter_frame(struct af_instance *af, struct mp_audio *data) if (!p->graph) goto error; - AVFilterLink *l_in = p->in->outputs[0]; - if (data) { - frame = av_frame_alloc(); + frame = mp_audio_to_avframe_and_unref(data); + data = NULL; if (!frame) goto error; - frame->nb_samples = data->samples; - frame->format = l_in->format; - // Timebase is 1/sample_rate frame->pts = p->samples_in; - - frame->channel_layout = l_in->channel_layout; - frame->sample_rate = l_in->sample_rate; -#if LIBAVFILTER_VERSION_MICRO >= 100 - // FFmpeg being a stupid POS - frame->channels = l_in->channels; -#endif - - frame->extended_data = frame->data; - for (int n = 0; n < data->num_planes; n++) - frame->data[n] = data->planes[n]; - frame->linesize[0] = frame->nb_samples * data->sstride; - - p->samples_in += data->samples; + p->samples_in += frame->nb_samples; } if (av_buffersrc_add_frame(p->in, frame) < 0) |