Changeset 151175 in webkit


Ignore:
Timestamp:
Jun 4, 2013 11:07:11 AM (11 years ago)
Author:
commit-queue@webkit.org
Message:

Prevent race when pad caps is set on gstreamer player
https://bugs.webkit.org/show_bug.cgi?id=115355

Patch by Thiago Santos <thiago.sousa.santos@collabora.com> on 2013-06-04
Reviewed by Philippe Normand.

Prevent race when pad caps is set on gstreamer player and
Also protect internal paint buffer with a mutex.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:

(WebCore::MediaPlayerPrivateGStreamerBase::MediaPlayerPrivateGStreamerBase):
(WebCore::MediaPlayerPrivateGStreamerBase::~MediaPlayerPrivateGStreamerBase):
(WebCore::MediaPlayerPrivateGStreamerBase::naturalSize):
(WebCore::MediaPlayerPrivateGStreamerBase::triggerRepaint):
(WebCore::MediaPlayerPrivateGStreamerBase::paint):

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h:

(MediaPlayerPrivateGStreamerBase):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r151170 r151175  
     12013-06-04  Thiago Santos  <thiago.sousa.santos@collabora.com>
     2
     3        Prevent race when pad caps is set on gstreamer player
     4        https://bugs.webkit.org/show_bug.cgi?id=115355
     5
     6        Reviewed by Philippe Normand.
     7
     8        Prevent race when pad caps is set on gstreamer player and
     9        Also protect internal paint buffer with a mutex.
     10
     11        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:
     12        (WebCore::MediaPlayerPrivateGStreamerBase::MediaPlayerPrivateGStreamerBase):
     13        (WebCore::MediaPlayerPrivateGStreamerBase::~MediaPlayerPrivateGStreamerBase):
     14        (WebCore::MediaPlayerPrivateGStreamerBase::naturalSize):
     15        (WebCore::MediaPlayerPrivateGStreamerBase::triggerRepaint):
     16        (WebCore::MediaPlayerPrivateGStreamerBase::paint):
     17        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h:
     18        (MediaPlayerPrivateGStreamerBase):
     19
    1202013-06-04  Jocelyn Turcotte  <jocelyn.turcotte@digia.com>
    221
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp

    r150890 r151175  
    116116#endif
    117117{
     118    g_mutex_init(&m_bufferMutex);
    118119}
    119120
     
    121122{
    122123    g_signal_handler_disconnect(m_webkitVideoSink.get(), m_repaintHandler);
     124
     125    g_mutex_clear(&m_bufferMutex);
    123126
    124127    if (m_buffer)
     
    159162        return m_videoSize;
    160163
     164#ifdef GST_API_VERSION_1
     165    /* FIXME this has a race with the pad setting caps as the buffer (m_buffer)
     166     * and the caps won't match and might cause a crash. (In case a
     167     * renegotiation happens)
     168     */
    161169    GRefPtr<GstCaps> caps = webkitGstGetPadCaps(m_videoSinkPad.get());
     170#else
     171    g_mutex_lock(&m_bufferMutex);
     172    GRefPtr<GstCaps> caps = m_buffer ? GST_BUFFER_CAPS(m_buffer) : 0;
     173    g_mutex_unlock(&m_bufferMutex);
     174#endif
    162175    if (!caps)
    163176        return IntSize();
     
    346359#endif
    347360    {
     361        g_mutex_lock(&m_bufferMutex);
    348362        gst_buffer_replace(&m_buffer, buffer);
     363        g_mutex_unlock(&m_bufferMutex);
    349364        m_player->repaint();
    350365    }
     
    369384        return;
    370385
    371     if (!m_buffer)
    372         return;
    373 
     386    g_mutex_lock(&m_bufferMutex);
     387    if (!m_buffer) {
     388        g_mutex_unlock(&m_bufferMutex);
     389        return;
     390    }
     391
     392#ifdef GST_API_VERSION_1
     393    /* FIXME this has a race with the pad setting caps as the buffer (m_buffer)
     394     * and the caps won't match and might cause a crash. (In case a
     395     * renegotiation happens)
     396     */
    374397    GRefPtr<GstCaps> caps = webkitGstGetPadCaps(m_videoSinkPad.get());
    375     if (!caps)
    376         return;
     398#else
     399    GRefPtr<GstCaps> caps = GST_BUFFER_CAPS(m_buffer);
     400#endif
     401    if (!caps) {
     402        g_mutex_unlock(&m_bufferMutex);
     403        return;
     404    }
    377405
    378406    RefPtr<ImageGStreamer> gstImage = ImageGStreamer::createImage(m_buffer, caps.get());
    379     if (!gstImage)
    380         return;
     407    if (!gstImage) {
     408        g_mutex_unlock(&m_bufferMutex);
     409        return;
     410    }
    381411
    382412    context->drawImage(reinterpret_cast<Image*>(gstImage->image().get()), ColorSpaceSRGB,
    383413        rect, gstImage->rect(), CompositeCopy, DoNotRespectImageOrientation, false);
     414    g_mutex_unlock(&m_bufferMutex);
    384415}
    385416
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h

    r150890 r151175  
    2727#include "GRefPtrGStreamer.h"
    2828#include "MediaPlayerPrivate.h"
     29
     30#include <glib.h>
    2931
    3032#include <wtf/Forward.h>
     
    122124    MediaPlayer::NetworkState m_networkState;
    123125    IntSize m_size;
     126    GMutex m_bufferMutex;
    124127    GstBuffer* m_buffer;
    125128#if USE(NATIVE_FULLSCREEN_VIDEO)
Note: See TracChangeset for help on using the changeset viewer.