2011-05-25 Alexis Menard <alexis.menard@openbossa.org>
[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 @class QTMovie;
39 @class QTMovieView;
40 @class QTMovieLayer;
41 @class QTVideoRendererWebKitOnly;
42 @class WebCoreMovieObserver;
43 #else
44 class NSDictionary;
45 class NSMutableDictionary;
46 class QTMovie;
47 class QTMovieView;
48 class QTTime;
49 class QTMovieLayer;
50 class QTVideoRendererWebKitOnly;
51 class WebCoreMovieObserver;
52 #endif
53
54 #ifndef DRAW_FRAME_RATE
55 #define DRAW_FRAME_RATE 0
56 #endif
57
58 namespace WebCore {
59     
60 class ApplicationCacheResource;
61
62 class MediaPlayerPrivateQTKit : public MediaPlayerPrivateInterface {
63 public:
64     ~MediaPlayerPrivateQTKit();
65     static void registerMediaEngine(MediaEngineRegistrar);
66
67     void repaint();
68     void loadStateChanged();
69     void rateChanged();
70     void sizeChanged();
71     void timeChanged();
72     void didEnd();
73 #if USE(ACCELERATED_COMPOSITING)
74     void layerHostChanged(PlatformLayer* rootLayer);
75 #endif
76
77 private:
78     MediaPlayerPrivateQTKit(MediaPlayer*);
79
80     // engine support
81     static PassOwnPtr<MediaPlayerPrivateInterface> create(MediaPlayer*);
82     static void getSupportedTypes(HashSet<String>& types);
83     static MediaPlayer::SupportsType supportsType(const String& type, const String& codecs);
84     static void getSitesInMediaCache(Vector<String>&);
85     static void clearMediaCache();
86     static void clearMediaCacheForSite(const String&);
87     static bool isAvailable();
88
89     PlatformMedia platformMedia() const;
90 #if USE(ACCELERATED_COMPOSITING) && !(PLATFORM(QT) && USE(QTKIT))
91     PlatformLayer* platformLayer() const;
92 #endif
93
94     IntSize naturalSize() const;
95     bool hasVideo() const;
96     bool hasAudio() const;
97     bool supportsFullscreen() const;
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     unsigned bytesLoaded() 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     void createQTMovie(ApplicationCacheResource*);
153
154     enum MediaRenderingMode { MediaRenderingNone, MediaRenderingMovieView, MediaRenderingSoftwareRenderer, MediaRenderingMovieLayer };
155     MediaRenderingMode currentRenderingMode() const;
156     MediaRenderingMode preferredRenderingMode() const;
157     
158     void setUpVideoRendering();
159     void tearDownVideoRendering();
160     bool hasSetUpVideoRendering() const;
161     
162     void createQTMovieView();
163     void detachQTMovieView();
164     
165     enum QTVideoRendererMode { QTVideoRendererModeDefault, QTVideoRendererModeListensForNewImages };
166     void createQTVideoRenderer(QTVideoRendererMode rendererMode);
167     void destroyQTVideoRenderer();
168     
169     void createQTMovieLayer();
170     void destroyQTMovieLayer();
171
172     QTTime createQTTime(float time) const;
173     
174     void updateStates();
175     void doSeek();
176     void cancelSeek();
177     void seekTimerFired(Timer<MediaPlayerPrivateQTKit>*);
178     float maxTimeLoaded() const;
179     void disableUnsupportedTracks();
180     
181     void sawUnsupportedTracks();
182     void cacheMovieScale();
183     bool metaDataAvailable() const { return m_qtMovie && m_readyState >= MediaPlayer::HaveMetadata; }
184
185     bool isReadyForVideoSetup() const;
186     
187     virtual float mediaTimeForTimeValue(float) const;
188
189     virtual double maximumDurationToCacheMediaTime() const { return 5; }
190
191     virtual void setPrivateBrowsingMode(bool);
192     
193     NSMutableDictionary* commonMovieAttributes();
194
195     MediaPlayer* m_player;
196     RetainPtr<QTMovie> m_qtMovie;
197     RetainPtr<QTMovieView> m_qtMovieView;
198     RetainPtr<QTVideoRendererWebKitOnly> m_qtVideoRenderer;
199     RetainPtr<WebCoreMovieObserver> m_objcObserver;
200     String m_movieURL;
201     float m_seekTo;
202     Timer<MediaPlayerPrivateQTKit> m_seekTimer;
203     MediaPlayer::NetworkState m_networkState;
204     MediaPlayer::ReadyState m_readyState;
205     IntRect m_rect;
206     FloatSize m_scaleFactor;
207     unsigned m_enabledTrackCount;
208     unsigned m_totalTrackCount;
209     float m_reportedDuration;
210     float m_cachedDuration;
211     float m_timeToRestore;
212     RetainPtr<QTMovieLayer> m_qtVideoLayer;
213     MediaPlayer::Preload m_preload;
214     bool m_startedPlaying;
215     bool m_isStreaming;
216     bool m_visible;
217     bool m_hasUnsupportedTracks;
218     bool m_videoFrameHasDrawn;
219     bool m_isAllowedToRender;
220     bool m_privateBrowsing;
221 #if DRAW_FRAME_RATE
222     int  m_frameCountWhilePlaying;
223     double m_timeStartedPlaying;
224     double m_timeStoppedPlaying;
225 #endif
226     mutable FloatSize m_cachedNaturalSize;
227 };
228
229 }
230
231 #endif
232 #endif