Remove the Timer parameters from timer callbacks
[WebKit-https.git] / Source / WebCore / platform / graphics / avfoundation / objc / MediaPlayerPrivateMediaSourceAVFObjC.h
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef MediaPlayerPrivateMediaSourceAVFObjC_h
27 #define MediaPlayerPrivateMediaSourceAVFObjC_h
28
29 #if ENABLE(MEDIA_SOURCE) && USE(AVFOUNDATION)
30
31 #include "MediaPlayerPrivate.h"
32 #include "SourceBufferPrivateClient.h"
33 #include <wtf/MediaTime.h>
34 #include <wtf/Vector.h>
35 #include <wtf/WeakPtr.h>
36
37 OBJC_CLASS AVAsset;
38 OBJC_CLASS AVSampleBufferAudioRenderer;
39 OBJC_CLASS AVSampleBufferDisplayLayer;
40 OBJC_CLASS AVSampleBufferRenderSynchronizer;
41 OBJC_CLASS AVStreamSession;
42
43 typedef struct OpaqueCMTimebase* CMTimebaseRef;
44
45 namespace WebCore {
46
47 class CDMSessionMediaSourceAVFObjC;
48 class PlatformClockCM;
49 class MediaSourcePrivateAVFObjC;
50
51 class MediaPlayerPrivateMediaSourceAVFObjC : public MediaPlayerPrivateInterface {
52 public:
53     MediaPlayerPrivateMediaSourceAVFObjC(MediaPlayer*);
54     virtual ~MediaPlayerPrivateMediaSourceAVFObjC();
55
56     static void registerMediaEngine(MediaEngineRegistrar);
57
58     // MediaPlayer Factory Methods
59     static PassOwnPtr<MediaPlayerPrivateInterface> create(MediaPlayer*);
60     static bool isAvailable();
61     static void getSupportedTypes(HashSet<String>& types);
62     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
63
64     void addDisplayLayer(AVSampleBufferDisplayLayer*);
65     void removeDisplayLayer(AVSampleBufferDisplayLayer*);
66
67     void addAudioRenderer(AVSampleBufferAudioRenderer*);
68     void removeAudioRenderer(AVSampleBufferAudioRenderer*);
69
70     virtual MediaPlayer::NetworkState networkState() const override;
71     virtual MediaPlayer::ReadyState readyState() const override;
72     void setReadyState(MediaPlayer::ReadyState);
73     void setNetworkState(MediaPlayer::NetworkState);
74
75     void seekInternal();
76     void waitForSeekCompleted();
77     void seekCompleted();
78     void setLoadingProgresssed(bool flag) { m_loadingProgressed = flag; }
79     void setHasAvailableVideoFrame(bool flag) { m_hasAvailableVideoFrame = flag; }
80     void durationChanged();
81
82     void effectiveRateChanged();
83     void sizeChanged();
84     void characteristicsChanged();
85
86 #if ENABLE(ENCRYPTED_MEDIA_V2)
87     bool hasStreamSession() { return m_streamSession; }
88     AVStreamSession *streamSession();
89     virtual void setCDMSession(CDMSession*) override;
90     void keyNeeded(Uint8Array*);
91 #endif
92
93     WeakPtr<MediaPlayerPrivateMediaSourceAVFObjC> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
94
95 private:
96     // MediaPlayerPrivateInterface
97     virtual void load(const String& url) override;
98     virtual void load(const String& url, MediaSourcePrivateClient*) override;
99     virtual void cancelLoad() override;
100
101     virtual void prepareToPlay() override;
102     virtual PlatformMedia platformMedia() const override;
103     virtual PlatformLayer* platformLayer() const override;
104
105     virtual void play() override;
106     void playInternal();
107
108     virtual void pause() override;
109     void pauseInternal();
110
111     virtual bool paused() const override;
112
113     virtual void setVolume(float volume) override;
114     virtual bool supportsMuting() const override { return true; }
115     virtual void setMuted(bool) override;
116
117     virtual bool supportsScanning() const override;
118
119     virtual IntSize naturalSize() const override;
120
121     virtual bool hasVideo() const override;
122     virtual bool hasAudio() const override;
123
124     virtual void setVisible(bool) override;
125
126     virtual MediaTime durationMediaTime() const override;
127     virtual MediaTime currentMediaTime() const override;
128     virtual MediaTime startTime() const override;
129     virtual MediaTime initialTime() const override;
130
131     virtual void seekWithTolerance(const MediaTime&, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold) override;
132     virtual bool seeking() const override;
133     virtual void setRateDouble(double) override;
134
135     virtual std::unique_ptr<PlatformTimeRanges> seekable() const override;
136     virtual MediaTime maxMediaTimeSeekable() const override;
137     virtual MediaTime minMediaTimeSeekable() const override;
138     virtual std::unique_ptr<PlatformTimeRanges> buffered() const override;
139
140     virtual bool didLoadingProgress() const override;
141
142     virtual void setSize(const IntSize&) override;
143
144     virtual void paint(GraphicsContext*, const IntRect&) override;
145     virtual void paintCurrentFrameInContext(GraphicsContext*, const IntRect&) override;
146
147     virtual bool hasAvailableVideoFrame() const override;
148
149     virtual bool supportsAcceleratedRendering() const override;
150     // called when the rendering system flips the into or out of accelerated rendering mode.
151     virtual void acceleratedRenderingStateChanged() override;
152
153     virtual MediaPlayer::MovieLoadType movieLoadType() const override;
154
155     virtual void prepareForRendering() override;
156
157     virtual String engineDescription() const override;
158
159     virtual String languageOfPrimaryAudioTrack() const override;
160
161     virtual size_t extraMemoryCost() const override;
162
163     virtual unsigned long totalVideoFrames() override;
164     virtual unsigned long droppedVideoFrames() override;
165     virtual unsigned long corruptedVideoFrames() override;
166     virtual MediaTime totalFrameDelay() override;
167
168     void ensureLayer();
169     void destroyLayer();
170     bool shouldBePlaying() const;
171     void seekTimerFired();
172
173     friend class MediaSourcePrivateAVFObjC;
174
175     struct PendingSeek {
176         PendingSeek(const MediaTime& targetTime, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold)
177             : targetTime(targetTime)
178             , negativeThreshold(negativeThreshold)
179             , positiveThreshold(positiveThreshold)
180         {
181         }
182         MediaTime targetTime;
183         MediaTime negativeThreshold;
184         MediaTime positiveThreshold;
185     };
186     std::unique_ptr<PendingSeek> m_pendingSeek;
187
188     MediaPlayer* m_player;
189     WeakPtrFactory<MediaPlayerPrivateMediaSourceAVFObjC> m_weakPtrFactory;
190     RefPtr<MediaSourcePrivateAVFObjC> m_mediaSourcePrivate;
191     RetainPtr<AVAsset> m_asset;
192     RetainPtr<AVSampleBufferDisplayLayer> m_sampleBufferDisplayLayer;
193     Vector<RetainPtr<AVSampleBufferAudioRenderer>> m_sampleBufferAudioRenderers;
194     RetainPtr<AVSampleBufferRenderSynchronizer> m_synchronizer;
195     RetainPtr<id> m_timeJumpedObserver;
196     RetainPtr<id> m_durationObserver;
197     RetainPtr<AVStreamSession> m_streamSession;
198     Timer m_seekTimer;
199     CDMSessionMediaSourceAVFObjC* m_session;
200     MediaPlayer::NetworkState m_networkState;
201     MediaPlayer::ReadyState m_readyState;
202     MediaTime m_lastSeekTime;
203     double m_rate;
204     bool m_playing;
205     bool m_seeking;
206     bool m_seekCompleted;
207     mutable bool m_loadingProgressed;
208     bool m_hasAvailableVideoFrame;
209 };
210
211 }
212
213 #endif // ENABLE(MEDIA_SOURCE) && USE(AVFOUNDATION)
214
215 #endif // MediaPlayerPrivateMediaSourceAVFObjC_h
216