Bug 1237836 - Add support for MetadataTags to MediaFormatReader. r=?jya draft
authorChris Pearce <cpearce@mozilla.com>
Fri, 08 Jan 2016 13:22:53 +1300
changeset 319865 db705d12d2caaaf48af8d01e974d4c0634f31a3a
parent 319863 b4d9c2dd5f7aa41a59138482956400da38b8b9f1
child 512662 c46813f9c695319b04ecba65296d7938cd28c0c3
push id9106
push usercpearce@mozilla.com
push dateFri, 08 Jan 2016 00:25:15 +0000
bugs1237836
milestone46.0a1
Bug 1237836 - Add support for MetadataTags to MediaFormatReader. r=?jya
dom/media/MediaFormatReader.cpp
dom/media/MediaInfo.h
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -265,41 +265,49 @@ MediaFormatReader::AsyncReadMetadata()
 void
 MediaFormatReader::OnDemuxerInitDone(nsresult)
 {
   MOZ_ASSERT(OnTaskQueue());
   mDemuxerInitRequest.Complete();
 
   mDemuxerInitDone = true;
 
+  UniquePtr<MetadataTags> tags(MakeUnique<MetadataTags>());
+
   // To decode, we need valid video and a place to put it.
   bool videoActive = !!mDemuxer->GetNumberTracks(TrackInfo::kVideoTrack) &&
     GetImageContainer();
 
   if (videoActive) {
     // We currently only handle the first video track.
     mVideo.mTrackDemuxer = mDemuxer->GetTrackDemuxer(TrackInfo::kVideoTrack, 0);
     if (!mVideo.mTrackDemuxer) {
       mMetadataPromise.Reject(ReadMetadataFailureReason::METADATA_ERROR, __func__);
       return;
     }
     mInfo.mVideo = *mVideo.mTrackDemuxer->GetInfo()->GetAsVideoInfo();
+    for (const MetadataTag& tag : mVideo.mTrackDemuxer->GetInfo()->mTags) {
+      tags->Put(tag.mKey, tag.mValue);
+    }
     mVideo.mCallback = new DecoderCallback(this, TrackInfo::kVideoTrack);
     mVideo.mTimeRanges = mVideo.mTrackDemuxer->GetBuffered();
     mTrackDemuxersMayBlock |= mVideo.mTrackDemuxer->GetSamplesMayBlock();
   }
 
   bool audioActive = !!mDemuxer->GetNumberTracks(TrackInfo::kAudioTrack);
   if (audioActive) {
     mAudio.mTrackDemuxer = mDemuxer->GetTrackDemuxer(TrackInfo::kAudioTrack, 0);
     if (!mAudio.mTrackDemuxer) {
       mMetadataPromise.Reject(ReadMetadataFailureReason::METADATA_ERROR, __func__);
       return;
     }
     mInfo.mAudio = *mAudio.mTrackDemuxer->GetInfo()->GetAsAudioInfo();
+    for (const MetadataTag& tag : mAudio.mTrackDemuxer->GetInfo()->mTags) {
+      tags->Put(tag.mKey, tag.mValue);
+    }
     mAudio.mCallback = new DecoderCallback(this, TrackInfo::kAudioTrack);
     mAudio.mTimeRanges = mAudio.mTrackDemuxer->GetBuffered();
     mTrackDemuxersMayBlock |= mAudio.mTrackDemuxer->GetSamplesMayBlock();
   }
 
   UniquePtr<EncryptionInfo> crypto = mDemuxer->GetCrypto();
 
   mIsEncrypted = crypto && crypto->IsEncrypted();
@@ -328,17 +336,17 @@ MediaFormatReader::OnDemuxerInitDone(nsr
   if (!videoActive && !audioActive) {
     mMetadataPromise.Reject(ReadMetadataFailureReason::METADATA_ERROR, __func__);
     return;
   }
 
   mInitDone = true;
   RefPtr<MetadataHolder> metadata = new MetadataHolder();
   metadata->mInfo = mInfo;
-  metadata->mTags = nullptr;
+  metadata->mTags = tags->Count() ? tags.release() : nullptr;
   mMetadataPromise.Resolve(metadata, __func__);
 }
 
 void
 MediaFormatReader::OnDemuxerInitFailed(DemuxerFailureReason aFailure)
 {
   mDemuxerInitRequest.Complete();
   mMetadataPromise.Reject(ReadMetadataFailureReason::METADATA_ERROR, __func__);
--- a/dom/media/MediaInfo.h
+++ b/dom/media/MediaInfo.h
@@ -18,16 +18,27 @@
 #include "TimeUnits.h"
 
 namespace mozilla {
 
 class AudioInfo;
 class VideoInfo;
 class TextInfo;
 
+class MetadataTag {
+public:
+  MetadataTag(const nsACString& aKey,
+              const nsACString& aValue)
+    : mKey(aKey)
+    , mValue(aValue)
+  {}
+  nsCString mKey;
+  nsCString mValue;
+};
+
 class TrackInfo {
 public:
   enum TrackType {
     kUndefinedTrack,
     kAudioTrack,
     kVideoTrack,
     kTextTrack
   };
@@ -75,16 +86,18 @@ public:
 
   TrackID mTrackId;
 
   nsCString mMimeType;
   int64_t mDuration;
   int64_t mMediaTime;
   CryptoTrack mCrypto;
 
+  nsTArray<MetadataTag> mTags;
+
   // True if the track is gonna be (decrypted)/decoded and
   // rendered directly by non-gecko components.
   bool mIsRenderedExternally;
 
   virtual AudioInfo* GetAsAudioInfo()
   {
     return nullptr;
   }