Title: [267261] branches/safari-610-branch/Source
Revision
267261
Author
[email protected]
Date
2020-09-18 12:35:49 -0700 (Fri, 18 Sep 2020)

Log Message

Cherry-pick r266745. rdar://problem/69100985

    Tighten checks when creating an audio buffer list
    https://bugs.webkit.org/show_bug.cgi?id=216237
    <rdar://problem/68271376>

    Reviewed by Geoffrey Garen.

    Source/WebCore:

    Add a routine to check there is no multiplication integer overflow.

    * platform/audio/cocoa/WebAudioBufferList.cpp:
    (WebCore::computeBufferSize):
    (WebCore::WebAudioBufferList::isSupportedDescription):
    (WebCore::WebAudioBufferList::setSampleCount):
    * platform/audio/cocoa/WebAudioBufferList.h:

    Source/WebKit:

    Add message checks to verify that no message integer overflows happen when processing audio buffer list messages.

    * GPUProcess/GPUConnectionToWebProcess.cpp:
    (WebKit::GPUConnectionToWebProcess::audioTrackRendererManager):
    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.cpp:
    (WebKit::RemoteAudioMediaStreamTrackRenderer::RemoteAudioMediaStreamTrackRenderer):
    (WebKit::RemoteAudioMediaStreamTrackRenderer::audioSamplesStorageChanged):
    (WebKit::RemoteAudioMediaStreamTrackRenderer::audioSamplesAvailable):
    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h:
    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp:
    (WebKit::RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager):
    (WebKit::RemoteAudioMediaStreamTrackRendererManager::createRenderer):
    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h:
    * GPUProcess/webrtc/RemoteMediaRecorder.cpp:
    (WebKit::RemoteMediaRecorder::audioSamplesStorageChanged):
    (WebKit::RemoteMediaRecorder::audioSamplesAvailable):
    * GPUProcess/webrtc/RemoteMediaRecorder.h:
    * WebProcess/cocoa/RemoteCaptureSampleManager.cpp:
    (WebKit::RemoteCaptureSampleManager::RemoteAudio::audioSamplesAvailable):

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266745 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Diff

Modified: branches/safari-610-branch/Source/WebCore/ChangeLog (267260 => 267261)


--- branches/safari-610-branch/Source/WebCore/ChangeLog	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebCore/ChangeLog	2020-09-18 19:35:49 UTC (rev 267261)
@@ -1,5 +1,65 @@
 2020-09-17  Alan Coon  <[email protected]>
 
+        Cherry-pick r266745. rdar://problem/69100985
+
+    Tighten checks when creating an audio buffer list
+    https://bugs.webkit.org/show_bug.cgi?id=216237
+    <rdar://problem/68271376>
+    
+    Reviewed by Geoffrey Garen.
+    
+    Source/WebCore:
+    
+    Add a routine to check there is no multiplication integer overflow.
+    
+    * platform/audio/cocoa/WebAudioBufferList.cpp:
+    (WebCore::computeBufferSize):
+    (WebCore::WebAudioBufferList::isSupportedDescription):
+    (WebCore::WebAudioBufferList::setSampleCount):
+    * platform/audio/cocoa/WebAudioBufferList.h:
+    
+    Source/WebKit:
+    
+    Add message checks to verify that no message integer overflows happen when processing audio buffer list messages.
+    
+    * GPUProcess/GPUConnectionToWebProcess.cpp:
+    (WebKit::GPUConnectionToWebProcess::audioTrackRendererManager):
+    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.cpp:
+    (WebKit::RemoteAudioMediaStreamTrackRenderer::RemoteAudioMediaStreamTrackRenderer):
+    (WebKit::RemoteAudioMediaStreamTrackRenderer::audioSamplesStorageChanged):
+    (WebKit::RemoteAudioMediaStreamTrackRenderer::audioSamplesAvailable):
+    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h:
+    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp:
+    (WebKit::RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager):
+    (WebKit::RemoteAudioMediaStreamTrackRendererManager::createRenderer):
+    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h:
+    * GPUProcess/webrtc/RemoteMediaRecorder.cpp:
+    (WebKit::RemoteMediaRecorder::audioSamplesStorageChanged):
+    (WebKit::RemoteMediaRecorder::audioSamplesAvailable):
+    * GPUProcess/webrtc/RemoteMediaRecorder.h:
+    * WebProcess/cocoa/RemoteCaptureSampleManager.cpp:
+    (WebKit::RemoteCaptureSampleManager::RemoteAudio::audioSamplesAvailable):
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266745 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2020-09-08  Youenn Fablet  <[email protected]>
+
+            Tighten checks when creating an audio buffer list
+            https://bugs.webkit.org/show_bug.cgi?id=216237
+            <rdar://problem/68271376>
+
+            Reviewed by Geoffrey Garen.
+
+            Add a routine to check there is no multiplication integer overflow.
+
+            * platform/audio/cocoa/WebAudioBufferList.cpp:
+            (WebCore::computeBufferSize):
+            (WebCore::WebAudioBufferList::isSupportedDescription):
+            (WebCore::WebAudioBufferList::setSampleCount):
+            * platform/audio/cocoa/WebAudioBufferList.h:
+
+2020-09-17  Alan Coon  <[email protected]>
+
         Cherry-pick r266375. rdar://problem/69101035
 
     Avoid computing metadata for idempotent text autosizing on macOS

Modified: branches/safari-610-branch/Source/WebCore/platform/audio/cocoa/WebAudioBufferList.cpp (267260 => 267261)


--- branches/safari-610-branch/Source/WebCore/platform/audio/cocoa/WebAudioBufferList.cpp	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebCore/platform/audio/cocoa/WebAudioBufferList.cpp	2020-09-18 19:35:49 UTC (rev 267261)
@@ -27,6 +27,8 @@
 #include "WebAudioBufferList.h"
 
 #include "CAAudioStreamDescription.h"
+#include <wtf/CheckedArithmetic.h>
+
 #include <pal/cf/CoreMediaSoftLink.h>
 
 namespace WebCore {
@@ -59,6 +61,31 @@
     setSampleCount(sampleCount);
 }
 
+static inline Optional<std::pair<size_t, size_t>> computeBufferSizes(uint32_t numberOfInterleavedChannels, uint32_t bytesPerFrame, uint32_t numberOfChannelStreams, uint32_t sampleCount)
+{
+    size_t totalSampleCount;
+    bool result = WTF::safeMultiply(sampleCount, numberOfInterleavedChannels, totalSampleCount);
+    if (!result)
+        return { };
+
+    size_t bytesPerBuffer;
+    result = WTF::safeMultiply(bytesPerFrame, totalSampleCount, bytesPerBuffer);
+    if (!result)
+        return { };
+
+    size_t flatBufferSize;
+    result = WTF::safeMultiply(numberOfChannelStreams, bytesPerBuffer, flatBufferSize);
+    if (!result)
+        return { };
+
+    return std::make_pair(bytesPerBuffer, flatBufferSize);
+}
+
+bool WebAudioBufferList::isSupportedDescription(const CAAudioStreamDescription& format, uint32_t sampleCount)
+{
+    return !!computeBufferSizes(format.numberOfInterleavedChannels(), format.bytesPerFrame(), format.numberOfChannelStreams(), sampleCount);
+}
+
 void WebAudioBufferList::setSampleCount(uint32_t sampleCount)
 {
     if (!sampleCount || m_sampleCount == sampleCount)
@@ -65,14 +92,17 @@
         return;
 
     m_sampleCount = sampleCount;
-    size_t bytesPerBuffer = m_sampleCount * m_channelCount * m_bytesPerFrame;
-    m_flatBuffer.resize(m_canonicalList->mNumberBuffers * bytesPerBuffer);
+
+    auto bufferSizes = computeBufferSizes(m_channelCount, m_bytesPerFrame, m_canonicalList->mNumberBuffers, m_sampleCount);
+    ASSERT(bufferSizes);
+
+    m_flatBuffer.resize(bufferSizes->second);
     auto* data = ""
 
     for (uint32_t buffer = 0; buffer < m_canonicalList->mNumberBuffers; ++buffer) {
         m_canonicalList->mBuffers[buffer].mData = data;
-        m_canonicalList->mBuffers[buffer].mDataByteSize = bytesPerBuffer;
-        data += bytesPerBuffer;
+        m_canonicalList->mBuffers[buffer].mDataByteSize = bufferSizes->first;
+        data += bufferSizes->first;
     }
 
     reset();

Modified: branches/safari-610-branch/Source/WebCore/platform/audio/cocoa/WebAudioBufferList.h (267260 => 267261)


--- branches/safari-610-branch/Source/WebCore/platform/audio/cocoa/WebAudioBufferList.h	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebCore/platform/audio/cocoa/WebAudioBufferList.h	2020-09-18 19:35:49 UTC (rev 267261)
@@ -41,7 +41,7 @@
 
 class WebAudioBufferList final : public PlatformAudioData {
 public:
-    WebAudioBufferList(const CAAudioStreamDescription&);
+    WEBCORE_EXPORT WebAudioBufferList(const CAAudioStreamDescription&);
     WEBCORE_EXPORT WebAudioBufferList(const CAAudioStreamDescription&, uint32_t sampleCount);
     WebAudioBufferList(const CAAudioStreamDescription&, CMSampleBufferRef);
 
@@ -56,6 +56,8 @@
     AudioBuffer* buffer(uint32_t index) const;
     WTF::IteratorRange<AudioBuffer*> buffers() const;
 
+    WEBCORE_EXPORT static bool isSupportedDescription(const CAAudioStreamDescription&, uint32_t sampleCount);
+
 private:
     Kind kind() const { return Kind::WebAudioBufferList; }
 

Modified: branches/safari-610-branch/Source/WebKit/ChangeLog (267260 => 267261)


--- branches/safari-610-branch/Source/WebKit/ChangeLog	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebKit/ChangeLog	2020-09-18 19:35:49 UTC (rev 267261)
@@ -1,5 +1,77 @@
 2020-09-17  Alan Coon  <[email protected]>
 
+        Cherry-pick r266745. rdar://problem/69100985
+
+    Tighten checks when creating an audio buffer list
+    https://bugs.webkit.org/show_bug.cgi?id=216237
+    <rdar://problem/68271376>
+    
+    Reviewed by Geoffrey Garen.
+    
+    Source/WebCore:
+    
+    Add a routine to check there is no multiplication integer overflow.
+    
+    * platform/audio/cocoa/WebAudioBufferList.cpp:
+    (WebCore::computeBufferSize):
+    (WebCore::WebAudioBufferList::isSupportedDescription):
+    (WebCore::WebAudioBufferList::setSampleCount):
+    * platform/audio/cocoa/WebAudioBufferList.h:
+    
+    Source/WebKit:
+    
+    Add message checks to verify that no message integer overflows happen when processing audio buffer list messages.
+    
+    * GPUProcess/GPUConnectionToWebProcess.cpp:
+    (WebKit::GPUConnectionToWebProcess::audioTrackRendererManager):
+    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.cpp:
+    (WebKit::RemoteAudioMediaStreamTrackRenderer::RemoteAudioMediaStreamTrackRenderer):
+    (WebKit::RemoteAudioMediaStreamTrackRenderer::audioSamplesStorageChanged):
+    (WebKit::RemoteAudioMediaStreamTrackRenderer::audioSamplesAvailable):
+    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h:
+    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp:
+    (WebKit::RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager):
+    (WebKit::RemoteAudioMediaStreamTrackRendererManager::createRenderer):
+    * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h:
+    * GPUProcess/webrtc/RemoteMediaRecorder.cpp:
+    (WebKit::RemoteMediaRecorder::audioSamplesStorageChanged):
+    (WebKit::RemoteMediaRecorder::audioSamplesAvailable):
+    * GPUProcess/webrtc/RemoteMediaRecorder.h:
+    * WebProcess/cocoa/RemoteCaptureSampleManager.cpp:
+    (WebKit::RemoteCaptureSampleManager::RemoteAudio::audioSamplesAvailable):
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266745 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2020-09-08  Youenn Fablet  <[email protected]>
+
+            Tighten checks when creating an audio buffer list
+            https://bugs.webkit.org/show_bug.cgi?id=216237
+            <rdar://problem/68271376>
+
+            Reviewed by Geoffrey Garen.
+
+            Add message checks to verify that no message integer overflows happen when processing audio buffer list messages.
+
+            * GPUProcess/GPUConnectionToWebProcess.cpp:
+            (WebKit::GPUConnectionToWebProcess::audioTrackRendererManager):
+            * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.cpp:
+            (WebKit::RemoteAudioMediaStreamTrackRenderer::RemoteAudioMediaStreamTrackRenderer):
+            (WebKit::RemoteAudioMediaStreamTrackRenderer::audioSamplesStorageChanged):
+            (WebKit::RemoteAudioMediaStreamTrackRenderer::audioSamplesAvailable):
+            * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h:
+            * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp:
+            (WebKit::RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager):
+            (WebKit::RemoteAudioMediaStreamTrackRendererManager::createRenderer):
+            * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h:
+            * GPUProcess/webrtc/RemoteMediaRecorder.cpp:
+            (WebKit::RemoteMediaRecorder::audioSamplesStorageChanged):
+            (WebKit::RemoteMediaRecorder::audioSamplesAvailable):
+            * GPUProcess/webrtc/RemoteMediaRecorder.h:
+            * WebProcess/cocoa/RemoteCaptureSampleManager.cpp:
+            (WebKit::RemoteCaptureSampleManager::RemoteAudio::audioSamplesAvailable):
+
+2020-09-17  Alan Coon  <[email protected]>
+
         Cherry-pick r266411. rdar://problem/68300959
 
     [iOS] AGX compiler service sandbox violation

Modified: branches/safari-610-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp (267260 => 267261)


--- branches/safari-610-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2020-09-18 19:35:49 UTC (rev 267261)
@@ -241,7 +241,7 @@
 RemoteAudioMediaStreamTrackRendererManager& GPUConnectionToWebProcess::audioTrackRendererManager()
 {
     if (!m_audioTrackRendererManager)
-        m_audioTrackRendererManager = makeUnique<RemoteAudioMediaStreamTrackRendererManager>();
+        m_audioTrackRendererManager = makeUnique<RemoteAudioMediaStreamTrackRendererManager>(*this);
 
     return *m_audioTrackRendererManager;
 }

Modified: branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.cpp (267260 => 267261)


--- branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.cpp	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.cpp	2020-09-18 19:35:49 UTC (rev 267261)
@@ -28,11 +28,15 @@
 
 #if PLATFORM(COCOA) && ENABLE(GPU_PROCESS) && ENABLE(MEDIA_STREAM)
 
+#include "Connection.h"
+#include "RemoteAudioMediaStreamTrackRendererManager.h"
 #include "SharedRingBufferStorage.h"
 #include <WebCore/AudioMediaStreamTrackRenderer.h>
 #include <WebCore/CARingBuffer.h>
 #include <WebCore/WebAudioBufferList.h>
 
+#define MESSAGE_CHECK(assertion) MESSAGE_CHECK_BASE(assertion, (&m_manager.connection()))
+
 namespace WebKit {
 using namespace WebCore;
 
@@ -50,9 +54,10 @@
 }
 #endif
 
-RemoteAudioMediaStreamTrackRenderer::RemoteAudioMediaStreamTrackRenderer()
-    : m_renderer(WebCore::AudioMediaStreamTrackRenderer::create())
-    , m_ringBuffer(makeUnique<CARingBuffer>(makeUniqueRef<SharedRingBufferStorage>(nullptr)))
+RemoteAudioMediaStreamTrackRenderer::RemoteAudioMediaStreamTrackRenderer(RemoteAudioMediaStreamTrackRendererManager& manager)
+    : m_manager(manager)
+    , m_renderer(WebCore::AudioMediaStreamTrackRenderer::create())
+    , m_ringBuffer(makeUniqueRef<CARingBuffer>(makeUniqueRef<SharedRingBufferStorage>(nullptr)))
 {
     ASSERT(m_renderer);
 
@@ -97,10 +102,7 @@
 
 void RemoteAudioMediaStreamTrackRenderer::audioSamplesStorageChanged(const SharedMemory::IPCHandle& ipcHandle, const WebCore::CAAudioStreamDescription& description, uint64_t numberOfFrames)
 {
-    ASSERT(m_ringBuffer);
-    if (!m_ringBuffer)
-        return;
-
+    MESSAGE_CHECK(WebAudioBufferList::isSupportedDescription(description, numberOfFrames));
     m_description = description;
 
     if (ipcHandle.handle.isNull()) {
@@ -115,20 +117,21 @@
     storage().setReadOnly(true);
 
     m_ringBuffer->allocate(description, numberOfFrames);
+
+    m_audioBufferList = makeUnique<WebAudioBufferList>(m_description);
 }
 
 void RemoteAudioMediaStreamTrackRenderer::audioSamplesAvailable(MediaTime time, uint64_t numberOfFrames, uint64_t startFrame, uint64_t endFrame)
 {
-    ASSERT(m_ringBuffer);
-    if (!m_ringBuffer)
-        return;
+    MESSAGE_CHECK(m_audioBufferList);
+    MESSAGE_CHECK(WebAudioBufferList::isSupportedDescription(m_description, numberOfFrames));
 
     m_ringBuffer->setCurrentFrameBounds(startFrame, endFrame);
 
-    WebAudioBufferList audioData(m_description, numberOfFrames);
-    m_ringBuffer->fetch(audioData.list(), numberOfFrames, time.timeValue());
+    m_audioBufferList->setSampleCount(numberOfFrames);
+    m_ringBuffer->fetch(m_audioBufferList->list(), numberOfFrames, time.timeValue());
 
-    m_renderer->pushSamples(time, audioData, m_description, numberOfFrames);
+    m_renderer->pushSamples(time, *m_audioBufferList, m_description, numberOfFrames);
 }
 
 }

Modified: branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h (267260 => 267261)


--- branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h	2020-09-18 19:35:49 UTC (rev 267261)
@@ -31,21 +31,23 @@
 #include "SharedMemory.h"
 #include <WebCore/CAAudioStreamDescription.h>
 #include <wtf/MediaTime.h>
+#include <wtf/UniqueRef.h>
 
 namespace WebCore {
 class AudioMediaStreamTrackRenderer;
 class CARingBuffer;
+class WebAudioBufferList;
 }
 
 namespace WebKit {
 
-class GPUConnectionToWebProcess;
+class RemoteAudioMediaStreamTrackRendererManager;
 class SharedRingBufferStorage;
 
 class RemoteAudioMediaStreamTrackRenderer final : private IPC::MessageReceiver {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    RemoteAudioMediaStreamTrackRenderer();
+    explicit RemoteAudioMediaStreamTrackRenderer(RemoteAudioMediaStreamTrackRendererManager&);
     ~RemoteAudioMediaStreamTrackRenderer();
 
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
@@ -61,10 +63,11 @@
 
     SharedRingBufferStorage& storage();
 
+    RemoteAudioMediaStreamTrackRendererManager& m_manager;
     std::unique_ptr<WebCore::AudioMediaStreamTrackRenderer> m_renderer;
-
     WebCore::CAAudioStreamDescription m_description;
-    std::unique_ptr<WebCore::CARingBuffer> m_ringBuffer;
+    UniqueRef<WebCore::CARingBuffer> m_ringBuffer;
+    std::unique_ptr<WebCore::WebAudioBufferList> m_audioBufferList;
 };
 
 }

Modified: branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp (267260 => 267261)


--- branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp	2020-09-18 19:35:49 UTC (rev 267261)
@@ -33,8 +33,12 @@
 
 namespace WebKit {
 
-RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager() = default;
 
+RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager(GPUConnectionToWebProcess& connectionToWebProcess)
+    : m_connectionToWebProcess(connectionToWebProcess)
+{
+}
+
 RemoteAudioMediaStreamTrackRendererManager::~RemoteAudioMediaStreamTrackRendererManager() = default;
 
 void RemoteAudioMediaStreamTrackRendererManager::didReceiveRendererMessage(IPC::Connection& connection, IPC::Decoder& decoder)
@@ -46,7 +50,7 @@
 void RemoteAudioMediaStreamTrackRendererManager::createRenderer(AudioMediaStreamTrackRendererIdentifier identifier)
 {
     ASSERT(!m_renderers.contains(identifier));
-    m_renderers.add(identifier, makeUnique<RemoteAudioMediaStreamTrackRenderer>());
+    m_renderers.add(identifier, makeUnique<RemoteAudioMediaStreamTrackRenderer>(*this));
 }
 
 void RemoteAudioMediaStreamTrackRendererManager::releaseRenderer(AudioMediaStreamTrackRendererIdentifier identifier)

Modified: branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h (267260 => 267261)


--- branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h	2020-09-18 19:35:49 UTC (rev 267261)
@@ -28,6 +28,7 @@
 #if PLATFORM(COCOA) && ENABLE(GPU_PROCESS) && ENABLE(MEDIA_STREAM)
 
 #include "AudioMediaStreamTrackRendererIdentifier.h"
+#include "GPUConnectionToWebProcess.h"
 #include "MessageReceiver.h"
 #include <wtf/Forward.h>
 #include <wtf/HashMap.h>
@@ -44,12 +45,14 @@
 class RemoteAudioMediaStreamTrackRendererManager final : private IPC::MessageReceiver {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    RemoteAudioMediaStreamTrackRendererManager();
+    explicit RemoteAudioMediaStreamTrackRendererManager(GPUConnectionToWebProcess&);
     ~RemoteAudioMediaStreamTrackRendererManager();
 
     void didReceiveRendererMessage(IPC::Connection&, IPC::Decoder&);
     void didReceiveMessageFromWebProcess(IPC::Connection& connection, IPC::Decoder& decoder) { didReceiveMessage(connection, decoder); }
 
+    IPC::Connection& connection() const { return m_connectionToWebProcess.connection(); }
+
 private:
     // IPC::MessageReceiver
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
@@ -56,6 +59,7 @@
     void createRenderer(AudioMediaStreamTrackRendererIdentifier);
     void releaseRenderer(AudioMediaStreamTrackRendererIdentifier);
 
+    GPUConnectionToWebProcess& m_connectionToWebProcess;
     HashMap<AudioMediaStreamTrackRendererIdentifier, std::unique_ptr<RemoteAudioMediaStreamTrackRenderer>> m_renderers;
 };
 

Modified: branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.cpp (267260 => 267261)


--- branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.cpp	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.cpp	2020-09-18 19:35:49 UTC (rev 267261)
@@ -28,6 +28,7 @@
 
 #if PLATFORM(COCOA) && ENABLE(GPU_PROCESS) && ENABLE(MEDIA_STREAM) && HAVE(AVASSETWRITERDELEGATE)
 
+#include "Connection.h"
 #include "SharedRingBufferStorage.h"
 #include <WebCore/CARingBuffer.h>
 #include <WebCore/ImageTransferSessionVT.h>
@@ -35,6 +36,8 @@
 #include <WebCore/WebAudioBufferList.h>
 #include <wtf/CompletionHandler.h>
 
+#define MESSAGE_CHECK(assertion) MESSAGE_CHECK_BASE(assertion, (&m_gpuConnectionToWebProcess.connection()))
+
 namespace WebKit {
 using namespace WebCore;
 
@@ -66,9 +69,7 @@
 
 void RemoteMediaRecorder::audioSamplesStorageChanged(const SharedMemory::IPCHandle& ipcHandle, const WebCore::CAAudioStreamDescription& description, uint64_t numberOfFrames)
 {
-    ASSERT(m_ringBuffer);
-    if (!m_ringBuffer)
-        return;
+    MESSAGE_CHECK(m_ringBuffer);
 
     m_description = description;
 
@@ -83,21 +84,22 @@
     storage().setStorage(WTFMove(memory));
     storage().setReadOnly(true);
 
-    m_ringBuffer->allocate(description, numberOfFrames);
+    m_ringBuffer->allocate(m_description, numberOfFrames);
+    m_audioBufferList = makeUnique<WebAudioBufferList>(m_description);
 }
 
 void RemoteMediaRecorder::audioSamplesAvailable(MediaTime time, uint64_t numberOfFrames, uint64_t startFrame, uint64_t endFrame)
 {
-    ASSERT(m_ringBuffer);
-    if (!m_ringBuffer)
-        return;
+    MESSAGE_CHECK(m_ringBuffer);
+    MESSAGE_CHECK(m_audioBufferList);
+    MESSAGE_CHECK(WebAudioBufferList::isSupportedDescription(m_description, numberOfFrames));
 
     m_ringBuffer->setCurrentFrameBounds(startFrame, endFrame);
 
-    WebAudioBufferList audioData(m_description, numberOfFrames);
-    m_ringBuffer->fetch(audioData.list(), numberOfFrames, time.timeValue());
+    m_audioBufferList->setSampleCount(numberOfFrames);
+    m_ringBuffer->fetch(m_audioBufferList->list(), numberOfFrames, time.timeValue());
 
-    m_writer->appendAudioSampleBuffer(audioData, m_description, time, numberOfFrames);
+    m_writer->appendAudioSampleBuffer(*m_audioBufferList, m_description, time, numberOfFrames);
 }
 
 void RemoteMediaRecorder::videoSampleAvailable(WebCore::RemoteVideoSample&& remoteSample)

Modified: branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.h (267260 => 267261)


--- branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.h	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.h	2020-09-18 19:35:49 UTC (rev 267261)
@@ -44,6 +44,7 @@
 class CARingBuffer;
 class ImageTransferSessionVT;
 class RemoteVideoSample;
+class WebAudioBufferList;
 }
 
 namespace WebKit {
@@ -77,6 +78,7 @@
 
     WebCore::CAAudioStreamDescription m_description;
     std::unique_ptr<WebCore::CARingBuffer> m_ringBuffer;
+    std::unique_ptr<WebCore::WebAudioBufferList> m_audioBufferList;
     std::unique_ptr<WebCore::ImageTransferSessionVT> m_imageTransferSession;
 };
 

Modified: branches/safari-610-branch/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp (267260 => 267261)


--- branches/safari-610-branch/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp	2020-09-18 19:35:45 UTC (rev 267260)
+++ branches/safari-610-branch/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp	2020-09-18 19:35:49 UTC (rev 267261)
@@ -143,9 +143,16 @@
 
 void RemoteCaptureSampleManager::RemoteAudio::audioSamplesAvailable(MediaTime time, uint64_t numberOfFrames, uint64_t startFrame, uint64_t endFrame)
 {
-    if (!m_buffer)
+    if (!m_buffer) {
+        RELEASE_LOG_ERROR(WebRTC, "buffer for audio source %llu is null", m_source->identifier().toUInt64());
         return;
+    }
 
+    if (!WebAudioBufferList::isSupportedDescription(m_description, numberOfFrames)) {
+        RELEASE_LOG_ERROR(WebRTC, "Unable to support description with given number of frames for audio source %llu", m_source->identifier().toUInt64());
+        return;
+    }
+
     m_buffer->setSampleCount(numberOfFrames);
 
     m_ringBuffer->setCurrentFrameBounds(startFrame, endFrame);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to