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

Side by Side Diff: content/renderer/media/media_stream_impl.cc

Issue 131763002: Adds MediaStreamSource, MediaStreamAudioSource and MediaStreamVideoCaptureDeviceSource (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed Ronghuas and Jois comments. Created 6 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/renderer/media/media_stream_impl.h" 5 #include "content/renderer/media/media_stream_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
11 #include "base/strings/stringprintf.h" 11 #include "base/strings/stringprintf.h"
12 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
13 #include "content/renderer/media/capturer_media_stream_video_source.h"
13 #include "content/renderer/media/media_stream_audio_renderer.h" 14 #include "content/renderer/media/media_stream_audio_renderer.h"
15 #include "content/renderer/media/media_stream_audio_source.h"
14 #include "content/renderer/media/media_stream_dependency_factory.h" 16 #include "content/renderer/media/media_stream_dependency_factory.h"
15 #include "content/renderer/media/media_stream_dispatcher.h" 17 #include "content/renderer/media/media_stream_dispatcher.h"
16 #include "content/renderer/media/media_stream_extra_data.h" 18 #include "content/renderer/media/media_stream_extra_data.h"
17 #include "content/renderer/media/media_stream_source_extra_data.h"
18 #include "content/renderer/media/peer_connection_tracker.h" 19 #include "content/renderer/media/peer_connection_tracker.h"
19 #include "content/renderer/media/rtc_video_renderer.h" 20 #include "content/renderer/media/rtc_video_renderer.h"
20 #include "content/renderer/media/webrtc_audio_capturer.h" 21 #include "content/renderer/media/webrtc_audio_capturer.h"
21 #include "content/renderer/media/webrtc_audio_renderer.h" 22 #include "content/renderer/media/webrtc_audio_renderer.h"
22 #include "content/renderer/media/webrtc_local_audio_renderer.h" 23 #include "content/renderer/media/webrtc_local_audio_renderer.h"
23 #include "content/renderer/media/webrtc_logging.h" 24 #include "content/renderer/media/webrtc_logging.h"
24 #include "content/renderer/media/webrtc_uma_histograms.h" 25 #include "content/renderer/media/webrtc_uma_histograms.h"
25 #include "content/renderer/render_thread_impl.h" 26 #include "content/renderer/render_thread_impl.h"
26 #include "media/base/audio_hardware_config.h" 27 #include "media/base/audio_hardware_config.h"
27 #include "third_party/WebKit/public/platform/WebMediaConstraints.h" 28 #include "third_party/WebKit/public/platform/WebMediaConstraints.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 67
67 void GetDefaultOutputDeviceParams( 68 void GetDefaultOutputDeviceParams(
68 int* output_sample_rate, int* output_buffer_size) { 69 int* output_sample_rate, int* output_buffer_size) {
69 // Fetch the default audio output hardware config. 70 // Fetch the default audio output hardware config.
70 media::AudioHardwareConfig* hardware_config = 71 media::AudioHardwareConfig* hardware_config =
71 RenderThreadImpl::current()->GetAudioHardwareConfig(); 72 RenderThreadImpl::current()->GetAudioHardwareConfig();
72 *output_sample_rate = hardware_config->GetOutputSampleRate(); 73 *output_sample_rate = hardware_config->GetOutputSampleRate();
73 *output_buffer_size = hardware_config->GetOutputBufferSize(); 74 *output_buffer_size = hardware_config->GetOutputBufferSize();
74 } 75 }
75 76
76 void RemoveSource(const blink::WebMediaStreamSource& source,
77 std::vector<blink::WebMediaStreamSource>* sources) {
78 for (std::vector<blink::WebMediaStreamSource>::iterator it =
79 sources->begin();
80 it != sources->end(); ++it) {
81 if (source.id() == it->id()) {
82 sources->erase(it);
83 return;
84 }
85 }
86 }
87
88 } // namespace 77 } // namespace
89 78
90 MediaStreamImpl::MediaStreamImpl( 79 MediaStreamImpl::MediaStreamImpl(
91 RenderView* render_view, 80 RenderView* render_view,
92 MediaStreamDispatcher* media_stream_dispatcher, 81 MediaStreamDispatcher* media_stream_dispatcher,
93 MediaStreamDependencyFactory* dependency_factory) 82 MediaStreamDependencyFactory* dependency_factory)
94 : RenderViewObserver(render_view), 83 : RenderViewObserver(render_view),
95 dependency_factory_(dependency_factory), 84 dependency_factory_(dependency_factory),
96 media_stream_dispatcher_(media_stream_dispatcher) { 85 media_stream_dispatcher_(media_stream_dispatcher) {
97 } 86 }
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 device_it != video_array.end(); ++device_it) { 303 device_it != video_array.end(); ++device_it) {
315 if (!FindLocalSource(*device_it)) 304 if (!FindLocalSource(*device_it))
316 media_stream_dispatcher_->StopStreamDevice(*device_it); 305 media_stream_dispatcher_->StopStreamDevice(*device_it);
317 } 306 }
318 307
319 DVLOG(1) << "Request ID not found"; 308 DVLOG(1) << "Request ID not found";
320 return; 309 return;
321 } 310 }
322 request_info->generated = true; 311 request_info->generated = true;
323 312
324 blink::WebVector<blink::WebMediaStreamSource> audio_source_vector(
325 audio_array.size());
326
327 // Log the device names for this request.
328 for (StreamDeviceInfoArray::const_iterator it = audio_array.begin();
329 it != audio_array.end(); ++it) {
330 WebRtcLogMessage(base::StringPrintf(
331 "Generated media stream for request id %d contains audio device name"
332 " \"%s\"",
333 request_id,
334 it->device.name.c_str()));
335 }
336
337 StreamDeviceInfoArray overridden_audio_array = audio_array;
338 if (!request_info->enable_automatic_output_device_selection) {
339 // If the GetUserMedia request did not explicitly set the constraint
340 // kMediaStreamRenderToAssociatedSink, the output device parameters must
341 // be removed.
342 for (StreamDeviceInfoArray::iterator it = overridden_audio_array.begin();
343 it != overridden_audio_array.end(); ++it) {
344 it->device.matched_output_device_id = "";
345 it->device.matched_output = MediaStreamDevice::AudioDeviceParameters();
346 }
347 }
348 CreateWebKitSourceVector(label, overridden_audio_array,
349 blink::WebMediaStreamSource::TypeAudio,
350 request_info->frame,
351 audio_source_vector);
352
353 blink::WebVector<blink::WebMediaStreamSource> video_source_vector(
354 video_array.size());
355 CreateWebKitSourceVector(label, video_array,
356 blink::WebMediaStreamSource::TypeVideo,
357 request_info->frame,
358 video_source_vector);
359 blink::WebUserMediaRequest* request = &(request_info->request);
360 blink::WebString webkit_id = base::UTF8ToUTF16(label);
361 blink::WebMediaStream* web_stream = &(request_info->web_stream);
362
363 blink::WebVector<blink::WebMediaStreamTrack> audio_track_vector(
364 audio_array.size());
365 for (size_t i = 0; i < audio_track_vector.size(); ++i) {
366 audio_track_vector[i].initialize(audio_source_vector[i]);
367 request_info->sources.push_back(audio_source_vector[i]);
368 }
369
370 blink::WebVector<blink::WebMediaStreamTrack> video_track_vector(
371 video_array.size());
372 for (size_t i = 0; i < video_track_vector.size(); ++i) {
373 video_track_vector[i].initialize(video_source_vector[i]);
374 request_info->sources.push_back(video_source_vector[i]);
375 }
376
377 web_stream->initialize(webkit_id, audio_track_vector,
378 video_track_vector);
379
380 // WebUserMediaRequest don't have an implementation in unit tests. 313 // WebUserMediaRequest don't have an implementation in unit tests.
381 // Therefore we need to check for isNull here. 314 // Therefore we need to check for isNull here.
315 blink::WebUserMediaRequest* request = &(request_info->request);
382 blink::WebMediaConstraints audio_constraints = request->isNull() ? 316 blink::WebMediaConstraints audio_constraints = request->isNull() ?
383 blink::WebMediaConstraints() : request->audioConstraints(); 317 blink::WebMediaConstraints() : request->audioConstraints();
384 blink::WebMediaConstraints video_constraints = request->isNull() ? 318 blink::WebMediaConstraints video_constraints = request->isNull() ?
385 blink::WebMediaConstraints() : request->videoConstraints(); 319 blink::WebMediaConstraints() : request->videoConstraints();
386 320
387 dependency_factory_->CreateNativeMediaSources( 321 blink::WebVector<blink::WebMediaStreamTrack> audio_track_vector(
388 RenderViewObserver::routing_id(), 322 audio_array.size());
389 audio_constraints, video_constraints, web_stream, 323 CreateAudioTracks(audio_array, audio_constraints, &audio_track_vector,
390 base::Bind(&MediaStreamImpl::OnCreateNativeSourcesComplete, AsWeakPtr())); 324 request_info);
325
326 blink::WebVector<blink::WebMediaStreamTrack> video_track_vector(
327 video_array.size());
328 CreateVideoTracks(video_array, video_constraints, &video_track_vector,
329 request_info);
330
331 blink::WebString webkit_id = base::UTF8ToUTF16(label);
332 blink::WebMediaStream* web_stream = &(request_info->web_stream);
333
334 web_stream->initialize(webkit_id, audio_track_vector,
335 video_track_vector);
336
337 // Wait for the tracks to be started successfully or to fail.
338 request_info->CallbackOnTracksStarted(
339 base::Bind(&MediaStreamImpl::OnCreateNativeTracksComplete, AsWeakPtr()));
391 } 340 }
392 341
393 // Callback from MediaStreamDispatcher. 342 // Callback from MediaStreamDispatcher.
394 // The requested stream failed to be generated. 343 // The requested stream failed to be generated.
395 void MediaStreamImpl::OnStreamGenerationFailed(int request_id) { 344 void MediaStreamImpl::OnStreamGenerationFailed(int request_id) {
396 DCHECK(CalledOnValidThread()); 345 DCHECK(CalledOnValidThread());
397 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" 346 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed("
398 << request_id << ")"; 347 << request_id << ")";
399 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); 348 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id);
400 if (!request_info) { 349 if (!request_info) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 local_sources_.erase(device_it); 385 local_sources_.erase(device_it);
437 break; 386 break;
438 } 387 }
439 } 388 }
440 389
441 // Remove the reference to this source from all |user_media_requests_|. 390 // Remove the reference to this source from all |user_media_requests_|.
442 // TODO(perkj): The below is not necessary once we don't need to support 391 // TODO(perkj): The below is not necessary once we don't need to support
443 // MediaStream::Stop(). 392 // MediaStream::Stop().
444 UserMediaRequests::iterator it = user_media_requests_.begin(); 393 UserMediaRequests::iterator it = user_media_requests_.begin();
445 while (it != user_media_requests_.end()) { 394 while (it != user_media_requests_.end()) {
446 RemoveSource(source, &(*it)->sources); 395 (*it)->RemoveSource(source);
447 if ((*it)->sources.empty()) { 396 if ((*it)->IsAllSourcesRemoved()) {
448 it = user_media_requests_.erase(it); 397 it = user_media_requests_.erase(it);
449 } else { 398 } else {
450 ++it; 399 ++it;
451 } 400 }
452 } 401 }
453 } 402 }
454 403
455 void MediaStreamImpl::CreateWebKitSourceVector( 404 void MediaStreamImpl::InitializeSourceObject(
456 const std::string& label, 405 const StreamDeviceInfo& device,
406 blink::WebMediaStreamSource::Type type,
407 const blink::WebMediaConstraints& constraints,
408 blink::WebFrame* frame,
409 blink::WebMediaStreamSource* webkit_source) {
410 const blink::WebMediaStreamSource* existing_source =
411 FindLocalSource(device);
412 if (existing_source) {
413 *webkit_source = *existing_source;
414 DVLOG(1) << "Source already exist. Reusing source with id "
415 << webkit_source->id().utf8();
416 return;
417 }
418
419 webkit_source->initialize(
420 base::UTF8ToUTF16(device.device.id),
421 type,
422 base::UTF8ToUTF16(device.device.name));
423
424 DVLOG(1) << "Initialize source object :"
425 << "id = " << webkit_source->id().utf8()
426 << ", name = " << webkit_source->name().utf8();
427
428 if (type == blink::WebMediaStreamSource::TypeVideo) {
429 CapturerMediaStreamVideoSource* video_source(
430 new content::CapturerMediaStreamVideoSource(
431 device,
432 base::Bind(&MediaStreamImpl::OnLocalSourceStopped, AsWeakPtr()),
433 dependency_factory_));
434 webkit_source->setExtraData(video_source);
435 } else {
436 DCHECK_EQ(blink::WebMediaStreamSource::TypeAudio, type);
437 MediaStreamAudioSource* audio_source(
438 new MediaStreamAudioSource(
439 device,
440 base::Bind(&MediaStreamImpl::OnLocalSourceStopped, AsWeakPtr())));
441 webkit_source->setExtraData(audio_source);
442 }
443 local_sources_.push_back(LocalStreamSource(frame, *webkit_source));
444 return;
445 }
446
447 void MediaStreamImpl::CreateVideoTracks(
457 const StreamDeviceInfoArray& devices, 448 const StreamDeviceInfoArray& devices,
458 blink::WebMediaStreamSource::Type type, 449 const blink::WebMediaConstraints& constraints,
459 blink::WebFrame* frame, 450 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks,
460 blink::WebVector<blink::WebMediaStreamSource>& webkit_sources) { 451 UserMediaRequestInfo* request) {
461 CHECK_EQ(devices.size(), webkit_sources.size()); 452 DCHECK_EQ(devices.size(), webkit_tracks->size());
453
462 for (size_t i = 0; i < devices.size(); ++i) { 454 for (size_t i = 0; i < devices.size(); ++i) {
463 const blink::WebMediaStreamSource* existing_source = 455 blink::WebMediaStreamSource webkit_source;
464 FindLocalSource(devices[i]); 456 InitializeSourceObject(devices[i],
465 if (existing_source) { 457 blink::WebMediaStreamSource::TypeVideo,
466 webkit_sources[i] = *existing_source; 458 constraints,
467 DVLOG(1) << "Source already exist. Reusing source with id " 459 request->frame,
468 << webkit_sources[i]. id().utf8(); 460 &webkit_source);
469 continue; 461 (*webkit_tracks)[i].initialize(webkit_source);
470 } 462 request->StartTrack((*webkit_tracks)[i], constraints);
471 webkit_sources[i].initialize(
472 base::UTF8ToUTF16(devices[i].device.id),
473 type,
474 base::UTF8ToUTF16(devices[i].device.name));
475 MediaStreamSourceExtraData* source_extra_data(
476 new content::MediaStreamSourceExtraData(
477 devices[i],
478 base::Bind(&MediaStreamImpl::OnLocalSourceStop, AsWeakPtr())));
479 // |source_extra_data| is owned by webkit_sources[i].
480 webkit_sources[i].setExtraData(source_extra_data);
481 local_sources_.push_back(LocalStreamSource(frame, webkit_sources[i]));
482 } 463 }
483 } 464 }
484 465
485 // Callback from MediaStreamDependencyFactory when the sources in |web_stream| 466 void MediaStreamImpl::CreateAudioTracks(
486 // have been generated. 467 const StreamDeviceInfoArray& devices,
487 void MediaStreamImpl::OnCreateNativeSourcesComplete( 468 const blink::WebMediaConstraints& constraints,
488 blink::WebMediaStream* web_stream, 469 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks,
489 bool request_succeeded) { 470 UserMediaRequestInfo* request) {
490 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(web_stream); 471 DCHECK_EQ(devices.size(), webkit_tracks->size());
491 if (!request_info) { 472
492 // This can happen if the request is canceled or the frame reloads while 473 // Log the device names for this request.
493 // MediaStreamDependencyFactory is creating the sources. 474 for (StreamDeviceInfoArray::const_iterator it = devices.begin();
494 DVLOG(1) << "Request ID not found"; 475 it != devices.end(); ++it) {
495 return; 476 WebRtcLogMessage(base::StringPrintf(
477 "Generated media stream for request id %d contains audio device name"
478 " \"%s\"",
479 request->request_id,
480 it->device.name.c_str()));
496 } 481 }
497 482
483 StreamDeviceInfoArray overridden_audio_array = devices;
484 if (!request->enable_automatic_output_device_selection) {
485 // If the GetUserMedia request did not explicitly set the constraint
486 // kMediaStreamRenderToAssociatedSink, the output device parameters must
487 // be removed.
488 for (StreamDeviceInfoArray::iterator it = overridden_audio_array.begin();
489 it != overridden_audio_array.end(); ++it) {
490 it->device.matched_output_device_id = "";
491 it->device.matched_output = MediaStreamDevice::AudioDeviceParameters();
492 }
493 }
494
495 // Create the audio source objects.
496 blink::WebVector<blink::WebMediaStreamSource> audio_source_vector(
497 overridden_audio_array.size());
498 for (size_t i = 0; i < overridden_audio_array.size(); ++i) {
499 InitializeSourceObject(overridden_audio_array[i],
500 blink::WebMediaStreamSource::TypeAudio,
501 constraints,
502 request->frame,
503 &audio_source_vector[i]);
504 }
505
506 dependency_factory_->InitializeMediaStreamAudioSource(
507 RenderViewObserver::routing_id(),
508 constraints, audio_source_vector);
509
510 // Create the audio tracks.
511 for (size_t i = 0; i < webkit_tracks->size(); ++i) {
512 (*webkit_tracks)[i].initialize(audio_source_vector[i]);
513 request->StartTrack((*webkit_tracks)[i], constraints);
no longer working on chromium 2014/01/17 14:51:51 The code here is a bit hard to read, is it possibl
perkj_chrome 2014/01/19 15:52:39 Done.
514 }
515 }
516
517 void MediaStreamImpl::OnCreateNativeTracksComplete(
518 UserMediaRequestInfo* request,
519 bool request_succeeded) {
498 // Create a native representation of the stream. 520 // Create a native representation of the stream.
499 if (request_succeeded) { 521 if (request_succeeded) {
500 dependency_factory_->CreateNativeLocalMediaStream( 522 dependency_factory_->CreateNativeLocalMediaStream(
501 web_stream, 523 &request->web_stream,
502 base::Bind(&MediaStreamImpl::OnLocalMediaStreamStop, AsWeakPtr())); 524 base::Bind(&MediaStreamImpl::OnLocalMediaStreamStop, AsWeakPtr()));
503 } 525 }
504 DVLOG(1) << "MediaStreamImpl::OnCreateNativeSourcesComplete(" 526 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete("
505 << "{request_id = " << request_info->request_id << "} " 527 << "{request_id = " << request->request_id << "} "
506 << "{request_succeeded = " << request_succeeded << "})"; 528 << "{request_succeeded = " << request_succeeded << "})";
507 CompleteGetUserMediaRequest(request_info->web_stream, &request_info->request, 529 CompleteGetUserMediaRequest(request->web_stream, &request->request,
508 request_succeeded); 530 request_succeeded);
509 if (!request_succeeded) { 531 if (!request_succeeded) {
510 // TODO(perkj): Once we don't support MediaStream::Stop the |request_info| 532 // TODO(perkj): Once we don't support MediaStream::Stop the |request_info|
511 // can be deleted even if the request succeeds. 533 // can be deleted even if the request succeeds.
512 DeleteUserMediaRequestInfo(request_info); 534 DeleteUserMediaRequestInfo(request);
513 StopUnreferencedSources(true); 535 StopUnreferencedSources(true);
514 } 536 }
515 } 537 }
516 538
517 void MediaStreamImpl::OnDevicesEnumerated( 539 void MediaStreamImpl::OnDevicesEnumerated(
518 int request_id, 540 int request_id,
519 const StreamDeviceInfoArray& device_array) { 541 const StreamDeviceInfoArray& device_array) {
520 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" 542 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated("
521 << request_id << ")"; 543 << request_id << ")";
522 NOTIMPLEMENTED(); 544 NOTIMPLEMENTED();
(...skipping 22 matching lines...) Expand all
545 request_info->requestSucceeded(stream); 567 request_info->requestSucceeded(stream);
546 } else { 568 } else {
547 request_info->requestFailed(); 569 request_info->requestFailed();
548 } 570 }
549 } 571 }
550 572
551 const blink::WebMediaStreamSource* MediaStreamImpl::FindLocalSource( 573 const blink::WebMediaStreamSource* MediaStreamImpl::FindLocalSource(
552 const StreamDeviceInfo& device) const { 574 const StreamDeviceInfo& device) const {
553 for (LocalStreamSources::const_iterator it = local_sources_.begin(); 575 for (LocalStreamSources::const_iterator it = local_sources_.begin();
554 it != local_sources_.end(); ++it) { 576 it != local_sources_.end(); ++it) {
555 MediaStreamSourceExtraData* extra_data = 577 MediaStreamSource* extra_data =
556 static_cast<MediaStreamSourceExtraData*>( 578 static_cast<MediaStreamSource*>(
no longer working on chromium 2014/01/17 14:51:51 nit, you can move the static_cast one line above.
perkj_chrome 2014/01/19 15:52:39 Done.
557 it->source.extraData()); 579 it->source.extraData());
558 const StreamDeviceInfo& active_device = extra_data->device_info(); 580 const StreamDeviceInfo& active_device = extra_data->device_info();
559 if (active_device.device.id == device.device.id && 581 if (active_device.device.id == device.device.id &&
560 active_device.device.type == device.device.type && 582 active_device.device.type == device.device.type &&
561 active_device.session_id == device.session_id) { 583 active_device.session_id == device.session_id) {
562 return &it->source; 584 return &it->source;
563 } 585 }
564 } 586 }
565 return NULL; 587 return NULL;
566 } 588 }
567 589
568 bool MediaStreamImpl::FindSourceInRequests( 590 bool MediaStreamImpl::FindSourceInRequests(
569 const blink::WebMediaStreamSource& source) const { 591 const blink::WebMediaStreamSource& source) const {
570 for (UserMediaRequests::const_iterator req_it = user_media_requests_.begin(); 592 for (UserMediaRequests::const_iterator req_it = user_media_requests_.begin();
571 req_it != user_media_requests_.end(); ++req_it) { 593 req_it != user_media_requests_.end(); ++req_it) {
572 const std::vector<blink::WebMediaStreamSource>& sources = 594 if ((*req_it)->IsSourceUsed(source))
573 (*req_it)->sources; 595 return true;
574 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it =
575 sources.begin();
576 source_it != sources.end(); ++source_it) {
577 if (source_it->id() == source.id()) {
578 return true;
579 }
580 }
581 } 596 }
582 return false; 597 return false;
583 } 598 }
584 599
585 MediaStreamImpl::UserMediaRequestInfo* 600 MediaStreamImpl::UserMediaRequestInfo*
586 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) { 601 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) {
587 UserMediaRequests::iterator it = user_media_requests_.begin(); 602 UserMediaRequests::iterator it = user_media_requests_.begin();
588 for (; it != user_media_requests_.end(); ++it) { 603 for (; it != user_media_requests_.end(); ++it) {
589 if ((*it)->request_id == request_id) 604 if ((*it)->request_id == request_id)
590 return (*it); 605 return (*it);
(...skipping 15 matching lines...) Expand all
606 MediaStreamImpl::UserMediaRequestInfo* 621 MediaStreamImpl::UserMediaRequestInfo*
607 MediaStreamImpl::FindUserMediaRequestInfo(const std::string& label) { 622 MediaStreamImpl::FindUserMediaRequestInfo(const std::string& label) {
608 UserMediaRequests::iterator it = user_media_requests_.begin(); 623 UserMediaRequests::iterator it = user_media_requests_.begin();
609 for (; it != user_media_requests_.end(); ++it) { 624 for (; it != user_media_requests_.end(); ++it) {
610 if ((*it)->generated && (*it)->web_stream.id() == base::UTF8ToUTF16(label)) 625 if ((*it)->generated && (*it)->web_stream.id() == base::UTF8ToUTF16(label))
611 return (*it); 626 return (*it);
612 } 627 }
613 return NULL; 628 return NULL;
614 } 629 }
615 630
616 MediaStreamImpl::UserMediaRequestInfo*
617 MediaStreamImpl::FindUserMediaRequestInfo(
618 blink::WebMediaStream* web_stream) {
619 UserMediaRequests::iterator it = user_media_requests_.begin();
620 for (; it != user_media_requests_.end(); ++it) {
621 if (&((*it)->web_stream) == web_stream)
622 return (*it);
623 }
624 return NULL;
625 }
626
627 void MediaStreamImpl::DeleteUserMediaRequestInfo( 631 void MediaStreamImpl::DeleteUserMediaRequestInfo(
628 UserMediaRequestInfo* request) { 632 UserMediaRequestInfo* request) {
629 UserMediaRequests::iterator it = user_media_requests_.begin(); 633 UserMediaRequests::iterator it = user_media_requests_.begin();
630 for (; it != user_media_requests_.end(); ++it) { 634 for (; it != user_media_requests_.end(); ++it) {
631 if ((*it) == request) { 635 if ((*it) == request) {
632 user_media_requests_.erase(it); 636 user_media_requests_.erase(it);
633 return; 637 return;
634 } 638 }
635 } 639 }
636 NOTREACHED(); 640 NOTREACHED();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
680 const std::string& label) { 684 const std::string& label) {
681 DVLOG(1) << "MediaStreamImpl::OnLocalMediaStreamStop(" << label << ")"; 685 DVLOG(1) << "MediaStreamImpl::OnLocalMediaStreamStop(" << label << ")";
682 686
683 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label); 687 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label);
684 if (user_media_request) { 688 if (user_media_request) {
685 DeleteUserMediaRequestInfo(user_media_request); 689 DeleteUserMediaRequestInfo(user_media_request);
686 } 690 }
687 StopUnreferencedSources(true); 691 StopUnreferencedSources(true);
688 } 692 }
689 693
690 void MediaStreamImpl::OnLocalSourceStop( 694 void MediaStreamImpl::OnLocalSourceStopped(
691 const blink::WebMediaStreamSource& source) { 695 const blink::WebMediaStreamSource& source) {
692 DCHECK(CalledOnValidThread()); 696 DCHECK(CalledOnValidThread());
693 697
694 StopLocalSource(source, true);
695
696 bool device_found = false; 698 bool device_found = false;
697 for (LocalStreamSources::iterator device_it = local_sources_.begin(); 699 for (LocalStreamSources::iterator device_it = local_sources_.begin();
698 device_it != local_sources_.end(); ++device_it) { 700 device_it != local_sources_.end(); ++device_it) {
699 if (device_it->source.id() == source.id()) { 701 if (device_it->source.id() == source.id()) {
700 device_found = true; 702 device_found = true;
701 local_sources_.erase(device_it); 703 local_sources_.erase(device_it);
702 break; 704 break;
703 } 705 }
704 } 706 }
705 CHECK(device_found); 707 CHECK(device_found);
706 708
707 // Remove the reference to this source from all |user_media_requests_|. 709 // Remove the reference to this source from all |user_media_requests_|.
708 // TODO(perkj): The below is not necessary once we don't need to support 710 // TODO(perkj): The below is not necessary once we don't need to support
709 // MediaStream::Stop(). 711 // MediaStream::Stop().
710 UserMediaRequests::iterator it = user_media_requests_.begin(); 712 UserMediaRequests::iterator it = user_media_requests_.begin();
711 while (it != user_media_requests_.end()) { 713 while (it != user_media_requests_.end()) {
712 RemoveSource(source, &(*it)->sources); 714 (*it)->RemoveSource(source);
713 if ((*it)->sources.empty()) { 715 if ((*it)->IsAllSourcesRemoved()) {
714 it = user_media_requests_.erase(it); 716 it = user_media_requests_.erase(it);
715 } else { 717 } else {
716 ++it; 718 ++it;
717 } 719 }
718 } 720 }
721
722 MediaStreamSource* source_impl =
723 static_cast<MediaStreamSource*> (source.extraData());
no longer working on chromium 2014/01/17 14:51:51 fix the indentation.
perkj_chrome 2014/01/19 15:52:39 Done.
724 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info());
719 } 725 }
720 726
721 void MediaStreamImpl::StopLocalSource( 727 void MediaStreamImpl::StopLocalSource(
722 const blink::WebMediaStreamSource& source, 728 const blink::WebMediaStreamSource& source,
723 bool notify_dispatcher) { 729 bool notify_dispatcher) {
724 MediaStreamSourceExtraData* extra_data = 730 MediaStreamSource* source_impl =
725 static_cast<MediaStreamSourceExtraData*> (source.extraData()); 731 static_cast<MediaStreamSource*> (source.extraData());
no longer working on chromium 2014/01/17 14:51:51 nit, indentation.
perkj_chrome 2014/01/19 15:52:39 Done.
726 CHECK(extra_data); 732 CHECK(source_impl);
no longer working on chromium 2014/01/17 14:51:51 nit, you don't need the check here, since you defe
perkj_chrome 2014/01/19 15:52:39 Done.
727 DVLOG(1) << "MediaStreamImpl::StopLocalSource(" 733 DVLOG(1) << "MediaStreamImpl::StopLocalSource("
728 << "{device_id = " << extra_data->device_info().device.id << "})"; 734 << "{device_id = " << source_impl->device_info().device.id << "})";
729
730 if (source.type() == blink::WebMediaStreamSource::TypeAudio) {
731 if (extra_data->GetAudioCapturer()) {
732 extra_data->GetAudioCapturer()->Stop();
733 }
734 }
735 735
736 if (notify_dispatcher) 736 if (notify_dispatcher)
737 media_stream_dispatcher_->StopStreamDevice(extra_data->device_info()); 737 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info());
738 738
739 blink::WebMediaStreamSource writable_source(source); 739 source_impl->ResetSourceStoppedCallback();
740 writable_source.setReadyState( 740 source_impl->StopSource();
741 blink::WebMediaStreamSource::ReadyStateEnded);
742 writable_source.setExtraData(NULL);
743 } 741 }
744 742
745 void MediaStreamImpl::StopUnreferencedSources(bool notify_dispatcher) { 743 void MediaStreamImpl::StopUnreferencedSources(bool notify_dispatcher) {
746 LocalStreamSources::iterator source_it = local_sources_.begin(); 744 LocalStreamSources::iterator source_it = local_sources_.begin();
747 while (source_it != local_sources_.end()) { 745 while (source_it != local_sources_.end()) {
748 if (!FindSourceInRequests(source_it->source)) { 746 if (!FindSourceInRequests(source_it->source)) {
749 StopLocalSource(source_it->source, notify_dispatcher); 747 StopLocalSource(source_it->source, notify_dispatcher);
750 source_it = local_sources_.erase(source_it); 748 source_it = local_sources_.erase(source_it);
751 } else { 749 } else {
752 ++source_it; 750 ++source_it;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 807
810 if (!audio_device->GetDefaultCapturer()) 808 if (!audio_device->GetDefaultCapturer())
811 return false; 809 return false;
812 810
813 return audio_device->GetDefaultCapturer()->GetPairedOutputParameters( 811 return audio_device->GetDefaultCapturer()->GetPairedOutputParameters(
814 session_id, 812 session_id,
815 output_sample_rate, 813 output_sample_rate,
816 output_frames_per_buffer); 814 output_frames_per_buffer);
817 } 815 }
818 816
819 MediaStreamSourceExtraData::MediaStreamSourceExtraData(
820 const StreamDeviceInfo& device_info,
821 const SourceStopCallback& stop_callback)
822 : device_info_(device_info),
823 stop_callback_(stop_callback) {
824 }
825
826 MediaStreamSourceExtraData::MediaStreamSourceExtraData() {
827 }
828
829 MediaStreamSourceExtraData::~MediaStreamSourceExtraData() {}
830
831 void MediaStreamSourceExtraData::OnLocalSourceStop() {
832 if (!stop_callback_.is_null())
833 stop_callback_.Run(owner());
834 }
835
836 MediaStreamExtraData::MediaStreamExtraData( 817 MediaStreamExtraData::MediaStreamExtraData(
837 webrtc::MediaStreamInterface* stream, bool is_local) 818 webrtc::MediaStreamInterface* stream, bool is_local)
838 : stream_(stream), 819 : stream_(stream),
839 is_local_(is_local) { 820 is_local_(is_local) {
840 } 821 }
841 822
842 MediaStreamExtraData::~MediaStreamExtraData() { 823 MediaStreamExtraData::~MediaStreamExtraData() {
843 } 824 }
844 825
845 void MediaStreamExtraData::SetLocalStreamStopCallback( 826 void MediaStreamExtraData::SetLocalStreamStopCallback(
846 const StreamStopCallback& stop_callback) { 827 const StreamStopCallback& stop_callback) {
847 stream_stop_callback_ = stop_callback; 828 stream_stop_callback_ = stop_callback;
848 } 829 }
849 830
850 void MediaStreamExtraData::OnLocalStreamStop() { 831 void MediaStreamExtraData::OnLocalStreamStop() {
851 if (!stream_stop_callback_.is_null()) 832 if (!stream_stop_callback_.is_null())
852 stream_stop_callback_.Run(stream_->label()); 833 stream_stop_callback_.Run(stream_->label());
853 } 834 }
854 835
855 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( 836 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo(
856 int request_id, 837 int request_id,
857 blink::WebFrame* frame, 838 blink::WebFrame* frame,
858 const blink::WebUserMediaRequest& request, 839 const blink::WebUserMediaRequest& request,
859 bool enable_automatic_output_device_selection) 840 bool enable_automatic_output_device_selection)
860 : request_id(request_id), 841 : request_id(request_id),
861 generated(false), 842 generated(false),
862 enable_automatic_output_device_selection( 843 enable_automatic_output_device_selection(
863 enable_automatic_output_device_selection), 844 enable_automatic_output_device_selection),
864 frame(frame), 845 frame(frame),
865 request(request) { 846 request(request),
847 request_failed_(false) {
866 } 848 }
867 849
868 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { 850 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() {
851 DVLOG(1) << "~UserMediaRequestInfo";
852 }
853
854 void MediaStreamImpl::UserMediaRequestInfo::StartTrack(
855 const blink::WebMediaStreamTrack& track,
856 const blink::WebMediaConstraints& constraints) {
no longer working on chromium 2014/01/17 14:51:51 can we add thread check for this class?
perkj_chrome 2014/01/19 15:52:39 I don't think that is needed since this is an inte
857 MediaStreamSource* native_source =
858 static_cast <MediaStreamSource*>(track.source().extraData());
859 DCHECK(native_source);
860
861 sources_.push_back(track.source());
862 sources_waiting_for_callback_.push_back(native_source);
863 native_source->AddTrack(
864 track, constraints, base::Bind(
865 &MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted,
866 AsWeakPtr()));
867 }
868
869 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted(
870 const ResourcesReady& callback) {
871 DCHECK(ready_callback_.is_null());
872 ready_callback_ = callback;
873 CheckAllTracksStarted();
874 }
875
876 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted(
877 MediaStreamSource* source, bool success) {
878 DVLOG(1) << "OnTrackStarted";
879 std::vector<MediaStreamSource*>::iterator it =
880 std::find(sources_waiting_for_callback_.begin(),
881 sources_waiting_for_callback_.end(),
882 source);
883 DCHECK(it != sources_waiting_for_callback_.end());
884 sources_waiting_for_callback_.erase(it);
885 // All tracks must be started successfully. Otherwise the request is a
886 // failure.
887 if (!success)
888 request_failed_ = true;
no longer working on chromium 2014/01/17 14:51:51 You can remove this member if you pass the success
perkj_chrome 2014/01/19 15:52:39 ? There can be multiple tracks that we try to star
no longer working on chromium 2014/01/20 13:36:20 Are you saying that you will only trigger the call
perkj_chrome 2014/01/20 16:12:06 Do you feel strongly about this? If I do as you su
no longer working on chromium 2014/01/21 09:25:30 No, I just tried to explain what I thought. Please
889 CheckAllTracksStarted();
890 }
891
892 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() {
893 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty())
894 ready_callback_.Run(this, !request_failed_);
895 }
896
897 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed(
898 const blink::WebMediaStreamSource& source) const {
899 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it =
900 sources_.begin();
901 source_it != sources_.end(); ++source_it) {
902 if (source_it->id() == source.id()) {
no longer working on chromium 2014/01/17 14:51:51 nit, remove {}
perkj_chrome 2014/01/19 15:52:39 Done.
903 return true;
904 }
905 }
906 return false;
907 }
908
909 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource(
910 const blink::WebMediaStreamSource& source) {
911 for (std::vector<blink::WebMediaStreamSource>::iterator it =
912 sources_.begin();
913 it != sources_.end(); ++it) {
914 if (source.id() == it->id()) {
915 sources_.erase(it);
916 return;
917 }
918 }
869 } 919 }
870 920
871 } // namespace content 921 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698