fune/dom/media/ADTSDemuxer.h
Iulian Moraru 8869ba4cf1 Backed out 25 changesets (bug 1858958, bug 1859536, bug 1749044) for causing multiple build bustages on GleanMetricsBinding.cpp. CLOSED TREE
Backed out changeset ef3fdc0aff0b (bug 1749044)
Backed out changeset 1a7064c0b046 (bug 1749044)
Backed out changeset cfeaef572769 (bug 1749044)
Backed out changeset 3c961124ae96 (bug 1749044)
Backed out changeset 9fc353b8689f (bug 1749044)
Backed out changeset b8ef52c64b38 (bug 1749044)
Backed out changeset 4a4df823adf4 (bug 1749044)
Backed out changeset 6236dad2f515 (bug 1749044)
Backed out changeset fb81fa706f77 (bug 1858958)
Backed out changeset 82415829c98e (bug 1749044)
Backed out changeset 604de77ebdb0 (bug 1749044)
Backed out changeset 2766ff1803eb (bug 1749044)
Backed out changeset 51a9560dca83 (bug 1749044)
Backed out changeset 2cc1feaa4278 (bug 1749044)
Backed out changeset c41a5aac3192 (bug 1858958)
Backed out changeset db5ccbbdbbee (bug 1859536)
Backed out changeset 8b9076bc479a (bug 1859536)
Backed out changeset 27b465fe92a3 (bug 1858958)
Backed out changeset 9aa8c8ed1ff7 (bug 1858958)
Backed out changeset 94c203600f2c (bug 1858958)
Backed out changeset 8f0d8d45d132 (bug 1858958)
Backed out changeset eb8c734baad4 (bug 1858958)
Backed out changeset c5b578de93bc (bug 1858958)
Backed out changeset 5e6e4e89d29f (bug 1858958)
Backed out changeset b76bd797f69d (bug 1858958)
2024-03-06 14:15:50 +02:00

152 lines
4.7 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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"
namespace mozilla {
namespace adts {
class Frame;
class FrameParser;
} // namespace adts
class ADTSTrackDemuxer;
DDLoggedTypeDeclNameAndBase(ADTSDemuxer, MediaDataDemuxer);
class ADTSDemuxer : public MediaDataDemuxer,
public DecoderDoctorLifeLogger<ADTSDemuxer> {
public:
// MediaDataDemuxer interface.
explicit ADTSDemuxer(MediaResource* aSource);
RefPtr<InitPromise> Init() 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;
};
DDLoggedTypeNameAndBase(ADTSTrackDemuxer, MediaTrackDemuxer);
class ADTSTrackDemuxer : public MediaTrackDemuxer,
public DecoderDoctorLifeLogger<ADTSTrackDemuxer> {
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(const media::TimeUnit& aTime) override;
RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override;
void Reset() override;
RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(
const 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(uint64_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.
uint32_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.
uint64_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;
// Amount of pre-roll time when seeking.
// AAC encoder delay is by default 2112 audio frames.
media::TimeUnit mPreRoll;
};
} // namespace mozilla
#endif // !ADTS_DEMUXER_H_