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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: content/renderer/media/webrtc/peer_connection_dependency_factory.cc
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
index d98b2ac06daea95a5e831306093058b153718064..4e7890b990e01dd6dd2e4c87ed9a9efb4b32913c 100644
--- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
+++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
@@ -66,6 +66,11 @@
#include "third_party/webrtc/base/ssladapter.h"
#include "third_party/webrtc/modules/video_coding/codecs/h264/include/h264.h"
+// Debug Only! Remove this!
+#include "media/filters/ffmpeg_video_decoder.h"
+#include "media/mojo/clients/mojo_video_decoder.h"
+#include "services/shell/public/cpp/interface_provider.h"
+
#if defined(OS_ANDROID)
#include "media/base/android/media_codec_util.h"
#endif
@@ -97,6 +102,24 @@ bool IsValidPortRange(uint16_t min_port, uint16_t max_port) {
return min_port != 0 && max_port != 0;
}
+// Debug Only! Remove this!
+std::unique_ptr<media::VideoDecoder> CreateFFmpegVideoDecoder() {
+ return base::WrapUnique(new media::FFmpegVideoDecoder());
+}
+
+// Debug Only! (Maybe)
+std::unique_ptr<media::VideoDecoder> CreateMojoVideoDecoder(
+ const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+ media::GpuVideoAcceleratorFactories* gpu_factories,
+ shell::InterfaceProvider* remote_interfaces) {
+ DCHECK(remote_interfaces);
+ DCHECK(task_runner->BelongsToCurrentThread());
+ media::mojom::VideoDecoderPtr remote_video_decoder;
+ remote_interfaces->GetInterface(mojo::GetProxy(&remote_video_decoder));
+ return base::MakeUnique<media::MojoVideoDecoder>(
+ task_runner, gpu_factories, std::move(remote_video_decoder));
+}
+
} // namespace
PeerConnectionDependencyFactory::PeerConnectionDependencyFactory(
@@ -106,7 +129,8 @@ PeerConnectionDependencyFactory::PeerConnectionDependencyFactory(
signaling_thread_(NULL),
worker_thread_(NULL),
chrome_signaling_thread_("Chrome_libJingle_Signaling"),
- chrome_worker_thread_("Chrome_libJingle_WorkerThread") {
+ chrome_worker_thread_("Chrome_libJingle_WorkerThread"),
+ task_runner_(base::ThreadTaskRunnerHandle::Get()) {
TryScheduleStunProbeTrial();
}
@@ -205,11 +229,27 @@ void PeerConnectionDependencyFactory::CreatePeerConnectionFactory() {
base::WaitableEvent start_signaling_event(
base::WaitableEvent::ResetPolicy::MANUAL,
base::WaitableEvent::InitialState::NOT_SIGNALED);
+
+#define USE_MOJO_VIDEO_DECODER
+#if defined(USE_LOCAL_FFMPEG_DECODER)
+ auto create_video_decoder_cb = base::Bind(&CreateFFmpegVideoDecoder);
+ auto decoder_task_runner =
+ RenderThreadImpl::current()->GetGpuFactories()->GetTaskRunner();
+#elif defined(USE_MOJO_VIDEO_DECODER)
+ auto create_video_decoder_cb =
+ base::Bind(&CreateMojoVideoDecoder, task_runner_,
+ RenderThreadImpl::current()->GetGpuFactories(),
+ RenderThreadImpl::current()->GetRemoteInterfaces());
+ auto decoder_task_runner = task_runner_;
+#else
+ INTENTIONAL ERROR: MUST DEFINE ONE OF THESE
+#endif
chrome_signaling_thread_.task_runner()->PostTask(
FROM_HERE,
base::Bind(&PeerConnectionDependencyFactory::InitializeSignalingThread,
base::Unretained(this),
RenderThreadImpl::current()->GetGpuFactories(),
+ create_video_decoder_cb, decoder_task_runner,
&start_signaling_event));
start_signaling_event.Wait();
@@ -218,6 +258,8 @@ void PeerConnectionDependencyFactory::CreatePeerConnectionFactory() {
void PeerConnectionDependencyFactory::InitializeSignalingThread(
media::GpuVideoAcceleratorFactories* gpu_factories,
+ const CreateVideoDecoderCB& create_video_decoder_cb,
+ const scoped_refptr<base::SingleThreadTaskRunner>& decoder_task_runner,
base::WaitableEvent* event) {
DCHECK(chrome_signaling_thread_.task_runner()->BelongsToCurrentThread());
DCHECK(worker_thread_);
@@ -234,13 +276,15 @@ void PeerConnectionDependencyFactory::InitializeSignalingThread(
std::unique_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory;
const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
- if (gpu_factories && gpu_factories->IsGpuVideoAcceleratorEnabled()) {
- if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding))
- decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories));
-
- if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding))
- encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories));
- }
+ // if (gpu_factories && gpu_factories->IsGpuVideoAcceleratorEnabled()) {
+ // if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding))
+ // decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories));
+
+ // if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding))
+ // encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories));
+ // }
+ decoder_factory.reset(
+ new RTCVideoDecoderFactory(create_video_decoder_cb, decoder_task_runner));
#if defined(OS_ANDROID)
if (!media::MediaCodecUtil::SupportsSetParameters())
« 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