Bug 1364866 - Part 1 - Provide a function for directly retrieving the total size of an ID3 tag. r?esawin
MozReview-Commit-ID: B9GQ7vzoJ2l
--- a/dom/media/MP3Demuxer.cpp
+++ b/dom/media/MP3Demuxer.cpp
@@ -505,17 +505,17 @@ MP3TrackDemuxer::FindNextFrame()
int32_t read = 0;
bool foundFrame = false;
int64_t frameHeaderOffset = 0;
// Check whether we've found a valid MPEG frame.
while (!foundFrame) {
if ((!mParser.FirstFrame().Length()
- && mOffset - mParser.ID3Header().Size() > MAX_SKIPPED_BYTES)
+ && mOffset - mParser.ID3Header().TotalTagSize() > MAX_SKIPPED_BYTES)
|| (read = Read(buffer, mOffset, BUFFER_SIZE)) == 0) {
MP3LOG("FindNext() EOS or exceeded MAX_SKIPPED_BYTES without a frame");
// This is not a valid MPEG audio stream or we've reached EOS, give up.
break;
}
ByteReader reader(buffer, read);
uint32_t bytesToSkip = 0;
@@ -1317,21 +1317,17 @@ static const uint8_t MAX_MAJOR_VER = 4;
uint32_t
ID3Parser::Parse(ByteReader* aReader)
{
MOZ_ASSERT(aReader);
while (aReader->CanRead8() && !mHeader.ParseNext(aReader->ReadU8())) { }
- if (mHeader.IsValid()) {
- // Header found, return total tag size.
- return ID3Header::SIZE + Header().Size() + Header().FooterSize();
- }
- return 0;
+ return mHeader.TotalTagSize();
}
void
ID3Parser::Reset()
{
mHeader.Reset();
}
@@ -1386,16 +1382,26 @@ uint8_t
ID3Parser::ID3Header::FooterSize() const
{
if (Flags() & (1 << 4)) {
return SIZE;
}
return 0;
}
+uint32_t
+ID3Parser::ID3Header::TotalTagSize() const
+{
+ if (IsValid()) {
+ // Header found, return total tag size.
+ return ID3Header::SIZE + Size() + FooterSize();
+ }
+ return 0;
+}
+
bool
ID3Parser::ID3Header::ParseNext(uint8_t c)
{
if (!Update(c)) {
Reset();
if (!Update(c)) {
Reset();
}
--- a/dom/media/MP3Demuxer.h
+++ b/dom/media/MP3Demuxer.h
@@ -67,16 +67,20 @@ public:
uint8_t Flags() const;
// The derived size based on the provided size fields.
uint32_t Size() const;
// Returns the size of an ID3v2.4 footer if present and zero otherwise.
uint8_t FooterSize() const;
+ // The total size of the ID3 tag including header/footer, or zero if
+ // none has been found.
+ uint32_t TotalTagSize() const;
+
// Returns whether the parsed data is a valid ID3 header up to the given
// byte position.
bool IsValid(int aPos) const;
// Returns whether the parsed data is a complete and valid ID3 header.
bool IsValid() const;
// Parses the next provided byte.