1/*
2 * Copyright (C) 2011-2014 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 MediaPlayerPrivateAVFoundationObjC_h
27#define MediaPlayerPrivateAVFoundationObjC_h
28
29#if ENABLE(VIDEO) && USE(AVFOUNDATION)
30
31#include "MediaPlayerPrivateAVFoundation.h"
32#include <wtf/HashMap.h>
33
34OBJC_CLASS AVAssetImageGenerator;
35OBJC_CLASS AVAssetResourceLoadingRequest;
36OBJC_CLASS AVMediaSelectionGroup;
37OBJC_CLASS AVPlayer;
38OBJC_CLASS AVPlayerItem;
39OBJC_CLASS AVPlayerItemLegibleOutput;
40OBJC_CLASS AVPlayerItemTrack;
41OBJC_CLASS AVPlayerItemVideoOutput;
42OBJC_CLASS AVPlayerLayer;
43OBJC_CLASS AVURLAsset;
44OBJC_CLASS NSArray;
45OBJC_CLASS NSURLAuthenticationChallenge;
46OBJC_CLASS WebCoreAVFMovieObserver;
47OBJC_CLASS WebCoreAVFPullDelegate;
48
49typedef struct objc_object* id;
50
51#if HAVE(AVFOUNDATION_LOADER_DELEGATE)
52OBJC_CLASS WebCoreAVFLoaderDelegate;
53OBJC_CLASS AVAssetResourceLoadingRequest;
54#endif
55
56typedef struct CGImage *CGImageRef;
57typedef struct __CVBuffer *CVPixelBufferRef;
58typedef struct OpaqueVTPixelTransferSession* VTPixelTransferSessionRef;
59
60namespace WebCore {
61
62class WebCoreAVFResourceLoader;
63class InbandMetadataTextTrackPrivateAVF;
64class InbandTextTrackPrivateAVFObjC;
65class AudioTrackPrivateAVFObjC;
66class VideoTrackPrivateAVFObjC;
67
68class MediaPlayerPrivateAVFoundationObjC : public MediaPlayerPrivateAVFoundation {
69public:
70    virtual ~MediaPlayerPrivateAVFoundationObjC();
71
72    static void registerMediaEngine(MediaEngineRegistrar);
73
74    void setAsset(id);
75    virtual void tracksChanged() override;
76
77#if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP)
78    RetainPtr<AVPlayerItem> playerItem() const { return m_avPlayerItem; }
79    void processCue(NSArray *, NSArray *, double);
80    void flushCues();
81#endif
82
83#if HAVE(AVFOUNDATION_LOADER_DELEGATE)
84    bool shouldWaitForLoadingOfResource(AVAssetResourceLoadingRequest*);
85    bool shouldWaitForResponseToAuthenticationChallenge(NSURLAuthenticationChallenge*);
86    void didCancelLoadingRequest(AVAssetResourceLoadingRequest*);
87    void didStopLoadingRequest(AVAssetResourceLoadingRequest *);
88#endif
89
90#if ENABLE(ENCRYPTED_MEDIA_V2)
91    RetainPtr<AVAssetResourceLoadingRequest> takeRequestForKeyURI(const String&);
92#endif
93
94    void playerItemStatusDidChange(int);
95    void playbackLikelyToKeepUpWillChange();
96    void playbackLikelyToKeepUpDidChange(bool);
97    void playbackBufferEmptyWillChange();
98    void playbackBufferEmptyDidChange(bool);
99    void playbackBufferFullWillChange();
100    void playbackBufferFullDidChange(bool);
101    void loadedTimeRangesDidChange(RetainPtr<NSArray>);
102    void seekableTimeRangesDidChange(RetainPtr<NSArray>);
103    void tracksDidChange(RetainPtr<NSArray>);
104    void hasEnabledAudioDidChange(bool);
105    void presentationSizeDidChange(FloatSize);
106    void durationDidChange(double);
107    void rateDidChange(double);
108    void metadataDidArrive(RetainPtr<NSArray>, double);
109    void firstFrameAvailableDidChange(bool);
110    void trackEnabledDidChange(bool);
111    void canPlayFastReverseDidChange(bool);
112    void canPlayFastForwardDidChange(bool);
113
114    virtual void setShouldBufferData(bool);
115
116#if HAVE(AVFOUNDATION_VIDEO_OUTPUT)
117    void outputMediaDataWillChange(AVPlayerItemVideoOutput*);
118#endif
119
120#if ENABLE(IOS_AIRPLAY)
121    void playbackTargetIsWirelessDidChange();
122#endif
123
124#if ENABLE(AVF_CAPTIONS)
125    virtual void notifyTrackModeChanged() override;
126    virtual void synchronizeTextTrackState() override;
127#endif
128
129    WeakPtr<MediaPlayerPrivateAVFoundationObjC> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
130
131private:
132    MediaPlayerPrivateAVFoundationObjC(MediaPlayer*);
133
134    // engine support
135    static PassOwnPtr<MediaPlayerPrivateInterface> create(MediaPlayer*);
136    static void getSupportedTypes(HashSet<String>& types);
137    static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
138    static bool supportsKeySystem(const String& keySystem, const String& mimeType);
139
140    static bool isAvailable();
141
142    virtual void cancelLoad();
143
144    virtual PlatformMedia platformMedia() const;
145
146    virtual void platformSetVisible(bool);
147    virtual void platformPlay();
148    virtual void platformPause();
149    virtual double currentTimeDouble() const override;
150    virtual void setVolume(float);
151    virtual void setClosedCaptionsVisible(bool);
152    virtual void paint(GraphicsContext*, const IntRect&);
153    virtual void paintCurrentFrameInContext(GraphicsContext*, const IntRect&);
154    virtual PlatformLayer* platformLayer() const;
155#if PLATFORM(IOS)
156    virtual void setVideoFullscreenLayer(PlatformLayer*);
157    virtual void setVideoFullscreenFrame(FloatRect);
158    virtual void setVideoFullscreenGravity(MediaPlayer::VideoGravity);
159
160    virtual NSArray *timedMetadata() const override;
161    virtual String accessLog() const;
162    virtual String errorLog() const;
163#endif
164
165    virtual bool supportsAcceleratedRendering() const { return true; }
166    virtual float mediaTimeForTimeValue(float) const;
167    virtual double maximumDurationToCacheMediaTime() const { return 5; }
168
169    virtual void createAVPlayer();
170    virtual void createAVPlayerItem();
171    virtual void createAVPlayerLayer();
172    virtual void createAVAssetForURL(const String& url);
173    virtual MediaPlayerPrivateAVFoundation::ItemStatus playerItemStatus() const;
174    virtual MediaPlayerPrivateAVFoundation::AssetStatus assetStatus() const;
175
176    virtual void checkPlayability();
177    virtual void updateRate();
178    virtual float rate() const;
179    virtual void seekToTime(double time, double negativeTolerance, double positiveTolerance);
180    virtual unsigned long long totalBytes() const;
181    virtual std::unique_ptr<PlatformTimeRanges> platformBufferedTimeRanges() const;
182    virtual double platformMinTimeSeekable() const;
183    virtual double platformMaxTimeSeekable() const;
184    virtual double platformDuration() const;
185    virtual float platformMaxTimeLoaded() const;
186    virtual void beginLoadingMetadata();
187    virtual void sizeChanged();
188
189    virtual bool hasAvailableVideoFrame() const;
190
191    virtual void createContextVideoRenderer();
192    virtual void destroyContextVideoRenderer();
193
194    virtual void createVideoLayer();
195    virtual void destroyVideoLayer();
196
197    virtual bool hasContextRenderer() const;
198    virtual bool hasLayerRenderer() const;
199
200    virtual void updateVideoLayerGravity() override;
201
202    virtual bool hasSingleSecurityOrigin() const;
203
204#if ENABLE(VIDEO_TRACK)
205    virtual bool requiresTextTrackRepresentation() const override;
206    virtual void setTextTrackRepresentation(TextTrackRepresentation*) override;
207    virtual void syncTextTrackBounds() override;
208#endif
209
210    void setAVPlayerItem(AVPlayerItem *);
211
212    void createImageGenerator();
213    void destroyImageGenerator();
214    RetainPtr<CGImageRef> createImageForTimeInRect(float, const IntRect&);
215    void paintWithImageGenerator(GraphicsContext*, const IntRect&);
216
217#if HAVE(AVFOUNDATION_VIDEO_OUTPUT)
218    void createVideoOutput();
219    void destroyVideoOutput();
220    RetainPtr<CVPixelBufferRef> createPixelBuffer();
221    void updateLastImage();
222    bool videoOutputHasAvailableFrame();
223    void paintWithVideoOutput(GraphicsContext*, const IntRect&);
224    virtual PassNativeImagePtr nativeImageForCurrentTime() override;
225    void waitForVideoOutputMediaDataWillChange();
226#endif
227
228#if ENABLE(ENCRYPTED_MEDIA)
229    virtual MediaPlayer::MediaKeyException addKey(const String&, const unsigned char*, unsigned, const unsigned char*, unsigned, const String&);
230    virtual MediaPlayer::MediaKeyException generateKeyRequest(const String&, const unsigned char*, unsigned);
231    virtual MediaPlayer::MediaKeyException cancelKeyRequest(const String&, const String&);
232#endif
233
234#if ENABLE(ENCRYPTED_MEDIA_V2)
235    std::unique_ptr<CDMSession> createSession(const String& keySystem);
236#endif
237
238    virtual String languageOfPrimaryAudioTrack() const override;
239
240#if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP)
241    void processMediaSelectionOptions();
242    AVMediaSelectionGroup* safeMediaSelectionGroupForLegibleMedia();
243#endif
244
245#if ENABLE(DATACUE_VALUE)
246    void processMetadataTrack();
247#endif
248
249    virtual void setCurrentTextTrack(InbandTextTrackPrivateAVF*) override;
250    virtual InbandTextTrackPrivateAVF* currentTextTrack() const override { return m_currentTextTrack; }
251
252#if !HAVE(AVFOUNDATION_LEGIBLE_OUTPUT_SUPPORT)
253    void processLegacyClosedCaptionsTracks();
254#endif
255
256#if ENABLE(VIDEO_TRACK)
257    void updateAudioTracks();
258    void updateVideoTracks();
259#endif
260
261#if ENABLE(IOS_AIRPLAY)
262    virtual bool isCurrentPlaybackTargetWireless() const override;
263    virtual String wirelessPlaybackTargetName() const override;
264    virtual MediaPlayer::WirelessPlaybackTargetType wirelessPlaybackTargetType() const override;
265    virtual bool wirelessVideoPlaybackDisabled() const override;
266    virtual void setWirelessVideoPlaybackDisabled(bool) override;
267    void updateDisableExternalPlayback();
268#endif
269
270    virtual double maxFastForwardRate() const override { return m_cachedCanPlayFastForward ? std::numeric_limits<double>::infinity() : 2.0; }
271    virtual double minFastReverseRate() const override { return m_cachedCanPlayFastReverse ? -std::numeric_limits<double>::infinity() : 0.0; }
272
273    WeakPtrFactory<MediaPlayerPrivateAVFoundationObjC> m_weakPtrFactory;
274
275    RetainPtr<AVURLAsset> m_avAsset;
276    RetainPtr<AVPlayer> m_avPlayer;
277    RetainPtr<AVPlayerItem> m_avPlayerItem;
278    RetainPtr<AVPlayerLayer> m_videoLayer;
279#if PLATFORM(IOS)
280    RetainPtr<PlatformLayer> m_videoInlineLayer;
281    RetainPtr<PlatformLayer> m_videoFullscreenLayer;
282    FloatRect m_videoFullscreenFrame;
283    MediaPlayer::VideoGravity m_videoFullscreenGravity;
284    RetainPtr<PlatformLayer> m_textTrackRepresentationLayer;
285#endif
286    RetainPtr<WebCoreAVFMovieObserver> m_objcObserver;
287    RetainPtr<id> m_timeObserver;
288    mutable String m_languageOfPrimaryAudioTrack;
289    bool m_videoFrameHasDrawn;
290    bool m_haveCheckedPlayability;
291
292    RetainPtr<AVAssetImageGenerator> m_imageGenerator;
293#if HAVE(AVFOUNDATION_VIDEO_OUTPUT)
294    RetainPtr<AVPlayerItemVideoOutput> m_videoOutput;
295    RetainPtr<WebCoreAVFPullDelegate> m_videoOutputDelegate;
296    RetainPtr<CGImageRef> m_lastImage;
297    dispatch_semaphore_t m_videoOutputSemaphore;
298#endif
299
300#if USE(VIDEOTOOLBOX)
301    RetainPtr<VTPixelTransferSessionRef> m_pixelTransferSession;
302#endif
303
304#if HAVE(AVFOUNDATION_LOADER_DELEGATE)
305    friend class WebCoreAVFResourceLoader;
306    HashMap<RetainPtr<AVAssetResourceLoadingRequest>, RefPtr<WebCoreAVFResourceLoader>> m_resourceLoaderMap;
307    RetainPtr<WebCoreAVFLoaderDelegate> m_loaderDelegate;
308    HashMap<String, RetainPtr<AVAssetResourceLoadingRequest>> m_keyURIToRequestMap;
309    HashMap<String, RetainPtr<AVAssetResourceLoadingRequest>> m_sessionIDToRequestMap;
310#endif
311
312#if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP) && HAVE(AVFOUNDATION_LEGIBLE_OUTPUT_SUPPORT)
313    RetainPtr<AVPlayerItemLegibleOutput> m_legibleOutput;
314#endif
315
316#if ENABLE(VIDEO_TRACK)
317    Vector<RefPtr<AudioTrackPrivateAVFObjC>> m_audioTracks;
318    Vector<RefPtr<VideoTrackPrivateAVFObjC>> m_videoTracks;
319#endif
320
321    InbandTextTrackPrivateAVF* m_currentTextTrack;
322
323#if ENABLE(DATACUE_VALUE)
324    RefPtr<InbandMetadataTextTrackPrivateAVF> m_metadataTrack;
325#endif
326
327    mutable RetainPtr<NSArray> m_cachedSeekableRanges;
328    mutable RetainPtr<NSArray> m_cachedLoadedRanges;
329    RetainPtr<NSArray> m_cachedTracks;
330    RetainPtr<NSArray> m_currentMetaData;
331    FloatSize m_cachedPresentationSize;
332    double m_cachedDuration;
333    double m_cachedRate;
334    mutable long long m_cachedTotalBytes;
335    unsigned m_pendingStatusChanges;
336    int m_cachedItemStatus;
337    bool m_cachedLikelyToKeepUp;
338    bool m_cachedBufferEmpty;
339    bool m_cachedBufferFull;
340    bool m_cachedHasEnabledAudio;
341    bool m_shouldBufferData;
342    bool m_cachedIsReadyForDisplay;
343    bool m_haveBeenAskedToCreateLayer;
344    bool m_cachedCanPlayFastForward;
345    bool m_cachedCanPlayFastReverse;
346#if ENABLE(IOS_AIRPLAY)
347    mutable bool m_allowsWirelessVideoPlayback;
348#endif
349};
350
351}
352
353#endif
354#endif
355