Title: [272213] trunk/Source
Revision
272213
Author
[email protected]
Date
2021-02-02 09:21:21 -0800 (Tue, 02 Feb 2021)

Log Message

Recover MediaStreamTrack audio rendering from GPUProcess crash
https://bugs.webkit.org/show_bug.cgi?id=221128

Reviewed by Eric Carlson.

Source/WebCore:

Add a callback to allow AudioMediaStreamTrackRenderer to notify its AudioTrackPrivateMediaStream of crash.
In case of crash, AudioTrackPrivateMediaStream will stop rendering, recreate a new renderer and restart rendering.

Manually tested since correct rendering is not easily observable.

* platform/mediastream/AudioMediaStreamTrackRenderer.h:
(WebCore::AudioMediaStreamTrackRenderer::crashed):
* platform/mediastream/AudioTrackPrivateMediaStream.cpp:
(WebCore::AudioTrackPrivateMediaStream::AudioTrackPrivateMediaStream):
(WebCore::AudioTrackPrivateMediaStream::createRenderer):
(WebCore::AudioTrackPrivateMediaStream::createNewRenderer):
* platform/mediastream/AudioTrackPrivateMediaStream.h:

Source/WebKit:

Make AudioMediaStreamTrackRenderer observe GPUProcess crash.
Notify its owner in case of crash.

* WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.cpp:
(WebKit::AudioMediaStreamTrackRenderer::AudioMediaStreamTrackRenderer):
(WebKit::AudioMediaStreamTrackRenderer::~AudioMediaStreamTrackRenderer):
(WebKit::AudioMediaStreamTrackRenderer::initialize):
(WebKit::AudioMediaStreamTrackRenderer::gpuProcessConnectionDidClose):
* WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (272212 => 272213)


--- trunk/Source/WebCore/ChangeLog	2021-02-02 17:17:31 UTC (rev 272212)
+++ trunk/Source/WebCore/ChangeLog	2021-02-02 17:21:21 UTC (rev 272213)
@@ -1,3 +1,23 @@
+2021-02-02  Youenn Fablet  <[email protected]>
+
+        Recover MediaStreamTrack audio rendering from GPUProcess crash
+        https://bugs.webkit.org/show_bug.cgi?id=221128
+
+        Reviewed by Eric Carlson.
+
+        Add a callback to allow AudioMediaStreamTrackRenderer to notify its AudioTrackPrivateMediaStream of crash.
+        In case of crash, AudioTrackPrivateMediaStream will stop rendering, recreate a new renderer and restart rendering.
+
+        Manually tested since correct rendering is not easily observable.
+
+        * platform/mediastream/AudioMediaStreamTrackRenderer.h:
+        (WebCore::AudioMediaStreamTrackRenderer::crashed):
+        * platform/mediastream/AudioTrackPrivateMediaStream.cpp:
+        (WebCore::AudioTrackPrivateMediaStream::AudioTrackPrivateMediaStream):
+        (WebCore::AudioTrackPrivateMediaStream::createRenderer):
+        (WebCore::AudioTrackPrivateMediaStream::createNewRenderer):
+        * platform/mediastream/AudioTrackPrivateMediaStream.h:
+
 2021-02-02  Chris Dumez  <[email protected]>
 
         Crash under NetworkStorageSession::cookiesForSession()

Modified: trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.h (272212 => 272213)


--- trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.h	2021-02-02 17:17:31 UTC (rev 272212)
+++ trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.h	2021-02-02 17:21:21 UTC (rev 272213)
@@ -27,6 +27,7 @@
 
 #if ENABLE(MEDIA_STREAM)
 
+#include <wtf/Function.h>
 #include <wtf/LoggerHelper.h>
 
 namespace WTF {
@@ -62,6 +63,8 @@
     using RendererCreator = std::unique_ptr<AudioMediaStreamTrackRenderer> (*)();
     static void setCreator(RendererCreator);
 
+    void setCrashCallback(Function<void()>&& callback) { m_crashCallback = WTFMove(callback); }
+
 protected:
 #if !RELEASE_LOG_DISABLED
     const Logger& logger() const final;
@@ -71,11 +74,14 @@
     WTFLogChannel& logChannel() const final;
 #endif
 
+    void crashed();
+
 private:
     static RendererCreator m_rendererCreator;
 
     // Main thread writable members
     float m_volume { 1 };
+    Function<void()> m_crashCallback;
 
 #if !RELEASE_LOG_DISABLED
     RefPtr<const Logger> m_logger;
@@ -93,6 +99,12 @@
     return m_volume;
 }
 
+inline void AudioMediaStreamTrackRenderer::crashed()
+{
+    if (m_crashCallback)
+        m_crashCallback();
+}
+
 #if !RELEASE_LOG_DISABLED
 inline const Logger& AudioMediaStreamTrackRenderer::logger() const
 {

Modified: trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp (272212 => 272213)


--- trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp	2021-02-02 17:17:31 UTC (rev 272212)
+++ trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp	2021-02-02 17:21:21 UTC (rev 272213)
@@ -38,7 +38,7 @@
     , m_audioSource(track.source())
     , m_id(track.id())
     , m_label(track.label())
-    , m_renderer { AudioMediaStreamTrackRenderer::create() }
+    , m_renderer(createRenderer(*this))
 {
     track.addObserver(*this);
 }
@@ -48,6 +48,16 @@
     clear();
 }
 
+std::unique_ptr<AudioMediaStreamTrackRenderer> AudioTrackPrivateMediaStream::createRenderer(AudioTrackPrivateMediaStream& stream)
+{
+    auto renderer = AudioMediaStreamTrackRenderer::create();
+    renderer->setCrashCallback([stream = makeWeakPtr(stream)] {
+        if (stream)
+            stream->createNewRenderer();
+    });
+    return renderer;
+}
+
 #if !RELEASE_LOG_DISABLED
 void AudioTrackPrivateMediaStream::setLogger(const Logger& logger, const void* identifier)
 {
@@ -159,6 +169,19 @@
     m_renderer->stop();
 }
 
+void AudioTrackPrivateMediaStream::createNewRenderer()
+{
+    bool isPlaying = m_isPlaying;
+    stopRenderer();
+
+    float volume = this->volume();
+    m_renderer = createRenderer(*this);
+    m_renderer->setVolume(volume);
+
+    if (isPlaying)
+        startRenderer();
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h (272212 => 272213)


--- trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h	2021-02-02 17:17:31 UTC (rev 272212)
+++ trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h	2021-02-02 17:21:21 UTC (rev 272213)
@@ -36,7 +36,7 @@
 
 class AudioTrackPrivateMediaStream final
     : public AudioTrackPrivate
-    , private MediaStreamTrackPrivate::Observer
+    , public MediaStreamTrackPrivate::Observer
     , private RealtimeMediaSource::AudioSampleObserver {
     WTF_MAKE_NONCOPYABLE(AudioTrackPrivateMediaStream)
 public:
@@ -69,9 +69,11 @@
     const char* logClassName() const final { return "AudioTrackPrivateMediaStream"; }
 #endif
 
-protected:
+private:
     explicit AudioTrackPrivateMediaStream(MediaStreamTrackPrivate&);
 
+    static std::unique_ptr<AudioMediaStreamTrackRenderer> createRenderer(AudioTrackPrivateMediaStream&);
+
     // AudioTrackPrivate
     Kind kind() const final { return Kind::Main; }
     AtomString id() const final { return m_id; }
@@ -91,6 +93,7 @@
     void startRenderer();
     void stopRenderer();
     void updateRenderer();
+    void createNewRenderer();
 
     // Main thread writable members
     bool m_isPlaying { false };

Modified: trunk/Source/WebKit/ChangeLog (272212 => 272213)


--- trunk/Source/WebKit/ChangeLog	2021-02-02 17:17:31 UTC (rev 272212)
+++ trunk/Source/WebKit/ChangeLog	2021-02-02 17:21:21 UTC (rev 272213)
@@ -1,5 +1,22 @@
 2021-02-02  Youenn Fablet  <[email protected]>
 
+        Recover MediaStreamTrack audio rendering from GPUProcess crash
+        https://bugs.webkit.org/show_bug.cgi?id=221128
+
+        Reviewed by Eric Carlson.
+
+        Make AudioMediaStreamTrackRenderer observe GPUProcess crash.
+        Notify its owner in case of crash.
+
+        * WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.cpp:
+        (WebKit::AudioMediaStreamTrackRenderer::AudioMediaStreamTrackRenderer):
+        (WebKit::AudioMediaStreamTrackRenderer::~AudioMediaStreamTrackRenderer):
+        (WebKit::AudioMediaStreamTrackRenderer::initialize):
+        (WebKit::AudioMediaStreamTrackRenderer::gpuProcessConnectionDidClose):
+        * WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.h:
+
+2021-02-02  Youenn Fablet  <[email protected]>
+
         Make sure NetworkRTCProvider stays valid for all NetworkRTCSocketCocoa callbacks
         https://bugs.webkit.org/show_bug.cgi?id=221249
         <rdar://problem/72671547>

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.cpp (272212 => 272213)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.cpp	2021-02-02 17:17:31 UTC (rev 272212)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.cpp	2021-02-02 17:21:21 UTC (rev 272213)
@@ -48,14 +48,21 @@
     , m_identifier(AudioMediaStreamTrackRendererIdentifier::generate())
     , m_ringBuffer(makeUnique<WebCore::CARingBuffer>(makeUniqueRef<SharedRingBufferStorage>(std::bind(&AudioMediaStreamTrackRenderer::storageChanged, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3))))
 {
-    m_connection->send(Messages::RemoteAudioMediaStreamTrackRendererManager::CreateRenderer { m_identifier }, 0);
+    initialize();
 }
 
 AudioMediaStreamTrackRenderer::~AudioMediaStreamTrackRenderer()
 {
+    WebProcess::singleton().ensureGPUProcessConnection().removeClient(*this);
     m_connection->send(Messages::RemoteAudioMediaStreamTrackRendererManager::ReleaseRenderer { m_identifier }, 0);
 }
 
+void AudioMediaStreamTrackRenderer::initialize()
+{
+    WebProcess::singleton().ensureGPUProcessConnection().addClient(*this);
+    m_connection->send(Messages::RemoteAudioMediaStreamTrackRendererManager::CreateRenderer { m_identifier }, 0);
+}
+
 void AudioMediaStreamTrackRenderer::start()
 {
     m_isPlaying = true;
@@ -113,6 +120,11 @@
     m_connection->send(Messages::RemoteAudioMediaStreamTrackRenderer::AudioSamplesStorageChanged { SharedMemory::IPCHandle { WTFMove(handle), dataSize }, format, frameCount }, m_identifier);
 }
 
+void AudioMediaStreamTrackRenderer::gpuProcessConnectionDidClose(GPUProcessConnection&)
+{
+    crashed();
 }
 
+}
+
 #endif // PLATFORM(COCOA) && ENABLE(GPU_PROCESS) && ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.h (272212 => 272213)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.h	2021-02-02 17:17:31 UTC (rev 272212)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.h	2021-02-02 17:21:21 UTC (rev 272213)
@@ -28,6 +28,7 @@
 #if PLATFORM(COCOA) && ENABLE(GPU_PROCESS) && ENABLE(MEDIA_STREAM)
 
 #include "AudioMediaStreamTrackRendererIdentifier.h"
+#include "GPUProcessConnection.h"
 #include "SharedRingBufferStorage.h"
 #include <WebCore/AudioMediaStreamTrackRenderer.h>
 #include <wtf/MediaTime.h>
@@ -38,7 +39,7 @@
 
 namespace WebKit {
 
-class AudioMediaStreamTrackRenderer final : public WebCore::AudioMediaStreamTrackRenderer {
+class AudioMediaStreamTrackRenderer final : public WebCore::AudioMediaStreamTrackRenderer, public GPUProcessConnection::Client {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     static std::unique_ptr<WebCore::AudioMediaStreamTrackRenderer> create();
@@ -49,6 +50,7 @@
 private:
     explicit AudioMediaStreamTrackRenderer(Ref<IPC::Connection>&&);
 
+    void initialize();
     void storageChanged(SharedMemory*, const WebCore::CAAudioStreamDescription& format, size_t frameCount);
 
     // WebCore::AudioMediaStreamTrackRenderer
@@ -58,6 +60,9 @@
     void setVolume(float) final;
     void pushSamples(const MediaTime&, const WebCore::PlatformAudioData&, const WebCore::AudioStreamDescription&, size_t) final;
 
+    // GPUProcessConnection::Client
+    void gpuProcessConnectionDidClose(GPUProcessConnection&) final;
+
     Ref<IPC::Connection> m_connection;
     AudioMediaStreamTrackRendererIdentifier m_identifier;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to