mirror of
https://github.com/taglib/taglib.git
synced 2025-05-27 21:20:26 -04:00
Use correct frame sizes when calculating length of MPEG 2 or 2.5 streams.
CCBUG:130185 git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@740177 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
This commit is contained in:
parent
e06495a7e3
commit
46fbd11d8f
@ -215,9 +215,17 @@ void MPEG::Properties::read()
|
||||
firstHeader.sampleRate() > 0 &&
|
||||
d->xingHeader->totalFrames() > 0)
|
||||
{
|
||||
static const int blockSize[] = { 0, 384, 1152, 1152 };
|
||||
static const int blockSize[2][4] = {
|
||||
// Version 1
|
||||
{ 0, 384, 1152, 1152 },
|
||||
// Version 2 or 2.5
|
||||
{ 0, 384, 1152, 576 }
|
||||
};
|
||||
|
||||
double timePerFrame = double(blockSize[firstHeader.layer()]) / firstHeader.sampleRate();
|
||||
int versionIndex = firstHeader.version() == Header::Version1 ? 0 : 1;
|
||||
double timePerFrame =
|
||||
double(blockSize[versionIndex][firstHeader.layer()]) /
|
||||
firstHeader.sampleRate();
|
||||
d->length = int(timePerFrame * d->xingHeader->totalFrames());
|
||||
d->bitrate = d->length > 0 ? d->xingHeader->totalSize() * 8 / d->length / 1000 : 0;
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ SET(test_runner_SRCS
|
||||
main.cpp
|
||||
test_list.cpp
|
||||
test_map.cpp
|
||||
test_mpeg.cpp
|
||||
test_synchdata.cpp
|
||||
test_bytevector.cpp
|
||||
test_string.cpp
|
||||
|
@ -10,6 +10,7 @@ test_runner_SOURCES = \
|
||||
main.cpp \
|
||||
test_list.cpp \
|
||||
test_map.cpp \
|
||||
test_mpeg.cpp \
|
||||
test_synchdata.cpp \
|
||||
test_bytevector.cpp \
|
||||
test_string.cpp \
|
||||
|
BIN
tests/data/mpeg2.mp3
Normal file
BIN
tests/data/mpeg2.mp3
Normal file
Binary file not shown.
25
tests/test_mpeg.cpp
Normal file
25
tests/test_mpeg.cpp
Normal file
@ -0,0 +1,25 @@
|
||||
#include <cppunit/extensions/HelperMacros.h>
|
||||
#include <string>
|
||||
#include <stdio.h>
|
||||
#include <mpegfile.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace TagLib;
|
||||
|
||||
class TestMPEG : public CppUnit::TestFixture
|
||||
{
|
||||
CPPUNIT_TEST_SUITE(TestMPEG);
|
||||
CPPUNIT_TEST(testVersion2DurationWithXingHeader);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
|
||||
public:
|
||||
|
||||
void testVersion2DurationWithXingHeader()
|
||||
{
|
||||
MPEG::File f("data/mpeg2.mp3");
|
||||
CPPUNIT_ASSERT_EQUAL(5387, f.audioProperties()->length());
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION(TestMPEG);
|
Loading…
Reference in New Issue
Block a user