mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1182100 - Add MP3 demuxer tests for stream resources with unknown lengths. r=kinetik
This commit is contained in:
parent
a21f8645bb
commit
5849e944de
@ -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;
|
||||
|
@ -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(),
|
||||
|
Loading…
Reference in New Issue
Block a user