123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #ifndef ADTS_DEMUXER_H_
- #define ADTS_DEMUXER_H_
- #include "mozilla/Attributes.h"
- #include "mozilla/Maybe.h"
- #include "MediaDataDemuxer.h"
- #include "MediaResource.h"
- #include "mp4_demuxer/ByteReader.h"
- namespace mozilla {
- namespace adts {
- class Frame;
- class FrameParser;
- }
- class ADTSTrackDemuxer;
- class ADTSDemuxer : public MediaDataDemuxer {
- public:
- // MediaDataDemuxer interface.
- 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;
- private:
- bool InitInternal();
- RefPtr<MediaResource> mSource;
- RefPtr<ADTSTrackDemuxer> mTrackDemuxer;
- };
- class ADTSTrackDemuxer : public MediaTrackDemuxer {
- public:
- explicit ADTSTrackDemuxer(MediaResource* aSource);
- // Initializes the track demuxer by reading the first frame for meta data.
- // Returns initialization success state.
- bool Init();
- // Returns the total stream length if known, -1 otherwise.
- int64_t StreamLength() const;
- // Returns the estimated stream duration, or a 0-duration if unknown.
- media::TimeUnit Duration() const;
- // Returns the estimated duration up to the given frame number,
- // or a 0-duration if unknown.
- media::TimeUnit Duration(int64_t aNumFrames) const;
- // MediaTrackDemuxer interface.
- UniquePtr<TrackInfo> GetInfo() const override;
- RefPtr<SeekPromise> Seek(media::TimeUnit aTime) override;
- RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override;
- void Reset() override;
- RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(
- media::TimeUnit aTimeThreshold) override;
- int64_t GetResourceOffset() const override;
- media::TimeIntervals GetBuffered() override;
- private:
- // Destructor.
- ~ADTSTrackDemuxer();
- // Fast approximate seeking to given time.
- media::TimeUnit FastSeek(const media::TimeUnit& aTime);
- // Seeks by scanning the stream up to the given time for more accurate results.
- media::TimeUnit ScanUntil(const media::TimeUnit& aTime);
- // Finds the next valid frame and returns its byte range.
- const adts::Frame& FindNextFrame(bool findFirstFrame = false);
- // Skips the next frame given the provided byte range.
- bool SkipNextFrame(const adts::Frame& aFrame);
- // Returns the next ADTS frame, if available.
- already_AddRefed<MediaRawData> GetNextFrame(const adts::Frame& aFrame);
- // Updates post-read meta data.
- void UpdateState(const adts::Frame& aFrame);
- // Returns the frame index for the given offset.
- int64_t FrameIndexFromOffset(int64_t aOffset) const;
- // Returns the frame index for the given time.
- int64_t FrameIndexFromTime(const media::TimeUnit& aTime) const;
- // Reads aSize bytes into aBuffer from the source starting at aOffset.
- // Returns the actual size read.
- int32_t Read(uint8_t* aBuffer, int64_t aOffset, int32_t aSize);
- // Returns the average frame length derived from the previously parsed frames.
- double AverageFrameLength() const;
- // The (hopefully) ADTS resource.
- MediaResourceIndex mSource;
- // ADTS frame parser used to detect frames and extract side info.
- adts::FrameParser* mParser;
- // Current byte offset in the source stream.
- int64_t mOffset;
- // Total parsed frames.
- uint64_t mNumParsedFrames;
- // Current frame index.
- int64_t mFrameIndex;
- // Sum of parsed frames' lengths in bytes.
- uint64_t mTotalFrameLen;
- // Samples per frame metric derived from frame headers or 0 if none available.
- uint32_t mSamplesPerFrame;
- // Samples per second metric derived from frame headers or 0 if none available.
- uint32_t mSamplesPerSecond;
- // Channel count derived from frame headers or 0 if none available.
- uint32_t mChannels;
- // Audio track config info.
- UniquePtr<AudioInfo> mInfo;
- };
- } // mozilla
- #endif // !ADTS_DEMUXER_H_
|