From cbd8abcbff83624c20460cc05bf33d72c5148d67 Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 11 Jan 2017 11:58:26 +0100 Subject: audio: restructure decode loop Same deal as with video. Including the EOF handling. (It would be nice if this code were not duplicated, but right now we're not even close to unifying the audio and video code paths.) --- audio/decode/dec_audio.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) (limited to 'audio/decode/dec_audio.c') diff --git a/audio/decode/dec_audio.c b/audio/decode/dec_audio.c index 9f28302bd5..56f0fe59ad 100644 --- a/audio/decode/dec_audio.c +++ b/audio/decode/dec_audio.c @@ -201,7 +201,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 +217,25 @@ void audio_work(struct dec_audio *da) da->packet = NULL; } - bool had_input_packet = !!da->packet; - bool had_packet = da->packet || da->new_segment; - - int ret = da->ad_driver->decode_packet(da, da->packet, &da->current_frame); - if (ret < 0 || (da->packet && da->packet->len == 0)) { + if (da->ad_driver->send_packet(da, da->packet)) { 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); -- cgit v1.2.3