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

Unified Diff: content/renderer/media/media_stream_renderer_factory_impl.cc

Issue 1633423002: MediaStream audio rendering: Bypass audio processing for non-WebRTC cases. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add comment to TrackAudioRenderer header to explain it does not handle remote WebRTC tracks. Created 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/content_renderer.gypi ('k') | content/renderer/media/track_audio_renderer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/media/media_stream_renderer_factory_impl.cc
diff --git a/content/renderer/media/media_stream_renderer_factory_impl.cc b/content/renderer/media/media_stream_renderer_factory_impl.cc
index 40463f58d3d69e5e51e003c992b8f711eb5e496e..13043806544fa78d2a119882aa9445eec022448e 100644
--- a/content/renderer/media/media_stream_renderer_factory_impl.cc
+++ b/content/renderer/media/media_stream_renderer_factory_impl.cc
@@ -9,9 +9,9 @@
#include "content/renderer/media/media_stream_audio_track.h"
#include "content/renderer/media/media_stream_video_renderer_sink.h"
#include "content/renderer/media/media_stream_video_track.h"
+#include "content/renderer/media/track_audio_renderer.h"
#include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
#include "content/renderer/media/webrtc_audio_renderer.h"
-#include "content/renderer/media/webrtc_local_audio_renderer.h"
#include "content/renderer/render_thread_impl.h"
#include "media/base/audio_hardware_config.h"
#include "third_party/WebKit/public/platform/WebMediaStream.h"
@@ -27,59 +27,26 @@ PeerConnectionDependencyFactory* GetPeerConnectionDependencyFactory() {
return RenderThreadImpl::current()->GetPeerConnectionDependencyFactory();
}
-// Returns a valid session id if a single capture device is currently open
-// (and then the matching session_id), otherwise -1.
-// This is used to pass on a session id to a webrtc audio renderer (either
-// local or remote), so that audio will be rendered to a matching output
-// device, should one exist.
+// Returns a valid session id if a single WebRTC capture device is currently
+// open (and then the matching session_id), otherwise 0.
+// This is used to pass on a session id to an audio renderer, so that audio will
+// be rendered to a matching output device, should one exist.
// Note that if there are more than one open capture devices the function
-// will not be able to pick an appropriate device and return false.
-bool GetSessionIdForAudioRenderer(int* session_id) {
+// will not be able to pick an appropriate device and return 0.
+int GetSessionIdForWebRtcAudioRenderer() {
WebRtcAudioDeviceImpl* audio_device =
GetPeerConnectionDependencyFactory()->GetWebRtcAudioDevice();
if (!audio_device)
- return false;
+ return 0;
+ int session_id = 0;
int sample_rate; // ignored, read from output device
int frames_per_buffer; // ignored, read from output device
- return audio_device->GetAuthorizedDeviceInfoForAudioRenderer(
- session_id, &sample_rate, &frames_per_buffer);
-}
-
-scoped_refptr<WebRtcAudioRenderer> CreateRemoteAudioRenderer(
- const blink::WebMediaStream& stream,
- int render_frame_id,
- const std::string& device_id,
- const url::Origin& security_origin) {
- DVLOG(1) << "MediaStreamRendererFactoryImpl::CreateRemoteAudioRenderer id:"
- << stream.id().utf8();
- // |stream| will always contain at least one audio track.
- // See MediaStreamRendererFactoryImpl::GetAudioRenderer.
-
- // TODO(tommi): Change the default value of session_id to be
- // StreamDeviceInfo::kNoId. Also update AudioOutputDevice etc.
- int session_id = 0;
- GetSessionIdForAudioRenderer(&session_id);
-
- return new WebRtcAudioRenderer(
- GetPeerConnectionDependencyFactory()->GetWebRtcSignalingThread(), stream,
- render_frame_id, session_id, device_id, security_origin);
-}
-
-scoped_refptr<WebRtcLocalAudioRenderer> CreateLocalAudioRenderer(
- const blink::WebMediaStreamTrack& audio_track,
- int render_frame_id,
- const std::string& device_id,
- const url::Origin& security_origin) {
- DVLOG(1) << "MediaStreamRendererFactoryImpl::CreateLocalAudioRenderer";
-
- int session_id = 0;
- GetSessionIdForAudioRenderer(&session_id);
-
- // Create a new WebRtcLocalAudioRenderer instance and connect it to the
- // existing WebRtcAudioCapturer so that the renderer can use it as source.
- return new WebRtcLocalAudioRenderer(audio_track, render_frame_id, session_id,
- device_id, security_origin);
+ if (!audio_device->GetAuthorizedDeviceInfoForAudioRenderer(
+ &session_id, &sample_rate, &frames_per_buffer)) {
+ session_id = 0;
+ }
+ return session_id;
}
} // namespace
@@ -151,29 +118,44 @@ MediaStreamRendererFactoryImpl::GetAudioRenderer(
return nullptr;
}
- if (audio_track->is_local_track()) {
+ // If the track has a local source, or is a remote track that does not use the
+ // WebRTC audio pipeline, return a new TrackAudioRenderer instance.
+ //
+ // TODO(miu): In a soon up-coming change, I'll introduce a cleaner way (i.e.,
+ // rather than calling GetAudioAdapter()) to determine whether a remote source
+ // is via WebRTC or something else.
+ if (audio_track->is_local_track() || !audio_track->GetAudioAdapter()) {
// TODO(xians): Add support for the case where the media stream contains
// multiple audio tracks.
- return CreateLocalAudioRenderer(audio_tracks[0], render_frame_id, device_id,
- security_origin);
+ DVLOG(1) << "Creating TrackAudioRenderer for "
+ << (audio_track->is_local_track() ? "local" : "remote")
+ << " track.";
+ return new TrackAudioRenderer(audio_tracks[0], render_frame_id,
+ 0 /* no session_id */, device_id,
+ security_origin);
}
// This is a remote WebRTC media stream.
WebRtcAudioDeviceImpl* audio_device =
GetPeerConnectionDependencyFactory()->GetWebRtcAudioDevice();
+ DCHECK(audio_device);
// Share the existing renderer if any, otherwise create a new one.
scoped_refptr<WebRtcAudioRenderer> renderer(audio_device->renderer());
- if (!renderer.get()) {
- renderer = CreateRemoteAudioRenderer(web_stream, render_frame_id,
- device_id, security_origin);
-
- if (renderer.get() && !audio_device->SetAudioRenderer(renderer.get()))
- renderer = NULL;
+ if (renderer) {
+ DVLOG(1) << "Using existing WebRtcAudioRenderer for remote WebRTC track.";
+ } else {
+ DVLOG(1) << "Creating WebRtcAudioRenderer for remote WebRTC track.";
+ renderer = new WebRtcAudioRenderer(
+ GetPeerConnectionDependencyFactory()->GetWebRtcSignalingThread(),
+ web_stream, render_frame_id, GetSessionIdForWebRtcAudioRenderer(),
+ device_id, security_origin);
+
+ if (!audio_device->SetAudioRenderer(renderer.get()))
+ return nullptr;
}
- return renderer.get() ? renderer->CreateSharedAudioRendererProxy(web_stream)
- : NULL;
+ return renderer->CreateSharedAudioRendererProxy(web_stream);
}
} // namespace content
« no previous file with comments | « content/content_renderer.gypi ('k') | content/renderer/media/track_audio_renderer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698