diff options
Diffstat (limited to 'audio/decode/dec_audio.c')
-rw-r--r-- | audio/decode/dec_audio.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/audio/decode/dec_audio.c b/audio/decode/dec_audio.c index f774ed1abd..f97636e475 100644 --- a/audio/decode/dec_audio.c +++ b/audio/decode/dec_audio.c @@ -161,13 +161,23 @@ void audio_uninit(struct dec_audio *d_audio) uninit_decoder(d_audio); af_destroy(d_audio->afilter); talloc_free(d_audio->waiting); + talloc_free(d_audio->packet); talloc_free(d_audio); } static int decode_new_frame(struct dec_audio *da) { while (!da->waiting) { - int ret = da->ad_driver->decode_packet(da, &da->waiting); + if (!da->packet) { + if (demux_read_packet_async(da->header, &da->packet) == 0) + return AD_WAIT; + } + + int ret = da->ad_driver->decode_packet(da, da->packet, &da->waiting); + if (ret < 0 || (da->packet && da->packet->len == 0)) { + talloc_free(da->packet); + da->packet = NULL; + } if (ret < 0) return ret; @@ -285,8 +295,8 @@ void audio_reset_decoding(struct dec_audio *d_audio) d_audio->pts = MP_NOPTS_VALUE; d_audio->pts_offset = 0; d_audio->pts_reset = false; - if (d_audio->waiting) { - talloc_free(d_audio->waiting); - d_audio->waiting = NULL; - } + talloc_free(d_audio->waiting); + d_audio->waiting = NULL; + talloc_free(d_audio->packet); + d_audio->packet = NULL; } |