ea35e2000b8ecdec2908bb17c5acee15f14f4e48
[WebKit-https.git] / Source / WebCore / platform / graphics / mac / MediaPlayerPrivateQTKit.h
1 /*
2  * Copyright (C) 2007, 2008, 2009, 2010, 2011 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 MediaPlayerPrivateQTKit_h
27 #define MediaPlayerPrivateQTKit_h
28
29 #if ENABLE(VIDEO)
30
31 #include "MediaPlayerPrivate.h"
32 #include "Timer.h"
33 #include "FloatSize.h"
34 #include <wtf/RetainPtr.h>
35
36 #ifdef __OBJC__
37 #import <QTKit/QTTime.h>
38 #else
39 class QTTime;
40 #endif
41
42 OBJC_CLASS NSDictionary;
43 OBJC_CLASS NSMutableDictionary;
44 OBJC_CLASS QTMovie;
45 OBJC_CLASS QTMovieLayer;
46 OBJC_CLASS QTVideoRendererWebKitOnly;
47 OBJC_CLASS WebCoreMovieObserver;
48
49 namespace WebCore {
50     
51 class MediaPlayerPrivateQTKit : public MediaPlayerPrivateInterface {
52 public:
53     ~MediaPlayerPrivateQTKit();
54     WEBCORE_EXPORT static void registerMediaEngine(MediaEngineRegistrar);
55
56     void repaint();
57     void loadStateChanged();
58     void loadedRangesChanged();
59     void rateChanged();
60     void sizeChanged();
61     void timeChanged();
62     void didEnd();
63     void layerHostChanged(PlatformLayer* rootLayer);
64
65 private:
66     MediaPlayerPrivateQTKit(MediaPlayer*);
67
68     // engine support
69     static PassOwnPtr<MediaPlayerPrivateInterface> create(MediaPlayer*);
70     static void getSupportedTypes(HashSet<String>& types);
71     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
72
73     static void getSitesInMediaCache(Vector<String>&);
74     static void clearMediaCache();
75     static void clearMediaCacheForSite(const String&);
76     static bool isAvailable();
77
78     PlatformMedia platformMedia() const;
79     PlatformLayer* platformLayer() const;
80
81     IntSize naturalSize() const;
82     bool hasVideo() const;
83     bool hasAudio() const;
84     bool supportsFullscreen() const;
85     virtual bool supportsScanning() const { return true; }
86     
87     void load(const String& url);
88 #if ENABLE(MEDIA_SOURCE)
89     virtual void load(const String&, MediaSourcePrivateClient*);
90 #endif
91     void cancelLoad();
92     void loadInternal(const String& url);
93     void resumeLoad();
94     
95     void play();
96     void pause();    
97     void prepareToPlay();
98     
99     bool paused() const;
100     bool seeking() const;
101     
102     virtual MediaTime durationMediaTime() const override;
103     virtual MediaTime currentMediaTime() const override;
104     virtual void seek(const MediaTime&) override;
105     
106     void setRate(float);
107     void setVolume(float);
108     void setPreservesPitch(bool);
109
110     bool hasClosedCaptions() const;
111     void setClosedCaptionsVisible(bool);
112
113     void setPreload(MediaPlayer::Preload);
114
115     MediaPlayer::NetworkState networkState() const { return m_networkState; }
116     MediaPlayer::ReadyState readyState() const { return m_readyState; }
117     
118     std::unique_ptr<PlatformTimeRanges> buffered() const;
119     MediaTime maxMediaTimeSeekable() const;
120     bool didLoadingProgress() const;
121     unsigned long long totalBytes() const;
122     
123     void setVisible(bool);
124     void setSize(const IntSize&);
125     
126     virtual bool hasAvailableVideoFrame() const;
127
128     void paint(GraphicsContext*, const IntRect&);
129     void paintCurrentFrameInContext(GraphicsContext*, const IntRect&);
130     virtual void prepareForRendering();
131
132     bool supportsAcceleratedRendering() const;
133     void acceleratedRenderingStateChanged();
134
135     bool hasSingleSecurityOrigin() const;
136     MediaPlayer::MovieLoadType movieLoadType() const;
137
138     virtual bool canSaveMediaData() const override;
139
140     void createQTMovie(const String& url);
141     void createQTMovie(NSURL *, NSDictionary *movieAttributes);
142
143     enum MediaRenderingMode { MediaRenderingNone, MediaRenderingSoftwareRenderer, MediaRenderingMovieLayer };
144     MediaRenderingMode currentRenderingMode() const;
145     MediaRenderingMode preferredRenderingMode() const;
146     
147     void setUpVideoRendering();
148     void tearDownVideoRendering();
149     bool hasSetUpVideoRendering() const;
150     
151     enum QTVideoRendererMode { QTVideoRendererModeDefault, QTVideoRendererModeListensForNewImages };
152     void createQTVideoRenderer(QTVideoRendererMode rendererMode);
153     void destroyQTVideoRenderer();
154     
155     void createQTMovieLayer();
156     void destroyQTMovieLayer();
157
158     void updateStates();
159     void doSeek();
160     void cancelSeek();
161     void seekTimerFired(Timer&);
162     MediaTime maxMediaTimeLoaded() const;
163     void disableUnsupportedTracks();
164     
165     void sawUnsupportedTracks();
166     void cacheMovieScale();
167     bool metaDataAvailable() const { return m_qtMovie && m_readyState >= MediaPlayer::HaveMetadata; }
168
169     bool isReadyForVideoSetup() const;
170
171     virtual double maximumDurationToCacheMediaTime() const { return 5; }
172
173     virtual void setPrivateBrowsingMode(bool);
174     
175     NSMutableDictionary* commonMovieAttributes();
176
177     virtual String engineDescription() const { return "QTKit"; }
178     virtual long platformErrorCode() const;
179
180     MediaPlayer* m_player;
181     RetainPtr<QTMovie> m_qtMovie;
182     RetainPtr<QTVideoRendererWebKitOnly> m_qtVideoRenderer;
183     RetainPtr<WebCoreMovieObserver> m_objcObserver;
184     String m_movieURL;
185     MediaTime m_seekTo;
186     Timer m_seekTimer;
187     MediaPlayer::NetworkState m_networkState;
188     MediaPlayer::ReadyState m_readyState;
189     IntRect m_rect;
190     FloatSize m_scaleFactor;
191     unsigned m_enabledTrackCount;
192     unsigned m_totalTrackCount;
193     MediaTime m_reportedDuration;
194     MediaTime m_cachedDuration;
195     MediaTime m_timeToRestore;
196     RetainPtr<QTMovieLayer> m_qtVideoLayer;
197     MediaPlayer::Preload m_preload;
198     bool m_startedPlaying;
199     bool m_isStreaming;
200     bool m_visible;
201     bool m_hasUnsupportedTracks;
202     bool m_videoFrameHasDrawn;
203     bool m_isAllowedToRender;
204     bool m_privateBrowsing;
205     mutable MediaTime m_maxTimeLoadedAtLastDidLoadingProgress;
206     mutable FloatSize m_cachedNaturalSize;
207 };
208
209 }
210
211 #endif
212 #endif