--- a/media/libstagefright/gtest/TestParser.cpp
+++ b/media/libstagefright/gtest/TestParser.cpp
@@ -2,16 +2,17 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "gtest/gtest.h"
#include "MediaData.h"
#include "MediaPrefs.h"
#include "mozilla/ArrayUtils.h"
+#include "mozilla/Preferences.h"
#include "mp4_demuxer/BufferStream.h"
#include "mp4_demuxer/MP4Metadata.h"
#include "mp4_demuxer/MoofParser.h"
using namespace mozilla;
using namespace mp4_demuxer;
class TestStream : public Stream
@@ -246,95 +247,101 @@ static const TestFileData rustTestFiles[
{ "test_case_1301065-i64max.mp4", 0, -1, 0, 0, 0, -1, false, 0, false, false, 0 },
{ "test_case_1301065-i64min.mp4", 0, -1, 0, 0, 0, -1, false, 0, false, false, 0 },
{ "test_case_1301065-u64max.mp4", 0, -1, 0, 0, 1, 0, false, 0, false, false, 2 },
{ "test_case_1329061.mov", 0, -1, 0, 0, 1, 234567981,
false, 0, false, false, 2 },
};
TEST(stagefright_MPEG4Metadata, test_case_mp4)
{
- const TestFileData* tests = nullptr;
- size_t length = 0;
-
- if (MediaPrefs::EnableRustMP4Parser()) {
- tests = rustTestFiles;
- length = ArrayLength(rustTestFiles);
- } else {
- tests = testFiles;
- length = ArrayLength(testFiles);
- }
-
- for (size_t test = 0; test < length; ++test) {
- nsTArray<uint8_t> buffer = ReadTestFile(tests[test].mFilename);
- ASSERT_FALSE(buffer.IsEmpty());
- RefPtr<Stream> stream = new TestStream(buffer.Elements(), buffer.Length());
+ for (bool rust : { !MediaPrefs::EnableRustMP4Parser(),
+ MediaPrefs::EnableRustMP4Parser() }) {
+ mozilla::Preferences::SetBool("media.rust.mp4parser", rust);
+ ASSERT_EQ(rust, MediaPrefs::EnableRustMP4Parser());
- RefPtr<MediaByteBuffer> metadataBuffer = MP4Metadata::Metadata(stream);
- EXPECT_TRUE(metadataBuffer);
+ const TestFileData* tests = nullptr;
+ size_t length = 0;
- MP4Metadata metadata(stream);
- EXPECT_EQ(0u, metadata.GetNumberTracks(TrackInfo::kUndefinedTrack));
- EXPECT_EQ(tests[test].mNumberAudioTracks,
- metadata.GetNumberTracks(TrackInfo::kAudioTrack));
- EXPECT_EQ(tests[test].mNumberVideoTracks,
- metadata.GetNumberTracks(TrackInfo::kVideoTrack));
- EXPECT_EQ(0u, metadata.GetNumberTracks(TrackInfo::kTextTrack));
- EXPECT_EQ(0u, metadata.GetNumberTracks(static_cast<TrackInfo::TrackType>(-1)));
- EXPECT_FALSE(metadata.GetTrackInfo(TrackInfo::kUndefinedTrack, 0));
- UniquePtr<TrackInfo> trackInfo = metadata.GetTrackInfo(TrackInfo::kVideoTrack, 0);
- if (tests[test].mNumberVideoTracks == 0) {
- EXPECT_TRUE(!trackInfo);
+ if (rust) {
+ tests = rustTestFiles;
+ length = ArrayLength(rustTestFiles);
} else {
- ASSERT_TRUE(!!trackInfo);
- const VideoInfo* videoInfo = trackInfo->GetAsVideoInfo();
- ASSERT_TRUE(!!videoInfo);
- EXPECT_TRUE(videoInfo->IsValid());
- EXPECT_TRUE(videoInfo->IsVideo());
- EXPECT_EQ(tests[test].mVideoDuration, videoInfo->mDuration);
- EXPECT_EQ(tests[test].mWidth, videoInfo->mDisplay.width);
- EXPECT_EQ(tests[test].mHeight, videoInfo->mDisplay.height);
-
- UniquePtr<IndiceWrapper> indices = metadata.GetTrackIndice(videoInfo->mTrackId);
- EXPECT_TRUE(!!indices);
- for (size_t i = 0; i < indices->Length(); i++) {
- Index::Indice data;
- EXPECT_TRUE(indices->GetIndice(i, data));
- EXPECT_TRUE(data.start_offset <= data.end_offset);
- EXPECT_TRUE(data.start_composition <= data.end_composition);
- }
+ tests = testFiles;
+ length = ArrayLength(testFiles);
}
- trackInfo = metadata.GetTrackInfo(TrackInfo::kAudioTrack, 0);
- if (tests[test].mNumberAudioTracks == 0) {
- EXPECT_TRUE(!trackInfo);
- } else {
- ASSERT_TRUE(!!trackInfo);
- const AudioInfo* audioInfo = trackInfo->GetAsAudioInfo();
- ASSERT_TRUE(!!audioInfo);
- EXPECT_TRUE(audioInfo->IsValid());
- EXPECT_TRUE(audioInfo->IsAudio());
- EXPECT_EQ(tests[test].mAudioDuration, audioInfo->mDuration);
- EXPECT_EQ(tests[test].mAudioProfile, audioInfo->mProfile);
- if (tests[test].mAudioDuration != audioInfo->mDuration) {
- MOZ_RELEASE_ASSERT(false);
- }
+
+ for (size_t test = 0; test < length; ++test) {
+ nsTArray<uint8_t> buffer = ReadTestFile(tests[test].mFilename);
+ ASSERT_FALSE(buffer.IsEmpty());
+ RefPtr<Stream> stream = new TestStream(buffer.Elements(), buffer.Length());
+
+ RefPtr<MediaByteBuffer> metadataBuffer = MP4Metadata::Metadata(stream);
+ EXPECT_TRUE(metadataBuffer);
+
+ MP4Metadata metadata(stream);
+ EXPECT_EQ(0u, metadata.GetNumberTracks(TrackInfo::kUndefinedTrack));
+ EXPECT_EQ(tests[test].mNumberAudioTracks,
+ metadata.GetNumberTracks(TrackInfo::kAudioTrack));
+ EXPECT_EQ(tests[test].mNumberVideoTracks,
+ metadata.GetNumberTracks(TrackInfo::kVideoTrack));
+ EXPECT_EQ(0u, metadata.GetNumberTracks(TrackInfo::kTextTrack));
+ EXPECT_EQ(0u, metadata.GetNumberTracks(static_cast<TrackInfo::TrackType>(-1)));
+ EXPECT_FALSE(metadata.GetTrackInfo(TrackInfo::kUndefinedTrack, 0));
+ UniquePtr<TrackInfo> trackInfo = metadata.GetTrackInfo(TrackInfo::kVideoTrack, 0);
+ if (tests[test].mNumberVideoTracks == 0) {
+ EXPECT_TRUE(!trackInfo);
+ } else {
+ ASSERT_TRUE(!!trackInfo);
+ const VideoInfo* videoInfo = trackInfo->GetAsVideoInfo();
+ ASSERT_TRUE(!!videoInfo);
+ EXPECT_TRUE(videoInfo->IsValid());
+ EXPECT_TRUE(videoInfo->IsVideo());
+ EXPECT_EQ(tests[test].mVideoDuration, videoInfo->mDuration);
+ EXPECT_EQ(tests[test].mWidth, videoInfo->mDisplay.width);
+ EXPECT_EQ(tests[test].mHeight, videoInfo->mDisplay.height);
- UniquePtr<IndiceWrapper> indices = metadata.GetTrackIndice(audioInfo->mTrackId);
- EXPECT_TRUE(!!indices);
- for (size_t i = 0; i < indices->Length(); i++) {
- Index::Indice data;
- EXPECT_TRUE(indices->GetIndice(i, data));
- EXPECT_TRUE(data.start_offset <= data.end_offset);
- EXPECT_TRUE(int64_t(data.start_composition) <= int64_t(data.end_composition));
+ UniquePtr<IndiceWrapper> indices = metadata.GetTrackIndice(videoInfo->mTrackId);
+ EXPECT_TRUE(!!indices);
+ for (size_t i = 0; i < indices->Length(); i++) {
+ Index::Indice data;
+ EXPECT_TRUE(indices->GetIndice(i, data));
+ EXPECT_TRUE(data.start_offset <= data.end_offset);
+ EXPECT_TRUE(data.start_composition <= data.end_composition);
+ }
}
+ trackInfo = metadata.GetTrackInfo(TrackInfo::kAudioTrack, 0);
+ if (tests[test].mNumberAudioTracks == 0) {
+ EXPECT_TRUE(!trackInfo);
+ } else {
+ ASSERT_TRUE(!!trackInfo);
+ const AudioInfo* audioInfo = trackInfo->GetAsAudioInfo();
+ ASSERT_TRUE(!!audioInfo);
+ EXPECT_TRUE(audioInfo->IsValid());
+ EXPECT_TRUE(audioInfo->IsAudio());
+ EXPECT_EQ(tests[test].mAudioDuration, audioInfo->mDuration);
+ EXPECT_EQ(tests[test].mAudioProfile, audioInfo->mProfile);
+ if (tests[test].mAudioDuration != audioInfo->mDuration) {
+ MOZ_RELEASE_ASSERT(false);
+ }
+
+ UniquePtr<IndiceWrapper> indices = metadata.GetTrackIndice(audioInfo->mTrackId);
+ EXPECT_TRUE(!!indices);
+ for (size_t i = 0; i < indices->Length(); i++) {
+ Index::Indice data;
+ EXPECT_TRUE(indices->GetIndice(i, data));
+ EXPECT_TRUE(data.start_offset <= data.end_offset);
+ EXPECT_TRUE(int64_t(data.start_composition) <= int64_t(data.end_composition));
+ }
+ }
+ EXPECT_FALSE(metadata.GetTrackInfo(TrackInfo::kTextTrack, 0));
+ EXPECT_FALSE(metadata.GetTrackInfo(static_cast<TrackInfo::TrackType>(-1), 0));
+ // We can see anywhere in any MPEG4.
+ EXPECT_TRUE(metadata.CanSeek());
+ EXPECT_EQ(tests[test].mHasCrypto, metadata.Crypto().valid);
}
- EXPECT_FALSE(metadata.GetTrackInfo(TrackInfo::kTextTrack, 0));
- EXPECT_FALSE(metadata.GetTrackInfo(static_cast<TrackInfo::TrackType>(-1), 0));
- // We can see anywhere in any MPEG4.
- EXPECT_TRUE(metadata.CanSeek());
- EXPECT_EQ(tests[test].mHasCrypto, metadata.Crypto().valid);
}
}
// Bug 1224019: This test produces way to much output, disabling for now.
#if 0
TEST(stagefright_MPEG4Metadata, test_case_mp4_subsets)
{
static const size_t step = 1u;
@@ -368,59 +375,65 @@ TEST(stagefright_MPEG4Metadata, test_cas
}
}
}
}
#endif
TEST(stagefright_MoofParser, test_case_mp4)
{
- const TestFileData* tests = nullptr;
- size_t length = 0;
-
- if (MediaPrefs::EnableRustMP4Parser()) {
- tests = rustTestFiles;
- length = ArrayLength(rustTestFiles);
- } else {
- tests = testFiles;
- length = ArrayLength(testFiles);
- }
-
- for (size_t test = 0; test < length; ++test) {
- nsTArray<uint8_t> buffer = ReadTestFile(tests[test].mFilename);
- ASSERT_FALSE(buffer.IsEmpty());
- RefPtr<Stream> stream = new TestStream(buffer.Elements(), buffer.Length());
+ for (bool rust : { !MediaPrefs::EnableRustMP4Parser(),
+ MediaPrefs::EnableRustMP4Parser() }) {
+ mozilla::Preferences::SetBool("media.rust.mp4parser", rust);
+ ASSERT_EQ(rust, MediaPrefs::EnableRustMP4Parser());
- MoofParser parser(stream, 0, false);
- EXPECT_EQ(0u, parser.mOffset);
- EXPECT_FALSE(parser.ReachedEnd());
- EXPECT_TRUE(parser.mInitRange.IsEmpty());
-
- EXPECT_TRUE(parser.HasMetadata());
- RefPtr<MediaByteBuffer> metadataBuffer = parser.Metadata();
- EXPECT_TRUE(metadataBuffer);
+ const TestFileData* tests = nullptr;
+ size_t length = 0;
- EXPECT_FALSE(parser.mInitRange.IsEmpty());
- const MediaByteRangeSet byteRanges(
- MediaByteRange(0, int64_t(buffer.Length())));
- EXPECT_EQ(tests[test].mValidMoof,
- parser.RebuildFragmentedIndex(byteRanges));
- if (tests[test].mMoofReachedOffset == 0) {
- EXPECT_EQ(buffer.Length(), parser.mOffset);
- EXPECT_TRUE(parser.ReachedEnd());
+ if (rust) {
+ tests = rustTestFiles;
+ length = ArrayLength(rustTestFiles);
} else {
- EXPECT_EQ(tests[test].mMoofReachedOffset, parser.mOffset);
- EXPECT_FALSE(parser.ReachedEnd());
+ tests = testFiles;
+ length = ArrayLength(testFiles);
}
- EXPECT_FALSE(parser.mInitRange.IsEmpty());
- EXPECT_TRUE(parser.GetCompositionRange(byteRanges).IsNull());
- EXPECT_TRUE(parser.FirstCompleteMediaSegment().IsEmpty());
- EXPECT_EQ(tests[test].mHeader,
- !parser.FirstCompleteMediaHeader().IsEmpty());
+ for (size_t test = 0; test < length; ++test) {
+ nsTArray<uint8_t> buffer = ReadTestFile(tests[test].mFilename);
+ ASSERT_FALSE(buffer.IsEmpty());
+ RefPtr<Stream> stream = new TestStream(buffer.Elements(), buffer.Length());
+
+ MoofParser parser(stream, 0, false);
+ EXPECT_EQ(0u, parser.mOffset);
+ EXPECT_FALSE(parser.ReachedEnd());
+ EXPECT_TRUE(parser.mInitRange.IsEmpty());
+
+ EXPECT_TRUE(parser.HasMetadata());
+ RefPtr<MediaByteBuffer> metadataBuffer = parser.Metadata();
+ EXPECT_TRUE(metadataBuffer);
+
+ EXPECT_FALSE(parser.mInitRange.IsEmpty());
+ const MediaByteRangeSet byteRanges(
+ MediaByteRange(0, int64_t(buffer.Length())));
+ EXPECT_EQ(tests[test].mValidMoof,
+ parser.RebuildFragmentedIndex(byteRanges));
+ if (tests[test].mMoofReachedOffset == 0) {
+ EXPECT_EQ(buffer.Length(), parser.mOffset);
+ EXPECT_TRUE(parser.ReachedEnd());
+ } else {
+ EXPECT_EQ(tests[test].mMoofReachedOffset, parser.mOffset);
+ EXPECT_FALSE(parser.ReachedEnd());
+ }
+
+ EXPECT_FALSE(parser.mInitRange.IsEmpty());
+ EXPECT_TRUE(parser.GetCompositionRange(byteRanges).IsNull());
+ EXPECT_TRUE(parser.FirstCompleteMediaSegment().IsEmpty());
+ EXPECT_EQ(tests[test].mHeader,
+ !parser.FirstCompleteMediaHeader().IsEmpty());
+ }
}
}
// Bug 1224019: This test produces way to much output, disabling for now.
#if 0
TEST(stagefright_MoofParser, test_case_mp4_subsets)
{
const size_t step = 1u;