summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-07-11 19:14:30 +0200
committerwm4 <wm4@nowhere>2013-07-11 19:14:30 +0200
commit7a4f9cc4d2509a0d9afa68ea53ed97b72525d001 (patch)
tree0f3436db38630add1e368fc1ad94397420cb5507 /audio
parent995fe05254449e71f3cb93f58e03e119685bdced (diff)
downloadmpv-7a4f9cc4d2509a0d9afa68ea53ed97b72525d001.tar.bz2
mpv-7a4f9cc4d2509a0d9afa68ea53ed97b72525d001.tar.xz
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.
Diffstat (limited to 'audio')
-rw-r--r--audio/decode/ad_spdif.c4
1 files changed, 3 insertions, 1 deletions
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;
}