Bug 1110608 - Add CENC support to MoofParser; r=edwin, a=sledru
authorAnthony Jones <ajones@mozilla.com>
Fri, 12 Dec 2014 18:53:45 +1300
changeset 242510 c4fdc95dd1fc20c5103530f0cc723e73ba7ad5a2
parent 242509 a6f176bb961f229255d31f46bccbe1aa2488b6f2
child 242511 548a7408f76b5603d24762793d9c77cdf8ec9730
push id4311
push userraliiev@mozilla.com
push dateMon, 12 Jan 2015 19:37:41 +0000
treeherdermozilla-beta@150c9fed433b [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersedwin, sledru
bugs1110608
milestone36.0a2
Bug 1110608 - Add CENC support to MoofParser; r=edwin, a=sledru
media/libstagefright/binding/Index.cpp
media/libstagefright/binding/MoofParser.cpp
media/libstagefright/binding/mp4_demuxer.cpp
--- a/media/libstagefright/binding/Index.cpp
+++ b/media/libstagefright/binding/Index.cpp
@@ -121,16 +121,18 @@ MP4Sample* SampleIterator::GetNext()
     sample->crypto.valid = true;
     reader.ReadArray(sample->crypto.iv, 16);
     if (reader.Remaining()) {
       uint16_t count = reader.ReadU16();
       for (size_t i = 0; i < count; i++) {
         sample->crypto.plain_sizes.AppendElement(reader.ReadU16());
         sample->crypto.encrypted_sizes.AppendElement(reader.ReadU32());
       }
+      reader.ReadArray(sample->crypto.iv, 16);
+      sample->crypto.iv_size = 16;
     }
   }
 
   return sample.forget();
 }
 
 Sample* SampleIterator::Get()
 {
--- a/media/libstagefright/binding/MoofParser.cpp
+++ b/media/libstagefright/binding/MoofParser.cpp
@@ -242,28 +242,28 @@ Moof::ProcessCenc()
 void
 Moof::ParseTraf(Box& aBox, Trex& aTrex, Mdhd& aMdhd, Edts& aEdts)
 {
   Tfhd tfhd(aTrex);
   Tfdt tfdt;
   for (Box box = aBox.FirstChild(); box.IsAvailable(); box = box.Next()) {
     if (box.IsType("tfhd")) {
       tfhd = Tfhd(box, aTrex);
-    } else if (box.IsType("tfdt")) {
-      if (!aTrex.mTrackId || tfhd.mTrackId == aTrex.mTrackId) {
-        tfdt = Tfdt(box);
-      }
-    } else if (box.IsType("trun")) {
+    } else {
       if (!aTrex.mTrackId || tfhd.mTrackId == aTrex.mTrackId) {
-        ParseTrun(box, tfhd, tfdt, aMdhd, aEdts);
+        if (box.IsType("tfdt")) {
+          tfdt = Tfdt(box);
+        } else if (box.IsType("trun")) {
+            ParseTrun(box, tfhd, tfdt, aMdhd, aEdts);
+        } else if (box.IsType("saiz")) {
+          mSaizs.AppendElement(Saiz(box));
+        } else if (box.IsType("saio")) {
+          mSaios.AppendElement(Saio(box));
+        }
       }
-    } else if (box.IsType("saiz")) {
-      mSaizs.AppendElement(Saiz(box));
-    } else if (box.IsType("saio")) {
-      mSaios.AppendElement(Saio(box));
     }
   }
 }
 
 void
 Moof::FixRounding(const Moof& aMoof) {
   Microseconds gap = aMoof.mTimeRange.start - mTimeRange.end;
   if (gap > 0 && gap <= mMaxRoundingError) {
--- a/media/libstagefright/binding/mp4_demuxer.cpp
+++ b/media/libstagefright/binding/mp4_demuxer.cpp
@@ -106,30 +106,30 @@ MP4Demuxer::Init()
       if (track->start() != OK) {
         return false;
       }
       mPrivate->mAudio = track;
       mAudioConfig.Update(metaData, mimeType);
       nsRefPtr<Index> index = new Index(mPrivate->mAudio->exportIndex(),
                                         mSource, mAudioConfig.mTrackId);
       mPrivate->mIndexes.AppendElement(index);
-      if (index->IsFragmented() && !mAudioConfig.crypto.valid) {
+      if (index->IsFragmented()) {
         mPrivate->mAudioIterator = new SampleIterator(index);
       }
     } else if (!mPrivate->mVideo.get() && !strncmp(mimeType, "video/", 6)) {
       sp<MediaSource> track = e->getTrack(i);
       if (track->start() != OK) {
         return false;
       }
       mPrivate->mVideo = track;
       mVideoConfig.Update(metaData, mimeType);
       nsRefPtr<Index> index = new Index(mPrivate->mVideo->exportIndex(),
                                         mSource, mVideoConfig.mTrackId);
       mPrivate->mIndexes.AppendElement(index);
-      if (index->IsFragmented() && !mVideoConfig.crypto.valid) {
+      if (index->IsFragmented()) {
         mPrivate->mVideoIterator = new SampleIterator(index);
       }
     }
   }
   sp<MetaData> metaData = e->getMetaData();
   mCrypto.Update(metaData);
 
   return mPrivate->mAudio.get() || mPrivate->mVideo.get();
@@ -214,17 +214,16 @@ MP4Sample*
 MP4Demuxer::DemuxVideoSample()
 {
   if (mPrivate->mVideoIterator) {
     nsAutoPtr<MP4Sample> sample(mPrivate->mVideoIterator->GetNext());
     if (sample) {
       sample->prefix_data = mVideoConfig.annex_b;
       if (sample->crypto.valid) {
         sample->crypto.mode = mVideoConfig.crypto.mode;
-        sample->crypto.iv_size = mVideoConfig.crypto.iv_size;
         sample->crypto.key.AppendElements(mVideoConfig.crypto.key);
       }
     }
     return sample.forget();
   }
 
   nsAutoPtr<MP4Sample> sample(new MP4Sample());
   status_t status =