Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(563)

Side by Side Diff: third_party/WebKit/Source/modules/mediarecorder/MediaRecorder.cpp

Issue 2697703003: MediaRecorder: make sure ondataavailable+onstop events are fired before onerror (Closed)
Patch Set: emircan@s comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/mediarecorder/MediaRecorder.h" 5 #include "modules/mediarecorder/MediaRecorder.h"
6 6
7 #include "bindings/core/v8/Dictionary.h" 7 #include "bindings/core/v8/Dictionary.h"
8 #include "core/events/Event.h" 8 #include "core/events/Event.h"
9 #include "core/fileapi/Blob.h" 9 #include "core/fileapi/Blob.h"
10 #include "core/inspector/ConsoleMessage.h" 10 #include "core/inspector/ConsoleMessage.h"
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 156
157 return recorder; 157 return recorder;
158 } 158 }
159 159
160 MediaRecorder::MediaRecorder(ExecutionContext* context, 160 MediaRecorder::MediaRecorder(ExecutionContext* context,
161 MediaStream* stream, 161 MediaStream* stream,
162 const MediaRecorderOptions& options, 162 const MediaRecorderOptions& options,
163 ExceptionState& exceptionState) 163 ExceptionState& exceptionState)
164 : SuspendableObject(context), 164 : SuspendableObject(context),
165 m_stream(stream), 165 m_stream(stream),
166 m_streamAmountOfTracks(stream->getTracks().size()),
167 m_mimeType(options.hasMimeType() ? options.mimeType() : kDefaultMimeType), 166 m_mimeType(options.hasMimeType() ? options.mimeType() : kDefaultMimeType),
168 m_stopped(true), 167 m_stopped(true),
169 m_audioBitsPerSecond(0), 168 m_audioBitsPerSecond(0),
170 m_videoBitsPerSecond(0), 169 m_videoBitsPerSecond(0),
171 m_state(State::Inactive), 170 m_state(State::Inactive),
172 m_dispatchScheduledEventRunner(AsyncMethodRunner<MediaRecorder>::create( 171 m_dispatchScheduledEventRunner(AsyncMethodRunner<MediaRecorder>::create(
173 this, 172 this,
174 &MediaRecorder::dispatchScheduledEvent)) { 173 &MediaRecorder::dispatchScheduledEvent)) {
175 DCHECK(m_stream->getTracks().size()); 174 DCHECK(m_stream->getTracks().size());
176 175
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 } 324 }
326 325
327 void MediaRecorder::writeData(const char* data, 326 void MediaRecorder::writeData(const char* data,
328 size_t length, 327 size_t length,
329 bool lastInSlice, 328 bool lastInSlice,
330 double timecode) { 329 double timecode) {
331 if (m_stopped && !lastInSlice) { 330 if (m_stopped && !lastInSlice) {
332 m_stopped = false; 331 m_stopped = false;
333 scheduleDispatchEvent(Event::create(EventTypeNames::start)); 332 scheduleDispatchEvent(Event::create(EventTypeNames::start));
334 } 333 }
335 if (m_stream && m_streamAmountOfTracks != m_stream->getTracks().size()) {
336 m_streamAmountOfTracks = m_stream->getTracks().size();
337 onError("Amount of tracks in MediaStream has changed.");
338 }
339
340 // TODO(mcasas): Act as |m_ignoredMutedMedia| instructs if |m_stream| track(s)
341 // is in muted() state.
emircan 2017/02/17 18:59:25 Is this TODO still relevant or...
mcasas 2017/02/17 20:40:29 No, it was removed from the Spec in https://githu
342 334
343 if (!m_blobData) { 335 if (!m_blobData) {
344 m_blobData = BlobData::create(); 336 m_blobData = BlobData::create();
345 m_blobData->setContentType(m_mimeType); 337 m_blobData->setContentType(m_mimeType);
346 } 338 }
347 if (data) 339 if (data)
348 m_blobData->appendBytes(data, length); 340 m_blobData->appendBytes(data, length);
349 341
350 if (!lastInSlice) 342 if (!lastInSlice)
351 return; 343 return;
352 344
353 // Cache |m_blobData->length()| before release()ng it. 345 // Cache |m_blobData->length()| before release()ng it.
354 const long long blobDataLength = m_blobData->length(); 346 const long long blobDataLength = m_blobData->length();
355 createBlobEvent(Blob::create(BlobDataHandle::create(std::move(m_blobData), 347 createBlobEvent(Blob::create(BlobDataHandle::create(std::move(m_blobData),
356 blobDataLength)), 348 blobDataLength)),
357 timecode); 349 timecode);
358 } 350 }
359 351
360 void MediaRecorder::onError(const WebString& message) { 352 void MediaRecorder::onError(const WebString& message) {
361 // TODO(mcasas): Beef up the Error Event and add the |message|, see 353 DLOG(ERROR) << message.ascii();
362 // https://github.com/w3c/mediacapture-record/issues/31 354 stopRecording();
363 scheduleDispatchEvent(Event::create(EventTypeNames::error)); 355 scheduleDispatchEvent(Event::create(EventTypeNames::error));
364 } 356 }
365 357
366 void MediaRecorder::createBlobEvent(Blob* blob, double timecode) { 358 void MediaRecorder::createBlobEvent(Blob* blob, double timecode) {
367 scheduleDispatchEvent( 359 scheduleDispatchEvent(
368 BlobEvent::create(EventTypeNames::dataavailable, blob, timecode)); 360 BlobEvent::create(EventTypeNames::dataavailable, blob, timecode));
369 } 361 }
370 362
371 void MediaRecorder::stopRecording() { 363 void MediaRecorder::stopRecording() {
372 DCHECK(m_state != State::Inactive); 364 DCHECK(m_state != State::Inactive);
(...skipping 22 matching lines...) Expand all
395 387
396 DEFINE_TRACE(MediaRecorder) { 388 DEFINE_TRACE(MediaRecorder) {
397 visitor->trace(m_stream); 389 visitor->trace(m_stream);
398 visitor->trace(m_dispatchScheduledEventRunner); 390 visitor->trace(m_dispatchScheduledEventRunner);
399 visitor->trace(m_scheduledEvents); 391 visitor->trace(m_scheduledEvents);
400 EventTargetWithInlineData::trace(visitor); 392 EventTargetWithInlineData::trace(visitor);
401 SuspendableObject::trace(visitor); 393 SuspendableObject::trace(visitor);
402 } 394 }
403 395
404 } // namespace blink 396 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698