mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-24 01:54:22 +00:00
MP3: Fail gracefully on unsupported mp3 formats
This commit is contained in:
parent
5d26b6a20f
commit
17dc5f7a92
1 changed files with 17 additions and 10 deletions
|
|
@ -492,7 +492,9 @@ struct MP3Frame
|
|||
return frequencies[sampleRateIndex];
|
||||
}
|
||||
|
||||
void decodeHeader (const uint32 header)
|
||||
enum class ParseSuccessful { no, yes };
|
||||
|
||||
ParseSuccessful decodeHeader (const uint32 header)
|
||||
{
|
||||
jassert (((header >> 10) & 3) != 3);
|
||||
|
||||
|
|
@ -527,17 +529,18 @@ struct MP3Frame
|
|||
jassertfalse; // This means the file is using "free format". Apparently very few decoders
|
||||
// support this mode, and this one certainly doesn't handle it correctly!
|
||||
frameSize = 0;
|
||||
return ParseSuccessful::no;
|
||||
}
|
||||
else
|
||||
|
||||
switch (layer)
|
||||
{
|
||||
switch (layer)
|
||||
{
|
||||
case 1: frameSize = (((frameSizes[lsf][0][bitrateIndex] * 12000) / getFrequency() + padding) * 4) - 4; break;
|
||||
case 2: frameSize = (frameSizes[lsf][1][bitrateIndex] * 144000) / getFrequency() + (padding - 4); break;
|
||||
case 3: frameSize = (bitrateIndex == 0) ? 0 : ((frameSizes[lsf][2][bitrateIndex] * 144000) / (getFrequency() << lsf) + (padding - 4)); break;
|
||||
default: break;
|
||||
}
|
||||
case 1: frameSize = (((frameSizes[lsf][0][bitrateIndex] * 12000) / getFrequency() + padding) * 4) - 4; break;
|
||||
case 2: frameSize = (frameSizes[lsf][1][bitrateIndex] * 144000) / getFrequency() + (padding - 4); break;
|
||||
case 3: frameSize = (bitrateIndex == 0) ? 0 : ((frameSizes[lsf][2][bitrateIndex] * 144000) / (getFrequency() << lsf) + (padding - 4)); break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
return ParseSuccessful::yes;
|
||||
}
|
||||
|
||||
int layer, frameSize, numChannels, single;
|
||||
|
|
@ -1430,7 +1433,11 @@ struct MP3Stream
|
|||
lastFrameSize += nextFrameOffset;
|
||||
}
|
||||
|
||||
frame.decodeHeader ((uint32) stream.readIntBigEndian());
|
||||
const auto successful = frame.decodeHeader ((uint32) stream.readIntBigEndian());
|
||||
|
||||
if (successful == MP3Frame::ParseSuccessful::no)
|
||||
return -1;
|
||||
|
||||
headerParsed = true;
|
||||
frameSize = frame.frameSize;
|
||||
isFreeFormat = (frameSize == 0);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue