Changeset 271575 in webkit
- Timestamp:
- Jan 18, 2021 12:40:55 AM (18 months ago)
- Location:
- trunk
- Files:
-
- 9 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/mediastream/mock-media-source-webaudio.html (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp (modified) (2 diffs)
-
Source/WebCore/Modules/mediastream/MediaStreamTrack.h (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.cpp (modified) (5 diffs)
-
Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.h (modified) (3 diffs)
-
Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r271554 r271575 1 2021-01-18 Youenn Fablet <youenn@apple.com> 2 3 WebRTC live Opus audio stream stutters 4 https://bugs.webkit.org/show_bug.cgi?id=220599 5 <rdar://problem/73190139> 6 7 Reviewed by Darin Adler. 8 9 Add media stream source nodes to ensure that concurrent reading is not an issue anymore. 10 11 * fast/mediastream/mock-media-source-webaudio.html: 12 1 13 2021-01-15 Rob Buis <rbuis@igalia.com> 2 14 -
trunk/LayoutTests/fast/mediastream/mock-media-source-webaudio.html
r267504 r271575 32 32 analyser.connect(gain); 33 33 gain.connect(context.destination); 34 35 const secondSource = context.createMediaStreamSource(stream); 36 const sourceGain = new GainNode(context, { gain : 0 }); 37 secondSource.connect(gain); 38 sourceGain.connect(context.destination); 34 39 35 40 function analyse() { -
trunk/Source/WebCore/ChangeLog
r271572 r271575 1 2021-01-18 Youenn Fablet <youenn@apple.com> 2 3 WebRTC live Opus audio stream stutters 4 https://bugs.webkit.org/show_bug.cgi?id=220599 5 <rdar://problem/73190139> 6 7 Reviewed by Darin Adler. 8 9 Before the patch, the MediaStreamTrack was owning its audio source provider. 10 Two MediaStreamAudioSourceNode reading the same track would read on the same provider buffer. 11 Instead, create a provider for each node. 12 13 Covered by updated test. 14 15 * Modules/mediastream/MediaStreamTrack.cpp: 16 (WebCore::MediaStreamTrack::createAudioSourceProvider): 17 * Modules/mediastream/MediaStreamTrack.h: 18 * Modules/webaudio/MediaStreamAudioSourceNode.cpp: 19 (WebCore::MediaStreamAudioSourceNode::create): 20 (WebCore::MediaStreamAudioSourceNode::MediaStreamAudioSourceNode): 21 (WebCore::MediaStreamAudioSourceNode::~MediaStreamAudioSourceNode): 22 (WebCore::MediaStreamAudioSourceNode::provideInput): 23 * Modules/webaudio/MediaStreamAudioSourceNode.h: 24 * platform/mediastream/MediaStreamTrackPrivate.cpp: 25 (WebCore::MediaStreamTrackPrivate::createAudioSourceProvider): 26 * platform/mediastream/MediaStreamTrackPrivate.h: 27 1 28 2021-01-17 Kimmo Kinnunen <kkinnunen@apple.com> 2 29 -
trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp
r271488 r271575 51 51 #include "ScriptExecutionContext.h" 52 52 #include "Settings.h" 53 #include "WebAudioSourceProvider.h" 53 54 #include <wtf/CompletionHandler.h> 54 55 #include <wtf/IsoMallocInlines.h> … … 623 624 } 624 625 625 AudioSourceProvider* MediaStreamTrack::audioSourceProvider()626 { 627 return m_private-> audioSourceProvider();626 RefPtr<WebAudioSourceProvider> MediaStreamTrack::createAudioSourceProvider() 627 { 628 return m_private->createAudioSourceProvider(); 628 629 } 629 630 -
trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h
r271440 r271575 140 140 MediaStreamTrackPrivate& privateTrack() { return m_private.get(); } 141 141 142 AudioSourceProvider* audioSourceProvider();142 RefPtr<WebAudioSourceProvider> createAudioSourceProvider(); 143 143 144 144 MediaProducer::MediaStateFlags mediaState() const; -
trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.cpp
r270468 r271575 35 35 #include "Logging.h" 36 36 #include "MediaStreamAudioSourceOptions.h" 37 #include "WebAudioSourceProvider.h" 37 38 #include <wtf/IsoMallocInlines.h> 38 39 #include <wtf/Locker.h> … … 50 51 return Exception { InvalidStateError, "Media stream has no audio tracks"_s }; 51 52 52 MediaStreamTrack* providerTrack = nullptr;53 RefPtr<WebAudioSourceProvider> provider; 53 54 for (auto& track : audioTracks) { 54 if (track->audioSourceProvider()) {55 providerTrack = track.get();55 provider = track->createAudioSourceProvider(); 56 if (provider) 56 57 break; 57 }58 58 } 59 if (!provider Track)59 if (!provider) 60 60 return Exception { InvalidStateError, "Could not find an audio track with an audio source provider"_s }; 61 61 62 auto node = adoptRef(*new MediaStreamAudioSourceNode(context, *options.mediaStream, *providerTrack));62 auto node = adoptRef(*new MediaStreamAudioSourceNode(context, *options.mediaStream, provider.releaseNonNull())); 63 63 node->setFormat(2, context.sampleRate()); 64 64 … … 69 69 } 70 70 71 MediaStreamAudioSourceNode::MediaStreamAudioSourceNode(BaseAudioContext& context, MediaStream& mediaStream, MediaStreamTrack& audioTrack)71 MediaStreamAudioSourceNode::MediaStreamAudioSourceNode(BaseAudioContext& context, MediaStream& mediaStream, Ref<WebAudioSourceProvider>&& provider) 72 72 : AudioNode(context, NodeTypeMediaStreamAudioSource) 73 73 , m_mediaStream(mediaStream) 74 , m_ audioTrack(audioTrack)74 , m_provider(provider) 75 75 { 76 AudioSourceProvider* audioSourceProvider = m_audioTrack->audioSourceProvider(); 77 ASSERT(audioSourceProvider); 78 79 audioSourceProvider->setClient(this); 76 m_provider->setClient(this); 80 77 81 78 // Default to stereo. This could change depending on the format of the MediaStream's audio track. … … 87 84 MediaStreamAudioSourceNode::~MediaStreamAudioSourceNode() 88 85 { 89 AudioSourceProvider* audioSourceProvider = m_audioTrack->audioSourceProvider(); 90 ASSERT(audioSourceProvider); 91 audioSourceProvider->setClient(nullptr); 86 m_provider->setClient(nullptr); 92 87 uninitialize(); 93 88 } … … 133 128 void MediaStreamAudioSourceNode::provideInput(AudioBus* bus, size_t framesToProcess) 134 129 { 135 if (auto* provider = m_audioTrack->audioSourceProvider()) 136 provider->provideInput(bus, framesToProcess); 137 else 138 bus->zero(); 130 m_provider->provideInput(bus, framesToProcess); 139 131 } 140 132 -
trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.h
r270468 r271575 38 38 struct MediaStreamAudioSourceOptions; 39 39 class MultiChannelResampler; 40 class WebAudioSourceProvider; 40 41 41 42 class MediaStreamAudioSourceNode final : public AudioNode, public AudioSourceProviderClient { … … 44 45 static ExceptionOr<Ref<MediaStreamAudioSourceNode>> create(BaseAudioContext&, MediaStreamAudioSourceOptions&&); 45 46 46 virtual~MediaStreamAudioSourceNode();47 ~MediaStreamAudioSourceNode(); 47 48 48 49 MediaStream* mediaStream() { return &m_mediaStream.get(); } 49 50 51 private: 52 MediaStreamAudioSourceNode(BaseAudioContext&, MediaStream&, Ref<WebAudioSourceProvider>&&); 53 50 54 // AudioNode 51 void process(size_t framesToProcess) override; 52 55 void process(size_t framesToProcess) final; 53 56 // AudioSourceProviderClient 54 void setFormat(size_t numberOfChannels, float sampleRate) override; 55 56 private: 57 MediaStreamAudioSourceNode(BaseAudioContext&, MediaStream&, MediaStreamTrack&); 57 void setFormat(size_t numberOfChannels, float sampleRate) final; 58 58 59 59 void provideInput(AudioBus*, size_t framesToProcess); … … 67 67 68 68 Ref<MediaStream> m_mediaStream; 69 Ref< MediaStreamTrack> m_audioTrack;69 Ref<WebAudioSourceProvider> m_provider; 70 70 std::unique_ptr<MultiChannelResampler> m_multiChannelResampler; 71 71 -
trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp
r268521 r271575 185 185 } 186 186 187 AudioSourceProvider* MediaStreamTrackPrivate::audioSourceProvider()187 RefPtr<WebAudioSourceProvider> MediaStreamTrackPrivate::createAudioSourceProvider() 188 188 { 189 189 #if PLATFORM(COCOA) 190 if (!m_audioSourceProvider) 191 m_audioSourceProvider = MediaStreamTrackAudioSourceProviderCocoa::create(*this); 190 return MediaStreamTrackAudioSourceProviderCocoa::create(*this); 192 191 #elif USE(LIBWEBRTC) && USE(GSTREAMER) 193 if (!m_audioSourceProvider)194 m_audioSourceProvider = AudioSourceProviderGStreamer::create(*this); 195 #endif 196 return m_audioSourceProvider.get(); 192 return AudioSourceProviderGStreamer::create(*this); 193 #else 194 return nullptr; 195 #endif 197 196 } 198 197 -
trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h
r261553 r271575 37 37 namespace WebCore { 38 38 39 class AudioSourceProvider;40 39 class GraphicsContext; 41 40 class MediaSample; … … 110 109 void applyConstraints(const MediaConstraints&, RealtimeMediaSource::ApplyConstraintsHandler&&); 111 110 112 AudioSourceProvider* audioSourceProvider();111 RefPtr<WebAudioSourceProvider> createAudioSourceProvider(); 113 112 114 113 void paintCurrentFrameInContext(GraphicsContext&, const FloatRect&); … … 154 153 bool m_hasStartedProducingData { false }; 155 154 HintValue m_contentHint { HintValue::Empty }; 156 RefPtr<WebAudioSourceProvider> m_audioSourceProvider;157 155 Ref<const Logger> m_logger; 158 156 #if !RELEASE_LOG_DISABLED
Note: See TracChangeset
for help on using the changeset viewer.