diff --git a/dom/media/ADTSDemuxer.cpp b/dom/media/ADTSDemuxer.cpp index 5d32e29cc7..cb4fe61541 100644 --- a/dom/media/ADTSDemuxer.cpp +++ b/dom/media/ADTSDemuxer.cpp @@ -840,4 +840,26 @@ ADTSTrackDemuxer::AverageFrameLength() const return 0.0; } +/* static */ bool +ADTSDemuxer::ADTSSniffer(const uint8_t* aData, const uint32_t aLength) +{ + if (aLength < 7) { + return false; + } + auto parser = MakeUnique(); + + 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 diff --git a/dom/media/ADTSDemuxer.h b/dom/media/ADTSDemuxer.h index e1daa29e67..fcd3b1f272 100644 --- a/dom/media/ADTSDemuxer.h +++ b/dom/media/ADTSDemuxer.h @@ -32,6 +32,9 @@ public: 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();