MP3 Parser needs to validate consecutive mp3 headers before parsing starts.
diff --git a/fileformats/mp3/parser/src/mp3parser.cpp b/fileformats/mp3/parser/src/mp3parser.cpp
index 812869c..a060d79 100644
--- a/fileformats/mp3/parser/src/mp3parser.cpp
+++ b/fileformats/mp3/parser/src/mp3parser.cpp
@@ -481,58 +481,38 @@
StartOffset = iTagSize;
}
- errCode = MP3Utils::SeektoOffset(fp, StartOffset, Oscl_File::SEEKSET);
- if (MP3_SUCCESS != errCode)
+ MP3ErrorType err = MP3Utils::SeektoOffset(fp, StartOffset, Oscl_File::SEEKSET);
+ if (MP3_SUCCESS != err)
{
- return errCode;
+ return err;
}
- if (!MP3FileIO::readByteData(fp, MP3_FRAME_HEADER_SIZE, (uint8 *)pFrameHeader))
+ uint32 seekOffset = 0;
+ err = mp3FindSync(StartOffset, seekOffset, fp);
+ if (err != MP3_SUCCESS)
+ {
+ // in eof scenario parser reports eof error to the user
+ // eof will be reported in case when no valid sync
+ // word is find in the maximum specified search limit
+ return err;
+ }
+
+ StartOffset += seekOffset;
+ err = MP3Utils::SeektoOffset(fp, StartOffset, Oscl_File::SEEKSET);
+ if (MP3_SUCCESS != err)
+ {
+ return err;
+ }
+
+ if (!MP3FileIO::readByteData(fp, MP3_FRAME_HEADER_SIZE, pFrameHeader))
{
return MP3_INSUFFICIENT_DATA;
}
-
firstHeader = SwapFileToHostByteOrderInt32(pFrameHeader);
- /**
- * If we don't find a valid MP3 Marker point we will attempt recovery.
- * Either the ID3 parsing failed or the ID3 header(s) are incorrect.
- * If this fails we won't be able to parse the rest of the file.
- * Attempt recovery now
- **/
if (!GetMP3Header(firstHeader, iMP3HeaderInfo))
{
- uint32 seekOffset = 0;
- MP3Utils::SeektoOffset(fp, 0 - MP3_FRAME_HEADER_SIZE, Oscl_File::SEEKCUR);
- MP3ErrorType err = mp3FindSync(StartOffset, seekOffset, fp);
- if (err == MP3_SUCCESS)
- {
- StartOffset += seekOffset;
- MP3ErrorType err = MP3Utils::SeektoOffset(fp, seekOffset, Oscl_File::SEEKCUR);
- if (MP3_SUCCESS != err)
- {
- return err;
- }
-
- if (!MP3FileIO::readByteData(fp, MP3_FRAME_HEADER_SIZE, pFrameHeader))
- {
- return MP3_INSUFFICIENT_DATA;
- }
- firstHeader = SwapFileToHostByteOrderInt32(pFrameHeader);
-
- if (!GetMP3Header(firstHeader, iMP3HeaderInfo))
- {
- return MP3_FILE_HDR_READ_ERR;
- }
- }
- else if (err == MP3_INSUFFICIENT_DATA ||
- err == MP3_END_OF_FILE)
- {
- // in eof scenario parser reports eof error to the user
- // eof will be reported in case when no valid sync
- // word is find in the maximum specified search limit
- return err;
- }
+ return MP3_FILE_HDR_READ_ERR;
}
if (!DecodeMP3Header(iMP3HeaderInfo, iMP3ConfigInfo, false))
@@ -545,7 +525,7 @@
ConfigSize = MP3_FRAME_HEADER_SIZE;
}
- int32 revSeek = 0 - MP3_FRAME_HEADER_SIZE;
+ int32 revSeek = 0 - MP3_FRAME_HEADER_SIZE - seekOffset;
errCode = MP3Utils::SeektoOffset(fp, revSeek, Oscl_File::SEEKCUR);
if (MP3_SUCCESS != errCode)
{
@@ -692,7 +672,7 @@
iAvgBitrateInbps = iMP3ConfigInfo.BitRate;
// Set the position to the position of the first MP3 frame
- errCode = MP3Utils::SeektoOffset(fp, revSeek, Oscl_File::SEEKCUR);
+ errCode = MP3Utils::SeektoOffset(fp, revSeek + seekOffset, Oscl_File::SEEKCUR);
if (MP3_SUCCESS != errCode)
{
return errCode;