Bug 1182100 - Add MP3 demuxer tests for stream resources with unknown lengths. r=kinetik

This commit is contained in:
Eugen Sawin 2015-07-09 22:42:23 +02:00
parent a21f8645bb
commit 5849e944de
2 changed files with 64 additions and 14 deletions

View File

@ -77,8 +77,10 @@ public:
void MockClearBufferedRanges();
void MockAddBufferedRange(int64_t aStart, int64_t aEnd);
private:
protected:
virtual ~MockMediaResource();
private:
FILE* mFileHandle;
const char* mFileName;
nsTArray<MediaByteRange> mRanges;

View File

@ -12,10 +12,34 @@
using namespace mp3;
// Regular MP3 file mock resource.
class MockMP3MediaResource : public MockMediaResource {
public:
explicit MockMP3MediaResource(const char* aFileName)
: MockMediaResource(aFileName)
{}
protected:
virtual ~MockMP3MediaResource() {}
};
// MP3 stream mock resource.
class MockMP3StreamMediaResource : public MockMP3MediaResource {
public:
explicit MockMP3StreamMediaResource(const char* aFileName)
: MockMP3MediaResource(aFileName)
{}
int64_t GetLength() override { return -1; }
protected:
virtual ~MockMP3StreamMediaResource() {}
};
struct MP3Resource {
const char* mFilePath;
bool mIsVBR;
uint64_t mFileSize;
int64_t mFileSize;
int32_t mMPEGLayer;
int32_t mMPEGVersion;
uint8_t mID3MajorVersion;
@ -37,7 +61,7 @@ struct MP3Resource {
// The first n frame offsets.
std::vector<int32_t> mSyncOffsets;
nsRefPtr<MockMediaResource> mResource;
nsRefPtr<MockMP3MediaResource> mResource;
nsRefPtr<MP3TrackDemuxer> mDemuxer;
};
@ -66,7 +90,20 @@ protected:
res.mPrivate = 0;
const int syncs[] = { 2151, 2987, 3823, 4659, 5495, 6331 };
res.mSyncOffsets.insert(res.mSyncOffsets.begin(), syncs, syncs + 6);
// No content length can be estimated for CBR stream resources.
MP3Resource streamRes = res;
streamRes.mFileSize = -1;
streamRes.mDuration = -1;
streamRes.mDurationError = 0.0f;
res.mResource = new MockMP3MediaResource(res.mFilePath);
res.mDemuxer = new MP3TrackDemuxer(res.mResource);
mTargets.push_back(res);
streamRes.mResource = new MockMP3StreamMediaResource(streamRes.mFilePath);
streamRes.mDemuxer = new MP3TrackDemuxer(streamRes.mResource);
mTargets.push_back(streamRes);
}
{
@ -91,13 +128,22 @@ protected:
res.mPrivate = 0;
const int syncs[] = { 2231, 2648, 2752, 3796, 4318, 4735 };
res.mSyncOffsets.insert(res.mSyncOffsets.begin(), syncs, syncs + 6);
// VBR stream resources contain header info on total frames numbers, which
// is used to estimate the total duration.
MP3Resource streamRes = res;
streamRes.mFileSize = -1;
res.mResource = new MockMP3MediaResource(res.mFilePath);
res.mDemuxer = new MP3TrackDemuxer(res.mResource);
mTargets.push_back(res);
streamRes.mResource = new MockMP3StreamMediaResource(streamRes.mFilePath);
streamRes.mDemuxer = new MP3TrackDemuxer(streamRes.mResource);
mTargets.push_back(streamRes);
}
for (auto& target: mTargets) {
target.mResource = new MockMediaResource(target.mFilePath),
target.mDemuxer = new MP3TrackDemuxer(target.mResource);
ASSERT_EQ(NS_OK, target.mResource->Open(nullptr));
ASSERT_TRUE(target.mDemuxer->Init());
}
@ -143,18 +189,18 @@ TEST_F(MP3DemuxerTest, FrameParsing) {
for (const auto& target: mTargets) {
nsRefPtr<MediaRawData> frameData(target.mDemuxer->DemuxSample());
ASSERT_TRUE(frameData);
EXPECT_EQ(static_cast<int64_t>(target.mFileSize), target.mDemuxer->StreamLength());
EXPECT_EQ(target.mFileSize, target.mDemuxer->StreamLength());
const auto& id3 = target.mDemuxer->ID3Header();
ASSERT_TRUE(id3.IsValid());
uint64_t parsedLength = id3.Size();
uint64_t bitrateSum = 0;
uint32_t numFrames = 0;
uint32_t numSamples = 0;
int64_t parsedLength = id3.Size();
int64_t bitrateSum = 0;
int32_t numFrames = 0;
int32_t numSamples = 0;
while (frameData) {
if (target.mSyncOffsets.size() > numFrames) {
if (static_cast<int64_t>(target.mSyncOffsets.size()) > numFrames) {
// Test sync offsets.
EXPECT_EQ(target.mSyncOffsets[numFrames], frameData->mOffset);
}
@ -190,7 +236,9 @@ TEST_F(MP3DemuxerTest, FrameParsing) {
// There may be trailing headers which we don't parse, so the stream length
// is the upper bound.
EXPECT_GE(target.mFileSize, parsedLength);
if (target.mFileSize > 0) {
EXPECT_GE(target.mFileSize, parsedLength);
}
if (target.mIsVBR) {
ASSERT_TRUE(numFrames);
@ -203,7 +251,7 @@ TEST_F(MP3DemuxerTest, Duration) {
for (const auto& target: mTargets) {
nsRefPtr<MediaRawData> frameData(target.mDemuxer->DemuxSample());
ASSERT_TRUE(frameData);
EXPECT_EQ(static_cast<int64_t>(target.mFileSize), target.mDemuxer->StreamLength());
EXPECT_EQ(target.mFileSize, target.mDemuxer->StreamLength());
while (frameData) {
EXPECT_NEAR(target.mDuration, target.mDemuxer->Duration().ToMicroseconds(),