Bug 1355933: P4. Add ADTS sniffer. r?kamidphish draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Thu, 13 Apr 2017 02:39:54 +0200
changeset 561792 8692900f4cc9a212dea893789e901b9e77b1d951
parent 561791 6cdd8fe84bfdc136606fb5cc990396d100f4e0b3
child 561793 e8f62b65d795e3870f11a43f957f7728840d1bad
push id53869
push userbmo:jyavenard@mozilla.com
push dateThu, 13 Apr 2017 07:09:28 +0000
reviewerskamidphish
bugs1355933
milestone55.0a1
Bug 1355933: P4. Add ADTS sniffer. r?kamidphish MozReview-Commit-ID: CjRZKtPVqcU
dom/media/ADTSDemuxer.cpp
dom/media/ADTSDemuxer.h
--- a/dom/media/ADTSDemuxer.cpp
+++ b/dom/media/ADTSDemuxer.cpp
@@ -848,9 +848,31 @@ ADTSTrackDemuxer::AverageFrameLength() c
 {
   if (mNumParsedFrames) {
     return static_cast<double>(mTotalFrameLen) / mNumParsedFrames;
   }
 
   return 0.0;
 }
 
+/* static */ bool
+ADTSDemuxer::ADTSSniffer(const uint8_t* aData, const uint32_t aLength)
+{
+  if (aLength < 7) {
+    return false;
+  }
+  auto parser = MakeUnique<adts::FrameParser>();
+
+  if (!parser->Parse(0, aData, aData + aLength)) {
+    return false;
+  }
+  const adts::Frame& currentFrame = parser->CurrentFrame();
+  // Check for sync marker after the found frame, since it's
+  // possible to find sync marker in AAC data. If sync marker
+  // exists after the current frame then we've found a frame
+  // header.
+  int64_t nextFrameHeaderOffset = currentFrame.Offset() + currentFrame.Length();
+  return int64_t(aLength) > nextFrameHeaderOffset &&
+         aLength - nextFrameHeaderOffset >= 2 &&
+         adts::FrameHeader::MatchesSync(aData + nextFrameHeaderOffset);
+}
+
 } // namespace mozilla
--- a/dom/media/ADTSDemuxer.h
+++ b/dom/media/ADTSDemuxer.h
@@ -29,16 +29,19 @@ public:
   explicit ADTSDemuxer(MediaResource* aSource);
   RefPtr<InitPromise> Init() override;
   bool HasTrackType(TrackInfo::TrackType aType) const override;
   uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override;
   already_AddRefed<MediaTrackDemuxer>
   GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber) override;
   bool IsSeekable() const override;
 
+  // Return true if a valid ADTS frame header could be found.
+  static bool ADTSSniffer(const uint8_t* aData, const uint32_t aLength);
+
 private:
   bool InitInternal();
 
   RefPtr<MediaResource> mSource;
   RefPtr<ADTSTrackDemuxer> mTrackDemuxer;
 };
 
 class ADTSTrackDemuxer : public MediaTrackDemuxer