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

Side by Side Diff: content/renderer/media/webrtc/peer_connection_dependency_factory.cc

Issue 2363303002: [WIP] Proxy RtcVideoDecoder calls to a media::VideoDecoder.
Patch Set: Now working with remote ffmpeg decoder Created 4 years, 2 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/webrtc/peer_connection_dependency_factory.h" 5 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" 59 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
60 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 60 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
61 #include "third_party/WebKit/public/platform/WebURL.h" 61 #include "third_party/WebKit/public/platform/WebURL.h"
62 #include "third_party/WebKit/public/web/WebDocument.h" 62 #include "third_party/WebKit/public/web/WebDocument.h"
63 #include "third_party/WebKit/public/web/WebFrame.h" 63 #include "third_party/WebKit/public/web/WebFrame.h"
64 #include "third_party/webrtc/api/mediaconstraintsinterface.h" 64 #include "third_party/webrtc/api/mediaconstraintsinterface.h"
65 #include "third_party/webrtc/api/videosourceproxy.h" 65 #include "third_party/webrtc/api/videosourceproxy.h"
66 #include "third_party/webrtc/base/ssladapter.h" 66 #include "third_party/webrtc/base/ssladapter.h"
67 #include "third_party/webrtc/modules/video_coding/codecs/h264/include/h264.h" 67 #include "third_party/webrtc/modules/video_coding/codecs/h264/include/h264.h"
68 68
69 // Debug Only! Remove this!
70 #include "media/filters/ffmpeg_video_decoder.h"
71 #include "media/mojo/clients/mojo_video_decoder.h"
72 #include "services/shell/public/cpp/interface_provider.h"
73
69 #if defined(OS_ANDROID) 74 #if defined(OS_ANDROID)
70 #include "media/base/android/media_codec_util.h" 75 #include "media/base/android/media_codec_util.h"
71 #endif 76 #endif
72 77
73 namespace content { 78 namespace content {
74 79
75 namespace { 80 namespace {
76 81
77 enum WebRTCIPHandlingPolicy { 82 enum WebRTCIPHandlingPolicy {
78 DEFAULT, 83 DEFAULT,
(...skipping 11 matching lines...) Expand all
90 if (preference == kWebRTCIPHandlingDisableNonProxiedUdp) 95 if (preference == kWebRTCIPHandlingDisableNonProxiedUdp)
91 return DISABLE_NON_PROXIED_UDP; 96 return DISABLE_NON_PROXIED_UDP;
92 return DEFAULT; 97 return DEFAULT;
93 } 98 }
94 99
95 bool IsValidPortRange(uint16_t min_port, uint16_t max_port) { 100 bool IsValidPortRange(uint16_t min_port, uint16_t max_port) {
96 DCHECK(min_port <= max_port); 101 DCHECK(min_port <= max_port);
97 return min_port != 0 && max_port != 0; 102 return min_port != 0 && max_port != 0;
98 } 103 }
99 104
105 // Debug Only! Remove this!
106 std::unique_ptr<media::VideoDecoder> CreateFFmpegVideoDecoder() {
107 return base::WrapUnique(new media::FFmpegVideoDecoder());
108 }
109
110 // Debug Only! (Maybe)
111 std::unique_ptr<media::VideoDecoder> CreateMojoVideoDecoder(
112 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
113 media::GpuVideoAcceleratorFactories* gpu_factories,
114 shell::InterfaceProvider* remote_interfaces) {
115 DCHECK(remote_interfaces);
116 DCHECK(task_runner->BelongsToCurrentThread());
117 media::mojom::VideoDecoderPtr remote_video_decoder;
118 remote_interfaces->GetInterface(mojo::GetProxy(&remote_video_decoder));
119 return base::MakeUnique<media::MojoVideoDecoder>(
120 task_runner, gpu_factories, std::move(remote_video_decoder));
121 }
122
100 } // namespace 123 } // namespace
101 124
102 PeerConnectionDependencyFactory::PeerConnectionDependencyFactory( 125 PeerConnectionDependencyFactory::PeerConnectionDependencyFactory(
103 P2PSocketDispatcher* p2p_socket_dispatcher) 126 P2PSocketDispatcher* p2p_socket_dispatcher)
104 : network_manager_(NULL), 127 : network_manager_(NULL),
105 p2p_socket_dispatcher_(p2p_socket_dispatcher), 128 p2p_socket_dispatcher_(p2p_socket_dispatcher),
106 signaling_thread_(NULL), 129 signaling_thread_(NULL),
107 worker_thread_(NULL), 130 worker_thread_(NULL),
108 chrome_signaling_thread_("Chrome_libJingle_Signaling"), 131 chrome_signaling_thread_("Chrome_libJingle_Signaling"),
109 chrome_worker_thread_("Chrome_libJingle_WorkerThread") { 132 chrome_worker_thread_("Chrome_libJingle_WorkerThread"),
133 task_runner_(base::ThreadTaskRunnerHandle::Get()) {
110 TryScheduleStunProbeTrial(); 134 TryScheduleStunProbeTrial();
111 } 135 }
112 136
113 PeerConnectionDependencyFactory::~PeerConnectionDependencyFactory() { 137 PeerConnectionDependencyFactory::~PeerConnectionDependencyFactory() {
114 DVLOG(1) << "~PeerConnectionDependencyFactory()"; 138 DVLOG(1) << "~PeerConnectionDependencyFactory()";
115 DCHECK(!pc_factory_); 139 DCHECK(!pc_factory_);
116 } 140 }
117 141
118 blink::WebRTCPeerConnectionHandler* 142 blink::WebRTCPeerConnectionHandler*
119 PeerConnectionDependencyFactory::CreateRTCPeerConnectionHandler( 143 PeerConnectionDependencyFactory::CreateRTCPeerConnectionHandler(
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 // Init SSL, which will be needed by PeerConnection. 222 // Init SSL, which will be needed by PeerConnection.
199 if (!rtc::InitializeSSL()) { 223 if (!rtc::InitializeSSL()) {
200 LOG(ERROR) << "Failed on InitializeSSL."; 224 LOG(ERROR) << "Failed on InitializeSSL.";
201 NOTREACHED(); 225 NOTREACHED();
202 return; 226 return;
203 } 227 }
204 228
205 base::WaitableEvent start_signaling_event( 229 base::WaitableEvent start_signaling_event(
206 base::WaitableEvent::ResetPolicy::MANUAL, 230 base::WaitableEvent::ResetPolicy::MANUAL,
207 base::WaitableEvent::InitialState::NOT_SIGNALED); 231 base::WaitableEvent::InitialState::NOT_SIGNALED);
232
233 #define USE_MOJO_VIDEO_DECODER
234 #if defined(USE_LOCAL_FFMPEG_DECODER)
235 auto create_video_decoder_cb = base::Bind(&CreateFFmpegVideoDecoder);
236 auto decoder_task_runner =
237 RenderThreadImpl::current()->GetGpuFactories()->GetTaskRunner();
238 #elif defined(USE_MOJO_VIDEO_DECODER)
239 auto create_video_decoder_cb =
240 base::Bind(&CreateMojoVideoDecoder, task_runner_,
241 RenderThreadImpl::current()->GetGpuFactories(),
242 RenderThreadImpl::current()->GetRemoteInterfaces());
243 auto decoder_task_runner = task_runner_;
244 #else
245 INTENTIONAL ERROR: MUST DEFINE ONE OF THESE
246 #endif
208 chrome_signaling_thread_.task_runner()->PostTask( 247 chrome_signaling_thread_.task_runner()->PostTask(
209 FROM_HERE, 248 FROM_HERE,
210 base::Bind(&PeerConnectionDependencyFactory::InitializeSignalingThread, 249 base::Bind(&PeerConnectionDependencyFactory::InitializeSignalingThread,
211 base::Unretained(this), 250 base::Unretained(this),
212 RenderThreadImpl::current()->GetGpuFactories(), 251 RenderThreadImpl::current()->GetGpuFactories(),
252 create_video_decoder_cb, decoder_task_runner,
213 &start_signaling_event)); 253 &start_signaling_event));
214 254
215 start_signaling_event.Wait(); 255 start_signaling_event.Wait();
216 CHECK(signaling_thread_); 256 CHECK(signaling_thread_);
217 } 257 }
218 258
219 void PeerConnectionDependencyFactory::InitializeSignalingThread( 259 void PeerConnectionDependencyFactory::InitializeSignalingThread(
220 media::GpuVideoAcceleratorFactories* gpu_factories, 260 media::GpuVideoAcceleratorFactories* gpu_factories,
261 const CreateVideoDecoderCB& create_video_decoder_cb,
262 const scoped_refptr<base::SingleThreadTaskRunner>& decoder_task_runner,
221 base::WaitableEvent* event) { 263 base::WaitableEvent* event) {
222 DCHECK(chrome_signaling_thread_.task_runner()->BelongsToCurrentThread()); 264 DCHECK(chrome_signaling_thread_.task_runner()->BelongsToCurrentThread());
223 DCHECK(worker_thread_); 265 DCHECK(worker_thread_);
224 DCHECK(p2p_socket_dispatcher_.get()); 266 DCHECK(p2p_socket_dispatcher_.get());
225 267
226 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); 268 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop();
227 jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true); 269 jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true);
228 signaling_thread_ = jingle_glue::JingleThreadWrapper::current(); 270 signaling_thread_ = jingle_glue::JingleThreadWrapper::current();
229 271
230 socket_factory_.reset( 272 socket_factory_.reset(
231 new IpcPacketSocketFactory(p2p_socket_dispatcher_.get())); 273 new IpcPacketSocketFactory(p2p_socket_dispatcher_.get()));
232 274
233 std::unique_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory; 275 std::unique_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory;
234 std::unique_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory; 276 std::unique_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory;
235 277
236 const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); 278 const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
237 if (gpu_factories && gpu_factories->IsGpuVideoAcceleratorEnabled()) { 279 // if (gpu_factories && gpu_factories->IsGpuVideoAcceleratorEnabled()) {
238 if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding)) 280 // if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding))
239 decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories)); 281 // decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories));
240 282
241 if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding)) 283 // if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding))
242 encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories)); 284 // encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories));
243 } 285 // }
286 decoder_factory.reset(
287 new RTCVideoDecoderFactory(create_video_decoder_cb, decoder_task_runner));
244 288
245 #if defined(OS_ANDROID) 289 #if defined(OS_ANDROID)
246 if (!media::MediaCodecUtil::SupportsSetParameters()) 290 if (!media::MediaCodecUtil::SupportsSetParameters())
247 encoder_factory.reset(); 291 encoder_factory.reset();
248 #endif 292 #endif
249 293
250 pc_factory_ = webrtc::CreatePeerConnectionFactory( 294 pc_factory_ = webrtc::CreatePeerConnectionFactory(
251 worker_thread_, signaling_thread_, audio_device_.get(), 295 worker_thread_, signaling_thread_, audio_device_.get(),
252 encoder_factory.release(), decoder_factory.release()); 296 encoder_factory.release(), decoder_factory.release());
253 CHECK(pc_factory_.get()); 297 CHECK(pc_factory_.get());
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 599
556 void PeerConnectionDependencyFactory::EnsureWebRtcAudioDeviceImpl() { 600 void PeerConnectionDependencyFactory::EnsureWebRtcAudioDeviceImpl() {
557 DCHECK(CalledOnValidThread()); 601 DCHECK(CalledOnValidThread());
558 if (audio_device_.get()) 602 if (audio_device_.get())
559 return; 603 return;
560 604
561 audio_device_ = new WebRtcAudioDeviceImpl(); 605 audio_device_ = new WebRtcAudioDeviceImpl();
562 } 606 }
563 607
564 } // namespace content 608 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/webrtc/peer_connection_dependency_factory.h ('k') | media/filters/ffmpeg_video_decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698