From 4f4486adff83035c159e085132ccd468696c0b29 Mon Sep 17 00:00:00 2001 From: Carmelo Messina Date: Sun, 19 Feb 2023 16:19:36 +0100 Subject: [PATCH] fix getChannelData performance issue --- ...ioBuffer-AnalyserNode-fp-mitigations.patch | 170 ++++++------------ 1 file changed, 53 insertions(+), 117 deletions(-) diff --git a/build/patches/AudioBuffer-AnalyserNode-fp-mitigations.patch b/build/patches/AudioBuffer-AnalyserNode-fp-mitigations.patch index 8a5a0048..1f3d5ae9 100644 --- a/build/patches/AudioBuffer-AnalyserNode-fp-mitigations.patch +++ b/build/patches/AudioBuffer-AnalyserNode-fp-mitigations.patch @@ -6,19 +6,19 @@ Truncate base latency precision to two digits License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- - chrome/browser/about_flags.cc | 4 ++++ - chrome/browser/flag_descriptions.cc | 5 ++++ - chrome/browser/flag_descriptions.h | 3 +++ - third_party/blink/common/features.cc | 4 ++++ - third_party/blink/public/common/features.h | 2 ++ - .../renderer/modules/webaudio/audio_buffer.cc | 24 +++++++++++++++---- - .../renderer/modules/webaudio/audio_buffer.h | 7 +++--- - .../modules/webaudio/audio_buffer.idl | 4 ++-- - .../modules/webaudio/audio_context.cc | 5 +++- - .../modules/webaudio/base_audio_context.cc | 12 ++++++++++ - .../modules/webaudio/base_audio_context.h | 2 ++ - .../modules/webaudio/realtime_analyser.cc | 9 +++++++ - 12 files changed, 71 insertions(+), 10 deletions(-) + chrome/browser/about_flags.cc | 4 ++++ + chrome/browser/flag_descriptions.cc | 5 +++++ + chrome/browser/flag_descriptions.h | 3 +++ + third_party/blink/common/features.cc | 4 ++++ + third_party/blink/public/common/features.h | 2 ++ + .../renderer/modules/webaudio/audio_buffer.cc | 14 ++++++++++++++ + .../blink/renderer/modules/webaudio/audio_buffer.h | 2 ++ + .../renderer/modules/webaudio/audio_context.cc | 5 ++++- + .../modules/webaudio/base_audio_context.cc | 12 ++++++++++++ + .../renderer/modules/webaudio/base_audio_context.h | 2 ++ + .../modules/webaudio/offline_audio_context.cc | 1 + + .../renderer/modules/webaudio/realtime_analyser.cc | 7 +++++++ + 12 files changed, 60 insertions(+), 1 deletion(-) diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc --- a/chrome/browser/about_flags.cc @@ -91,112 +91,39 @@ diff --git a/third_party/blink/public/common/features.h b/third_party/blink/publ diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer.cc b/third_party/blink/renderer/modules/webaudio/audio_buffer.cc --- a/third_party/blink/renderer/modules/webaudio/audio_buffer.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_buffer.cc -@@ -30,6 +30,7 @@ - - #include - -+#include "third_party/blink/public/common/features.h" - #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_buffer_options.h" - #include "third_party/blink/renderer/modules/webaudio/base_audio_context.h" - #include "third_party/blink/renderer/platform/audio/audio_bus.h" -@@ -197,6 +198,7 @@ AudioBuffer::AudioBuffer(AudioBus* bus) +@@ -196,6 +196,20 @@ AudioBuffer::AudioBuffer(AudioBus* bus) + } } - NotShared AudioBuffer::getChannelData( -+ ScriptState* script_state, - unsigned channel_index, - ExceptionState& exception_state) { - if (channel_index >= channels_.size()) { -@@ -208,7 +210,16 @@ NotShared AudioBuffer::getChannelData( - return NotShared(nullptr); - } - -- return getChannelData(channel_index); -+ NotShared array = getChannelData(channel_index); -+ DOMFloat32Array* destination_array = array.Get(); -+ size_t len = destination_array->length(); -+ if (len > 0) { -+ float* destination = destination_array->Data(); -+ for (unsigned i = 0; i < len; ++i) { -+ destination[i] = BaseAudioContext::ShuffleAudioData(destination[i], i); ++void AudioBuffer::ShuffleAudioData() { ++ for (unsigned i = 0; i < channels_.size(); ++i) { ++ if (NotShared array = getChannelData(i)) { ++ size_t len = array->length(); ++ if (len > 0) { ++ float* destination = array->Data(); ++ for (unsigned j = 0; j < len; ++j) { ++ destination[j] = BaseAudioContext::ShuffleAudioData(destination[j], j); ++ } ++ } + } + } -+ return array; - } - - NotShared AudioBuffer::getChannelData(unsigned channel_index) { -@@ -219,13 +230,15 @@ NotShared AudioBuffer::getChannelData(unsigned channel_index) { - return NotShared(channels_[channel_index].Get()); - } - --void AudioBuffer::copyFromChannel(NotShared destination, -+void AudioBuffer::copyFromChannel(ScriptState* script_state, -+ NotShared destination, - int32_t channel_number, - ExceptionState& exception_state) { -- return copyFromChannel(destination, channel_number, 0, exception_state); -+ return copyFromChannel(script_state, destination, channel_number, 0, exception_state); - } - --void AudioBuffer::copyFromChannel(NotShared destination, -+void AudioBuffer::copyFromChannel(ScriptState* script_state, -+ NotShared destination, - int32_t channel_number, - size_t buffer_offset, - ExceptionState& exception_state) { -@@ -266,6 +279,9 @@ void AudioBuffer::copyFromChannel(NotShared destination, - DCHECK_LE(buffer_offset + count, data_length); - - memmove(dst, src + buffer_offset, count * sizeof(*src)); -+ for (unsigned i = 0; i < count; i++) { -+ dst[i] = BaseAudioContext::ShuffleAudioData(dst[i], i); -+ } - } - - void AudioBuffer::copyToChannel(NotShared source, ++} ++ + NotShared AudioBuffer::getChannelData( + unsigned channel_index, + ExceptionState& exception_state) { diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer.h b/third_party/blink/renderer/modules/webaudio/audio_buffer.h --- a/third_party/blink/renderer/modules/webaudio/audio_buffer.h +++ b/third_party/blink/renderer/modules/webaudio/audio_buffer.h -@@ -44,6 +44,7 @@ class AudioBus; - class AudioBufferOptions; - class ExceptionState; - class SharedAudioBuffer; -+class ScriptState; +@@ -115,6 +115,8 @@ class MODULES_EXPORT AudioBuffer final : public ScriptWrappable { - class MODULES_EXPORT AudioBuffer final : public ScriptWrappable { - DEFINE_WRAPPERTYPEINFO(); -@@ -88,13 +89,13 @@ class MODULES_EXPORT AudioBuffer final : public ScriptWrappable { + std::unique_ptr CreateSharedAudioBuffer(); - // Channel data access - unsigned numberOfChannels() const { return channels_.size(); } -- NotShared getChannelData(unsigned channel_index, -+ NotShared getChannelData(ScriptState*, unsigned channel_index, - ExceptionState&); - NotShared getChannelData(unsigned channel_index); -- void copyFromChannel(NotShared, -+ void copyFromChannel(ScriptState*, NotShared, - int32_t channel_number, - ExceptionState&); -- void copyFromChannel(NotShared, -+ void copyFromChannel(ScriptState*, NotShared, - int32_t channel_number, - size_t buffer_offset, - ExceptionState&); -diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer.idl b/third_party/blink/renderer/modules/webaudio/audio_buffer.idl ---- a/third_party/blink/renderer/modules/webaudio/audio_buffer.idl -+++ b/third_party/blink/renderer/modules/webaudio/audio_buffer.idl -@@ -37,9 +37,9 @@ - - // Channel access - readonly attribute unsigned long numberOfChannels; -- [HighEntropy=Direct, Measure, RaisesException] Float32Array getChannelData( -+ [CallWith=ScriptState, HighEntropy=Direct, Measure, RaisesException] Float32Array getChannelData( - unsigned long channelIndex); -- [HighEntropy, Measure, RaisesException] void copyFromChannel( -+ [CallWith=ScriptState, HighEntropy, Measure, RaisesException] void copyFromChannel( - Float32Array destination, - unsigned long channelNumber, - optional unsigned long bufferOffset = 0); ++ void ShuffleAudioData(); ++ + private: + static DOMFloat32Array* CreateFloat32ArrayOrNull( + uint32_t length, diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc --- a/third_party/blink/renderer/modules/webaudio/audio_context.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc @@ -260,20 +187,29 @@ diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.h b/ protected: enum ContextType { kRealtimeContext, kOfflineContext }; +diff --git a/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc b/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc +--- a/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc ++++ b/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc +@@ -368,6 +368,7 @@ void OfflineAudioContext::FireCompletionEvent() { + if (!rendered_buffer) { + return; + } ++ rendered_buffer->ShuffleAudioData(); + + // Call the offline rendering completion event listener and resolve the + // promise too. diff --git a/third_party/blink/renderer/modules/webaudio/realtime_analyser.cc b/third_party/blink/renderer/modules/webaudio/realtime_analyser.cc --- a/third_party/blink/renderer/modules/webaudio/realtime_analyser.cc +++ b/third_party/blink/renderer/modules/webaudio/realtime_analyser.cc -@@ -29,6 +29,9 @@ +@@ -29,6 +29,7 @@ #include #include -+#include "third_party/blink/public/common/features.h" -+#include "third_party/blink/renderer/modules/webaudio/realtime_analyser.h" +#include "third_party/blink/renderer/modules/webaudio/base_audio_context.h" #include "third_party/blink/renderer/platform/audio/audio_bus.h" #include "third_party/blink/renderer/platform/audio/audio_utilities.h" #include "third_party/blink/renderer/platform/audio/vector_math.h" -@@ -154,6 +157,7 @@ void RealtimeAnalyser::GetFloatTimeDomainData( +@@ -154,6 +155,7 @@ void RealtimeAnalyser::GetFloatTimeDomainData( input_buffer[(i + write_index - fft_size + kInputBufferSize) % kInputBufferSize]; @@ -281,7 +217,7 @@ diff --git a/third_party/blink/renderer/modules/webaudio/realtime_analyser.cc b/ destination[i] = value; } } -@@ -181,6 +185,8 @@ void RealtimeAnalyser::GetByteTimeDomainData(DOMUint8Array* destination_array) { +@@ -181,6 +183,8 @@ void RealtimeAnalyser::GetByteTimeDomainData(DOMUint8Array* destination_array) { input_buffer[(i + write_index - fft_size + kInputBufferSize) % kInputBufferSize]; @@ -290,7 +226,7 @@ diff --git a/third_party/blink/renderer/modules/webaudio/realtime_analyser.cc b/ // Scale from nominal -1 -> +1 to unsigned byte. double scaled_value = 128 * (value + 1); -@@ -300,6 +306,8 @@ void RealtimeAnalyser::ConvertToByteData(DOMUint8Array* destination_array) { +@@ -300,6 +304,8 @@ void RealtimeAnalyser::ConvertToByteData(DOMUint8Array* destination_array) { double scaled_value = UCHAR_MAX * (db_mag - min_decibels) * range_scale_factor; @@ -299,7 +235,7 @@ diff --git a/third_party/blink/renderer/modules/webaudio/realtime_analyser.cc b/ // Clip to valid range. destination[i] = static_cast(ClampTo(scaled_value, 0, UCHAR_MAX)); -@@ -319,6 +327,7 @@ void RealtimeAnalyser::ConvertFloatToDb(DOMFloat32Array* destination_array) { +@@ -319,6 +325,7 @@ void RealtimeAnalyser::ConvertFloatToDb(DOMFloat32Array* destination_array) { float linear_value = source[i]; double db_mag = audio_utilities::LinearToDecibels(linear_value); destination[i] = static_cast(db_mag);