From c11757c5afa53c3556252ec32a18f1fa88aa5d5b Mon Sep 17 00:00:00 2001 From: reimar Date: Sun, 12 Dec 2010 12:36:56 +0000 Subject: ad_speex: improve timestamp handling Improve speex codec pts handling, make audio timestamps work reasonably even with the native demuxer as long as seeking is not done. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@32704 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpcodecs/ad_speex.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libmpcodecs/ad_speex.c b/libmpcodecs/ad_speex.c index a8d0bf4036..f8ddc2f336 100644 --- a/libmpcodecs/ad_speex.c +++ b/libmpcodecs/ad_speex.c @@ -140,6 +140,7 @@ static void uninit(sh_audio_t *sh) { static int decode_audio(sh_audio_t *sh, unsigned char *buf, int minlen, int maxlen) { + double pts; context_t *ctx = sh->context; int len, framelen, framesamples; char *packet; @@ -150,8 +151,14 @@ static int decode_audio(sh_audio_t *sh, unsigned char *buf, mp_msg(MSGT_DECAUDIO, MSGL_V, "maxlen too small in decode_audio\n"); return -1; } - len = ds_get_packet(sh->ds, (unsigned char **)&packet); + len = ds_get_packet_pts(sh->ds, (unsigned char **)&packet, &pts); if (len <= 0) return -1; + if (sh->pts == MP_NOPTS_VALUE) + sh->pts = 0; + if (pts != MP_NOPTS_VALUE) { + sh->pts = pts; + sh->pts_bytes = 0; + } speex_bits_read_from(&ctx->bits, packet, len); i = ctx->hdr->frames_per_packet; do { @@ -162,6 +169,7 @@ static int decode_audio(sh_audio_t *sh, unsigned char *buf, speex_decode_stereo_int((short *)buf, framesamples, &ctx->stereo); buf = &buf[framelen]; } while (--i > 0); + sh->pts_bytes += ctx->hdr->frames_per_packet * framelen; return ctx->hdr->frames_per_packet * framelen; } -- cgit v1.2.3