| Index: content/public/renderer/media_stream_api.cc
 | 
| diff --git a/content/public/renderer/media_stream_api.cc b/content/public/renderer/media_stream_api.cc
 | 
| index 5baaa5421d006e32fa70cfcec86eb1138bdfaa3f..9ec76b703105d1ea58e20fc28bc30420289bde9d 100644
 | 
| --- a/content/public/renderer/media_stream_api.cc
 | 
| +++ b/content/public/renderer/media_stream_api.cc
 | 
| @@ -6,9 +6,8 @@
 | 
|  
 | 
|  #include <utility>
 | 
|  
 | 
| +#include "base/base64.h"
 | 
|  #include "base/callback.h"
 | 
| -#include "base/guid.h"
 | 
| -#include "base/memory/scoped_ptr.h"
 | 
|  #include "base/rand_util.h"
 | 
|  #include "base/strings/utf_string_conversions.h"
 | 
|  #include "content/renderer/media/media_stream_audio_source.h"
 | 
| @@ -23,92 +22,112 @@
 | 
|  
 | 
|  namespace content {
 | 
|  
 | 
| -bool AddVideoTrackToMediaStream(
 | 
| -    scoped_ptr<media::VideoCapturerSource> video_source,
 | 
| -    bool is_remote,
 | 
| -    bool is_readonly,
 | 
| -    blink::WebMediaStream* web_media_stream) {
 | 
| -  DCHECK(video_source.get());
 | 
| -  if (!web_media_stream || web_media_stream->isNull()) {
 | 
| -    DLOG(ERROR) << "WebMediaStream is null";
 | 
| +namespace {
 | 
| +
 | 
| +blink::WebString MakeTrackId() {
 | 
| +  std::string track_id;
 | 
| +  base::Base64Encode(base::RandBytesAsString(64), &track_id);
 | 
| +  return base::UTF8ToUTF16(track_id);
 | 
| +}
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
| +bool AddVideoTrackToMediaStream(scoped_ptr<media::VideoCapturerSource> source,
 | 
| +                                bool is_remote,
 | 
| +                                bool is_readonly,
 | 
| +                                const std::string& media_stream_url) {
 | 
| +  blink::WebMediaStream web_stream =
 | 
| +      blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor(
 | 
| +          GURL(media_stream_url));
 | 
| +  return AddVideoTrackToMediaStream(std::move(source), is_remote, is_readonly,
 | 
| +                                    &web_stream);
 | 
| +}
 | 
| +
 | 
| +bool AddVideoTrackToMediaStream(scoped_ptr<media::VideoCapturerSource> source,
 | 
| +                                bool is_remote,
 | 
| +                                bool is_readonly,
 | 
| +                                blink::WebMediaStream* web_stream) {
 | 
| +  if (web_stream->isNull()) {
 | 
| +    DLOG(ERROR) << "Stream not found";
 | 
|      return false;
 | 
|    }
 | 
| -
 | 
| -  blink::WebMediaStreamSource web_media_stream_source;
 | 
| -  MediaStreamVideoSource* const media_stream_source =
 | 
| +  const blink::WebString track_id = MakeTrackId();
 | 
| +  blink::WebMediaStreamSource webkit_source;
 | 
| +  scoped_ptr<MediaStreamVideoSource> media_stream_source(
 | 
|        new MediaStreamVideoCapturerSource(
 | 
| -          MediaStreamSource::SourceStoppedCallback(), std::move(video_source));
 | 
| -  const blink::WebString track_id =
 | 
| -      blink::WebString::fromUTF8(base::GenerateGUID());
 | 
| -  web_media_stream_source.initialize(track_id,
 | 
| -                                     blink::WebMediaStreamSource::TypeVideo,
 | 
| -                                     track_id, is_remote, is_readonly);
 | 
| -  // Takes ownership of |media_stream_source|.
 | 
| -  web_media_stream_source.setExtraData(media_stream_source);
 | 
| +          MediaStreamSource::SourceStoppedCallback(), std::move(source)));
 | 
| +  webkit_source.initialize(track_id, blink::WebMediaStreamSource::TypeVideo,
 | 
| +                           track_id, is_remote, is_readonly);
 | 
| +  webkit_source.setExtraData(media_stream_source.get());
 | 
|  
 | 
|    blink::WebMediaConstraints constraints;
 | 
|    constraints.initialize();
 | 
| -  web_media_stream->addTrack(MediaStreamVideoTrack::CreateVideoTrack(
 | 
| -      media_stream_source, constraints,
 | 
| +  web_stream->addTrack(MediaStreamVideoTrack::CreateVideoTrack(
 | 
| +      media_stream_source.release(), constraints,
 | 
|        MediaStreamVideoSource::ConstraintsCallback(), true));
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
|  bool AddAudioTrackToMediaStream(
 | 
| -    scoped_refptr<media::AudioCapturerSource> audio_source,
 | 
| -    int sample_rate,
 | 
| -    media::ChannelLayout channel_layout,
 | 
| -    int frames_per_buffer,
 | 
| +    const scoped_refptr<media::AudioCapturerSource>& source,
 | 
| +    const media::AudioParameters& params,
 | 
|      bool is_remote,
 | 
|      bool is_readonly,
 | 
| -    blink::WebMediaStream* web_media_stream) {
 | 
| -  DCHECK(audio_source.get());
 | 
| -  if (!web_media_stream || web_media_stream->isNull()) {
 | 
| -    DLOG(ERROR) << "WebMediaStream is null";
 | 
| +    const std::string& media_stream_url) {
 | 
| +  DCHECK(params.IsValid()) << params.AsHumanReadableString();
 | 
| +  blink::WebMediaStream web_stream =
 | 
| +      blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor(
 | 
| +          GURL(media_stream_url));
 | 
| +  return AddAudioTrackToMediaStream(source,
 | 
| +                                    is_remote, is_readonly, &web_stream);
 | 
| +}
 | 
| +
 | 
| +bool AddAudioTrackToMediaStream(
 | 
| +    const scoped_refptr<media::AudioCapturerSource>& source,
 | 
| +    bool is_remote,
 | 
| +    bool is_readonly,
 | 
| +    blink::WebMediaStream* web_stream) {
 | 
| +  if (web_stream->isNull()) {
 | 
| +    DLOG(ERROR) << "Stream not found";
 | 
|      return false;
 | 
|    }
 | 
|  
 | 
| -  const media::AudioParameters params(
 | 
| -      media::AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout,
 | 
| -      sample_rate, sizeof(int16_t) * 8, frames_per_buffer);
 | 
| -  if (!params.IsValid()) {
 | 
| -    DLOG(ERROR) << "Invalid audio parameters.";
 | 
| -    return false;
 | 
| -  }
 | 
| +  media::AudioParameters params(
 | 
| +      media::AudioParameters::AUDIO_PCM_LINEAR, media::CHANNEL_LAYOUT_STEREO,
 | 
| +      48000, /* sample rate */
 | 
| +      16,    /* bits per sample */
 | 
| +      480);  /* frames per buffer */
 | 
|  
 | 
| -  blink::WebMediaStreamSource web_media_stream_source;
 | 
| -  const blink::WebString track_id =
 | 
| -      blink::WebString::fromUTF8(base::GenerateGUID());
 | 
| -  web_media_stream_source.initialize(track_id,
 | 
| -                                     blink::WebMediaStreamSource::TypeAudio,
 | 
| -                                     track_id, is_remote, is_readonly);
 | 
| +  blink::WebMediaStreamSource webkit_source;
 | 
| +  const blink::WebString track_id = MakeTrackId();
 | 
| +  webkit_source.initialize(track_id,
 | 
| +                           blink::WebMediaStreamSource::TypeAudio,
 | 
| +                           track_id,
 | 
| +                           is_remote,
 | 
| +                           is_readonly);
 | 
|  
 | 
| -  MediaStreamAudioSource* media_stream_source(new MediaStreamAudioSource(
 | 
| -      -1, StreamDeviceInfo(), MediaStreamSource::SourceStoppedCallback(),
 | 
| -      RenderThreadImpl::current()->GetPeerConnectionDependencyFactory()));
 | 
| +  MediaStreamAudioSource* audio_source(
 | 
| +      new MediaStreamAudioSource(
 | 
| +          -1,
 | 
| +          StreamDeviceInfo(),
 | 
| +          MediaStreamSource::SourceStoppedCallback(),
 | 
| +          RenderThreadImpl::current()->GetPeerConnectionDependencyFactory()));
 | 
|  
 | 
|    blink::WebMediaConstraints constraints;
 | 
|    constraints.initialize();
 | 
| -  {
 | 
| -    // TODO(miu): In an upcoming change, a source purposed for passing audio
 | 
| -    // directly (i.e., without modification) will replace this "hacky" use of
 | 
| -    // WebRtcAudioCapturer.  http://crbug.com/577881
 | 
| -    scoped_ptr<WebRtcAudioCapturer> capturer(
 | 
| -        WebRtcAudioCapturer::CreateCapturer(-1, StreamDeviceInfo(), constraints,
 | 
| -                                            nullptr, media_stream_source));
 | 
| -    capturer->SetCapturerSource(std::move(audio_source), params);
 | 
| -    media_stream_source->SetAudioCapturer(std::move(capturer));
 | 
| -  }
 | 
| -  web_media_stream_source.setExtraData(
 | 
| -      media_stream_source);  // Takes ownership.
 | 
| +  scoped_refptr<WebRtcAudioCapturer> capturer(
 | 
| +      WebRtcAudioCapturer::CreateCapturer(-1, StreamDeviceInfo(), constraints,
 | 
| +                                          nullptr, audio_source));
 | 
| +  capturer->SetCapturerSource(source, params);
 | 
| +  audio_source->SetAudioCapturer(capturer);
 | 
| +  webkit_source.setExtraData(audio_source);
 | 
|  
 | 
| -  blink::WebMediaStreamTrack web_media_stream_track;
 | 
| -  web_media_stream_track.initialize(web_media_stream_source);
 | 
| -  RenderThreadImpl::current()
 | 
| -      ->GetPeerConnectionDependencyFactory()
 | 
| -      ->CreateLocalAudioTrack(web_media_stream_track);
 | 
| +  blink::WebMediaStreamTrack web_media_audio_track;
 | 
| +  web_media_audio_track.initialize(webkit_source);
 | 
| +  RenderThreadImpl::current()->GetPeerConnectionDependencyFactory()->
 | 
| +      CreateLocalAudioTrack(web_media_audio_track);
 | 
|  
 | 
| -  web_media_stream->addTrack(web_media_stream_track);
 | 
| +  web_stream->addTrack(web_media_audio_track);
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| 
 |