1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
10 #include "mozilla/AbstractThread.h"
11 #include "mozilla/RefPtr.h"
12 #include "nsISupportsImpl.h"
14 #include "MediaEventSource.h"
15 #include "MediaFormatReader.h"
16 #include "MediaPromiseDefs.h"
21 * A wrapper around MediaFormatReader to offset the timestamps of Audio/Video
22 * samples by the start time to ensure MDSM can always assume zero start time.
23 * It also adjusts the seek target passed to Seek() to ensure correct seek time
24 * is passed to the underlying reader.
27 using MetadataPromise
= MediaFormatReader::MetadataPromise
;
28 using AudioDataPromise
= MediaFormatReader::AudioDataPromise
;
29 using VideoDataPromise
= MediaFormatReader::VideoDataPromise
;
30 using SeekPromise
= MediaFormatReader::SeekPromise
;
31 using WaitForDataPromise
= MediaFormatReader::WaitForDataPromise
;
32 using TrackSet
= MediaFormatReader::TrackSet
;
33 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ReaderProxy
);
36 ReaderProxy(AbstractThread
* aOwnerThread
, MediaFormatReader
* aReader
);
38 media::TimeUnit
StartTime() const;
39 RefPtr
<MetadataPromise
> ReadMetadata();
41 RefPtr
<AudioDataPromise
> RequestAudioData();
43 RefPtr
<VideoDataPromise
> RequestVideoData(
44 const media::TimeUnit
& aTimeThreshold
, bool aRequestNextVideoKeyFrame
);
46 RefPtr
<WaitForDataPromise
> WaitForData(MediaData::Type aType
);
48 RefPtr
<SeekPromise
> Seek(const SeekTarget
& aTarget
);
49 RefPtr
<ShutdownPromise
> Shutdown();
51 void ReleaseResources();
52 void ResetDecode(TrackSet aTracks
);
54 nsresult
Init() { return mReader
->Init(); }
55 bool UseBufferingHeuristics() const {
56 return mReader
->UseBufferingHeuristics();
59 bool VideoIsHardwareAccelerated() const {
60 return mReader
->VideoIsHardwareAccelerated();
62 TimedMetadataEventSource
& TimedMetadataEvent() {
63 return mReader
->TimedMetadataEvent();
65 MediaEventSource
<void>& OnMediaNotSeekable() {
66 return mReader
->OnMediaNotSeekable();
68 MediaEventProducer
<VideoInfo
, AudioInfo
>& OnTrackInfoUpdatedEvent() {
69 return mReader
->OnTrackInfoUpdatedEvent();
71 size_t SizeOfAudioQueueInFrames() const {
72 return mReader
->SizeOfAudioQueueInFrames();
74 size_t SizeOfVideoQueueInFrames() const {
75 return mReader
->SizeOfVideoQueueInFrames();
77 void ReadUpdatedMetadata(MediaInfo
* aInfo
) {
78 mReader
->ReadUpdatedMetadata(aInfo
);
80 AbstractCanonical
<media::TimeIntervals
>* CanonicalBuffered() {
81 return mReader
->CanonicalBuffered();
84 RefPtr
<SetCDMPromise
> SetCDMProxy(CDMProxy
* aProxy
);
86 void SetVideoBlankDecode(bool aIsBlankDecode
);
88 void SetCanonicalDuration(
89 AbstractCanonical
<media::NullableTimeUnit
>* aCanonical
);
91 void UpdateMediaEngineId(uint64_t aMediaEngineId
);
95 RefPtr
<MetadataPromise
> OnMetadataRead(MetadataHolder
&& aMetadata
);
96 RefPtr
<MetadataPromise
> OnMetadataNotRead(const MediaResult
& aError
);
97 void UpdateDuration();
98 RefPtr
<SeekPromise
> SeekInternal(const SeekTarget
& aTarget
);
100 RefPtr
<ReaderProxy::AudioDataPromise
> OnAudioDataRequestCompleted(
101 RefPtr
<AudioData
> aAudio
);
102 RefPtr
<ReaderProxy::AudioDataPromise
> OnAudioDataRequestFailed(
103 const MediaResult
& aError
);
105 const RefPtr
<AbstractThread
> mOwnerThread
;
106 const RefPtr
<MediaFormatReader
> mReader
;
108 bool mShutdown
= false;
109 Maybe
<media::TimeUnit
> mStartTime
;
111 // State-watching manager.
112 WatchManager
<ReaderProxy
> mWatchManager
;
114 // Duration, mirrored from the state machine task queue.
115 Mirror
<media::NullableTimeUnit
> mDuration
;
118 } // namespace mozilla
120 #endif // ReaderProxy_h_