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