From 96f52cde23982f668592418a9548045237d5e327 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Tue, 11 May 2010 10:11:55 -0700 Subject: Better seek handling and proper reset of the vorbis decoder after a discontinuity (seek) Change-Id: I3c76d35da48e0964f7a0fa2816f8573b5e1a9436 related-to-bug: 2674036 QA-impact: low, only affects ogg-vorbis playback through http --- .../libstagefright/codecs/vorbis/dec/VorbisDecoder.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'media/libstagefright/codecs/vorbis/dec') diff --git a/media/libstagefright/codecs/vorbis/dec/VorbisDecoder.cpp b/media/libstagefright/codecs/vorbis/dec/VorbisDecoder.cpp index 5485f25..df3f16a 100644 --- a/media/libstagefright/codecs/vorbis/dec/VorbisDecoder.cpp +++ b/media/libstagefright/codecs/vorbis/dec/VorbisDecoder.cpp @@ -173,18 +173,19 @@ int VorbisDecoder::decodePacket(MediaBuffer *packet, MediaBuffer *out) { pack.granulepos = 0; pack.packetno = 0; + int numFrames = 0; + int err = vorbis_dsp_synthesis(mState, &pack, 1); if (err != 0) { LOGW("vorbis_dsp_synthesis returned %d", err); - return 0; - } - - int numFrames = vorbis_dsp_pcmout( - mState, (int16_t *)out->data(), kMaxNumSamplesPerBuffer); + } else { + numFrames = vorbis_dsp_pcmout( + mState, (int16_t *)out->data(), kMaxNumSamplesPerBuffer); - if (numFrames < 0) { - LOGE("vorbis_dsp_pcmout returned %d", numFrames); - return 0; + if (numFrames < 0) { + LOGE("vorbis_dsp_pcmout returned %d", numFrames); + numFrames = 0; + } } out->set_range(0, numFrames * sizeof(int16_t) * mNumChannels); @@ -203,6 +204,7 @@ status_t VorbisDecoder::read( CHECK(seekTimeUs >= 0); mNumFramesOutput = 0; + vorbis_dsp_restart(mState); } else { seekTimeUs = -1; } -- cgit v1.1