summaryrefslogtreecommitdiffstats
path: root/audio/decode/dec_audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/decode/dec_audio.c')
-rw-r--r--audio/decode/dec_audio.c21
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);