Skip to content

Commit

Permalink
Handle the case when MP4 file header has zero bitrate
Browse files Browse the repository at this point in the history
This incorporates [6ca536b] (mp4 properties: handle the case when
mp4 file header has zero bitrate) from PR taglib#899 with a more accurate
bitrate calculation and a unit test.
  • Loading branch information
ufleisch committed Dec 27, 2020
1 parent 3d71ea1 commit 563fbaf
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
9 changes: 8 additions & 1 deletion taglib/mp4/mp4properties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,14 @@ MP4::Properties::read(File *file, Atoms *atoms)
pos += 3;
}
pos += 10;
d->bitrate = static_cast<int>((data.toUInt(pos) + 500) / 1000.0 + 0.5);
const unsigned int bitrateValue = data.toUInt(pos);
if(bitrateValue != 0 || d->length <= 0) {
d->bitrate = static_cast<int>((bitrateValue + 500) / 1000.0 + 0.5);
}
else {
d->bitrate = static_cast<int>(
(calculateMdatLength(atoms->atoms) * 8) / d->length);
}
}
}
}
Expand Down
23 changes: 23 additions & 0 deletions tests/test_mp4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class TestMP4 : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE(TestMP4);
CPPUNIT_TEST(testPropertiesAAC);
CPPUNIT_TEST(testPropertiesAACWithoutBitrate);
CPPUNIT_TEST(testPropertiesALAC);
CPPUNIT_TEST(testPropertiesALACWithoutBitrate);
CPPUNIT_TEST(testPropertiesM4V);
Expand Down Expand Up @@ -81,6 +82,28 @@ class TestMP4 : public CppUnit::TestFixture
CPPUNIT_ASSERT_EQUAL(MP4::Properties::AAC, f.audioProperties()->codec());
}

void testPropertiesAACWithoutBitrate()
{
ByteVector aacData = PlainFile(TEST_FILE_PATH_C("has-tags.m4a")).readAll();
CPPUNIT_ASSERT_GREATER(1960U, aacData.size());
CPPUNIT_ASSERT_EQUAL(ByteVector("mp4a"), aacData.mid(1890, 4));
// Set the bitrate to zero
for (int offset = 1956; offset < 1960; ++offset) {
aacData[offset] = 0;
}
ByteVectorStream aacStream(aacData);
MP4::File f(&aacStream);
CPPUNIT_ASSERT(f.audioProperties());
CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds());
CPPUNIT_ASSERT_EQUAL(3708, f.audioProperties()->lengthInMilliseconds());
CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->bitrate());
CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels());
CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate());
CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample());
CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted());
CPPUNIT_ASSERT_EQUAL(MP4::Properties::AAC, f.audioProperties()->codec());
}

void testPropertiesALAC()
{
MP4::File f(TEST_FILE_PATH_C("empty_alac.m4a"));
Expand Down

0 comments on commit 563fbaf

Please sign in to comment.