blob: 16274b25be514eb9546597b6657f7a30cd517e1a [file] [log] [blame]
/*
* Copyright (C) 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef MediaPlayerPrivateIOS_h
#define MediaPlayerPrivateIOS_h
#if ENABLE(VIDEO) && PLATFORM(IOS)
#include "InbandTextTrackPrivateAVF.h"
#include "MediaPlayer.h"
#include "MediaPlayerPrivate.h"
#include "MediaPlayerProxy.h"
#include <objc/runtime.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/RetainPtr.h>
OBJC_CLASS NSDictionary;
OBJC_CLASS NSMutableDictionary;
OBJC_CLASS NSNumber;
OBJC_CLASS NSObject;
OBJC_CLASS WebCoreMediaPlayerNotificationHelper;
namespace WebCore {
class InbandTextTrackPrivateAVFIOS;
class MediaPlayerPrivateIOS : public MediaPlayerPrivateInterface, public AVFInbandTrackParent {
public:
static void registerMediaEngine(MediaEngineRegistrar);
virtual ~MediaPlayerPrivateIOS();
virtual void deliverNotification(MediaPlayerProxyNotificationType) override;
bool callbacksDelayed() { return m_delayCallbacks > 0; }
virtual void prepareToPlay() override;
void processDeferredRequests();
#if ENABLE(VIDEO_TRACK)
void inbandTextTracksChanged(NSArray *);
void processInbandTextTrackCue(NSArray *, double);
void textTrackWasSelectedByPlugin(NSDictionary *);
#endif
private:
MediaPlayerPrivateIOS(MediaPlayer*);
// Engine support
static PassOwnPtr<MediaPlayerPrivateInterface> create(MediaPlayer*);
static void getSupportedTypes(HashSet<String>& types);
static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
static bool isAvailable();
virtual IntSize naturalSize() const override;
virtual bool hasVideo() const override;
virtual bool hasAudio() const override;
virtual bool supportsFullscreen() const override { return true; }
virtual bool canLoadPoster() const override { return true; }
virtual void setPoster(const String& url) override;
virtual void setControls(bool) override;
virtual void enterFullscreen() override;
virtual void exitFullscreen() override;
virtual bool hasClosedCaptions() const override;
virtual void setClosedCaptionsVisible(bool) override;
virtual void load(const String& url) override;
#if ENABLE(MEDIA_SOURCE)
virtual void load(const String&, PassRefPtr<HTMLMediaSource>) override { }
#endif
virtual void cancelLoad() override;
virtual void play() override;
virtual void pause() override;
virtual bool paused() const override;
virtual bool seeking() const override;
virtual float duration() const override;
virtual float currentTime() const override;
virtual void seek(float time) override;
void setEndTime(float);
float rate() const;
virtual void setRate(float inRate) override;
virtual float volume() const override;
virtual void setVolume(float inVolume) override;
virtual void setMuted(bool inMute) override;
int dataRate() const;
virtual MediaPlayer::NetworkState networkState() const override;
virtual MediaPlayer::ReadyState readyState() const override;
float maxTimeBuffered() const;
virtual float maxTimeSeekable() const override;
virtual PassRefPtr<TimeRanges> buffered() const override;
virtual bool didLoadingProgress() const override;
bool totalBytesKnown() const;
unsigned totalBytes() const;
virtual void setVisible(bool) override;
virtual void setSize(const IntSize&) override;
virtual void paint(GraphicsContext*, const IntRect&) override;
#if ENABLE(IOS_AIRPLAY)
virtual bool isCurrentPlaybackTargetWireless() const override;
virtual void showPlaybackTargetPicker() override;
virtual bool hasWirelessPlaybackTargets() const override;
virtual bool wirelessVideoPlaybackDisabled() const override;
virtual void setWirelessVideoPlaybackDisabled(bool) override;
virtual void setHasPlaybackTargetAvailabilityListeners(bool) override;
#endif
virtual bool supportsAcceleratedRendering() const override;
virtual void setMediaPlayerProxy(WebMediaPlayerProxy*) override;
void processPendingRequests();
void setDelayCallbacks(bool doDelay) { m_delayCallbacks += (doDelay ? 1 : -1); }
bool usingNetwork() const { return m_usingNetwork; }
bool inFullscreen() const { return m_inFullScreen; }
void addDeferredRequest(NSString *name, id value);
virtual String engineDescription() const { return String(ASCIILiteral("iOS")); }
virtual void attributeChanged(const String& name, const String& value) override;
virtual bool readyForPlayback() const override;
#if ENABLE(VIDEO_TRACK)
virtual bool requiresTextTrackRepresentation() const;
virtual void setTextTrackRepresentation(TextTrackRepresentation*);
void clearTextTracks();
void setSelectedTextTrack(NSNumber *);
virtual void trackModeChanged() override;
void setOutOfBandTextTracks(NSArray *);
virtual bool implementsTextTrackControls() const { return true; }
virtual PassRefPtr<PlatformTextTrackMenuInterface> textTrackMenu();
void outOfBandTextTracksChanged();
void textTrackWasSelectedByMediaElement(PassRefPtr<PlatformTextTrack>);
#endif
private:
class PlatformTextTrackMenuInterfaceIOS : public PlatformTextTrackMenuInterface {
public:
static PassRefPtr<PlatformTextTrackMenuInterfaceIOS> create(MediaPlayerPrivateIOS* owner)
{
return adoptRef(new PlatformTextTrackMenuInterfaceIOS(owner));
}
virtual ~PlatformTextTrackMenuInterfaceIOS();
virtual void tracksDidChange() override
{
if (m_owner)
m_owner->outOfBandTextTracksChanged();
}
virtual void trackWasSelected(PassRefPtr<PlatformTextTrack> track) override
{
if (m_owner)
m_owner->textTrackWasSelectedByMediaElement(track);
}
virtual void setClient(PlatformTextTrackMenuClient* client) override { m_client = client; }
PlatformTextTrackMenuClient* client() { return m_client; }
private:
PlatformTextTrackMenuInterfaceIOS(MediaPlayerPrivateIOS*);
PlatformTextTrackMenuClient* m_client;
MediaPlayerPrivateIOS* m_owner;
};
MediaPlayer* m_mediaPlayer;
RetainPtr<NSObject> m_mediaPlayerHelper; // This is the MediaPlayerProxy.
RetainPtr<WebCoreMediaPlayerNotificationHelper> m_objcHelper;
RetainPtr<NSMutableDictionary> m_deferredProperties;
MediaPlayer::NetworkState m_networkState;
MediaPlayer::ReadyState m_readyState;
enum BufferingState { Empty, UnlikeleyToKeepUp, LikeleyToKeepUp, Full };
#if ENABLE(VIDEO_TRACK)
InbandTextTrackPrivateAVFIOS* m_currentTrack;
Vector<RefPtr<InbandTextTrackPrivateAVFIOS> > m_textTracks;
RefPtr<PlatformTextTrackMenuInterfaceIOS> m_menuInterface;
#endif
int m_delayCallbacks;
int m_changingVolume;
mutable unsigned m_bytesLoadedAtLastDidLoadingProgress;
float m_requestedRate;
BufferingState m_bufferingState;
bool m_visible : 1;
bool m_usingNetwork : 1;
bool m_inFullScreen : 1;
bool m_shouldPrepareToPlay : 1;
bool m_preparingToPlay : 1;
bool m_pauseRequested : 1;
};
} // namespace WebCore
#endif
#endif // MediaPlayerPrivateIOS