Bug 1351152 - Run gtest for both Stagefright and Rust MP4 parsers - r?alfredo draft
authorGerald Squelart <gsquelart@mozilla.com>
Tue, 28 Mar 2017 13:54:45 +1100
changeset 552185 85df897ca5ca6cf273f4df954d62bcf0231fbef6
parent 552146 5182b2c4b963ed87d038c7d9a4021463917076cd
child 552186 cdd3f83b8fc47958a6a3d99ed3b0f0c14570e018
push id51277
push usergsquelart@mozilla.com
push dateTue, 28 Mar 2017 04:36:32 +0000
reviewersalfredo
bugs1351152
milestone55.0a1
Bug 1351152 - Run gtest for both Stagefright and Rust MP4 parsers - r?alfredo MozReview-Commit-ID: BSaMIi6UnVz
media/libstagefright/gtest/TestParser.cpp
--- 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;