Changeset 263588 in webkit
- Timestamp:
- Jun 26, 2020 2:45:25 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 4 deleted
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r263582 r263588 1 2020-06-26 Jason Lawrence <lawrence.j@apple.com> 2 3 Unreviewed, reverting r263511, r263514, and r263565. 4 5 r263511 caused MediaRecorder test crashes on internal testers. 6 7 Reverted changesets: 8 9 "MediaRecorder stopRecorder() returns empty Blob after first 10 use" 11 https://bugs.webkit.org/show_bug.cgi?id=212274 12 https://trac.webkit.org/changeset/263511 13 14 "Unreviewed iOS build fix after r263511." 15 https://trac.webkit.org/changeset/263514 16 17 "MediaRecorder.start() Method is Ignoring the "timeslice" 18 Parameter" 19 https://bugs.webkit.org/show_bug.cgi?id=202233 20 https://trac.webkit.org/changeset/263565 21 1 22 2020-06-26 Karl Rackler <rackler@apple.com> 2 23 -
trunk/Source/WebCore/ChangeLog
r263581 r263588 1 2020-06-26 Jason Lawrence <lawrence.j@apple.com> 2 3 Unreviewed, reverting r263511, r263514, and r263565. 4 5 r263511 caused MediaRecorder test crashes on internal testers. 6 7 Reverted changesets: 8 9 "MediaRecorder stopRecorder() returns empty Blob after first 10 use" 11 https://bugs.webkit.org/show_bug.cgi?id=212274 12 https://trac.webkit.org/changeset/263511 13 14 "Unreviewed iOS build fix after r263511." 15 https://trac.webkit.org/changeset/263514 16 17 "MediaRecorder.start() Method is Ignoring the "timeslice" 18 Parameter" 19 https://bugs.webkit.org/show_bug.cgi?id=202233 20 https://trac.webkit.org/changeset/263565 21 1 22 2020-06-26 Sam Weinig <weinig@apple.com> 2 23 -
trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp
r263565 r263588 52 52 if (!privateInstance) 53 53 return Exception { NotSupportedError, "The MediaRecorder is unsupported on this platform"_s }; 54 auto recorder = adoptRef(*new MediaRecorder(document, WTFMove(stream), WTFMove( options)));54 auto recorder = adoptRef(*new MediaRecorder(document, WTFMove(stream), WTFMove(privateInstance), WTFMove(options))); 55 55 recorder->suspendIfNeeded(); 56 recorder->m_private->setErrorCallback([recorder](auto&& exception) mutable { 57 recorder->dispatchError(WTFMove(*exception)); 58 }); 56 59 return recorder; 57 60 } … … 80 83 } 81 84 82 MediaRecorder::MediaRecorder(Document& document, Ref<MediaStream>&& stream, Options&& option)85 MediaRecorder::MediaRecorder(Document& document, Ref<MediaStream>&& stream, std::unique_ptr<MediaRecorderPrivate>&& privateImpl, Options&& option) 83 86 : ActiveDOMObject(document) 84 87 , m_options(WTFMove(option)) 85 88 , m_stream(WTFMove(stream)) 86 , m_ timeSliceTimer([this] { requestData(); })89 , m_private(WTFMove(privateImpl)) 87 90 { 88 91 m_tracks = WTF::map(m_stream->getTracks(), [] (auto&& track) -> Ref<MediaStreamTrackPrivate> { … … 127 130 } 128 131 129 ExceptionOr<void> MediaRecorder::startRecording(Optional<int> timeSlice) 130 { 131 if (!m_isActive) 132 return Exception { InvalidStateError, "The MediaRecorder is not active"_s }; 133 132 ExceptionOr<void> MediaRecorder::startRecording(Optional<int> timeslice) 133 { 134 UNUSED_PARAM(timeslice); 134 135 if (state() != RecordingState::Inactive) 135 136 return Exception { InvalidStateError, "The MediaRecorder's state must be inactive in order to start recording"_s }; 136 137 ASSERT(!m_private); 138 m_private = createMediaRecorderPrivate(*document(), m_stream->privateStream()); 139 140 if (!m_private) 141 return Exception { NotSupportedError, "The MediaRecorder is unsupported on this platform"_s }; 142 143 m_private->startRecording([this, pendingActivity = makePendingActivity(*this)](auto&& exception) mutable { 144 if (!m_isActive || !exception) 145 return; 146 147 stopRecordingInternal(); 148 dispatchError(WTFMove(*exception)); 149 }); 150 137 151 138 for (auto& track : m_tracks) 152 139 track->addObserver(*this); 153 140 154 141 m_state = RecordingState::Recording; 155 m_timeSlice = timeSlice;156 if (m_timeSlice)157 m_timeSliceTimer.startOneShot(Seconds::fromMilliseconds(*m_timeSlice));158 142 return { }; 159 143 } … … 163 147 if (state() == RecordingState::Inactive) 164 148 return Exception { InvalidStateError, "The MediaRecorder's state cannot be inactive"_s }; 165 166 stopRecordingInternal(); 167 auto& privateRecorder = *m_private; 168 privateRecorder.fetchData([this, pendingActivity = makePendingActivity(*this), privateRecorder = WTFMove(m_private)](auto&& buffer, auto& mimeType) { 169 queueTaskKeepingObjectAlive(*this, TaskSource::Networking, [this, buffer = WTFMove(buffer), mimeType]() mutable { 149 150 queueTaskKeepingObjectAlive(*this, TaskSource::Networking, [this] { 151 if (!m_isActive || state() == RecordingState::Inactive) 152 return; 153 154 stopRecordingInternal(); 155 ASSERT(m_state == RecordingState::Inactive); 156 m_private->fetchData([this, pendingActivity = makePendingActivity(*this)](auto&& buffer, auto& mimeType) { 170 157 if (!m_isActive) 171 158 return; 159 172 160 dispatchEvent(BlobEvent::create(eventNames().dataavailableEvent, Event::CanBubble::No, Event::IsCancelable::No, buffer ? Blob::create(buffer.releaseNonNull(), mimeType) : Blob::create())); 173 161 174 162 if (!m_isActive) 175 163 return; 164 176 165 dispatchEvent(Event::create(eventNames().stopEvent, Event::CanBubble::No, Event::IsCancelable::No)); 177 166 }); … … 185 174 return Exception { InvalidStateError, "The MediaRecorder's state cannot be inactive"_s }; 186 175 187 if (m_timeSliceTimer.isActive())188 m_timeSliceTimer.stop();189 176 m_private->fetchData([this, pendingActivity = makePendingActivity(*this)](auto&& buffer, auto& mimeType) { 190 queueTaskKeepingObjectAlive(*this, TaskSource::Networking, [this, buffer = WTFMove(buffer), mimeType]() mutable { 191 if (!m_isActive) 192 return; 193 194 dispatchEvent(BlobEvent::create(eventNames().dataavailableEvent, Event::CanBubble::No, Event::IsCancelable::No, buffer ? Blob::create(buffer.releaseNonNull(), mimeType) : Blob::create())); 195 196 if (m_timeSlice) 197 m_timeSliceTimer.startOneShot(Seconds::fromMilliseconds(*m_timeSlice)); 198 }); 177 if (!m_isActive) 178 return; 179 180 dispatchEvent(BlobEvent::create(eventNames().dataavailableEvent, Event::CanBubble::No, Event::IsCancelable::No, buffer ? Blob::create(buffer.releaseNonNull(), mimeType) : Blob::create())); 199 181 }); 200 182 return { }; -
trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h
r263565 r263588 31 31 #include "MediaStream.h" 32 32 #include "MediaStreamTrackPrivate.h" 33 #include "Timer.h"34 33 #include <wtf/UniqueRef.h> 35 34 … … 77 76 78 77 private: 79 MediaRecorder(Document&, Ref<MediaStream>&&, Options&& = { });78 MediaRecorder(Document&, Ref<MediaStream>&&, std::unique_ptr<MediaRecorderPrivate>&&, Options&& = { }); 80 79 81 80 static std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate(Document&, MediaStreamPrivate&); … … 118 117 RecordingState m_state { RecordingState::Inactive }; 119 118 Vector<Ref<MediaStreamTrackPrivate>> m_tracks; 120 Optional<int> m_timeSlice;121 Timer m_timeSliceTimer;122 119 123 120 bool m_isActive { true }; -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.h
r263511 r263588 61 61 virtual void stopRecording() = 0; 62 62 63 using ErrorCallback = CompletionHandler<void(Optional<Exception>&&)>;64 v irtual void startRecording(ErrorCallback&& callback) { callback({ }); }63 using ErrorCallback = Function<void(Optional<Exception>&&)>; 64 void setErrorCallback(ErrorCallback&& errorCallback) { m_errorCallback = WTFMove(errorCallback); } 65 65 66 66 protected: 67 67 void setAudioSource(RefPtr<RealtimeMediaSource>&&); 68 68 void setVideoSource(RefPtr<RealtimeMediaSource>&&); 69 70 protected: 71 ErrorCallback m_errorCallback; 69 72 70 73 private: -
trunk/Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.h
r263511 r263588 61 61 62 62 dispatch_queue_t m_serialDispatchQueue; 63 CMTime m_lowWaterTime { kCMTimeInvalid };63 CMTime m_lowWaterTime; 64 64 65 65 RetainPtr<CMBufferQueueRef> m_outputBufferQueue; … … 67 67 bool m_isEncoding { false }; 68 68 69 AudioConverterRef m_converter { nullptr };69 RetainPtr<AudioConverterRef> m_converter; 70 70 AudioStreamBasicDescription m_sourceFormat; 71 71 AudioStreamBasicDescription m_destinationFormat; … … 75 75 Vector<AudioStreamPacketDescription> m_destinationPacketDescriptions; 76 76 77 CMTime m_currentNativePresentationTimeStamp { kCMTimeInvalid };78 CMTime m_currentOutputPresentationTimeStamp { kCMTimeInvalid };79 CMTime m_remainingPrimeDuration { kCMTimeInvalid };77 CMTime m_currentNativePresentationTimeStamp; 78 CMTime m_currentOutputPresentationTimeStamp; 79 CMTime m_remainingPrimeDuration; 80 80 81 81 Vector<char> m_sourceBuffer; -
trunk/Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm
r263511 r263588 59 59 { 60 60 dispatch_release(m_serialDispatchQueue); 61 if (m_converter) {62 AudioConverterDispose(m_converter);63 m_converter = nullptr;64 }65 61 } 66 62 … … 117 113 return false; 118 114 } 119 m_converter = converter;115 m_converter = adoptCF(converter); 120 116 121 117 size_t cookieSize = 0; 122 118 const void *cookie = CMAudioFormatDescriptionGetMagicCookie(formatDescription, &cookieSize); 123 119 if (cookieSize) { 124 if (auto error = AudioConverterSetProperty(m_converter , kAudioConverterDecompressionMagicCookie, (UInt32)cookieSize, cookie)) {120 if (auto error = AudioConverterSetProperty(m_converter.get(), kAudioConverterDecompressionMagicCookie, (UInt32)cookieSize, cookie)) { 125 121 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor setting kAudioConverterDecompressionMagicCookie failed with %d", error); 126 122 return false; … … 129 125 130 126 size = sizeof(m_sourceFormat); 131 if (auto error = AudioConverterGetProperty(m_converter , kAudioConverterCurrentInputStreamDescription, &size, &m_sourceFormat)) {127 if (auto error = AudioConverterGetProperty(m_converter.get(), kAudioConverterCurrentInputStreamDescription, &size, &m_sourceFormat)) { 132 128 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor getting kAudioConverterCurrentInputStreamDescription failed with %d", error); 133 129 return false; … … 140 136 141 137 size = sizeof(m_destinationFormat); 142 if (auto error = AudioConverterGetProperty(m_converter , kAudioConverterCurrentOutputStreamDescription, &size, &m_destinationFormat)) {138 if (auto error = AudioConverterGetProperty(m_converter.get(), kAudioConverterCurrentOutputStreamDescription, &size, &m_destinationFormat)) { 143 139 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor getting kAudioConverterCurrentOutputStreamDescription failed with %d", error); 144 140 return false; … … 154 150 155 151 size = sizeof(outputBitRate); 156 if (auto error = AudioConverterSetProperty(m_converter , kAudioConverterEncodeBitRate, size, &outputBitRate)) {152 if (auto error = AudioConverterSetProperty(m_converter.get(), kAudioConverterEncodeBitRate, size, &outputBitRate)) { 157 153 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor setting kAudioConverterEncodeBitRate failed with %d", error); 158 154 return false; … … 164 160 size = sizeof(m_maxOutputPacketSize); 165 161 166 if (auto error = AudioConverterGetProperty(m_converter , kAudioConverterPropertyMaximumOutputPacketSize, &size, &m_maxOutputPacketSize)) {162 if (auto error = AudioConverterGetProperty(m_converter.get(), kAudioConverterPropertyMaximumOutputPacketSize, &size, &m_maxOutputPacketSize)) { 167 163 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor getting kAudioConverterPropertyMaximumOutputPacketSize failed with %d", error); 168 164 return false; … … 194 190 UInt32 size = sizeof(primeInfo); 195 191 196 if (auto error = AudioConverterGetProperty(m_converter , kAudioConverterPrimeInfo, &size, &primeInfo)) {192 if (auto error = AudioConverterGetProperty(m_converter.get(), kAudioConverterPrimeInfo, &size, &primeInfo)) { 197 193 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor getting kAudioConverterPrimeInfo failed with %d", error); 198 194 return; … … 216 212 UInt32 delaySize = sizeof(uint32_t); 217 213 uint32_t originalDelayMode = 0; 218 if (auto error = AudioConverterGetProperty(m_converter , kAudioCodecPropertyDelayMode, &delaySize, &originalDelayMode)) {214 if (auto error = AudioConverterGetProperty(m_converter.get(), kAudioCodecPropertyDelayMode, &delaySize, &originalDelayMode)) { 219 215 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor getting kAudioCodecPropertyDelayMode failed with %d", error); 220 216 return nil; … … 222 218 223 219 uint32_t optimalDelayMode = kAudioCodecDelayMode_Optimal; 224 if (auto error = AudioConverterSetProperty(m_converter , kAudioCodecPropertyDelayMode, delaySize, &optimalDelayMode)) {220 if (auto error = AudioConverterSetProperty(m_converter.get(), kAudioCodecPropertyDelayMode, delaySize, &optimalDelayMode)) { 225 221 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor setting kAudioCodecPropertyDelayMode failed with %d", error); 226 222 return nil; … … 229 225 UInt32 primeSize = sizeof(AudioCodecPrimeInfo); 230 226 AudioCodecPrimeInfo primeInfo { 0, 0 }; 231 if (auto error = AudioConverterGetProperty(m_converter , kAudioCodecPropertyPrimeInfo, &primeSize, &primeInfo)) {227 if (auto error = AudioConverterGetProperty(m_converter.get(), kAudioCodecPropertyPrimeInfo, &primeSize, &primeInfo)) { 232 228 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor getting kAudioCodecPropertyPrimeInfo failed with %d", error); 233 229 return nil; 234 230 } 235 231 236 if (auto error = AudioConverterSetProperty(m_converter , kAudioCodecPropertyDelayMode, delaySize, &originalDelayMode)) {232 if (auto error = AudioConverterSetProperty(m_converter.get(), kAudioCodecPropertyDelayMode, delaySize, &originalDelayMode)) { 237 233 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor setting kAudioCodecPropertyDelayMode failed with %d", error); 238 234 return nil; … … 247 243 UInt32 cookieSize = 0; 248 244 249 auto error = AudioConverterGetPropertyInfo(m_converter , kAudioConverterCompressionMagicCookie, &cookieSize, NULL);245 auto error = AudioConverterGetPropertyInfo(m_converter.get(), kAudioConverterCompressionMagicCookie, &cookieSize, NULL); 250 246 if ((error == noErr) && !!cookieSize) { 251 247 cookie.resize(cookieSize); 252 248 253 if (auto error = AudioConverterGetProperty(m_converter , kAudioConverterCompressionMagicCookie, &cookieSize, cookie.data())) {249 if (auto error = AudioConverterGetProperty(m_converter.get(), kAudioConverterCompressionMagicCookie, &cookieSize, cookie.data())) { 254 250 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor getting kAudioConverterCompressionMagicCookie failed with %d", error); 255 251 return nil; … … 444 440 UInt32 numOutputPackets = (UInt32)m_destinationBuffer.capacity() / outputPacketSize; 445 441 446 auto error = AudioConverterFillComplexBuffer(m_converter , audioConverterComplexInputDataProc, this, &numOutputPackets, &fillBufferList, m_destinationPacketDescriptions.data());442 auto error = AudioConverterFillComplexBuffer(m_converter.get(), audioConverterComplexInputDataProc, this, &numOutputPackets, &fillBufferList, m_destinationPacketDescriptions.data()); 447 443 if (error) { 448 444 RELEASE_LOG_ERROR(MediaStream, "AudioSampleBufferCompressor AudioConverterFillComplexBuffer failed with %d", error); -
trunk/Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.h
r263511 r263588 115 115 std::unique_ptr<VideoSampleBufferCompressor> m_videoCompressor; 116 116 RetainPtr<AVAssetWriterInput> m_videoAssetWriterInput; 117 CMTime m_lastVideoPresentationTime { kCMTimeInvalid };118 CMTime m_lastVideoDecodingTime { kCMTimeInvalid };117 CMTime m_lastVideoPresentationTime; 118 CMTime m_lastVideoDecodingTime; 119 119 bool m_hasEncodedVideoSamples { false }; 120 120 -
trunk/Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm
r263511 r263588 436 436 // We hop to the main thread since finishing the video compressor might trigger starting the writer asynchronously. 437 437 callOnMainThread([this, weakThis = makeWeakPtr(this)]() mutable { 438 auto whenFinished = [this, weakThis] { 439 if (!weakThis) 440 return; 441 438 auto whenFinished = [this] { 442 439 m_isStopping = false; 440 if (m_fetchDataCompletionHandler) { 441 auto buffer = WTFMove(m_data); 442 m_fetchDataCompletionHandler(WTFMove(buffer)); 443 } 444 443 445 m_isStopped = false; 444 446 m_hasStartedWriting = false; 445 446 if (m_writer) 447 m_writer.clear(); 448 if (m_fetchDataCompletionHandler) 449 m_fetchDataCompletionHandler(std::exchange(m_data, nullptr)); 447 clear(); 450 448 }; 451 449 … … 464 462 ALLOW_DEPRECATED_DECLARATIONS_END 465 463 466 [m_writer finishWritingWithCompletionHandler:[whenFinished = WTFMove(whenFinished)]() mutable { 467 callOnMainThread(WTFMove(whenFinished)); 464 [m_writer finishWritingWithCompletionHandler:[weakThis = WTFMove(weakThis), whenFinished = WTFMove(whenFinished)]() mutable { 465 callOnMainThread([weakThis = WTFMove(weakThis), whenFinished = WTFMove(whenFinished)]() mutable { 466 if (!weakThis) 467 return; 468 whenFinished(); 469 }); 468 470 }]; 469 471 }); -
trunk/Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm
r263511 r263588 57 57 { 58 58 dispatch_release(m_serialDispatchQueue); 59 if (m_vtSession) {60 VTCompressionSessionInvalidate(m_vtSession.get());61 m_vtSession = nullptr;62 }63 59 } 64 60 -
trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h
r263514 r263588 74 74 static Ref<MediaStreamPrivate> create(Ref<const Logger>&& logger, const MediaStreamTrackPrivateVector& tracks, String&& id = createCanonicalUUIDString()) { return adoptRef(*new MediaStreamPrivate(WTFMove(logger), tracks, WTFMove(id))); } 75 75 76 WEBCORE_EXPORTvirtual ~MediaStreamPrivate();76 virtual ~MediaStreamPrivate(); 77 77 78 78 void addObserver(Observer&); -
trunk/Source/WebKit/ChangeLog
r263575 r263588 1 2020-06-26 Jason Lawrence <lawrence.j@apple.com> 2 3 Unreviewed, reverting r263511, r263514, and r263565. 4 5 r263511 caused MediaRecorder test crashes on internal testers. 6 7 Reverted changesets: 8 9 "MediaRecorder stopRecorder() returns empty Blob after first 10 use" 11 https://bugs.webkit.org/show_bug.cgi?id=212274 12 https://trac.webkit.org/changeset/263511 13 14 "Unreviewed iOS build fix after r263511." 15 https://trac.webkit.org/changeset/263514 16 17 "MediaRecorder.start() Method is Ignoring the "timeslice" 18 Parameter" 19 https://bugs.webkit.org/show_bug.cgi?id=202233 20 https://trac.webkit.org/changeset/263565 21 1 22 2020-06-26 Geoffrey Garen <ggaren@apple.com> 2 23 -
trunk/Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorderManager.cpp
r263511 r263588 65 65 void RemoteMediaRecorderManager::releaseRecorder(MediaRecorderIdentifier identifier) 66 66 { 67 ASSERT(m_recorders.contains(identifier)); 67 68 m_recorders.remove(identifier); 68 69 } -
trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp
r263511 r263588 46 46 MediaRecorderPrivate::MediaRecorderPrivate(MediaStreamPrivate& stream) 47 47 : m_identifier(MediaRecorderIdentifier::generate()) 48 , m_stream(makeRef(stream))49 48 , m_connection(WebProcess::singleton().ensureGPUProcessConnection().connection()) 50 {51 }52 53 void MediaRecorderPrivate::startRecording(ErrorCallback&& errorCallback)54 49 { 55 50 // FIXME: we will need to implement support for multiple audio/video tracks 56 51 // Currently we only choose the first track as the recorded track. 57 52 58 auto selectedTracks = MediaRecorderPrivate::selectTracks( m_stream);53 auto selectedTracks = MediaRecorderPrivate::selectTracks(stream); 59 54 if (selectedTracks.audioTrack) { 60 55 m_ringBuffer = makeUnique<CARingBuffer>(makeUniqueRef<SharedRingBufferStorage>(this)); … … 70 65 } 71 66 72 m_connection->sendWithAsyncReply(Messages::RemoteMediaRecorderManager::CreateRecorder { m_identifier, !!selectedTracks.audioTrack, width, height }, [this, weakThis = makeWeakPtr(this), audioTrack = makeRefPtr(selectedTracks.audioTrack), videoTrack = makeRefPtr(selectedTracks.videoTrack), errorCallback = WTFMove(errorCallback)](auto&& exception) mutable { 73 if (!weakThis) { 74 errorCallback({ }); 67 m_connection->sendWithAsyncReply(Messages::RemoteMediaRecorderManager::CreateRecorder { m_identifier, !!selectedTracks.audioTrack, width, height }, [this, weakThis = makeWeakPtr(this), audioTrack = makeRefPtr(selectedTracks.audioTrack), videoTrack = makeRefPtr(selectedTracks.videoTrack)](auto&& exception) { 68 if (!weakThis) 75 69 return; 76 } 77 if (exception) { 78 errorCallback(Exception { exception->code, WTFMove(exception->message) }); 79 return; 80 } 70 if (exception) 71 return m_errorCallback(Exception { exception->code, WTFMove(exception->message) }); 81 72 if (audioTrack) 82 73 setAudioSource(&audioTrack->source()); 83 74 if (videoTrack) 84 75 setVideoSource(&videoTrack->source()); 85 errorCallback({ });86 76 }, 0); 87 77 } -
trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.h
r263511 r263588 59 59 void fetchData(CompletionHandler<void(RefPtr<WebCore::SharedBuffer>&&, const String& mimeType)>&&) final; 60 60 void stopRecording() final; 61 void startRecording(ErrorCallback&&) final;62 61 void audioSamplesAvailable(const WTF::MediaTime&, const WebCore::PlatformAudioData&, const WebCore::AudioStreamDescription&, size_t) final; 63 62 … … 66 65 67 66 MediaRecorderIdentifier m_identifier; 68 Ref<MediaStreamPrivate> m_stream; 67 69 68 Ref<IPC::Connection> m_connection; 70 71 69 String m_recordedAudioTrackID; 72 70 String m_recordedVideoTrackID;
Note: See TracChangeset
for help on using the changeset viewer.