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

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: Added MediaStreamAudioSource. 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/media_stream_audio_renderer.h" 13 #include "content/renderer/media/media_stream_audio_renderer.h"
14 #include "content/renderer/media/media_stream_audio_source.h"
14 #include "content/renderer/media/media_stream_dependency_factory.h" 15 #include "content/renderer/media/media_stream_dependency_factory.h"
15 #include "content/renderer/media/media_stream_dispatcher.h" 16 #include "content/renderer/media/media_stream_dispatcher.h"
16 #include "content/renderer/media/media_stream_extra_data.h" 17 #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/media_stream_video_capture_device_source.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 if (type == blink::WebMediaStreamSource::TypeVideo) {
425 MediaStreamVideoCaptureDeviceSource* video_source(
426 new content::MediaStreamVideoCaptureDeviceSource(
427 device,
428 base::Bind(&MediaStreamImpl::OnLocalSourceStop, AsWeakPtr()),
429 dependency_factory_));
430 webkit_source->setExtraData(video_source);
431 } else {
432 DCHECK_EQ(blink::WebMediaStreamSource::TypeAudio, type);
433 MediaStreamSource* audio_source(
434 new MediaStreamAudioSource(
435 device,
436 base::Bind(&MediaStreamImpl::OnLocalSourceStop, AsWeakPtr())));
437 webkit_source->setExtraData(audio_source);
438 }
439 local_sources_.push_back(LocalStreamSource(frame, *webkit_source));
440 return;
441 }
442
443 void MediaStreamImpl::CreateVideoTracks(
457 const StreamDeviceInfoArray& devices, 444 const StreamDeviceInfoArray& devices,
458 blink::WebMediaStreamSource::Type type, 445 const blink::WebMediaConstraints& constraints,
459 blink::WebFrame* frame, 446 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks,
460 blink::WebVector<blink::WebMediaStreamSource>& webkit_sources) { 447 UserMediaRequestInfo* request) {
461 CHECK_EQ(devices.size(), webkit_sources.size()); 448 DCHECK_EQ(devices.size(), webkit_tracks->size());
449
462 for (size_t i = 0; i < devices.size(); ++i) { 450 for (size_t i = 0; i < devices.size(); ++i) {
463 const blink::WebMediaStreamSource* existing_source = 451 blink::WebMediaStreamSource webkit_source;
464 FindLocalSource(devices[i]); 452 InitializeSourceObject(devices[i],
465 if (existing_source) { 453 blink::WebMediaStreamSource::TypeVideo,
466 webkit_sources[i] = *existing_source; 454 constraints,
467 DVLOG(1) << "Source already exist. Reusing source with id " 455 request->frame,
468 << webkit_sources[i]. id().utf8(); 456 &webkit_source);
469 continue; 457 (*webkit_tracks)[i].initialize(webkit_source);
470 } 458 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 } 459 }
483 } 460 }
484 461
485 // Callback from MediaStreamDependencyFactory when the sources in |web_stream| 462 void MediaStreamImpl::CreateAudioTracks(
486 // have been generated. 463 const StreamDeviceInfoArray& devices,
487 void MediaStreamImpl::OnCreateNativeSourcesComplete( 464 const blink::WebMediaConstraints& constraints,
488 blink::WebMediaStream* web_stream, 465 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks,
489 bool request_succeeded) { 466 UserMediaRequestInfo* request) {
490 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(web_stream); 467 DCHECK_EQ(devices.size(), webkit_tracks->size());
491 if (!request_info) { 468
492 // This can happen if the request is canceled or the frame reloads while 469 // Log the device names for this request.
493 // MediaStreamDependencyFactory is creating the sources. 470 for (StreamDeviceInfoArray::const_iterator it = devices.begin();
494 DVLOG(1) << "Request ID not found"; 471 it != devices.end(); ++it) {
495 return; 472 WebRtcLogMessage(base::StringPrintf(
473 "Generated media stream for request id %d contains audio device name"
474 " \"%s\"",
475 request->request_id,
476 it->device.name.c_str()));
496 } 477 }
497 478
479 StreamDeviceInfoArray overridden_audio_array = devices;
480 if (!request->enable_automatic_output_device_selection) {
481 // If the GetUserMedia request did not explicitly set the constraint
482 // kMediaStreamRenderToAssociatedSink, the output device parameters must
483 // be removed.
484 for (StreamDeviceInfoArray::iterator it = overridden_audio_array.begin();
485 it != overridden_audio_array.end(); ++it) {
486 it->device.matched_output_device_id = "";
487 it->device.matched_output = MediaStreamDevice::AudioDeviceParameters();
488 }
489 }
490
491 // Create the audio source objects.
492 blink::WebVector<blink::WebMediaStreamSource> audio_source_vector(
493 overridden_audio_array.size());
494 for (size_t i = 0; i < overridden_audio_array.size(); ++i) {
495 InitializeSourceObject(overridden_audio_array[i],
496 blink::WebMediaStreamSource::TypeAudio,
497 constraints,
498 request->frame,
499 &audio_source_vector[i]);
500 }
501
502 dependency_factory_->CreateNativeMediaStreamAudioSources(
503 RenderViewObserver::routing_id(),
504 constraints, audio_source_vector);
505
506 // Create the audio tracks.
507 for (size_t i = 0; i < webkit_tracks->size(); ++i) {
508 (*webkit_tracks)[i].initialize(audio_source_vector[i]);
509 request->StartTrack((*webkit_tracks)[i], constraints);
510 }
511 }
512
513 void MediaStreamImpl::OnCreateNativeTracksComplete(
514 UserMediaRequestInfo* request,
515 bool request_succeeded) {
498 // Create a native representation of the stream. 516 // Create a native representation of the stream.
499 if (request_succeeded) { 517 if (request_succeeded) {
500 dependency_factory_->CreateNativeLocalMediaStream( 518 dependency_factory_->CreateNativeLocalMediaStream(
501 web_stream, 519 &request->web_stream,
502 base::Bind(&MediaStreamImpl::OnLocalMediaStreamStop, AsWeakPtr())); 520 base::Bind(&MediaStreamImpl::OnLocalMediaStreamStop, AsWeakPtr()));
503 } 521 }
504 DVLOG(1) << "MediaStreamImpl::OnCreateNativeSourcesComplete(" 522 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete("
505 << "{request_id = " << request_info->request_id << "} " 523 << "{request_id = " << request->request_id << "} "
506 << "{request_succeeded = " << request_succeeded << "})"; 524 << "{request_succeeded = " << request_succeeded << "})";
507 CompleteGetUserMediaRequest(request_info->web_stream, &request_info->request, 525 CompleteGetUserMediaRequest(request->web_stream, &request->request,
508 request_succeeded); 526 request_succeeded);
509 if (!request_succeeded) { 527 if (!request_succeeded) {
510 // TODO(perkj): Once we don't support MediaStream::Stop the |request_info| 528 // TODO(perkj): Once we don't support MediaStream::Stop the |request_info|
511 // can be deleted even if the request succeeds. 529 // can be deleted even if the request succeeds.
512 DeleteUserMediaRequestInfo(request_info); 530 DeleteUserMediaRequestInfo(request);
513 StopUnreferencedSources(true); 531 StopUnreferencedSources(true);
514 } 532 }
515 } 533 }
516 534
517 void MediaStreamImpl::OnDevicesEnumerated( 535 void MediaStreamImpl::OnDevicesEnumerated(
518 int request_id, 536 int request_id,
519 const StreamDeviceInfoArray& device_array) { 537 const StreamDeviceInfoArray& device_array) {
520 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" 538 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated("
521 << request_id << ")"; 539 << request_id << ")";
522 NOTIMPLEMENTED(); 540 NOTIMPLEMENTED();
(...skipping 22 matching lines...) Expand all
545 request_info->requestSucceeded(stream); 563 request_info->requestSucceeded(stream);
546 } else { 564 } else {
547 request_info->requestFailed(); 565 request_info->requestFailed();
548 } 566 }
549 } 567 }
550 568
551 const blink::WebMediaStreamSource* MediaStreamImpl::FindLocalSource( 569 const blink::WebMediaStreamSource* MediaStreamImpl::FindLocalSource(
552 const StreamDeviceInfo& device) const { 570 const StreamDeviceInfo& device) const {
553 for (LocalStreamSources::const_iterator it = local_sources_.begin(); 571 for (LocalStreamSources::const_iterator it = local_sources_.begin();
554 it != local_sources_.end(); ++it) { 572 it != local_sources_.end(); ++it) {
555 MediaStreamSourceExtraData* extra_data = 573 MediaStreamSource* extra_data =
556 static_cast<MediaStreamSourceExtraData*>( 574 static_cast<MediaStreamSource*>(
557 it->source.extraData()); 575 it->source.extraData());
558 const StreamDeviceInfo& active_device = extra_data->device_info(); 576 const StreamDeviceInfo& active_device = extra_data->device_info();
559 if (active_device.device.id == device.device.id && 577 if (active_device.device.id == device.device.id &&
560 active_device.device.type == device.device.type && 578 active_device.device.type == device.device.type &&
561 active_device.session_id == device.session_id) { 579 active_device.session_id == device.session_id) {
562 return &it->source; 580 return &it->source;
563 } 581 }
564 } 582 }
565 return NULL; 583 return NULL;
566 } 584 }
567 585
568 bool MediaStreamImpl::FindSourceInRequests( 586 bool MediaStreamImpl::FindSourceInRequests(
569 const blink::WebMediaStreamSource& source) const { 587 const blink::WebMediaStreamSource& source) const {
570 for (UserMediaRequests::const_iterator req_it = user_media_requests_.begin(); 588 for (UserMediaRequests::const_iterator req_it = user_media_requests_.begin();
571 req_it != user_media_requests_.end(); ++req_it) { 589 req_it != user_media_requests_.end(); ++req_it) {
572 const std::vector<blink::WebMediaStreamSource>& sources = 590 if ((*req_it)->IsSourceUsed(source))
573 (*req_it)->sources; 591 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 } 592 }
582 return false; 593 return false;
583 } 594 }
584 595
585 MediaStreamImpl::UserMediaRequestInfo* 596 MediaStreamImpl::UserMediaRequestInfo*
586 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) { 597 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) {
587 UserMediaRequests::iterator it = user_media_requests_.begin(); 598 UserMediaRequests::iterator it = user_media_requests_.begin();
588 for (; it != user_media_requests_.end(); ++it) { 599 for (; it != user_media_requests_.end(); ++it) {
589 if ((*it)->request_id == request_id) 600 if ((*it)->request_id == request_id)
590 return (*it); 601 return (*it);
(...skipping 15 matching lines...) Expand all
606 MediaStreamImpl::UserMediaRequestInfo* 617 MediaStreamImpl::UserMediaRequestInfo*
607 MediaStreamImpl::FindUserMediaRequestInfo(const std::string& label) { 618 MediaStreamImpl::FindUserMediaRequestInfo(const std::string& label) {
608 UserMediaRequests::iterator it = user_media_requests_.begin(); 619 UserMediaRequests::iterator it = user_media_requests_.begin();
609 for (; it != user_media_requests_.end(); ++it) { 620 for (; it != user_media_requests_.end(); ++it) {
610 if ((*it)->generated && (*it)->web_stream.id() == base::UTF8ToUTF16(label)) 621 if ((*it)->generated && (*it)->web_stream.id() == base::UTF8ToUTF16(label))
611 return (*it); 622 return (*it);
612 } 623 }
613 return NULL; 624 return NULL;
614 } 625 }
615 626
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( 627 void MediaStreamImpl::DeleteUserMediaRequestInfo(
628 UserMediaRequestInfo* request) { 628 UserMediaRequestInfo* request) {
629 UserMediaRequests::iterator it = user_media_requests_.begin(); 629 UserMediaRequests::iterator it = user_media_requests_.begin();
630 for (; it != user_media_requests_.end(); ++it) { 630 for (; it != user_media_requests_.end(); ++it) {
631 if ((*it) == request) { 631 if ((*it) == request) {
632 user_media_requests_.erase(it); 632 user_media_requests_.erase(it);
633 return; 633 return;
634 } 634 }
635 } 635 }
636 NOTREACHED(); 636 NOTREACHED();
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 break; 702 break;
703 } 703 }
704 } 704 }
705 CHECK(device_found); 705 CHECK(device_found);
706 706
707 // Remove the reference to this source from all |user_media_requests_|. 707 // 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 708 // TODO(perkj): The below is not necessary once we don't need to support
709 // MediaStream::Stop(). 709 // MediaStream::Stop().
710 UserMediaRequests::iterator it = user_media_requests_.begin(); 710 UserMediaRequests::iterator it = user_media_requests_.begin();
711 while (it != user_media_requests_.end()) { 711 while (it != user_media_requests_.end()) {
712 RemoveSource(source, &(*it)->sources); 712 (*it)->RemoveSource(source);
713 if ((*it)->sources.empty()) { 713 if ((*it)->IsAllSourcesRemoved()) {
714 it = user_media_requests_.erase(it); 714 it = user_media_requests_.erase(it);
715 } else { 715 } else {
716 ++it; 716 ++it;
717 } 717 }
718 } 718 }
719 } 719 }
720 720
721 void MediaStreamImpl::StopLocalSource( 721 void MediaStreamImpl::StopLocalSource(
722 const blink::WebMediaStreamSource& source, 722 const blink::WebMediaStreamSource& source,
723 bool notify_dispatcher) { 723 bool notify_dispatcher) {
724 MediaStreamSourceExtraData* extra_data = 724 MediaStreamSource* extra_data =
725 static_cast<MediaStreamSourceExtraData*> (source.extraData()); 725 static_cast<MediaStreamSource*> (source.extraData());
726 CHECK(extra_data); 726 CHECK(extra_data);
727 DVLOG(1) << "MediaStreamImpl::StopLocalSource(" 727 DVLOG(1) << "MediaStreamImpl::StopLocalSource("
728 << "{device_id = " << extra_data->device_info().device.id << "})"; 728 << "{device_id = " << extra_data->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
736 if (notify_dispatcher) 729 if (notify_dispatcher)
737 media_stream_dispatcher_->StopStreamDevice(extra_data->device_info()); 730 media_stream_dispatcher_->StopStreamDevice(extra_data->device_info());
738 731
739 blink::WebMediaStreamSource writable_source(source); 732 blink::WebMediaStreamSource writable_source(source);
740 writable_source.setReadyState( 733 writable_source.setReadyState(
741 blink::WebMediaStreamSource::ReadyStateEnded); 734 blink::WebMediaStreamSource::ReadyStateEnded);
742 writable_source.setExtraData(NULL); 735 writable_source.setExtraData(NULL);
743 } 736 }
744 737
745 void MediaStreamImpl::StopUnreferencedSources(bool notify_dispatcher) { 738 void MediaStreamImpl::StopUnreferencedSources(bool notify_dispatcher) {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 802
810 if (!audio_device->GetDefaultCapturer()) 803 if (!audio_device->GetDefaultCapturer())
811 return false; 804 return false;
812 805
813 return audio_device->GetDefaultCapturer()->GetPairedOutputParameters( 806 return audio_device->GetDefaultCapturer()->GetPairedOutputParameters(
814 session_id, 807 session_id,
815 output_sample_rate, 808 output_sample_rate,
816 output_frames_per_buffer); 809 output_frames_per_buffer);
817 } 810 }
818 811
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( 812 MediaStreamExtraData::MediaStreamExtraData(
837 webrtc::MediaStreamInterface* stream, bool is_local) 813 webrtc::MediaStreamInterface* stream, bool is_local)
838 : stream_(stream), 814 : stream_(stream),
839 is_local_(is_local) { 815 is_local_(is_local) {
840 } 816 }
841 817
842 MediaStreamExtraData::~MediaStreamExtraData() { 818 MediaStreamExtraData::~MediaStreamExtraData() {
843 } 819 }
844 820
845 void MediaStreamExtraData::SetLocalStreamStopCallback( 821 void MediaStreamExtraData::SetLocalStreamStopCallback(
846 const StreamStopCallback& stop_callback) { 822 const StreamStopCallback& stop_callback) {
847 stream_stop_callback_ = stop_callback; 823 stream_stop_callback_ = stop_callback;
848 } 824 }
849 825
850 void MediaStreamExtraData::OnLocalStreamStop() { 826 void MediaStreamExtraData::OnLocalStreamStop() {
851 if (!stream_stop_callback_.is_null()) 827 if (!stream_stop_callback_.is_null())
852 stream_stop_callback_.Run(stream_->label()); 828 stream_stop_callback_.Run(stream_->label());
853 } 829 }
854 830
855 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( 831 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo(
856 int request_id, 832 int request_id,
857 blink::WebFrame* frame, 833 blink::WebFrame* frame,
858 const blink::WebUserMediaRequest& request, 834 const blink::WebUserMediaRequest& request,
859 bool enable_automatic_output_device_selection) 835 bool enable_automatic_output_device_selection)
860 : request_id(request_id), 836 : request_id(request_id),
861 generated(false), 837 generated(false),
862 enable_automatic_output_device_selection( 838 enable_automatic_output_device_selection(
863 enable_automatic_output_device_selection), 839 enable_automatic_output_device_selection),
864 frame(frame), 840 frame(frame),
865 request(request) { 841 request(request),
842 request_failed_(false){
866 } 843 }
867 844
868 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { 845 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() {
846 DVLOG(1) << "~UserMediaRequestInfo";
847 }
848
849 void MediaStreamImpl::UserMediaRequestInfo::StartTrack(
850 const blink::WebMediaStreamTrack& track,
851 const blink::WebMediaConstraints& constraints) {
852 MediaStreamSource* native_source =
853 static_cast <MediaStreamSource*>(track.source().extraData());
854 DCHECK(native_source);
855 native_source->AddTrack(track);
856 sources_.push_back(track.source());
857 sources_waiting_for_callback_.push_back(native_source);
858 native_source->ApplyConstraints(
859 track,
860 constraints,
861 base::Bind(&MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted,
862 AsWeakPtr()));
863 }
864
865 void MediaStreamImpl::UserMediaRequestInfo::CallbackonTracksStarted(
866 const ResourcesReady& callback) {
867 DCHECK(ready_callback_.is_null());
868 ready_callback_ = callback;
869 CheckAllTracksStarted();
870 }
871
872 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted(
873 MediaStreamSource* source, bool success) {
874 DVLOG(1) << "OnTrackStarted";
875 std::vector<MediaStreamSource*>::iterator it =
876 std::find(sources_waiting_for_callback_.begin(),
877 sources_waiting_for_callback_.end(),
878 source);
879 DCHECK(it != sources_waiting_for_callback_.end());
880 sources_waiting_for_callback_.erase(it);
881 // All tracks must be started successfully. Otherwise the request is a
882 // failure.
883 if (!success)
884 request_failed_ = true;
885 CheckAllTracksStarted();
886 }
887
888 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() {
889 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty())
890 ready_callback_.Run(this, !request_failed_);
891 }
892
893 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed(
894 const blink::WebMediaStreamSource& source) const {
895 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it =
896 sources_.begin();
897 source_it != sources_.end(); ++source_it) {
898 if (source_it->id() == source.id()) {
899 return true;
900 }
901 }
902 return false;
903 }
904
905 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource(
906 const blink::WebMediaStreamSource& source) {
907 for (std::vector<blink::WebMediaStreamSource>::iterator it =
908 sources_.begin();
909 it != sources_.end(); ++it) {
910 if (source.id() == it->id()) {
911 sources_.erase(it);
912 return;
913 }
914 }
869 } 915 }
870 916
871 } // namespace content 917 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698