Bug 1355933: P4. Add ADTS sniffer. r?kamidphish
MozReview-Commit-ID: CjRZKtPVqcU
--- 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