Changeset 247211 in webkit
- Timestamp:
- Jul 8, 2019 10:46:27 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r247208 r247211 1 2019-07-08 Youenn Fablet <youenn@apple.com> 2 3 MediaStreamTrackPrivate should always call readyStateChanged on the main thread 4 https://bugs.webkit.org/show_bug.cgi?id=199538 5 <rdar://problem/52709106> 6 7 Reviewed by Eric Carlson. 8 9 MediaStreamTrackPrivate is sometimes calling readyStateChanged in a 10 background thread inside its audioSamplesAvailable method. 11 Instead of doing that, we hop to the main thread to call readyStateChanged. 12 Once the call is made in the main thread, MediaStreamTrackPrivate will 13 send the audio samples to its observers. 14 15 To make mock audio source closer to real capture audio sources, 16 audioSamplesAvailable is called on a background thread. 17 RealtimeMediaSource is updated to always be destroyed in the main 18 run loop since it is WebKit2 only. 19 20 Covered by existing tests and making sure the mock audio source calls 21 the audioSamplesAvailable method on a background thread. 22 23 * platform/mediastream/MediaStreamTrackPrivate.cpp: 24 (WebCore::MediaStreamTrackPrivate::videoSampleAvailable): 25 (WebCore::MediaStreamTrackPrivate::audioSamplesAvailable): 26 * platform/mediastream/MediaStreamTrackPrivate.h: 27 * platform/mediastream/RealtimeMediaSource.cpp: 28 (WebCore::RealtimeMediaSource::scheduleDeferredTask): 29 scheduleDeferredTask may be called from a background thread. 30 It is thus safer to ref the source instead of creating a weak pointer. 31 * platform/mediastream/RealtimeMediaSource.h: 32 * platform/mediastream/mac/MockRealtimeAudioSourceMac.mm: 33 (WebCore::MockRealtimeAudioSourceMac::MockRealtimeAudioSourceMac): 34 (WebCore::MockRealtimeAudioSourceMac::emitSampleBuffers): 35 (WebCore::MockRealtimeAudioSourceMac::reconfigure): 36 (WebCore::MockRealtimeAudioSourceMac::render): 37 (WebCore::MockRealtimeAudioSourceMac::settingsDidChange): 38 * platform/mock/MockRealtimeAudioSource.cpp: 39 (WebCore::MockRealtimeAudioSource::MockRealtimeAudioSource): 40 (WebCore::MockRealtimeAudioSource::tick): 41 * platform/mock/MockRealtimeAudioSource.h: 42 1 43 2019-07-08 Youenn Fablet <youenn@apple.com> 2 44 -
trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp
r246644 r247211 243 243 void MediaStreamTrackPrivate::videoSampleAvailable(MediaSample& mediaSample) 244 244 { 245 ASSERT(isMainThread()); 245 246 if (!m_haveProducedData) { 246 247 m_haveProducedData = true; … … 260 261 void MediaStreamTrackPrivate::audioSamplesAvailable(const MediaTime& mediaTime, const PlatformAudioData& data, const AudioStreamDescription& description, size_t sampleCount) 261 262 { 262 if (!m_haveProducedData) { 263 m_haveProducedData = true; 264 updateReadyState(); 263 if (!m_hasSentStartProducedData) { 264 callOnMainThread([this, protectedThis = makeRef(*this)] { 265 if (!m_haveProducedData) { 266 m_haveProducedData = true; 267 updateReadyState(); 268 } 269 m_hasSentStartProducedData = true; 270 }); 271 return; 265 272 } 266 273 … … 269 276 }); 270 277 } 271 272 278 273 279 void MediaStreamTrackPrivate::updateReadyState() -
trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h
r246436 r247211 42 42 43 43 class MediaStreamTrackPrivate final 44 : public RefCounted<MediaStreamTrackPrivate>44 : public ThreadSafeRefCounted<MediaStreamTrackPrivate, WTF::DestructionThread::Main> 45 45 , public RealtimeMediaSource::Observer 46 46 #if !RELEASE_LOG_DISABLED … … 152 152 bool m_isEnded { false }; 153 153 bool m_haveProducedData { false }; 154 bool m_hasSentStartProducedData { false }; 154 155 HintValue m_contentHint { HintValue::Empty }; 155 156 RefPtr<WebAudioSourceProvider> m_audioSourceProvider; -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp
r243899 r247211 1036 1036 } 1037 1037 1038 void RealtimeMediaSource::scheduleDeferredTask( WTF::Function<void()>&& function)1038 void RealtimeMediaSource::scheduleDeferredTask(Function<void()>&& function) 1039 1039 { 1040 1040 ASSERT(function); 1041 callOnMainThread([weakThis = makeWeakPtr(*this), function = WTFMove(function)] { 1042 if (!weakThis) 1043 return; 1044 1041 callOnMainThread([protectedThis = makeRef(*this), function = WTFMove(function)] { 1045 1042 function(); 1046 1043 }); -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h
r246644 r247211 68 68 69 69 class WEBCORE_EXPORT RealtimeMediaSource 70 : public ThreadSafeRefCounted<RealtimeMediaSource >70 : public ThreadSafeRefCounted<RealtimeMediaSource, WTF::DestructionThread::MainRunLoop> 71 71 , public CanMakeWeakPtr<RealtimeMediaSource> 72 72 #if !RELEASE_LOG_DISABLED -
trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm
r236877 r247211 107 107 : MockRealtimeAudioSource(WTFMove(deviceID), WTFMove(name), WTFMove(hashSalt)) 108 108 { 109 ASSERT(isMainThread()); 109 110 } 110 111 111 112 void MockRealtimeAudioSourceMac::emitSampleBuffers(uint32_t frameCount) 112 113 { 114 ASSERT(!isMainThread()); 113 115 ASSERT(m_formatDescription); 114 116 … … 121 123 void MockRealtimeAudioSourceMac::reconfigure() 122 124 { 125 ASSERT(!isMainThread()); 123 126 m_maximiumFrameCount = WTF::roundUpToPowerOfTwo(renderInterval().seconds() * sampleRate() * 2); 124 127 ASSERT(m_maximiumFrameCount); … … 141 144 void MockRealtimeAudioSourceMac::render(Seconds delta) 142 145 { 146 ASSERT(!isMainThread()); 143 147 if (!m_audioBufferList) 144 148 reconfigure(); … … 169 173 { 170 174 if (settings.contains(RealtimeMediaSourceSettings::Flag::SampleRate)) { 171 m_formatDescription = nullptr; 172 m_audioBufferList = nullptr; 175 m_workQueue->dispatch([this, protectedThis = makeRef(*this)] { 176 m_formatDescription = nullptr; 177 m_audioBufferList = nullptr; 173 178 174 auto rate = sampleRate();175 size_t sampleCount = 2 * rate;179 auto rate = sampleRate(); 180 size_t sampleCount = 2 * rate; 176 181 177 m_bipBopBuffer.grow(sampleCount);178 m_bipBopBuffer.fill(0);182 m_bipBopBuffer.grow(sampleCount); 183 m_bipBopBuffer.fill(0); 179 184 180 size_t bipBopSampleCount = ceil(BipBopDuration * rate);181 size_t bipStart = 0;182 size_t bopStart = rate;185 size_t bipBopSampleCount = ceil(BipBopDuration * rate); 186 size_t bipStart = 0; 187 size_t bopStart = rate; 183 188 184 addHum(BipBopVolume, BipFrequency, rate, 0, m_bipBopBuffer.data() + bipStart, bipBopSampleCount); 185 addHum(BipBopVolume, BopFrequency, rate, 0, m_bipBopBuffer.data() + bopStart, bipBopSampleCount); 189 addHum(BipBopVolume, BipFrequency, rate, 0, m_bipBopBuffer.data() + bipStart, bipBopSampleCount); 190 addHum(BipBopVolume, BopFrequency, rate, 0, m_bipBopBuffer.data() + bopStart, bipBopSampleCount); 191 }); 186 192 } 187 193 -
trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp
r239427 r247211 63 63 MockRealtimeAudioSource::MockRealtimeAudioSource(String&& deviceID, String&& name, String&& hashSalt) 64 64 : RealtimeMediaSource(RealtimeMediaSource::Type::Audio, WTFMove(name), WTFMove(deviceID), WTFMove(hashSalt)) 65 , m_workQueue(WorkQueue::create("MockRealtimeAudioSource Render Queue")) 65 66 , m_timer(RunLoop::current(), this, &MockRealtimeAudioSource::tick) 66 67 { … … 152 153 Seconds delta = now - m_lastRenderTime; 153 154 m_lastRenderTime = now; 154 render(delta); 155 156 m_workQueue->dispatch([this, delta, protectedThis = makeRef(*this)] { 157 render(delta); 158 }); 155 159 } 156 160 -
trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h
r239840 r247211 37 37 #include "RealtimeMediaSourceFactory.h" 38 38 #include <wtf/RunLoop.h> 39 #include <wtf/WorkQueue.h> 39 40 40 41 namespace WebCore { … … 42 43 class MockRealtimeAudioSource : public RealtimeMediaSource { 43 44 public: 44 45 45 static CaptureSourceOrError create(String&& deviceID, String&& name, String&& hashSalt, const MediaConstraints*); 46 47 46 virtual ~MockRealtimeAudioSource(); 48 47 … … 50 49 MockRealtimeAudioSource(String&& deviceID, String&& name, String&& hashSalt); 51 50 52 void startProducingData() final; 53 void stopProducingData() final; 54 55 virtual void render(Seconds) { } 51 virtual void render(Seconds) = 0; 56 52 void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) override; 57 53 … … 62 58 const RealtimeMediaSourceSettings& settings() final; 63 59 64 void tick(); 60 void startProducingData() final; 61 void stopProducingData() final; 65 62 66 63 bool isCaptureSource() const final { return true; } … … 69 66 void delaySamples(Seconds) final; 70 67 68 void tick(); 69 70 protected: 71 Ref<WorkQueue> m_workQueue; 72 73 private: 71 74 Optional<RealtimeMediaSourceCapabilities> m_capabilities; 72 75 Optional<RealtimeMediaSourceSettings> m_currentSettings;
Note: See TracChangeset
for help on using the changeset viewer.