Changeset 151175 in webkit
- Timestamp:
- Jun 4, 2013 11:07:11 AM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r151170 r151175 1 2013-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 1 20 2013-06-04 Jocelyn Turcotte <jocelyn.turcotte@digia.com> 2 21 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp
r150890 r151175 116 116 #endif 117 117 { 118 g_mutex_init(&m_bufferMutex); 118 119 } 119 120 … … 121 122 { 122 123 g_signal_handler_disconnect(m_webkitVideoSink.get(), m_repaintHandler); 124 125 g_mutex_clear(&m_bufferMutex); 123 126 124 127 if (m_buffer) … … 159 162 return m_videoSize; 160 163 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 */ 161 169 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 162 175 if (!caps) 163 176 return IntSize(); … … 346 359 #endif 347 360 { 361 g_mutex_lock(&m_bufferMutex); 348 362 gst_buffer_replace(&m_buffer, buffer); 363 g_mutex_unlock(&m_bufferMutex); 349 364 m_player->repaint(); 350 365 } … … 369 384 return; 370 385 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 */ 374 397 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 } 377 405 378 406 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 } 381 411 382 412 context->drawImage(reinterpret_cast<Image*>(gstImage->image().get()), ColorSpaceSRGB, 383 413 rect, gstImage->rect(), CompositeCopy, DoNotRespectImageOrientation, false); 414 g_mutex_unlock(&m_bufferMutex); 384 415 } 385 416 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h
r150890 r151175 27 27 #include "GRefPtrGStreamer.h" 28 28 #include "MediaPlayerPrivate.h" 29 30 #include <glib.h> 29 31 30 32 #include <wtf/Forward.h> … … 122 124 MediaPlayer::NetworkState m_networkState; 123 125 IntSize m_size; 126 GMutex m_bufferMutex; 124 127 GstBuffer* m_buffer; 125 128 #if USE(NATIVE_FULLSCREEN_VIDEO)
Note: See TracChangeset
for help on using the changeset viewer.