Bug 1240412 - add VP9-in-MP4 support to Rust demuxer. r=rillian draft
authorAlfredo.Yang <ayang@mozilla.com>
Mon, 29 Aug 2016 14:37:22 +0800
changeset 411434 d6ee4404eafef8a476767ebfd17a195f81dcf275
parent 411433 77940cbf0c2a9f52c209fbbde5b2e7d4c74a1501
child 530731 3efb7fd26df918be3e4fcfe35fc8eb93ad6dd59e
push id28896
push userbmo:ayang@mozilla.com
push dateThu, 08 Sep 2016 02:54:08 +0000
reviewersrillian
bugs1240412
milestone51.0a1
Bug 1240412 - add VP9-in-MP4 support to Rust demuxer. r=rillian MozReview-Commit-ID: 1Yq8OOV3kvM
dom/media/platforms/agnostic/VPXDecoder.cpp
media/libstagefright/binding/MP4Metadata.cpp
--- a/dom/media/platforms/agnostic/VPXDecoder.cpp
+++ b/dom/media/platforms/agnostic/VPXDecoder.cpp
@@ -23,16 +23,18 @@ using namespace gfx;
 using namespace layers;
 
 static int MimeTypeToCodec(const nsACString& aMimeType)
 {
   if (aMimeType.EqualsLiteral("video/webm; codecs=vp8")) {
     return VPXDecoder::Codec::VP8;
   } else if (aMimeType.EqualsLiteral("video/webm; codecs=vp9")) {
     return VPXDecoder::Codec::VP9;
+  } else if (aMimeType.EqualsLiteral("video/vp9")) {
+    return VPXDecoder::Codec::VP9;
   }
   return -1;
 }
 
 VPXDecoder::VPXDecoder(const CreateDecoderParams& aParams)
   : mImageContainer(aParams.mImageContainer)
   , mTaskQueue(aParams.mTaskQueue)
   , mCallback(aParams.mCallback)
@@ -225,17 +227,19 @@ VPXDecoder::Drain()
 
 /* static */
 bool
 VPXDecoder::IsVPX(const nsACString& aMimeType, uint8_t aCodecMask)
 {
   return ((aCodecMask & VPXDecoder::VP8) &&
           aMimeType.EqualsLiteral("video/webm; codecs=vp8")) ||
          ((aCodecMask & VPXDecoder::VP9) &&
-          aMimeType.EqualsLiteral("video/webm; codecs=vp9"));
+          aMimeType.EqualsLiteral("video/webm; codecs=vp9")) ||
+         ((aCodecMask & VPXDecoder::VP9) &&
+          aMimeType.EqualsLiteral("video/vp9"));
 }
 
 /* static */
 bool
 VPXDecoder::IsVP8(const nsACString& aMimeType)
 {
   return IsVPX(aMimeType, VPXDecoder::VP8);
 }
--- a/media/libstagefright/binding/MP4Metadata.cpp
+++ b/media/libstagefright/binding/MP4Metadata.cpp
@@ -239,16 +239,27 @@ bool MP4Metadata::ShouldPreferRust() con
     auto info = mRust->GetTrackInfo(TrackInfo::kAudioTrack, i);
     if (!info) {
       return false;
     }
     if (info->mMimeType.EqualsASCII("audio/opus")) {
       return true;
     }
   }
+
+  numTracks = mRust->GetNumberTracks(TrackInfo::kVideoTrack);
+  for (auto i = 0; i < numTracks; i++) {
+    auto info = mRust->GetTrackInfo(TrackInfo::kVideoTrack, i);
+    if (!info) {
+      return false;
+    }
+    if (info->mMimeType.EqualsASCII("video/vp9")) {
+      return true;
+    }
+  }
   // Otherwise, fall back.
   return false;
 }
 #endif // MOZ_RUST_MP4PARSE
 
 mozilla::UniquePtr<mozilla::TrackInfo>
 MP4Metadata::GetTrackInfo(mozilla::TrackInfo::TrackType aType,
                           size_t aTrackNumber) const
@@ -281,16 +292,21 @@ const CryptoFile&
 MP4Metadata::Crypto() const
 {
   return mStagefright->Crypto();
 }
 
 bool
 MP4Metadata::ReadTrackIndex(FallibleTArray<Index::Indice>& aDest, mozilla::TrackID aTrackID)
 {
+#ifdef MOZ_RUST_MP4PARSE
+  if (mRust && mPreferRust) {
+    return mRust->ReadTrackIndex(aDest, aTrackID);
+  }
+#endif
   return mStagefright->ReadTrackIndex(aDest, aTrackID);
 }
 
 static inline bool
 ConvertIndex(FallibleTArray<Index::Indice>& aDest,
              const nsTArray<stagefright::MediaSource::Indice>& aIndex,
              int64_t aMediaTime)
 {
@@ -726,17 +742,29 @@ MP4MetadataRust::Crypto() const
 {
   MOZ_ASSERT(false, "Not yet implemented");
   return mCrypto;
 }
 
 bool
 MP4MetadataRust::ReadTrackIndex(FallibleTArray<Index::Indice>& aDest, mozilla::TrackID aTrackID)
 {
+  uint8_t fragmented = false;
+  int32_t rv = mp4parse_is_fragmented(mRustParser.get(), aTrackID, &fragmented);
+  if (rv != MP4PARSE_OK) {
+    return false;
+  }
+
+  if (fragmented) {
+    return true;
+  }
+
+  // For non-fragmented mp4.
   MOZ_ASSERT(false, "Not yet implemented");
+
   return false;
 }
 
 /*static*/ bool
 MP4MetadataRust::HasCompleteMetadata(Stream* aSource)
 {
   MOZ_ASSERT(false, "Not yet implemented");
   return false;