From b52b0133dafd723da760235851f4ebb189c45738 Mon Sep 17 00:00:00 2001 From: shatty Date: Sun, 28 Dec 2003 01:34:42 +0000 Subject: [PATCH] handle B_LAST_BUFFER_ERROR from GetNextChunk. properly return a non-full buffer if we got anything decoded. if the buffer has no data, set framecount to zero, and return B_LAST_BUFFER_ERROR. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5777 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../media/plugins/vorbis/vorbisCodecPlugin.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp b/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp index 64ac3cd9f8..b8fa56b9da 100644 --- a/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp +++ b/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp @@ -169,9 +169,13 @@ vorbisDecoder::Decode(void *buffer, int64 *frameCount, void *chunkBuffer; int32 chunkSize; media_header mh; - if (B_OK != GetNextChunk(&chunkBuffer, &chunkSize, &mh)) { + status_t status = GetNextChunk(&chunkBuffer, &chunkSize, &mh); + if (status == B_LAST_BUFFER_ERROR) { + goto done; + } + if (status != B_OK) { TRACE("vorbisDecoder::Decode: GetNextChunk failed\n"); - return B_ERROR; + return status; } if (chunkSize != sizeof(ogg_packet)) { TRACE("vorbisDecoder::Decode: chunk not ogg_packet-sized\n"); @@ -197,10 +201,14 @@ vorbisDecoder::Decode(void *buffer, int64 *frameCount, fStartTime += (1000000LL * samples) / fInfo.rate; //TRACE("vorbisDecoder: fStartTime inc'd to %.6f\n", fStartTime / 1000000.0); } + +done: *frameCount = (fOutputBufferSize - out_bytes_needed) / fFrameSize; - // XXX this doesn't guarantee that we always return B_LAST_BUFFER_ERROR bofore returning B_ERROR - return (out_bytes_needed == 0) ? B_OK : (out_bytes_needed == fOutputBufferSize) ? B_ERROR : B_LAST_BUFFER_ERROR; + if (out_buffer != buffer) { + return B_OK; + } + return B_LAST_BUFFER_ERROR; } Decoder *