From e25b285ca77c05b4c503038d624454b04fc51e6a Mon Sep 17 00:00:00 2001 From: Moonchild Date: Sun, 29 Dec 2024 13:31:47 +0100 Subject: [PATCH] Issue #2673 - Part 2: Add ADTS format sniffer. --- dom/media/ADTSDemuxer.cpp | 22 ++++++++++++++++++++++ dom/media/ADTSDemuxer.h | 3 +++ 2 files changed, 25 insertions(+) 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();