12bde8e466a4451c7319e3a072d118917957d6554Steve Block/*
22bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2011 Apple Inc. All rights reserved.
32bde8e466a4451c7319e3a072d118917957d6554Steve Block *
42bde8e466a4451c7319e3a072d118917957d6554Steve Block * Redistribution and use in source and binary forms, with or without
52bde8e466a4451c7319e3a072d118917957d6554Steve Block * modification, are permitted provided that the following conditions
62bde8e466a4451c7319e3a072d118917957d6554Steve Block * are met:
72bde8e466a4451c7319e3a072d118917957d6554Steve Block * 1. Redistributions of source code must retain the above copyright
82bde8e466a4451c7319e3a072d118917957d6554Steve Block *    notice, this list of conditions and the following disclaimer.
92bde8e466a4451c7319e3a072d118917957d6554Steve Block * 2. Redistributions in binary form must reproduce the above copyright
102bde8e466a4451c7319e3a072d118917957d6554Steve Block *    notice, this list of conditions and the following disclaimer in the
112bde8e466a4451c7319e3a072d118917957d6554Steve Block *    documentation and/or other materials provided with the distribution.
122bde8e466a4451c7319e3a072d118917957d6554Steve Block *
132bde8e466a4451c7319e3a072d118917957d6554Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
142bde8e466a4451c7319e3a072d118917957d6554Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
152bde8e466a4451c7319e3a072d118917957d6554Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
162bde8e466a4451c7319e3a072d118917957d6554Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
172bde8e466a4451c7319e3a072d118917957d6554Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
182bde8e466a4451c7319e3a072d118917957d6554Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
192bde8e466a4451c7319e3a072d118917957d6554Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
202bde8e466a4451c7319e3a072d118917957d6554Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
212bde8e466a4451c7319e3a072d118917957d6554Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
222bde8e466a4451c7319e3a072d118917957d6554Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
232bde8e466a4451c7319e3a072d118917957d6554Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
242bde8e466a4451c7319e3a072d118917957d6554Steve Block */
252bde8e466a4451c7319e3a072d118917957d6554Steve Block
262bde8e466a4451c7319e3a072d118917957d6554Steve Block#ifndef MediaPlayerPrivateAVFoundation_h
272bde8e466a4451c7319e3a072d118917957d6554Steve Block#define MediaPlayerPrivateAVFoundation_h
282bde8e466a4451c7319e3a072d118917957d6554Steve Block
292bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(VIDEO) && USE(AVFOUNDATION)
302bde8e466a4451c7319e3a072d118917957d6554Steve Block
312bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "FloatSize.h"
322bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "MediaPlayerPrivate.h"
332bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "Timer.h"
342bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <wtf/RetainPtr.h>
352bde8e466a4451c7319e3a072d118917957d6554Steve Block
362bde8e466a4451c7319e3a072d118917957d6554Steve Blocknamespace WebCore {
372bde8e466a4451c7319e3a072d118917957d6554Steve Block
382bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass ApplicationCacheResource;
392bde8e466a4451c7319e3a072d118917957d6554Steve Block
402bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass MediaPlayerPrivateAVFoundation : public MediaPlayerPrivateInterface {
412bde8e466a4451c7319e3a072d118917957d6554Steve Blockpublic:
422bde8e466a4451c7319e3a072d118917957d6554Steve Block
432bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void repaint();
442bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void metadataLoaded();
452bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void loadStateChanged();
462bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void playabilityKnown();
472bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void rateChanged();
482bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void loadedTimeRangesChanged();
492bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void seekableTimeRangesChanged();
502bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void timeChanged(double);
512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    virtual void seekCompleted(bool);
522bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void didEnd();
532bde8e466a4451c7319e3a072d118917957d6554Steve Block
542bde8e466a4451c7319e3a072d118917957d6554Steve Block    class Notification {
552bde8e466a4451c7319e3a072d118917957d6554Steve Block    public:
562bde8e466a4451c7319e3a072d118917957d6554Steve Block        enum Type {
572bde8e466a4451c7319e3a072d118917957d6554Steve Block            None,
582bde8e466a4451c7319e3a072d118917957d6554Steve Block            ItemDidPlayToEndTime,
592bde8e466a4451c7319e3a072d118917957d6554Steve Block            ItemTracksChanged,
602bde8e466a4451c7319e3a072d118917957d6554Steve Block            ItemStatusChanged,
612bde8e466a4451c7319e3a072d118917957d6554Steve Block            ItemSeekableTimeRangesChanged,
622bde8e466a4451c7319e3a072d118917957d6554Steve Block            ItemLoadedTimeRangesChanged,
632bde8e466a4451c7319e3a072d118917957d6554Steve Block            ItemPresentationSizeChanged,
642bde8e466a4451c7319e3a072d118917957d6554Steve Block            ItemIsPlaybackLikelyToKeepUpChanged,
652bde8e466a4451c7319e3a072d118917957d6554Steve Block            ItemIsPlaybackBufferEmptyChanged,
662bde8e466a4451c7319e3a072d118917957d6554Steve Block            ItemIsPlaybackBufferFullChanged,
672bde8e466a4451c7319e3a072d118917957d6554Steve Block            AssetMetadataLoaded,
682bde8e466a4451c7319e3a072d118917957d6554Steve Block            AssetPlayabilityKnown,
692bde8e466a4451c7319e3a072d118917957d6554Steve Block            PlayerRateChanged,
702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            PlayerTimeChanged,
712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            SeekCompleted,
722bde8e466a4451c7319e3a072d118917957d6554Steve Block        };
732bde8e466a4451c7319e3a072d118917957d6554Steve Block
742bde8e466a4451c7319e3a072d118917957d6554Steve Block        Notification()
752bde8e466a4451c7319e3a072d118917957d6554Steve Block            : m_type(None)
762bde8e466a4451c7319e3a072d118917957d6554Steve Block            , m_time(0)
772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            , m_finished(false)
782bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
792bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
802bde8e466a4451c7319e3a072d118917957d6554Steve Block
812bde8e466a4451c7319e3a072d118917957d6554Steve Block        Notification(Type type, double time)
822bde8e466a4451c7319e3a072d118917957d6554Steve Block            : m_type(type)
832bde8e466a4451c7319e3a072d118917957d6554Steve Block            , m_time(time)
842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            , m_finished(false)
852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Notification(Type type, bool finished)
892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        : m_type(type)
902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        , m_time(0)
912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        , m_finished(finished)
922bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
932bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
942bde8e466a4451c7319e3a072d118917957d6554Steve Block
952bde8e466a4451c7319e3a072d118917957d6554Steve Block        Type type() { return m_type; }
962bde8e466a4451c7319e3a072d118917957d6554Steve Block        bool isValid() { return m_type != None; }
972bde8e466a4451c7319e3a072d118917957d6554Steve Block        double time() { return m_time; }
982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        bool finished() { return m_finished; }
992bde8e466a4451c7319e3a072d118917957d6554Steve Block
1002bde8e466a4451c7319e3a072d118917957d6554Steve Block    private:
1012bde8e466a4451c7319e3a072d118917957d6554Steve Block        Type m_type;
1022bde8e466a4451c7319e3a072d118917957d6554Steve Block        double m_time;
1032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        bool m_finished;
1042bde8e466a4451c7319e3a072d118917957d6554Steve Block    };
1052bde8e466a4451c7319e3a072d118917957d6554Steve Block
1062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void scheduleMainThreadNotification(Notification);
1072bde8e466a4451c7319e3a072d118917957d6554Steve Block    void scheduleMainThreadNotification(Notification::Type, double time = 0);
1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void scheduleMainThreadNotification(Notification::Type, bool completed);
1092bde8e466a4451c7319e3a072d118917957d6554Steve Block    void dispatchNotification();
1102bde8e466a4451c7319e3a072d118917957d6554Steve Block    void clearMainThreadPendingFlag();
1112bde8e466a4451c7319e3a072d118917957d6554Steve Block
1122bde8e466a4451c7319e3a072d118917957d6554Steve Blockprotected:
1132bde8e466a4451c7319e3a072d118917957d6554Steve Block    MediaPlayerPrivateAVFoundation(MediaPlayer*);
1142bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual ~MediaPlayerPrivateAVFoundation();
1152bde8e466a4451c7319e3a072d118917957d6554Steve Block
1162bde8e466a4451c7319e3a072d118917957d6554Steve Block    // MediaPlayerPrivatePrivateInterface overrides.
1172bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void load(const String& url);
1182bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void cancelLoad() = 0;
1192bde8e466a4451c7319e3a072d118917957d6554Steve Block
1202bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void prepareToPlay();
1212bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual PlatformMedia platformMedia() const = 0;
1222bde8e466a4451c7319e3a072d118917957d6554Steve Block
1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    virtual void play();
1242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    virtual void pause();
1252bde8e466a4451c7319e3a072d118917957d6554Steve Block
1262bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual IntSize naturalSize() const;
1272bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool hasVideo() const { return m_cachedHasVideo; }
1282bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool hasAudio() const { return m_cachedHasAudio; }
1292bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void setVisible(bool);
1302bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual float duration() const;
1312bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual float currentTime() const = 0;
1322bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void seek(float);
1332bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool seeking() const;
1342bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void setRate(float);
1352bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool paused() const;
1362bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void setVolume(float) = 0;
1372bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool hasClosedCaptions() const { return m_cachedHasCaptions; }
1382bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void setClosedCaptionsVisible(bool) = 0;
1392bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual MediaPlayer::NetworkState networkState() const { return m_networkState; }
1402bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual MediaPlayer::ReadyState readyState() const { return m_readyState; }
1412bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual float maxTimeSeekable() const;
1422bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual PassRefPtr<TimeRanges> buffered() const;
1432bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual unsigned bytesLoaded() const;
1442bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void setSize(const IntSize&);
1452bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void paint(GraphicsContext*, const IntRect&);
1462bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void paintCurrentFrameInContext(GraphicsContext*, const IntRect&) = 0;
1472bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void setPreload(MediaPlayer::Preload);
1482bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool hasAvailableVideoFrame() const;
1492bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(ACCELERATED_COMPOSITING)
1502bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual PlatformLayer* platformLayer() const { return 0; }
1512bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool supportsAcceleratedRendering() const = 0;
1522bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void acceleratedRenderingStateChanged();
1532bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1542bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool hasSingleSecurityOrigin() const { return true; }
1552bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual MediaPlayer::MovieLoadType movieLoadType() const;
1562bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void prepareForRendering();
1572bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual float mediaTimeForTimeValue(float) const = 0;
1582bde8e466a4451c7319e3a072d118917957d6554Steve Block
1592bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool supportsFullscreen() const;
1602bde8e466a4451c7319e3a072d118917957d6554Steve Block
1612bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Required interfaces for concrete derived classes.
1622bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void createAVPlayerForURL(const String& url) = 0;
1632bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS)
1642bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void createAVPlayerForCacheResource(ApplicationCacheResource*) = 0;
1652bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1662bde8e466a4451c7319e3a072d118917957d6554Steve Block
1672bde8e466a4451c7319e3a072d118917957d6554Steve Block    enum ItemStatus {
1682bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVPlayerItemStatusUnknown,
1692bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVPlayerItemStatusFailed,
1702bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVPlayerItemStatusReadyToPlay,
1712bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVPlayerItemStatusPlaybackBufferEmpty,
1722bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVPlayerItemStatusPlaybackBufferFull,
1732bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVPlayerItemStatusPlaybackLikelyToKeepUp,
1742bde8e466a4451c7319e3a072d118917957d6554Steve Block    };
1752bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual ItemStatus playerItemStatus() const = 0;
1762bde8e466a4451c7319e3a072d118917957d6554Steve Block
1772bde8e466a4451c7319e3a072d118917957d6554Steve Block    enum AVAssetStatus {
1782bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVAssetStatusUnknown,
1792bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVAssetStatusLoading,
1802bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVAssetStatusFailed,
1812bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVAssetStatusCancelled,
1822bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVAssetStatusLoaded,
1832bde8e466a4451c7319e3a072d118917957d6554Steve Block        MediaPlayerAVAssetStatusPlayable,
1842bde8e466a4451c7319e3a072d118917957d6554Steve Block    };
1852bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual AVAssetStatus assetStatus() const = 0;
1862bde8e466a4451c7319e3a072d118917957d6554Steve Block
1872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    virtual void platformPlay() = 0;
1882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    virtual void platformPause() = 0;
1892bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void checkPlayability() = 0;
1902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    virtual void updateRate() = 0;
1912bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual float rate() const = 0;
1922bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void seekToTime(float time) = 0;
1932bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual unsigned totalBytes() const = 0;
1942bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual PassRefPtr<TimeRanges> platformBufferedTimeRanges() const = 0;
1952bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual float platformMaxTimeSeekable() const = 0;
1962bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual float platformMaxTimeLoaded() const = 0;
1972bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual float platformDuration() const = 0;
1982bde8e466a4451c7319e3a072d118917957d6554Steve Block
1992bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void beginLoadingMetadata() = 0;
2002bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void tracksChanged() = 0;
2012bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void sizeChanged() = 0;
2022bde8e466a4451c7319e3a072d118917957d6554Steve Block
2032bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void createContextVideoRenderer() = 0;
2042bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void destroyContextVideoRenderer() = 0;
2052bde8e466a4451c7319e3a072d118917957d6554Steve Block
2062bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void createVideoLayer() = 0;
2072bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void destroyVideoLayer() = 0;
2082bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool videoLayerIsReadyToDisplay() const = 0;
2092bde8e466a4451c7319e3a072d118917957d6554Steve Block
2102bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool hasContextRenderer() const = 0;
2112bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual bool hasLayerRenderer() const = 0;
2122bde8e466a4451c7319e3a072d118917957d6554Steve Block
2132bde8e466a4451c7319e3a072d118917957d6554Steve Blockprotected:
2142bde8e466a4451c7319e3a072d118917957d6554Steve Block    void resumeLoad();
2152bde8e466a4451c7319e3a072d118917957d6554Steve Block    void updateStates();
2162bde8e466a4451c7319e3a072d118917957d6554Steve Block
2172bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setHasVideo(bool b) { m_cachedHasVideo = b; };
2182bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setHasAudio(bool b) { m_cachedHasAudio = b; }
2192bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setHasClosedCaptions(bool b) { m_cachedHasCaptions = b; }
2202bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setDelayCallbacks(bool);
2212bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setIgnoreLoadStateChanges(bool delay) { m_ignoreLoadStateChanges = delay; }
2222bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setNaturalSize(IntSize);
2232bde8e466a4451c7319e3a072d118917957d6554Steve Block
2242bde8e466a4451c7319e3a072d118917957d6554Steve Block    enum MediaRenderingMode { MediaRenderingNone, MediaRenderingToContext, MediaRenderingToLayer };
2252bde8e466a4451c7319e3a072d118917957d6554Steve Block    MediaRenderingMode currentRenderingMode() const;
2262bde8e466a4451c7319e3a072d118917957d6554Steve Block    MediaRenderingMode preferredRenderingMode() const;
2272bde8e466a4451c7319e3a072d118917957d6554Steve Block
2282bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool metaDataAvailable() const { return m_readyState >= MediaPlayer::HaveMetadata; }
2292bde8e466a4451c7319e3a072d118917957d6554Steve Block    float requestedRate() const { return m_requestedRate; }
2302bde8e466a4451c7319e3a072d118917957d6554Steve Block    float maxTimeLoaded() const;
2312bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool isReadyForVideoSetup() const;
2322bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void setUpVideoRendering();
2332bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void tearDownVideoRendering();
2342bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool hasSetUpVideoRendering() const;
2352bde8e466a4451c7319e3a072d118917957d6554Steve Block
2362bde8e466a4451c7319e3a072d118917957d6554Steve Block    static void mainThreadCallback(void*);
2372bde8e466a4451c7319e3a072d118917957d6554Steve Block
2382bde8e466a4451c7319e3a072d118917957d6554Steve Blockprivate:
2392bde8e466a4451c7319e3a072d118917957d6554Steve Block
2402bde8e466a4451c7319e3a072d118917957d6554Steve Block    MediaPlayer* m_player;
2412bde8e466a4451c7319e3a072d118917957d6554Steve Block
2422bde8e466a4451c7319e3a072d118917957d6554Steve Block    Vector<Notification> m_queuedNotifications;
2432bde8e466a4451c7319e3a072d118917957d6554Steve Block    Mutex m_queueMutex;
2442bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_mainThreadCallPending;
2452bde8e466a4451c7319e3a072d118917957d6554Steve Block
2462bde8e466a4451c7319e3a072d118917957d6554Steve Block    mutable RefPtr<TimeRanges> m_cachedLoadedTimeRanges;
2472bde8e466a4451c7319e3a072d118917957d6554Steve Block
2482bde8e466a4451c7319e3a072d118917957d6554Steve Block    MediaPlayer::NetworkState m_networkState;
2492bde8e466a4451c7319e3a072d118917957d6554Steve Block    MediaPlayer::ReadyState m_readyState;
2502bde8e466a4451c7319e3a072d118917957d6554Steve Block
2512bde8e466a4451c7319e3a072d118917957d6554Steve Block    String m_assetURL;
2522bde8e466a4451c7319e3a072d118917957d6554Steve Block    MediaPlayer::Preload m_preload;
2532bde8e466a4451c7319e3a072d118917957d6554Steve Block    FloatSize m_scaleFactor;
2542bde8e466a4451c7319e3a072d118917957d6554Steve Block
2552bde8e466a4451c7319e3a072d118917957d6554Steve Block    IntSize m_cachedNaturalSize;
2562bde8e466a4451c7319e3a072d118917957d6554Steve Block    mutable float m_cachedMaxTimeLoaded;
2572bde8e466a4451c7319e3a072d118917957d6554Steve Block    mutable float m_cachedMaxTimeSeekable;
2582bde8e466a4451c7319e3a072d118917957d6554Steve Block    mutable float m_cachedDuration;
2592bde8e466a4451c7319e3a072d118917957d6554Steve Block    float m_reportedDuration;
2602bde8e466a4451c7319e3a072d118917957d6554Steve Block
2612bde8e466a4451c7319e3a072d118917957d6554Steve Block    float m_seekTo;
2622bde8e466a4451c7319e3a072d118917957d6554Steve Block    float m_requestedRate;
2632bde8e466a4451c7319e3a072d118917957d6554Steve Block    int m_delayCallbacks;
2642bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_havePreparedToPlay;
2652bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_assetIsPlayable;
2662bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_visible;
2672bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_videoFrameHasDrawn;
2682bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_loadingMetadata;
2692bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_delayingLoad;
2702bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_isAllowedToRender;
2712bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_cachedHasAudio;
2722bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_cachedHasVideo;
2732bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_cachedHasCaptions;
2742bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_ignoreLoadStateChanges;
2752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool m_haveReportedFirstVideoFrame;
2762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool m_playWhenFramesAvailable;
2772bde8e466a4451c7319e3a072d118917957d6554Steve Block};
2782bde8e466a4451c7319e3a072d118917957d6554Steve Block
2792bde8e466a4451c7319e3a072d118917957d6554Steve Block}
2802bde8e466a4451c7319e3a072d118917957d6554Steve Block
2812bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
2822bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
283