Bug-1259355 Test draft
authorJames Cheng <jacheng@mozilla.com>
Thu, 27 Jul 2017 17:25:39 +0800
changeset 616656 f48f027730af978342c6d2cbb0d113ff6feef9ab
parent 614172 b078c82a2d6940d996957c8eeedc572510d88e9c
child 639543 01293ca92f0b377d3e48ff15e4273dc90c5cf3ed
push id70759
push userbmo:jacheng@mozilla.com
push dateThu, 27 Jul 2017 09:28:08 +0000
bugs1259355
milestone56.0a1
Bug-1259355 Test MozReview-Commit-ID: H1EaEpxtal9
dom/media/fmp4/MP4Demuxer.cpp
--- a/dom/media/fmp4/MP4Demuxer.cpp
+++ b/dom/media/fmp4/MP4Demuxer.cpp
@@ -71,16 +71,18 @@ private:
   RefPtr<mp4_demuxer::Index> mIndex;
   UniquePtr<mp4_demuxer::SampleIterator> mIterator;
   Maybe<media::TimeUnit> mNextKeyframeTime;
   // Queued samples extracted by the demuxer, but not yet returned.
   RefPtr<MediaRawData> mQueuedSample;
   bool mNeedReIndex;
   bool mNeedSPSForTelemetry;
   bool mIsH264 = false;
+  bool mTolerateBadMuxed = false;
+  uint32_t mMisMatchCount = 0;
 };
 
 
 // Returns true if no SPS was found and search for it should continue.
 bool
 AccumulateSPSTelemetry(const MediaByteBuffer* aExtradata)
 {
   mp4_demuxer::SPSData spsdata;
@@ -440,25 +442,31 @@ MP4TrackDemuxer::GetNextSample()
       mp4_demuxer::H264::FrameType type =
         mp4_demuxer::H264::GetFrameType(sample);
       switch (type) {
         case mp4_demuxer::H264::FrameType::I_FRAME: MOZ_FALLTHROUGH;
         case mp4_demuxer::H264::FrameType::OTHER:
         {
           bool keyframe = type == mp4_demuxer::H264::FrameType::I_FRAME;
           if (sample->mKeyframe != keyframe) {
+            mMisMatchCount++;
+            if (mMisMatchCount > 5) {
+              mTolerateBadMuxed = true;
+            }
             NS_WARNING(nsPrintfCString("Frame incorrectly marked as %skeyframe "
                                        "@ pts:%" PRId64 " dur:%" PRId64
                                        " dts:%" PRId64,
                                        keyframe ? "" : "non-",
                                        sample->mTime.ToMicroseconds(),
                                        sample->mDuration.ToMicroseconds(),
                                        sample->mTimecode.ToMicroseconds())
                          .get());
-            sample->mKeyframe = keyframe;
+            if (!mTolerateBadMuxed) {
+              sample->mKeyframe = keyframe;
+            }
           }
           break;
         }
         case mp4_demuxer::H264::FrameType::INVALID:
           NS_WARNING(
             nsPrintfCString("Invalid H264 frame @ pts:%" PRId64 " dur:%" PRId64
                             " dts:%" PRId64,
                             sample->mTime.ToMicroseconds(),