Bug 1110608 - Add CENC support to MoofParser; r=edwin
authorAnthony Jones <ajones@mozilla.com>
Tue, 16 Dec 2014 18:10:46 +1300
changeset 219817 f3c3eafffc60a077231ba1dde8d00597cd2ee602
parent 219816 20f481cfd2d9478c069203c4e1fd6ab7da69e896
child 219818 54759604f407869be3a0c119b5160211e3fc412d
push id52933
push userajones@mozilla.com
push dateTue, 16 Dec 2014 05:10:59 +0000
treeherdermozilla-inbound@54759604f407 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersedwin
bugs1110608
milestone37.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1110608 - Add CENC support to MoofParser; r=edwin
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,26 @@ 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) {
+    } else if (!aTrex.mTrackId || tfhd.mTrackId == aTrex.mTrackId) {
+      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("trun")) {
-      if (!aTrex.mTrackId || tfhd.mTrackId == aTrex.mTrackId) {
-        ParseTrun(box, tfhd, tfdt, aMdhd, aEdts);
-      }
-    } 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 =