diff options
Diffstat (limited to 'player/lavfi.c')
-rw-r--r-- | player/lavfi.c | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/player/lavfi.c b/player/lavfi.c index ee0ca281e4..e5bfe7fdf5 100644 --- a/player/lavfi.c +++ b/player/lavfi.c @@ -37,7 +37,8 @@ #include "common/av_common.h" #include "common/msg.h" -#include "audio/audio.h" +#include "audio/format.h" +#include "audio/aframe.h" #include "video/mp_image.h" #include "audio/fmt-conversion.h" #include "video/fmt-conversion.h" @@ -96,7 +97,7 @@ struct lavfi_pad { // 1-frame queue (used for both input and output) struct mp_image *pending_v; - struct mp_audio *pending_a; + struct mp_aframe *pending_a; // -- dir==LAVFI_IN @@ -107,7 +108,7 @@ struct lavfi_pad { // used to check for format changes manually struct mp_image *in_fmt_v; - struct mp_audio in_fmt_a; + struct mp_aframe *in_fmt_a; // -- dir==LAVFI_OUT @@ -199,7 +200,7 @@ static void free_graph(struct lavfi *c) pad->filter_pad = -1; pad->buffer = NULL; TA_FREEP(&pad->in_fmt_v); - pad->in_fmt_a = (struct mp_audio){0}; + TA_FREEP(&pad->in_fmt_a); pad->buffer_is_eof = false; pad->input_needed = false; pad->input_waiting = false; @@ -312,9 +313,14 @@ static void send_global_eof(struct lavfi *c) // libavfilter allows changing some parameters on the fly, but not // others. -static bool is_aformat_ok(struct mp_audio *a, struct mp_audio *b) +static bool is_aformat_ok(struct mp_aframe *a, struct mp_aframe *b) { - return mp_audio_config_equals(a, b); + struct mp_chmap ca = {0}, cb = {0}; + mp_aframe_get_chmap(a, &ca); + mp_aframe_get_chmap(b, &cb); + return mp_chmap_equals(&ca, &cb) && + mp_aframe_get_rate(a) == mp_aframe_get_rate(b) && + mp_aframe_get_format(a) == mp_aframe_get_format(b); } static bool is_vformat_ok(struct mp_image *a, struct mp_image *b) { @@ -331,9 +337,9 @@ static void check_format_changes(struct lavfi *c) if (!pad->buffer || pad->dir != LAVFI_IN) continue; - if (pad->type == STREAM_AUDIO && pad->pending_a && pad->in_fmt_a.format) { + if (pad->type == STREAM_AUDIO && pad->pending_a && pad->in_fmt_a) { c->draining_new_format |= !is_aformat_ok(pad->pending_a, - &pad->in_fmt_a); + pad->in_fmt_a); } if (pad->type == STREAM_VIDEO && pad->pending_v && pad->in_fmt_v) { c->draining_new_format |= !is_vformat_ok(pad->pending_v, @@ -389,7 +395,10 @@ static bool init_pads(struct lavfi *c) if (pad->pending_a) { assert(pad->type == STREAM_AUDIO); - mp_audio_copy_config(&pad->in_fmt_a, pad->pending_a); + pad->in_fmt_a = mp_aframe_new_ref(pad->pending_a); + if (!pad->in_fmt_a) + goto error; + mp_aframe_unref_data(pad->in_fmt_a); } else if (pad->pending_v) { assert(pad->type == STREAM_VIDEO); pad->in_fmt_v = mp_image_new_ref(pad->pending_v); @@ -400,9 +409,11 @@ static bool init_pads(struct lavfi *c) // libavfilter makes this painful. Init it with a dummy config, // just so we can tell it the stream is EOF. if (pad->type == STREAM_AUDIO) { - mp_audio_set_format(&pad->in_fmt_a, AF_FORMAT_FLOAT); - mp_audio_set_num_channels(&pad->in_fmt_a, 2); - pad->in_fmt_a.rate = 48000; + pad->in_fmt_a = mp_aframe_create(); + mp_aframe_set_format(pad->in_fmt_a, AF_FORMAT_FLOAT); + mp_aframe_set_chmap(pad->in_fmt_a, + &(struct mp_chmap)MP_CHMAP_INIT_STEREO); + mp_aframe_set_rate(pad->in_fmt_a, 48000); } else if (pad->type == STREAM_VIDEO) { pad->in_fmt_v = talloc_zero(NULL, struct mp_image); mp_image_setfmt(pad->in_fmt_v, IMGFMT_420P); @@ -421,11 +432,13 @@ static bool init_pads(struct lavfi *c) char *filter_name = NULL; if (pad->type == STREAM_AUDIO) { params->time_base = pad->timebase = - (AVRational){1, pad->in_fmt_a.rate}; - params->format = af_to_avformat(pad->in_fmt_a.format); - params->sample_rate = pad->in_fmt_a.rate; - params->channel_layout = - mp_chmap_to_lavc(&pad->in_fmt_a.channels); + (AVRational){1, mp_aframe_get_rate(pad->in_fmt_a)}; + params->format = + af_to_avformat(mp_aframe_get_format(pad->in_fmt_a)); + params->sample_rate = mp_aframe_get_rate(pad->in_fmt_a); + struct mp_chmap chmap = {0}; + mp_aframe_get_chmap(pad->in_fmt_a, &chmap); + params->channel_layout = mp_chmap_to_lavc(&chmap); filter_name = "abuffer"; } else if (pad->type == STREAM_VIDEO) { params->time_base = pad->timebase = AV_TIME_BASE_Q; @@ -565,8 +578,8 @@ static void feed_input_pads(struct lavfi *c) frame = mp_image_to_av_frame_and_unref(pad->pending_v); pad->pending_v = NULL; } else if (pad->pending_a) { - pts = pad->pending_a->pts; - frame = mp_audio_to_avframe_and_unref(pad->pending_a); + pts = mp_aframe_get_pts(pad->pending_a); + frame = mp_aframe_to_avframe_and_unref(pad->pending_a); pad->pending_a = NULL; } else { if (!pad->input_eof) { @@ -621,9 +634,9 @@ static void read_output_pads(struct lavfi *c) pad->output_needed = false; double pts = mp_pts_from_av(c->tmp_frame->pts, &pad->timebase); if (pad->type == STREAM_AUDIO) { - pad->pending_a = mp_audio_from_avframe(c->tmp_frame); + pad->pending_a = mp_aframe_from_avframe(c->tmp_frame); if (pad->pending_a) - pad->pending_a->pts = pts; + mp_aframe_set_pts(pad->pending_a, pts); } else if (pad->type == STREAM_VIDEO) { pad->pending_v = mp_image_from_av_frame(c->tmp_frame); if (pad->pending_v) @@ -733,7 +746,7 @@ static int lavfi_request_frame(struct lavfi_pad *pad) // DATA_STARVE: needs more input data // DATA_WAIT: needs more input data, and all inputs in LAVFI_WAIT state // DATA_EOF: no more data -int lavfi_request_frame_a(struct lavfi_pad *pad, struct mp_audio **out_aframe) +int lavfi_request_frame_a(struct lavfi_pad *pad, struct mp_aframe **out_aframe) { int r = lavfi_request_frame(pad); *out_aframe = pad->pending_a; @@ -787,7 +800,7 @@ static void lavfi_sent_frame(struct lavfi_pad *pad) } // See lavfi_send_status() for remarks. -void lavfi_send_frame_a(struct lavfi_pad *pad, struct mp_audio *aframe) +void lavfi_send_frame_a(struct lavfi_pad *pad, struct mp_aframe *aframe) { assert(pad->type == STREAM_AUDIO); assert(!pad->pending_a); |