summaryrefslogtreecommitdiffstats
path: root/audio/decode/dec_audio.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-01-11 11:58:26 +0100
committerwm4 <wm4@nowhere>2017-01-11 11:58:32 +0100
commitcbd8abcbff83624c20460cc05bf33d72c5148d67 (patch)
tree03df0420a2e1722d6eb4d85738d8210ba3931cc8 /audio/decode/dec_audio.c
parentf8baae585451bb072e8ef606bafd7c0d5e369bf7 (diff)
downloadmpv-cbd8abcbff83624c20460cc05bf33d72c5148d67.tar.bz2
mpv-cbd8abcbff83624c20460cc05bf33d72c5148d67.tar.xz
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.)
Diffstat (limited to 'audio/decode/dec_audio.c')
-rw-r--r--audio/decode/dec_audio.c19
1 files changed, 7 insertions, 12 deletions
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);