From 7a4f9cc4d2509a0d9afa68ea53ed97b72525d001 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 11 Jul 2013 19:14:30 +0200 Subject: ad_spdif: better PTS sync pts_bytes can't just be changed at the end. It must be offset to the pts value, which is reset with each packet read from the demuxer. Make sure the pts_byte field is always reset after receiving a new PTS, i.e. increment it after actually writing to the output buffer. Flush the AVFormatContext's write buffer, because otherwise the audio PTS will jump around too much: the calculation doesn't use the exact output buffer size if there's still data in the avio buffer. --- audio/decode/ad_spdif.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'audio') diff --git a/audio/decode/ad_spdif.c b/audio/decode/ad_spdif.c index f4fc430208..d0fa43aa25 100644 --- a/audio/decode/ad_spdif.c +++ b/audio/decode/ad_spdif.c @@ -220,12 +220,14 @@ static int decode_audio(sh_audio_t *sh, unsigned char *buf, sh->pts = mpkt->pts; sh->pts_bytes = 0; } + int out_len = spdif_ctx->out_buffer_len; int ret = lavf_ctx->oformat->write_packet(lavf_ctx, &pkt); + avio_flush(lavf_ctx->pb); + sh->pts_bytes += spdif_ctx->out_buffer_len - out_len; talloc_free(mpkt); if (ret < 0) break; } - sh->pts_bytes += spdif_ctx->out_buffer_len; return spdif_ctx->out_buffer_len; } -- cgit v1.2.3