Enable ENCRYPTED_MEDIA support on Mac.
[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 COMPUTER, 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 COMPUTER, 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 QTMovieView;
46 OBJC_CLASS QTMovieLayer;
47 OBJC_CLASS QTVideoRendererWebKitOnly;
48 OBJC_CLASS WebCoreMovieObserver;
49
50 #ifndef DRAW_FRAME_RATE
51 #define DRAW_FRAME_RATE 0
52 #endif
53
54 namespace WebCore {
55     
56 class MediaPlayerPrivateQTKit : public MediaPlayerPrivateInterface {
57 public:
58     ~MediaPlayerPrivateQTKit();
59     static void registerMediaEngine(MediaEngineRegistrar);
60
61     void repaint();
62     void loadStateChanged();
63     void loadedRangesChanged();
64     void rateChanged();
65     void sizeChanged();
66     void timeChanged();
67     void didEnd();
68 #if USE(ACCELERATED_COMPOSITING)
69     void layerHostChanged(PlatformLayer* rootLayer);
70 #endif
71
72 private:
73     MediaPlayerPrivateQTKit(MediaPlayer*);
74
75     // engine support
76     static PassOwnPtr<MediaPlayerPrivateInterface> create(MediaPlayer*);
77     static void getSupportedTypes(HashSet<String>& types);
78     static MediaPlayer::SupportsType supportsType(const String& type, const String& codecs, const KURL&);
79 #if ENABLE(ENCRYPTED_MEDIA)
80     static MediaPlayer::SupportsType extendedSupportsType(const String& type, const String& codecs, const String& keySystem, const KURL&);
81 #endif
82
83     static void getSitesInMediaCache(Vector<String>&);
84     static void clearMediaCache();
85     static void clearMediaCacheForSite(const String&);
86     static bool isAvailable();
87
88     PlatformMedia platformMedia() const;
89 #if USE(ACCELERATED_COMPOSITING) && !(PLATFORM(QT) && USE(QTKIT))
90     PlatformLayer* platformLayer() const;
91 #endif
92
93     IntSize naturalSize() const;
94     bool hasVideo() const;
95     bool hasAudio() const;
96     bool supportsFullscreen() const;
97     virtual bool supportsScanning() const { return true; }
98     
99     void load(const String& url);
100     void cancelLoad();
101     void loadInternal(const String& url);
102     void resumeLoad();
103     
104     void play();
105     void pause();    
106     void prepareToPlay();
107     
108     bool paused() const;
109     bool seeking() const;
110     
111     float duration() const;
112     float currentTime() const;
113     void seek(float time);
114     
115     void setRate(float);
116     void setVolume(float);
117     void setPreservesPitch(bool);
118
119     bool hasClosedCaptions() const;
120     void setClosedCaptionsVisible(bool);
121
122     void setPreload(MediaPlayer::Preload);
123
124     MediaPlayer::NetworkState networkState() const { return m_networkState; }
125     MediaPlayer::ReadyState readyState() const { return m_readyState; }
126     
127     PassRefPtr<TimeRanges> buffered() const;
128     float maxTimeSeekable() const;
129     bool didLoadingProgress() const;
130     unsigned totalBytes() const;
131     
132     void setVisible(bool);
133     void setSize(const IntSize&);
134     
135     virtual bool hasAvailableVideoFrame() const;
136
137     void paint(GraphicsContext*, const IntRect&);
138     void paintCurrentFrameInContext(GraphicsContext*, const IntRect&);
139     virtual void prepareForRendering();
140
141
142 #if USE(ACCELERATED_COMPOSITING) && !(PLATFORM(QT) && USE(QTKIT))
143     bool supportsAcceleratedRendering() const;
144     void acceleratedRenderingStateChanged();
145 #endif
146
147     bool hasSingleSecurityOrigin() const;
148     MediaPlayer::MovieLoadType movieLoadType() const;
149
150     void createQTMovie(const String& url);
151     void createQTMovie(NSURL *, NSDictionary *movieAttributes);
152
153     enum MediaRenderingMode { MediaRenderingNone, MediaRenderingMovieView, MediaRenderingSoftwareRenderer, MediaRenderingMovieLayer };
154     MediaRenderingMode currentRenderingMode() const;
155     MediaRenderingMode preferredRenderingMode() const;
156     
157     void setUpVideoRendering();
158     void tearDownVideoRendering();
159     bool hasSetUpVideoRendering() const;
160     
161     void createQTMovieView();
162     void detachQTMovieView();
163     
164     enum QTVideoRendererMode { QTVideoRendererModeDefault, QTVideoRendererModeListensForNewImages };
165     void createQTVideoRenderer(QTVideoRendererMode rendererMode);
166     void destroyQTVideoRenderer();
167     
168     void createQTMovieLayer();
169     void destroyQTMovieLayer();
170
171     QTTime createQTTime(float time) const;
172     
173     void updateStates();
174     void doSeek();
175     void cancelSeek();
176     void seekTimerFired(Timer<MediaPlayerPrivateQTKit>*);
177     float maxTimeLoaded() const;
178     void disableUnsupportedTracks();
179     
180     void sawUnsupportedTracks();
181     void cacheMovieScale();
182     bool metaDataAvailable() const { return m_qtMovie && m_readyState >= MediaPlayer::HaveMetadata; }
183
184     bool isReadyForVideoSetup() const;
185     
186     virtual float mediaTimeForTimeValue(float) const;
187
188     virtual double maximumDurationToCacheMediaTime() const { return 5; }
189
190     virtual void setPrivateBrowsingMode(bool);
191     
192     NSMutableDictionary* commonMovieAttributes();
193
194     virtual String engineDescription() const { return "QTKit"; }
195
196     MediaPlayer* m_player;
197     RetainPtr<QTMovie> m_qtMovie;
198     RetainPtr<QTMovieView> m_qtMovieView;
199     RetainPtr<QTVideoRendererWebKitOnly> m_qtVideoRenderer;
200     RetainPtr<WebCoreMovieObserver> m_objcObserver;
201     String m_movieURL;
202     float m_seekTo;
203     Timer<MediaPlayerPrivateQTKit> m_seekTimer;
204     MediaPlayer::NetworkState m_networkState;
205     MediaPlayer::ReadyState m_readyState;
206     IntRect m_rect;
207     FloatSize m_scaleFactor;
208     unsigned m_enabledTrackCount;
209     unsigned m_totalTrackCount;
210     float m_reportedDuration;
211     float m_cachedDuration;
212     float m_timeToRestore;
213     RetainPtr<QTMovieLayer> m_qtVideoLayer;
214     MediaPlayer::Preload m_preload;
215     bool m_startedPlaying;
216     bool m_isStreaming;
217     bool m_visible;
218     bool m_hasUnsupportedTracks;
219     bool m_videoFrameHasDrawn;
220     bool m_isAllowedToRender;
221     bool m_privateBrowsing;
222     mutable float m_maxTimeLoadedAtLastDidLoadingProgress;
223 #if DRAW_FRAME_RATE
224     int  m_frameCountWhilePlaying;
225     double m_timeStartedPlaying;
226     double m_timeStoppedPlaying;
227 #endif
228     mutable FloatSize m_cachedNaturalSize;
229 };
230
231 }
232
233 #endif
234 #endif