<!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>[210740] 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/210740">210740</a></dd>
<dt>Author</dt> <dd>zandobersek@gmail.com</dd>
<dt>Date</dt> <dd>2017-01-13 12:53:15 -0800 (Fri, 13 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GStreamer] Cache the accelerated capability of MediaPlayerClient in MediaPlayerPrivateGStreamerBase
https://bugs.webkit.org/show_bug.cgi?id=167015

Reviewed by Jer Noble.

In MediaPlayerPrivateGStreamerBase, avoid continuously querying the MediaPlayerClient
object about the accelerated compositing capabilities. Instead, cache this information
when creating the video sink (which is most affected by this information anyway), storing
it in a new protected boolean member variable in the MediaPlayerPrivateGStreamerBase class.

All calls to MediaPlayerClient::mediaPlayerRenderingCanBeAccelerated() and
MediaPlayerClient::mediaPlayerAcceleratedCompositingEnabled() are replaced by tests
on the value of this new member variable.

* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin):
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:
(WebCore::MediaPlayerPrivateGStreamerBase::naturalSize):
(WebCore::MediaPlayerPrivateGStreamerBase::repaint):
(WebCore::MediaPlayerPrivateGStreamerBase::triggerRepaint):
(WebCore::MediaPlayerPrivateGStreamerBase::paint):
(WebCore::MediaPlayerPrivateGStreamerBase::createVideoSink):
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBasecpp">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBaseh">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (210739 => 210740)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-01-13 19:18:30 UTC (rev 210739)
+++ trunk/Source/WebCore/ChangeLog        2017-01-13 20:53:15 UTC (rev 210740)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2017-01-13  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
+
+        [GStreamer] Cache the accelerated capability of MediaPlayerClient in MediaPlayerPrivateGStreamerBase
+        https://bugs.webkit.org/show_bug.cgi?id=167015
+
+        Reviewed by Jer Noble.
+
+        In MediaPlayerPrivateGStreamerBase, avoid continuously querying the MediaPlayerClient
+        object about the accelerated compositing capabilities. Instead, cache this information
+        when creating the video sink (which is most affected by this information anyway), storing
+        it in a new protected boolean member variable in the MediaPlayerPrivateGStreamerBase class.
+
+        All calls to MediaPlayerClient::mediaPlayerRenderingCanBeAccelerated() and
+        MediaPlayerClient::mediaPlayerAcceleratedCompositingEnabled() are replaced by tests
+        on the value of this new member variable.
+
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+        (WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin):
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:
+        (WebCore::MediaPlayerPrivateGStreamerBase::naturalSize):
+        (WebCore::MediaPlayerPrivateGStreamerBase::repaint):
+        (WebCore::MediaPlayerPrivateGStreamerBase::triggerRepaint):
+        (WebCore::MediaPlayerPrivateGStreamerBase::paint):
+        (WebCore::MediaPlayerPrivateGStreamerBase::createVideoSink):
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h:
+
</ins><span class="cx"> 2017-01-13  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Report post-page load CPU usage using diagnostic logging
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (210739 => 210740)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2017-01-13 19:18:30 UTC (rev 210739)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2017-01-13 20:53:15 UTC (rev 210740)
</span><span class="lines">@@ -2016,7 +2016,7 @@
</span><span class="cx">             g_object_set(m_pipeline.get(), &quot;audio-filter&quot;, scale, nullptr);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!m_player-&gt;client().mediaPlayerRenderingCanBeAccelerated(m_player)) {
</del><ins>+    if (!m_renderingCanBeAccelerated) {
</ins><span class="cx">         // If not using accelerated compositing, let GStreamer handle
</span><span class="cx">         // the image-orientation tag.
</span><span class="cx">         GstElement* videoFlip = gst_element_factory_make(&quot;videoflip&quot;, nullptr);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp (210739 => 210740)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp        2017-01-13 19:18:30 UTC (rev 210739)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp        2017-01-13 20:53:15 UTC (rev 210740)
</span><span class="lines">@@ -403,7 +403,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if USE(TEXTURE_MAPPER_GL)
</span><span class="cx">     // When using accelerated compositing, if the video is tagged as rotated 90 or 270 degrees, swap width and height.
</span><del>-    if (m_player-&gt;client().mediaPlayerRenderingCanBeAccelerated(m_player)) {
</del><ins>+    if (m_renderingCanBeAccelerated) {
</ins><span class="cx">         if (m_videoSourceOrientation.usesWidthAsHeight())
</span><span class="cx">             originalSize = originalSize.transposedSize();
</span><span class="cx">     }
</span><span class="lines">@@ -625,7 +625,7 @@
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx"> 
</span><span class="cx"> #if USE(TEXTURE_MAPPER_GL) &amp;&amp; !USE(COORDINATED_GRAPHICS)
</span><del>-    if (supportsAcceleratedRendering() &amp;&amp; m_player-&gt;client().mediaPlayerRenderingCanBeAccelerated(m_player) &amp;&amp; client()) {
</del><ins>+    if (m_renderingCanBeAccelerated &amp;&amp; client()) {
</ins><span class="cx">         client()-&gt;setPlatformLayerNeedsDisplay();
</span><span class="cx"> #if USE(GSTREAMER_GL)
</span><span class="cx">         m_drawCondition.notifyOne();
</span><span class="lines">@@ -656,7 +656,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if USE(COORDINATED_GRAPHICS_THREADED)
</span><del>-    if (!m_player-&gt;client().mediaPlayerAcceleratedCompositingEnabled()) {
</del><ins>+    if (!m_renderingCanBeAccelerated) {
</ins><span class="cx">         LockHolder locker(m_drawMutex);
</span><span class="cx">         m_drawTimer.startOneShot(0);
</span><span class="cx">         m_drawCondition.wait(m_drawMutex);
</span><span class="lines">@@ -728,7 +728,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     ImagePaintingOptions paintingOptions(CompositeCopy);
</span><del>-    if (m_player-&gt;client().mediaPlayerRenderingCanBeAccelerated(m_player))
</del><ins>+    if (m_renderingCanBeAccelerated)
</ins><span class="cx">         paintingOptions.m_orientationDescription.setImageOrientationEnum(m_videoSourceOrientation);
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;ImageGStreamer&gt; gstImage = ImageGStreamer::createImage(m_sample.get());
</span><span class="lines">@@ -1020,8 +1020,11 @@
</span><span class="cx"> 
</span><span class="cx"> GstElement* MediaPlayerPrivateGStreamerBase::createVideoSink()
</span><span class="cx"> {
</span><ins>+    m_renderingCanBeAccelerated = supportsAcceleratedRendering() &amp;&amp; m_player-&gt;client().mediaPlayerAcceleratedCompositingEnabled()
+        &amp;&amp; m_player-&gt;client().mediaPlayerRenderingCanBeAccelerated(m_player);
+
</ins><span class="cx"> #if USE(GSTREAMER_GL)
</span><del>-    if (m_player-&gt;client().mediaPlayerRenderingCanBeAccelerated(m_player))
</del><ins>+    if (m_renderingCanBeAccelerated)
</ins><span class="cx">         m_videoSink = createVideoSinkGL();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h (210739 => 210740)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h        2017-01-13 19:18:30 UTC (rev 210739)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h        2017-01-13 20:53:15 UTC (rev 210740)
</span><span class="lines">@@ -205,6 +205,7 @@
</span><span class="cx"> #endif
</span><span class="cx">     mutable FloatSize m_videoSize;
</span><span class="cx">     bool m_usingFallbackVideoSink;
</span><ins>+    bool m_renderingCanBeAccelerated { false };
</ins><span class="cx"> #if USE(TEXTURE_MAPPER_GL) &amp;&amp; !USE(COORDINATED_GRAPHICS_MULTIPROCESS)
</span><span class="cx">     void updateTexture(BitmapTextureGL&amp;, GstVideoInfo&amp;);
</span><span class="cx"> #endif
</span></span></pre>
</div>
</div>

</body>
</html>