- 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;