From 6736ae524a343f42152863f0a64d05874d2f97f4 Mon Sep 17 00:00:00 2001 From: beveloper Date: Sat, 23 Oct 2004 18:00:53 +0000 Subject: [PATCH] This fixes the bugs that crashed nplay and ColdCut during the Begeistert 13 presentation git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9463 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../media/plugins/raw_decoder/AudioConversion.cpp | 8 ++++++-- .../plugins/raw_decoder/RawDecoderPlugin.cpp | 15 ++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/add-ons/media/plugins/raw_decoder/AudioConversion.cpp b/src/add-ons/media/plugins/raw_decoder/AudioConversion.cpp index a9c793a8c6..106a4e069f 100644 --- a/src/add-ons/media/plugins/raw_decoder/AudioConversion.cpp +++ b/src/add-ons/media/plugins/raw_decoder/AudioConversion.cpp @@ -52,13 +52,17 @@ public: inline operator int8() { return (int8)data[2]; } inline operator int16() { return (int16)((uint32)data[2] << 8 | (uint32)data[1]); } inline operator int32() { return (int32)((uint32)data[2] << 24 | (uint32)data[1] << 16 | (uint32)data[0] << 8); } - inline operator float() { return (int32)((uint32)data[2] << 24 | (uint32)data[1] << 16 | (uint32)data[0] << 8) * (1.0f / 2147483647.0f); } + inline operator float() { return (int32)((uint32)data[2] << 16 | (uint32)data[1] << 8 | (uint32)data[0]) * (1.0f / (2147483647.0f / 256)); } +// XXX is the line above correct? long version: +// inline operator float() { return (int32)((uint32)data[2] << 24 | (uint32)data[1] << 16 | (uint32)data[0] << 8) * (1.0f / 2147483647.0f); } #else inline operator uint8() { return (int32)data[0] + 128; } inline operator int8() { return (int8)data[0]; } inline operator int16() { return (int16)((uint32)data[0] << 8 | (uint32)data[1]); } inline operator int32() { return (int32)((uint32)data[0] << 24 | (uint32)data[1] << 16 | (uint32)data[2] << 8); } - inline operator float() { return (int32)((uint32)data[0] << 24 | (uint32)data[1] << 16 | (uint32)data[2] << 8) * (1.0f / 2147483647.0f); } + inline operator float() { return (int32)((uint32)data[0] << 16 | (uint32)data[1] << 8 | (uint32)data[2]) * (1.0f / (2147483647.0f / 256)); } +// XXX is the line above correct? long version: +// inline operator float() { return (int32)((uint32)data[0] << 24 | (uint32)data[1] << 16 | (uint32)data[2] << 8) * (1.0f / 2147483647.0f); } #endif private: uint8 data[3]; diff --git a/src/add-ons/media/plugins/raw_decoder/RawDecoderPlugin.cpp b/src/add-ons/media/plugins/raw_decoder/RawDecoderPlugin.cpp index f946e90fa0..e8c32b471c 100644 --- a/src/add-ons/media/plugins/raw_decoder/RawDecoderPlugin.cpp +++ b/src/add-ons/media/plugins/raw_decoder/RawDecoderPlugin.cpp @@ -7,8 +7,8 @@ #include "RawDecoderPlugin.h" #include "AudioConversion.h" -#define TRACE_THIS 0 -#if TRACE_THIS +#define TRACE_DECODER +#ifdef TRACE_DECODER #define TRACE printf #else #define TRACE(a...) @@ -98,10 +98,11 @@ RawDecoder::NegotiateOutputFormat(media_format *ioDecodedFormat) // BeBook says: The codec will find and return in ioFormat its best matching format // => This means, we never return an error, and always change the format values // that we don't support to something more applicable - if (ioDecodedFormat->type == B_MEDIA_RAW_VIDEO) + if (fInputFormat.type == B_MEDIA_RAW_VIDEO) return NegotiateVideoOutputFormat(ioDecodedFormat); - if (ioDecodedFormat->type == B_MEDIA_RAW_AUDIO) + if (fInputFormat.type == B_MEDIA_RAW_AUDIO) return NegotiateAudioOutputFormat(ioDecodedFormat); + debugger("RawDecoder::NegotiateOutputFormat: wrong encoded format type"); return B_ERROR; } @@ -159,10 +160,11 @@ RawDecoder::NegotiateAudioOutputFormat(media_format *ioDecodedFormat) break; } - fFrameRate = (int32) ioDecodedFormat->u.raw_audio.frame_rate; ioDecodedFormat->u.raw_audio.frame_rate = fInputFormat.u.raw_audio.frame_rate; ioDecodedFormat->u.raw_audio.channel_count = fInputFormat.u.raw_audio.channel_count; + fFrameRate = (int32) ioDecodedFormat->u.raw_audio.frame_rate; + fOutputSampleSize = (ioDecodedFormat->u.raw_audio.format & B_AUDIO_FORMAT_SIZE_MASK); fOutputFrameSize = fOutputSampleSize * ioDecodedFormat->u.raw_audio.channel_count; @@ -412,6 +414,9 @@ RawDecoder::NegotiateAudioOutputFormat(media_format *ioDecodedFormat) string_for_format(*ioDecodedFormat, s, sizeof(s)); TRACE("RawDecoder::NegotiateAudioOutputFormat leave: %s\n", s); + + if (ioDecodedFormat->type == 0) + debugger("RawDecoder::NegotiateAudioOutputFormat ioDecodedFormat->type == 0"); /* TRACE("fFrameRate %ld\n", fFrameRate); TRACE("fInputFrameSize %ld\n", fInputFrameSize);