Changeset 228639 in webkit
- Timestamp:
- Feb 19, 2018 2:47:49 AM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r228617 r228639 1 2018-02-19 Xabier Rodriguez Calvar <calvaris@igalia.com> 2 3 [GStreamer] Crash in WebCore::MediaPlayerRequestInstallMissingPluginsCallback::complete 4 https://bugs.webkit.org/show_bug.cgi?id=166733 5 6 Reviewed by Philippe Normand. 7 8 There are a couple of issues to tackle here. 9 10 First is handling getting more than one missing plugin 11 installation request at the same time. For this we add the request 12 to a Vector and handle them there. 13 14 Second is that if the player is dead and we still get the result, 15 bad things happen. For that we "weaked" the pointer capture by the 16 lambda. 17 18 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: 19 (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): 20 Handle Vector of callbacks. 21 (WebCore::MediaPlayerPrivateGStreamer::handleMessage): Weak 22 private player pointer and put the callback in the Vector. 23 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: 24 Callback becomes Vector. 25 * platform/graphics/gstreamer/MediaPlayerRequestInstallMissingPluginsCallback.h: 26 (WebCore::MediaPlayerRequestInstallMissingPluginsCallback::create): 27 (WebCore::MediaPlayerRequestInstallMissingPluginsCallback::complete): 28 (WebCore::MediaPlayerRequestInstallMissingPluginsCallback::MediaPlayerRequestInstallMissingPluginsCallback): 29 Callback function is refactored into a "using" type and added self 30 as parameter to the function. 31 1 32 2018-02-19 Philippe Normand <pnormand@igalia.com> 2 33 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
r228617 r228639 192 192 193 193 m_readyTimerHandler.stop(); 194 if (m_missingPluginsCallback) { 195 m_missingPluginsCallback->invalidate(); 196 m_missingPluginsCallback = nullptr; 197 } 194 for (auto& missingPluginCallback : m_missingPluginCallbacks) { 195 if (missingPluginCallback) 196 missingPluginCallback->invalidate(); 197 } 198 m_missingPluginCallbacks.clear(); 198 199 199 200 if (m_videoSink) { … … 1108 1109 switch (GST_MESSAGE_TYPE(message)) { 1109 1110 case GST_MESSAGE_ERROR: 1110 if (m_resetPipeline || m_missingPluginsCallback|| m_errorOccured)1111 if (m_resetPipeline || !m_missingPluginCallbacks.isEmpty() || m_errorOccured) 1111 1112 break; 1112 1113 gst_message_parse_error(message, &err.outPtr(), &debug.outPtr()); … … 1204 1205 if (gst_is_missing_plugin_message(message)) { 1205 1206 if (gst_install_plugins_supported()) { 1206 m_missingPluginsCallback = MediaPlayerRequestInstallMissingPluginsCallback::create([this](uint32_t result) { 1207 m_missingPluginsCallback = nullptr; 1207 RefPtr<MediaPlayerRequestInstallMissingPluginsCallback> missingPluginCallback = MediaPlayerRequestInstallMissingPluginsCallback::create([weakThis = createWeakPtr()](uint32_t result, MediaPlayerRequestInstallMissingPluginsCallback& missingPluginCallback) { 1208 if (!weakThis) { 1209 GST_INFO("got missing pluging installation callback in destroyed player with result %u", result); 1210 return; 1211 } 1212 1213 GST_DEBUG("got missing plugin installation callback with result %u", result); 1214 RefPtr<MediaPlayerRequestInstallMissingPluginsCallback> protectedMissingPluginCallback = &missingPluginCallback; 1215 weakThis->m_missingPluginCallbacks.removeFirst(protectedMissingPluginCallback); 1208 1216 if (result != GST_INSTALL_PLUGINS_SUCCESS) 1209 1217 return; 1210 1218 1211 changePipelineState(GST_STATE_READY);1212 changePipelineState(GST_STATE_PAUSED);1219 weakThis->changePipelineState(GST_STATE_READY); 1220 weakThis->changePipelineState(GST_STATE_PAUSED); 1213 1221 }); 1222 m_missingPluginCallbacks.append(missingPluginCallback); 1214 1223 GUniquePtr<char> detail(gst_missing_plugin_message_get_installer_detail(message)); 1215 1224 GUniquePtr<char> description(gst_missing_plugin_message_get_description(message)); 1216 m_player->client().requestInstallMissingPlugins(String::fromUTF8(detail.get()), String::fromUTF8(description.get()), *m _missingPluginsCallback);1225 m_player->client().requestInstallMissingPlugins(String::fromUTF8(detail.get()), String::fromUTF8(description.get()), *missingPluginCallback); 1217 1226 } 1218 1227 } -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
r228617 r228639 269 269 GRefPtr<GstElement> m_autoAudioSink; 270 270 GRefPtr<GstElement> m_downloadBuffer; 271 RefPtr<MediaPlayerRequestInstallMissingPluginsCallback> m_missingPluginsCallback;271 Vector<RefPtr<MediaPlayerRequestInstallMissingPluginsCallback>> m_missingPluginCallbacks; 272 272 #if ENABLE(VIDEO_TRACK) 273 273 HashMap<AtomicString, RefPtr<AudioTrackPrivateGStreamer>> m_audioTracks; -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerRequestInstallMissingPluginsCallback.h
r218615 r228639 30 30 WTF_MAKE_FAST_ALLOCATED(); 31 31 public: 32 static Ref<MediaPlayerRequestInstallMissingPluginsCallback> create(WTF::Function<void (uint32_t)>&& function) 32 using MediaPlayerRequestInstallMissingPluginsCallbackFunction = std::function<void(uint32_t, MediaPlayerRequestInstallMissingPluginsCallback&)>; 33 34 static Ref<MediaPlayerRequestInstallMissingPluginsCallback> create(MediaPlayerRequestInstallMissingPluginsCallbackFunction&& function) 33 35 { 34 36 return adoptRef(*new MediaPlayerRequestInstallMissingPluginsCallback(WTFMove(function))); … … 44 46 if (!m_function) 45 47 return; 46 m_function(result );48 m_function(result, *this); 47 49 m_function = nullptr; 48 50 } 49 51 50 52 private: 51 MediaPlayerRequestInstallMissingPluginsCallback( WTF::Function<void (uint32_t)>&& function)53 MediaPlayerRequestInstallMissingPluginsCallback(MediaPlayerRequestInstallMissingPluginsCallbackFunction&& function) 52 54 : m_function(WTFMove(function)) 53 55 { 54 56 } 55 57 56 WTF::Function<void (uint32_t)>m_function;58 MediaPlayerRequestInstallMissingPluginsCallbackFunction m_function; 57 59 }; 58 60
Note: See TracChangeset
for help on using the changeset viewer.