diff options
Diffstat (limited to 'audio/decode/dec_audio.c')
-rw-r--r-- | audio/decode/dec_audio.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/audio/decode/dec_audio.c b/audio/decode/dec_audio.c index 9f28302bd5..5a2735ef20 100644 --- a/audio/decode/dec_audio.c +++ b/audio/decode/dec_audio.c @@ -27,6 +27,7 @@ #include "common/codecs.h" #include "common/msg.h" +#include "common/recorder.h" #include "misc/bstr.h" #include "stream/stream.h" @@ -201,7 +202,7 @@ static void fix_audio_pts(struct dec_audio *da) void audio_work(struct dec_audio *da) { - if (da->current_frame) + if (da->current_frame || !da->ad_driver) return; if (!da->packet && !da->new_segment && @@ -217,30 +218,28 @@ void audio_work(struct dec_audio *da) da->packet = NULL; } - bool had_input_packet = !!da->packet; - bool had_packet = da->packet || da->new_segment; + if (da->ad_driver->send_packet(da, da->packet)) { + if (da->recorder_sink) + mp_recorder_feed_packet(da->recorder_sink, da->packet); - int ret = da->ad_driver->decode_packet(da, da->packet, &da->current_frame); - if (ret < 0 || (da->packet && da->packet->len == 0)) { talloc_free(da->packet); da->packet = NULL; } + bool progress = da->ad_driver->receive_frame(da, &da->current_frame); + if (da->current_frame && !mp_audio_config_valid(da->current_frame)) { talloc_free(da->current_frame); da->current_frame = NULL; } - da->current_state = DATA_OK; - if (!da->current_frame) { + da->current_state = da->current_frame ? DATA_OK : DATA_AGAIN; + if (!progress) da->current_state = DATA_EOF; - if (had_packet) - da->current_state = DATA_AGAIN; - } fix_audio_pts(da); - bool segment_end = !da->current_frame && !had_input_packet; + bool segment_end = da->current_state == DATA_EOF; if (da->current_frame) { mp_audio_clip_timestamps(da->current_frame, da->start, da->end); |