<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[186766] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/186766">186766</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-07-13 10:59:16 -0700 (Mon, 13 Jul 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Adding MediaStream Engine building blocks to the code repo
https://bugs.webkit.org/show_bug.cgi?id=146789
&lt;rdar://problem/21747025&gt;

Patch by Matthew Daiter &lt;mdaiter@apple.com&gt; on 2015-07-13
Reviewed by Brent Fulgham.

* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: Added.
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setLoadingProgresssed):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setHasAvailableVideoFrame):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::createWeakPtr):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: Added.
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::MediaPlayerPrivateMediaStreamAVFObjC):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::~MediaPlayerPrivateMediaStreamAVFObjC):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::registerMediaEngine):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::isAvailable):
(WebCore::mimeTypeCache):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::getSupportedTypes):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::supportsType):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::load):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::cancelLoad):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::prepareToPlay):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::platformMedia):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::platformLayer):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::play):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::playInternal):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::pause):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::pauseInternal):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::paused):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVolume):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::supportsScanning):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setMuted):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::naturalSize):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::hasVideo):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::hasAudio):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVisible):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::durationMediaTime):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::seeking):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setRateDouble):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setPreservesPitch):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::networkState):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::readyState):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::seekable):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::maxMediaTimeSeekable):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::minMediaTimeSeekable):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::buffered):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::didLoadingProgress):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setSize):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::hasAvailableVideoFrame):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::supportsAcceleratedRendering):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::movieLoadType):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::prepareForRendering):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::engineDescription):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::languageOfPrimaryAudioTrack):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::shouldBePlaying):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::addDisplayLayer):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::removeDisplayLayer):
* platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h: Added.
* platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm: Added.
(WebCore::MediaStreamPrivateAVFObjC::create):
(WebCore::MediaStreamPrivateAVFObjC::MediaStreamPrivateAVFObjC):
(WebCore::MediaStreamPrivateAVFObjC::~MediaStreamPrivateAVFObjC):
(WebCore::MediaStreamPrivateAVFObjC::duration):
(WebCore::MediaStreamPrivateAVFObjC::buffered):
(WebCore::MediaStreamPrivateAVFObjC::readyState):
(WebCore::MediaStreamPrivateAVFObjC::hasAudio):
(WebCore::MediaStreamPrivateAVFObjC::hasVideo):
(WebCore::MediaStreamPrivateAVFObjC::naturalSize):
* platform/mediastream/MediaStreamPrivate.h:
(WebCore::MediaStreamPrivate::MediaStreamPrivate): Added constructor.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaStreamPrivateh">trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaStreamPrivateAVFObjCh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaStreamPrivateAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (186765 => 186766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-07-13 17:17:02 UTC (rev 186765)
+++ trunk/Source/WebCore/ChangeLog        2015-07-13 17:59:16 UTC (rev 186766)
</span><span class="lines">@@ -1,3 +1,75 @@
</span><ins>+2015-07-13  Matthew Daiter  &lt;mdaiter@apple.com&gt;
+
+        Adding MediaStream Engine building blocks to the code repo
+        https://bugs.webkit.org/show_bug.cgi?id=146789
+        &lt;rdar://problem/21747025&gt;
+
+        Reviewed by Brent Fulgham.
+
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: Added.
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setLoadingProgresssed):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setHasAvailableVideoFrame):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::createWeakPtr):
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: Added.
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::MediaPlayerPrivateMediaStreamAVFObjC):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::~MediaPlayerPrivateMediaStreamAVFObjC):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::registerMediaEngine):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::isAvailable):
+        (WebCore::mimeTypeCache):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::getSupportedTypes):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::supportsType):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::load):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::cancelLoad):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::prepareToPlay):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::platformMedia):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::platformLayer):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::play):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::playInternal):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::pause):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::pauseInternal):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::paused):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVolume):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::supportsScanning):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setMuted):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::naturalSize):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::hasVideo):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::hasAudio):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVisible):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::durationMediaTime):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::seeking):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setRateDouble):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setPreservesPitch):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::networkState):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::readyState):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::seekable):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::maxMediaTimeSeekable):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::minMediaTimeSeekable):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::buffered):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::didLoadingProgress):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setSize):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::hasAvailableVideoFrame):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::supportsAcceleratedRendering):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::movieLoadType):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::prepareForRendering):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::engineDescription):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::languageOfPrimaryAudioTrack):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::shouldBePlaying):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::addDisplayLayer):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::removeDisplayLayer):
+        * platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h: Added.
+        * platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm: Added.
+        (WebCore::MediaStreamPrivateAVFObjC::create):
+        (WebCore::MediaStreamPrivateAVFObjC::MediaStreamPrivateAVFObjC):
+        (WebCore::MediaStreamPrivateAVFObjC::~MediaStreamPrivateAVFObjC):
+        (WebCore::MediaStreamPrivateAVFObjC::duration):
+        (WebCore::MediaStreamPrivateAVFObjC::buffered):
+        (WebCore::MediaStreamPrivateAVFObjC::readyState):
+        (WebCore::MediaStreamPrivateAVFObjC::hasAudio):
+        (WebCore::MediaStreamPrivateAVFObjC::hasVideo):
+        (WebCore::MediaStreamPrivateAVFObjC::naturalSize):
+        * platform/mediastream/MediaStreamPrivate.h: 
+        (WebCore::MediaStreamPrivate::MediaStreamPrivate): Added constructor.
+
</ins><span class="cx"> 2015-07-13  Eric Carlson  &lt;eric.carlson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS] Cancel AirPlay explicitly when exiting from full screen
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h (0 => 186766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h                                (rev 0)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h        2015-07-13 17:59:16 UTC (rev 186766)
</span><span class="lines">@@ -0,0 +1,174 @@
</span><ins>+/*
+ * Copyright (C) 2015 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 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 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 MediaPlayerPrivateMediaStreamAVFObjC_h
+#define MediaPlayerPrivateMediaStreamAVFObjC_h
+
+#if ENABLE(MEDIA_STREAM) &amp;&amp; USE(AVFOUNDATION)
+
+#include &quot;MediaPlayerPrivate.h&quot;
+#include &quot;MediaStreamPrivateAVFObjC.h&quot;
+#include &quot;SourceBufferPrivateClient.h&quot;
+#include &lt;wtf/MediaTime.h&gt;
+#include &lt;wtf/Vector.h&gt;
+#include &lt;wtf/WeakPtr.h&gt;
+
+OBJC_CLASS AVAsset;
+OBJC_CLASS AVCaptureVideoPreviewLayer;
+OBJC_CLASS AVSampleBufferAudioRenderer;
+OBJC_CLASS AVSampleBufferDisplayLayer;
+OBJC_CLASS AVSampleBufferRenderSynchronizer;
+OBJC_CLASS AVStreamSession;
+
+typedef struct OpaqueCMTimebase* CMTimebaseRef;
+
+namespace WebCore {
+
+class MediaPlayerPrivateMediaStreamAVFObjC : public MediaPlayerPrivateInterface {
+public:
+    explicit MediaPlayerPrivateMediaStreamAVFObjC(MediaPlayer*);
+    virtual ~MediaPlayerPrivateMediaStreamAVFObjC();
+
+    static void registerMediaEngine(MediaEngineRegistrar);
+
+    // MediaPlayer Factory Methods
+    static bool isAvailable();
+    static void getSupportedTypes(HashSet&lt;String&gt;&amp; types);
+    static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&amp;);
+
+    void addDisplayLayer(AVSampleBufferDisplayLayer*);
+    void removeDisplayLayer(AVSampleBufferDisplayLayer*);
+
+    void addAudioRenderer(AVSampleBufferAudioRenderer*);
+    void removeAudioRenderer(AVSampleBufferAudioRenderer*);
+
+    MediaPlayer::NetworkState networkState() const override;
+    MediaPlayer::ReadyState readyState() const override;
+    void setReadyState(MediaPlayer::ReadyState);
+
+    void sizeChanged();
+    void characteristicsChanged();
+
+    WeakPtr&lt;MediaPlayerPrivateMediaStreamAVFObjC&gt; createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
+
+private:
+        // MediaPlayerPrivateInterface
+        // FIXME(146853): Implement necessary conformations to standard in HTMLMediaElement for MediaStream 
+    void load(const String&amp;) override { };
+#if ENABLE(MEDIA_SOURCE)
+    void load(const String&amp;, MediaSourcePrivateClient*) override { };
+#endif
+#if ENABLE(MEDIA_STREAM)
+    void load(MediaStreamPrivate*) override;
+#endif
+    void cancelLoad() override;
+
+    void prepareToPlay() override;
+    PlatformMedia platformMedia() const override;
+    PlatformLayer* platformLayer() const override;
+
+    bool supportsFullscreen() const override { return true; }
+
+    void play() override;
+    void playInternal();
+
+    void pause() override;
+    void pauseInternal();
+
+    bool paused() const override;
+
+    void setVolume(float) override;
+    bool supportsMuting() const override { return true; }
+    void setMuted(bool) override;
+
+    bool supportsScanning() const override;
+
+    FloatSize naturalSize() const override;
+
+    bool hasVideo() const override;
+    bool hasAudio() const override;
+
+    void setVisible(bool) override;
+
+    MediaTime durationMediaTime() const override;
+    MediaTime currentMediaTime() const override;
+
+    void seekWithTolerance(const MediaTime&amp;, const MediaTime&amp;, const MediaTime&amp;) override { };
+    bool seeking() const override;
+    void setRateDouble(double) override;
+
+    std::unique_ptr&lt;PlatformTimeRanges&gt; seekable() const override;
+    MediaTime maxMediaTimeSeekable() const override;
+    MediaTime minMediaTimeSeekable() const override;
+    std::unique_ptr&lt;PlatformTimeRanges&gt; buffered() const override;
+
+    bool didLoadingProgress() const override;
+
+    void setSize(const IntSize&amp;) override;
+
+    void paint(GraphicsContext*, const FloatRect&amp;) override;
+    void paintCurrentFrameInContext(GraphicsContext*, const FloatRect&amp;) override;
+
+    bool supportsAcceleratedRendering() const override;
+
+    MediaPlayer::MovieLoadType movieLoadType() const override;
+
+    void prepareForRendering() override;
+
+    String engineDescription() const override;
+
+    String languageOfPrimaryAudioTrack() const override;
+
+    size_t extraMemoryCost() const override;
+
+    bool shouldBePlaying() const;
+
+    friend class MediaStreamPrivateAVFObjC;
+
+    MediaPlayer* m_player;
+    WeakPtrFactory&lt;MediaPlayerPrivateMediaStreamAVFObjC&gt; m_weakPtrFactory;
+    RefPtr&lt;MediaStreamPrivateAVFObjC&gt; m_MediaStreamPrivate;
+    RetainPtr&lt;AVAsset&gt; m_asset;
+    RetainPtr&lt;AVSampleBufferDisplayLayer&gt; m_sampleBufferDisplayLayer;
+    Vector&lt;RetainPtr&lt;AVSampleBufferAudioRenderer&gt;&gt; m_sampleBufferAudioRenderers;
+    RetainPtr&lt;AVSampleBufferRenderSynchronizer&gt; m_synchronizer;
+    RetainPtr&lt;id&gt; m_timeJumpedObserver;
+    RetainPtr&lt;id&gt; m_durationObserver;
+    RetainPtr&lt;AVStreamSession&gt; m_streamSession;
+    MediaPlayer::NetworkState m_networkState;
+    MediaPlayer::ReadyState m_readyState;
+    MediaTime m_lastSeekTime;
+    double m_rate;
+    bool m_playing;
+    bool m_seeking;
+    bool m_seekCompleted;
+    mutable bool m_loadingProgressed;
+};
+    
+}
+
+#endif // ENABLE(MEDIA_STREAM) &amp;&amp; USE(AVFOUNDATION)
+
+#endif // MediaPlayerPrivateMediaStreamAVFObjC_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCmm"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (0 => 186766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm                                (rev 0)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm        2015-07-13 17:59:16 UTC (rev 186766)
</span><span class="lines">@@ -0,0 +1,408 @@
</span><ins>+/*
+ * Copyright (C) 2013, 2015 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 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 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.
+ */
+
+#import &quot;config.h&quot;
+#import &quot;MediaPlayerPrivateMediaStreamAVFObjC.h&quot;
+
+#if ENABLE(MEDIA_STREAM) &amp;&amp; USE(AVFOUNDATION)
+
+#import &quot;AVVideoCaptureSource.h&quot;
+#import &quot;FileSystem.h&quot;
+#import &quot;Logging.h&quot;
+#import &quot;MediaStreamPrivate.h&quot;
+#import &quot;MediaStreamPrivateAVFObjC.h&quot;
+#import &quot;MediaTimeAVFoundation.h&quot;
+#import &quot;PlatformClockCM.h&quot;
+#import &quot;WebCoreSystemInterface.h&quot;
+#import &lt;AVFoundation/AVAsset.h&gt;
+#import &lt;AVFoundation/AVCaptureVideoPreviewLayer.h&gt;
+#import &lt;AVFoundation/AVTime.h&gt;
+#import &lt;QuartzCore/CALayer.h&gt;
+#import &lt;objc_runtime.h&gt;
+#import &lt;wtf/MainThread.h&gt;
+#import &lt;wtf/NeverDestroyed.h&gt;
+
+#pragma mark - Soft Linking
+
+#import &quot;CoreMediaSoftLink.h&quot;
+
+SOFT_LINK_FRAMEWORK_OPTIONAL(AVFoundation)
+
+SOFT_LINK_CLASS_OPTIONAL(AVFoundation, AVAsset)
+SOFT_LINK_CLASS_OPTIONAL(AVFoundation, AVCaptureVideoPreviewLayer)
+SOFT_LINK_CLASS_OPTIONAL(AVFoundation, AVURLAsset)
+SOFT_LINK_CLASS_OPTIONAL(AVFoundation, AVStreamSession);
+
+#pragma mark -
+#pragma mark AVStreamSession
+
+@interface AVStreamSession : NSObject
+- (instancetype)initWithStorageDirectoryAtURL:(NSURL *)storageDirectory;
+@end
+
+namespace WebCore {
+
+#pragma mark -
+#pragma mark MediaPlayerPrivateMediaStreamAVFObjC
+
+MediaPlayerPrivateMediaStreamAVFObjC::MediaPlayerPrivateMediaStreamAVFObjC(MediaPlayer* player)
+    : m_player(player)
+    , m_weakPtrFactory(this)
+    , m_networkState(MediaPlayer::Idle)
+    , m_readyState(MediaPlayer::HaveNothing)
+    , m_rate(1)
+    , m_playing(0)
+    , m_seeking(false)
+    , m_seekCompleted(true)
+    , m_loadingProgressed(false)
+{
+}
+
+MediaPlayerPrivateMediaStreamAVFObjC::~MediaPlayerPrivateMediaStreamAVFObjC()
+{
+}
+
+#pragma mark -
+#pragma mark MediaPlayer Factory Methods
+
+void MediaPlayerPrivateMediaStreamAVFObjC::registerMediaEngine(MediaEngineRegistrar registrar)
+{
+    if (isAvailable())
+        registrar([](MediaPlayer* player) { return std::make_unique&lt;MediaPlayerPrivateMediaStreamAVFObjC&gt;(player); }, getSupportedTypes,
+            supportsType, 0, 0, 0, 0);
+}
+
+bool MediaPlayerPrivateMediaStreamAVFObjC::isAvailable()
+{
+    return AVFoundationLibrary()
+        &amp;&amp; isCoreMediaFrameworkAvailable();
+}
+
+static const HashSet&lt;String&gt;&amp; mimeTypeCache()
+{
+    static NeverDestroyed&lt;HashSet&lt;String&gt;&gt; cache;
+    static bool typeListInitialized = false;
+
+    if (typeListInitialized)
+        return cache;
+    typeListInitialized = true;
+
+    NSArray *types = [getAVURLAssetClass() audiovisualMIMETypes];
+    for (NSString *mimeType in types)
+        cache.get().add(mimeType);
+
+    return cache;
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::getSupportedTypes(HashSet&lt;String&gt;&amp; types)
+{
+    types = mimeTypeCache();
+}
+
+MediaPlayer::SupportsType MediaPlayerPrivateMediaStreamAVFObjC::supportsType(const MediaEngineSupportParameters&amp; parameters)
+{
+    // This engine does not support non-media-stream sources.
+    if (parameters.isMediaStream)
+        return MediaPlayer::IsSupported;
+    return MediaPlayer::IsNotSupported;
+}
+
+#pragma mark -
+#pragma mark MediaPlayerPrivateInterface Overrides
+
+void MediaPlayerPrivateMediaStreamAVFObjC::load(MediaStreamPrivate* client)
+{
+    m_MediaStreamPrivate = MediaStreamPrivateAVFObjC::create(this, client-&gt;client());
+    for (auto track : m_MediaStreamPrivate-&gt;client()-&gt;getVideoTracks()) {
+        client-&gt;addTrack(&amp;track-&gt;privateTrack(), MediaStreamPrivate::NotifyClientOption::DontNotify);
+        client-&gt;client()-&gt;didAddTrackToPrivate(track-&gt;privateTrack());
+        if (track-&gt;readyState() == &quot;live&quot;) {
+            track-&gt;source()-&gt;startProducingData();
+            track-&gt;setEnabled(true);
+        }
+    }
+    for (auto track : m_MediaStreamPrivate-&gt;client()-&gt;getAudioTracks()) {
+        client-&gt;addTrack(&amp;track-&gt;privateTrack(), MediaStreamPrivate::NotifyClientOption::DontNotify);
+        client-&gt;client()-&gt;didAddTrackToPrivate(track-&gt;privateTrack());
+        if (track-&gt;readyState() == &quot;live&quot;) {
+            track-&gt;source()-&gt;startProducingData();
+            track-&gt;setEnabled(true);
+        }
+    }
+    m_player-&gt;client().mediaPlayerRenderingModeChanged(m_player);
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::cancelLoad()
+{
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::prepareToPlay()
+{
+}
+
+PlatformMedia MediaPlayerPrivateMediaStreamAVFObjC::platformMedia() const
+{
+    PlatformMedia pm;
+    pm.type = PlatformMedia::AVFoundationAssetType;
+    pm.media.avfAsset = m_asset.get();
+    return pm;
+}
+
+PlatformLayer* MediaPlayerPrivateMediaStreamAVFObjC::platformLayer() const
+{
+    if (!m_MediaStreamPrivate)
+        return MediaPlayerPrivateInterface::platformLayer();
+    for (auto track : m_MediaStreamPrivate-&gt;client()-&gt;getVideoTracks()) {
+        // FIXME(146858): Just grab the first webcam for now, we can manage more later
+        AVVideoCaptureSource* capture = (AVVideoCaptureSource*)track-&gt;source();
+        return (PlatformLayer*)[getAVCaptureVideoPreviewLayerClass() layerWithSession:capture-&gt;session()];
+    }
+    return MediaPlayerPrivateInterface::platformLayer();
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::play()
+{
+    auto weakThis = createWeakPtr();
+    callOnMainThread([weakThis] {
+        if (!weakThis)
+            return;
+        weakThis.get()-&gt;playInternal();
+    });
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::playInternal()
+{
+    m_playing = true;
+    if (shouldBePlaying())
+        [m_synchronizer setRate:m_rate];
+
+    for (auto track : m_MediaStreamPrivate-&gt;client()-&gt;getVideoTracks())
+        track-&gt;source()-&gt;startProducingData();
+    for (auto track : m_MediaStreamPrivate-&gt;client()-&gt;getAudioTracks())
+        track-&gt;source()-&gt;startProducingData();
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::pause()
+{
+    auto weakThis = createWeakPtr();
+    callOnMainThread([weakThis] {
+        if (!weakThis)
+            return;
+        weakThis.get()-&gt;pauseInternal();
+    });
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::pauseInternal()
+{
+    m_playing = false;
+
+    for (auto track : m_MediaStreamPrivate-&gt;client()-&gt;getVideoTracks())
+        track-&gt;source()-&gt;stopProducingData();
+    for (auto track : m_MediaStreamPrivate-&gt;client()-&gt;getAudioTracks())
+        track-&gt;source()-&gt;stopProducingData();
+}
+
+bool MediaPlayerPrivateMediaStreamAVFObjC::paused() const
+{
+    // Shouldn't be able to pause streams
+    return false;
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::setVolume(float)
+{
+}
+
+bool MediaPlayerPrivateMediaStreamAVFObjC::supportsScanning() const
+{
+    return true;
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::setMuted(bool muted)
+{
+    for (auto track : m_MediaStreamPrivate-&gt;client()-&gt;getAudioTracks())
+        track-&gt;source()-&gt;setMuted(muted);
+}
+
+FloatSize MediaPlayerPrivateMediaStreamAVFObjC::naturalSize() const
+{
+    FloatSize floatSize;
+    for (auto track : m_MediaStreamPrivate-&gt;client()-&gt;getVideoTracks()) {
+        AVVideoCaptureSource* source = (AVVideoCaptureSource*)track-&gt;source();
+        if (!source-&gt;stopped() &amp;&amp; track-&gt;enabled()) {
+            if (source-&gt;width() &gt; floatSize.width())
+                floatSize.setWidth(source-&gt;width());
+            if (source-&gt;height() &gt; floatSize.height())
+                floatSize.setHeight(source-&gt;height());
+        }
+    }
+    return floatSize;
+}
+
+bool MediaPlayerPrivateMediaStreamAVFObjC::hasVideo() const
+{
+    return !m_MediaStreamPrivate-&gt;client()-&gt;getVideoTracks().isEmpty();
+}
+
+bool MediaPlayerPrivateMediaStreamAVFObjC::hasAudio() const
+{
+    return !m_MediaStreamPrivate-&gt;client()-&gt;getAudioTracks().isEmpty();
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::setVisible(bool)
+{
+    // No-op.
+}
+
+MediaTime MediaPlayerPrivateMediaStreamAVFObjC::durationMediaTime() const
+{
+    return MediaTime::positiveInfiniteTime();
+}
+
+MediaTime MediaPlayerPrivateMediaStreamAVFObjC::currentMediaTime() const
+{
+    MediaTime synchronizerTime = toMediaTime(CMTimebaseGetTime([m_synchronizer timebase]));
+    if (synchronizerTime &lt; MediaTime::zeroTime())
+        return MediaTime::zeroTime();
+    return synchronizerTime;
+}
+
+bool MediaPlayerPrivateMediaStreamAVFObjC::seeking() const
+{
+    // MediaStream is unseekable
+    return false;
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::setRateDouble(double)
+{
+    // MediaStream is unseekable; therefore, cannot set rate
+}
+
+MediaPlayer::NetworkState MediaPlayerPrivateMediaStreamAVFObjC::networkState() const
+{
+    return m_networkState;
+}
+
+MediaPlayer::ReadyState MediaPlayerPrivateMediaStreamAVFObjC::readyState() const
+{
+    return m_readyState;
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::sizeChanged()
+{
+    m_player-&gt;sizeChanged();
+}
+
+std::unique_ptr&lt;PlatformTimeRanges&gt; MediaPlayerPrivateMediaStreamAVFObjC::seekable() const
+{
+    return std::make_unique&lt;PlatformTimeRanges&gt;(minMediaTimeSeekable(), maxMediaTimeSeekable());
+}
+
+MediaTime MediaPlayerPrivateMediaStreamAVFObjC::maxMediaTimeSeekable() const
+{
+    return durationMediaTime();
+}
+
+MediaTime MediaPlayerPrivateMediaStreamAVFObjC::minMediaTimeSeekable() const
+{
+    return startTime();
+}
+
+std::unique_ptr&lt;PlatformTimeRanges&gt; MediaPlayerPrivateMediaStreamAVFObjC::buffered() const
+{
+    return std::make_unique&lt;PlatformTimeRanges&gt;();
+}
+
+bool MediaPlayerPrivateMediaStreamAVFObjC::didLoadingProgress() const
+{
+    bool loadingProgressed = m_loadingProgressed;
+    m_loadingProgressed = false;
+    return loadingProgressed;
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::setSize(const IntSize&amp;)
+{
+    // No-op.
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::paint(GraphicsContext*, const FloatRect&amp;)
+{
+    // FIXME(125157): Implement painting.
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::paintCurrentFrameInContext(GraphicsContext*, const FloatRect&amp;)
+{
+    // FIXME(125157): Implement painting.
+}
+
+bool MediaPlayerPrivateMediaStreamAVFObjC::supportsAcceleratedRendering() const
+{
+    return true;
+}
+
+MediaPlayer::MovieLoadType MediaPlayerPrivateMediaStreamAVFObjC::movieLoadType() const
+{
+    return MediaPlayer::LiveStream;
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::prepareForRendering()
+{
+    // No-op.
+}
+
+String MediaPlayerPrivateMediaStreamAVFObjC::engineDescription() const
+{
+    static NeverDestroyed&lt;String&gt; description(ASCIILiteral(&quot;AVFoundation MediaStream Engine&quot;));
+    return description;
+}
+
+String MediaPlayerPrivateMediaStreamAVFObjC::languageOfPrimaryAudioTrack() const
+{
+    // FIXME(125158): implement languageOfPrimaryAudioTrack()
+    return emptyString();
+}
+
+size_t MediaPlayerPrivateMediaStreamAVFObjC::extraMemoryCost() const
+{
+    return 0;
+}
+
+bool MediaPlayerPrivateMediaStreamAVFObjC::shouldBePlaying() const
+{
+    return m_playing &amp;&amp; m_readyState &gt;= MediaPlayer::HaveFutureData;
+}
+
+void MediaPlayerPrivateMediaStreamAVFObjC::setReadyState(MediaPlayer::ReadyState readyState)
+{
+    if (m_readyState == readyState)
+        return;
+
+    m_readyState = readyState;
+
+    m_player-&gt;readyStateChanged();
+}
+
+}
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaStreamPrivateAVFObjCh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h (0 => 186766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h                                (rev 0)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h        2015-07-13 17:59:16 UTC (rev 186766)
</span><span class="lines">@@ -0,0 +1,87 @@
</span><ins>+/*
+ * Copyright (C) 2015 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 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 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 MediaStreamPrivateAVFObjC_h
+#define MediaStreamPrivateAVFObjC_h
+
+#if ENABLE(MEDIA_STREAM) &amp;&amp; USE(AVFOUNDATION)
+
+#include &quot;MediaPlayer.h&quot;
+#include &quot;MediaStreamPrivate.h&quot;
+#include &lt;wtf/Deque.h&gt;
+#include &lt;wtf/HashMap.h&gt;
+#include &lt;wtf/MediaTime.h&gt;
+#include &lt;wtf/RefPtr.h&gt;
+#include &lt;wtf/RetainPtr.h&gt;
+#include &lt;wtf/Vector.h&gt;
+
+OBJC_CLASS AVAsset;
+OBJC_CLASS AVStreamDataParser;
+OBJC_CLASS NSError;
+OBJC_CLASS NSObject;
+typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
+
+namespace WebCore {
+
+class CDMSession;
+class MediaPlayerPrivateMediaStreamAVFObjC;
+class MediaStreamPrivate;
+class MediaStreamPrivateClient;
+class PlatformTimeRanges;
+class TimeRanges;
+
+class MediaStreamPrivateAVFObjC final : public MediaStreamPrivate {
+public:
+    static RefPtr&lt;MediaStreamPrivateAVFObjC&gt; create(MediaPlayerPrivateMediaStreamAVFObjC&amp;, MediaStreamPrivateClient&amp;);
+    virtual ~MediaStreamPrivateAVFObjC();
+
+    MediaPlayerPrivateMediaStreamAVFObjC* player() const { return m_player; }
+
+    virtual MediaStreamPrivateClient* client() const { return m_client.get(); }
+    virtual void setClient(MediaStreamPrivateClient* client) { m_client = client; }
+
+    MediaTime duration();
+    std::unique_ptr&lt;PlatformTimeRanges&gt; buffered();
+
+    bool hasAudio() const;
+    bool hasVideo() const;
+
+    void setReadyState(MediaPlayer::ReadyState);
+    FloatSize naturalSize() const;
+
+    MediaPlayer::ReadyState readyState() const;
+
+private:
+    MediaStreamPrivateAVFObjC(MediaPlayerPrivateMediaStreamAVFObjC&amp;, MediaStreamPrivateClient&amp;);
+
+    MediaPlayerPrivateMediaStreamAVFObjC* m_player;
+    RefPtr&lt;MediaStreamPrivateClient&gt; m_client;
+};
+    
+}
+
+#endif // ENABLE(MEDIA_STREAM) &amp;&amp; USE(AVFOUNDATION)
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaStreamPrivateAVFObjCmm"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm (0 => 186766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm                                (rev 0)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm        2015-07-13 17:59:16 UTC (rev 186766)
</span><span class="lines">@@ -0,0 +1,98 @@
</span><ins>+/*
+ * Copyright (C) 2015 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 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 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.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;MediaStreamPrivateAVFObjC.h&quot;
+
+#if ENABLE(MEDIA_STREAM) &amp;&amp; USE(AVFOUNDATION)
+
+#import &quot;ContentType.h&quot;
+#import &quot;ExceptionCodePlaceholder.h&quot;
+#import &quot;MediaPlayerPrivateMediaStreamAVFObjC.h&quot;
+#import &quot;MediaStreamPrivate.h&quot;
+#import &quot;SoftLinking.h&quot;
+#import &quot;SourceBufferPrivateAVFObjC.h&quot;
+#import &lt;objc/runtime.h&gt;
+#import &lt;wtf/text/AtomicString.h&gt;
+#import &lt;wtf/text/StringBuilder.h&gt;
+
+namespace WebCore {
+
+#pragma mark -
+#pragma mark MediaStreamPrivateAVFObjC
+
+RefPtr&lt;MediaStreamPrivateAVFObjC&gt; MediaStreamPrivateAVFObjC::create(MediaPlayerPrivateMediaStreamAVFObjC&amp; parent, MediaStreamPrivateClient&amp; client)
+{
+    return adoptRef(new MediaStreamPrivateAVFObjC(parent, client));
+}
+
+MediaStreamPrivateAVFObjC::MediaStreamPrivateAVFObjC(MediaPlayerPrivateMediaStreamAVFObjC&amp; parent, MediaStreamPrivateClient&amp; client)
+    : m_player(&amp;parent)
+    , m_client(&amp;client)
+{
+}
+
+MediaStreamPrivateAVFObjC::~MediaStreamPrivateAVFObjC()
+{
+}
+
+MediaTime MediaStreamPrivateAVFObjC::duration()
+{
+    return MediaTime::positiveInfiniteTime();
+}
+
+std::unique_ptr&lt;PlatformTimeRanges&gt; MediaStreamPrivateAVFObjC::buffered()
+{
+    return std::unique_ptr&lt;PlatformTimeRanges&gt;();
+}
+
+MediaPlayer::ReadyState MediaStreamPrivateAVFObjC::readyState() const
+{
+    return m_player-&gt;readyState();
+}
+
+void MediaStreamPrivateAVFObjC::setReadyState(MediaPlayer::ReadyState readyState)
+{
+    m_player-&gt;setReadyState(readyState);
+}
+
+bool MediaStreamPrivateAVFObjC::hasAudio() const
+{
+    return m_player-&gt;hasAudio();
+}
+
+bool MediaStreamPrivateAVFObjC::hasVideo() const
+{
+    return m_player-&gt;hasVideo();
+}
+
+FloatSize MediaStreamPrivateAVFObjC::naturalSize() const
+{
+    return m_player-&gt;naturalSize();
+}
+    
+}
+
+#endif // ENABLE(MEDIA_STREAM) &amp;&amp; USE(AVFOUNDATION)
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaStreamPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h (186765 => 186766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h        2015-07-13 17:17:02 UTC (rev 186765)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h        2015-07-13 17:59:16 UTC (rev 186766)
</span><span class="lines">@@ -81,6 +81,7 @@
</span><span class="cx">     void removeTrack(MediaStreamTrackPrivate&amp;, NotifyClientOption);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    MediaStreamPrivate() { }
</ins><span class="cx">     MediaStreamPrivate(const String&amp; id, const Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt;&amp;);
</span><span class="cx"> 
</span><span class="cx">     MediaStreamPrivateClient* m_client;
</span></span></pre>
</div>
</div>

</body>
</html>