summaryrefslogtreecommitdiffstats
path: root/chromecast
diff options
context:
space:
mode:
Diffstat (limited to 'chromecast')
-rw-r--r--chromecast/chromecast.gyp5
-rw-r--r--chromecast/common/chromecast_switches.cc3
-rw-r--r--chromecast/common/chromecast_switches.h2
-rw-r--r--chromecast/common/media/cast_message_generator.cc15
-rw-r--r--chromecast/common/media/cast_message_generator.h8
-rw-r--r--chromecast/common/media/cast_messages.h17
-rw-r--r--chromecast/media/base/media_caps.cc38
-rw-r--r--chromecast/media/base/media_caps.h12
-rw-r--r--chromecast/media/media.gyp2
-rw-r--r--chromecast/renderer/cast_content_renderer_client.cc12
-rw-r--r--chromecast/renderer/cast_render_process_observer.cc9
-rw-r--r--chromecast/renderer/cast_render_process_observer.h2
-rw-r--r--chromecast/renderer/media/capabilities_message_filter.cc32
-rw-r--r--chromecast/renderer/media/capabilities_message_filter.h29
14 files changed, 185 insertions, 1 deletions
diff --git a/chromecast/chromecast.gyp b/chromecast/chromecast.gyp
index 2e1b9a5..8a16e9a 100644
--- a/chromecast/chromecast.gyp
+++ b/chromecast/chromecast.gyp
@@ -227,6 +227,9 @@
'common/cast_resource_delegate.h',
'common/chromecast_switches.cc',
'common/chromecast_switches.h',
+ 'common/media/cast_messages.h',
+ 'common/media/cast_message_generator.cc',
+ 'common/media/cast_message_generator.h',
'common/platform_client_auth.h',
'common/pref_names.cc',
'common/pref_names.h',
@@ -238,6 +241,8 @@
'renderer/cast_render_process_observer.h',
'renderer/key_systems_cast.cc',
'renderer/key_systems_cast.h',
+ 'renderer/media/capabilities_message_filter.cc',
+ 'renderer/media/capabilities_message_filter.h',
],
'conditions': [
['chromecast_branding=="Chrome"', {
diff --git a/chromecast/common/chromecast_switches.cc b/chromecast/common/chromecast_switches.cc
index aca640d..fe16627 100644
--- a/chromecast/common/chromecast_switches.cc
+++ b/chromecast/common/chromecast_switches.cc
@@ -9,6 +9,9 @@ namespace switches {
// Enable the CMA media pipeline.
const char kEnableCmaMediaPipeline[] = "enable-cma-media-pipeline";
+// The bitmask of codecs (media_caps.h) supported by the current HDMI sink.
+const char kHdmiSinkSupportedCodecs[] = "hdmi-sink-supported-codecs";
+
#if defined(OS_ANDROID)
// Enable file accesses for debug.
const char kEnableLocalFileAccesses[] = "enable-local-file-accesses";
diff --git a/chromecast/common/chromecast_switches.h b/chromecast/common/chromecast_switches.h
index 4bb7490..5840d45 100644
--- a/chromecast/common/chromecast_switches.h
+++ b/chromecast/common/chromecast_switches.h
@@ -9,7 +9,9 @@
namespace switches {
+// Media switches
extern const char kEnableCmaMediaPipeline[];
+extern const char kHdmiSinkSupportedCodecs[];
#if defined(OS_ANDROID)
// Content-implementation switches
diff --git a/chromecast/common/media/cast_message_generator.cc b/chromecast/common/media/cast_message_generator.cc
new file mode 100644
index 0000000..ee6c73e
--- /dev/null
+++ b/chromecast/common/media/cast_message_generator.cc
@@ -0,0 +1,15 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Get basic type definitions.
+#define IPC_MESSAGE_IMPL
+#include "chromecast/common/media/cast_message_generator.h"
+
+// Generate constructors.
+#include "ipc/struct_constructor_macros.h"
+#include "chromecast/common/media/cast_message_generator.h"
+
+// Generate destructors.
+#include "ipc/struct_destructor_macros.h"
+#include "chromecast/common/media/cast_message_generator.h"
diff --git a/chromecast/common/media/cast_message_generator.h b/chromecast/common/media/cast_message_generator.h
new file mode 100644
index 0000000..ac6c004
--- /dev/null
+++ b/chromecast/common/media/cast_message_generator.h
@@ -0,0 +1,8 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Multiply-included file, hence no include guard.
+
+#include "chromecast/common/media/cast_messages.h"
+
diff --git a/chromecast/common/media/cast_messages.h b/chromecast/common/media/cast_messages.h
new file mode 100644
index 0000000..3d9cc2a
--- /dev/null
+++ b/chromecast/common/media/cast_messages.h
@@ -0,0 +1,17 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// IPC messages related to media on Chromecast.
+// Multiply-included message file, hence no include guard.
+
+#include "ipc/ipc_message_macros.h"
+
+#undef IPC_MESSAGE_EXPORT
+#define IPC_MESSAGE_EXPORT
+#define IPC_MESSAGE_START CastMediaMsgStart
+
+// Messages sent from the browser to the renderer process.
+
+IPC_MESSAGE_CONTROL1(CmaMsg_UpdateSupportedHdmiSinkCodecs,
+ int /* Codec support, bitmask of media_caps.h values */)
diff --git a/chromecast/media/base/media_caps.cc b/chromecast/media/base/media_caps.cc
new file mode 100644
index 0000000..2924882
--- /dev/null
+++ b/chromecast/media/base/media_caps.cc
@@ -0,0 +1,38 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromecast/media/base/media_caps.h"
+
+namespace media {
+
+namespace {
+int g_hdmi_codecs = 0;
+} // namespace
+
+void SetHdmiSinkCodecs(int codecs_mask) {
+ g_hdmi_codecs = codecs_mask;
+}
+
+bool HdmiSinkSupportsAC3() {
+ return g_hdmi_codecs & HdmiSinkCodec::kSinkCodecAc3;
+}
+
+bool HdmiSinkSupportsDTS() {
+ return g_hdmi_codecs & HdmiSinkCodec::kSinkCodecDts;
+}
+
+bool HdmiSinkSupportsDTSHD() {
+ return g_hdmi_codecs & HdmiSinkCodec::kSinkCodecDtsHd;
+}
+
+bool HdmiSinkSupportsEAC3() {
+ return g_hdmi_codecs & HdmiSinkCodec::kSinkCodecEac3;
+}
+
+bool HdmiSinkSupportsPcmSurroundSound() {
+ return g_hdmi_codecs & HdmiSinkCodec::kSinkCodecPcmSurroundSound;
+}
+
+} // namespace media
+
diff --git a/chromecast/media/base/media_caps.h b/chromecast/media/base/media_caps.h
index 8e13798..8ae2c7b 100644
--- a/chromecast/media/base/media_caps.h
+++ b/chromecast/media/base/media_caps.h
@@ -7,6 +7,18 @@
namespace media {
+enum HdmiSinkCodec {
+ kSinkCodecAc3 = 1,
+ kSinkCodecDts = 1 << 1,
+ kSinkCodecDtsHd = 1 << 2,
+ kSinkCodecEac3 = 1 << 3,
+ kSinkCodecPcmSurroundSound = 1 << 4,
+};
+
+// Records the known supported codecs for the current HDMI sink, as a bit mask
+// of HdmiSinkCodec values.
+void SetHdmiSinkCodecs(int codecs_mask);
+
bool HdmiSinkSupportsAC3();
bool HdmiSinkSupportsDTS();
bool HdmiSinkSupportsDTSHD();
diff --git a/chromecast/media/media.gyp b/chromecast/media/media.gyp
index f85404c..bc468a6 100644
--- a/chromecast/media/media.gyp
+++ b/chromecast/media/media.gyp
@@ -22,6 +22,8 @@
'base/decrypt_context_clearkey.h',
'base/key_systems_common.cc',
'base/key_systems_common.h',
+ 'base/media_caps.cc',
+ 'base/media_caps.h',
'base/switching_media_renderer.cc',
'base/switching_media_renderer.h',
],
diff --git a/chromecast/renderer/cast_content_renderer_client.cc b/chromecast/renderer/cast_content_renderer_client.cc
index 7c9ea22..8934e95 100644
--- a/chromecast/renderer/cast_content_renderer_client.cc
+++ b/chromecast/renderer/cast_content_renderer_client.cc
@@ -8,8 +8,10 @@
#include "base/command_line.h"
#include "base/memory/memory_pressure_listener.h"
+#include "base/strings/string_number_conversions.h"
#include "chromecast/common/chromecast_switches.h"
#include "chromecast/crash/cast_crash_keys.h"
+#include "chromecast/media/base/media_caps.h"
#include "chromecast/renderer/cast_media_load_deferrer.h"
#include "chromecast/renderer/cast_render_process_observer.h"
#include "chromecast/renderer/key_systems_cast.h"
@@ -107,6 +109,16 @@ void CastContentRendererClient::RenderThreadStarted() {
PlatformPollFreemem();
#endif
+ // Set the initial known codecs mask.
+ if (command_line->HasSwitch(switches::kHdmiSinkSupportedCodecs)) {
+ int hdmi_codecs_mask;
+ if (base::StringToInt(command_line->GetSwitchValueASCII(
+ switches::kHdmiSinkSupportedCodecs),
+ &hdmi_codecs_mask)) {
+ ::media::SetHdmiSinkCodecs(hdmi_codecs_mask);
+ }
+ }
+
cast_observer_.reset(
new CastRenderProcessObserver(PlatformGetRendererMessageFilters()));
diff --git a/chromecast/renderer/cast_render_process_observer.cc b/chromecast/renderer/cast_render_process_observer.cc
index 316fd616..caba244 100644
--- a/chromecast/renderer/cast_render_process_observer.cc
+++ b/chromecast/renderer/cast_render_process_observer.cc
@@ -4,6 +4,7 @@
#include "chromecast/renderer/cast_render_process_observer.h"
+#include "chromecast/renderer/media/capabilities_message_filter.h"
#include "chromecast/renderer/media/cma_message_filter_proxy.h"
#include "content/public/renderer/render_thread.h"
@@ -31,6 +32,8 @@ void CastRenderProcessObserver::CreateCustomFilters() {
new media::CmaMessageFilterProxy(thread->GetIOMessageLoopProxy());
thread->AddFilter(cma_message_filter_proxy_.get());
#endif // !defined(OS_ANDROID)
+ capabilities_message_filter_ = new CapabilitiesMessageFilter;
+ thread->AddFilter(capabilities_message_filter_.get());
for (const auto& filter : platform_message_filters_) {
thread->AddFilter(filter.get());
}
@@ -41,9 +44,13 @@ void CastRenderProcessObserver::OnRenderProcessShutdown() {
#if !defined(OS_ANDROID)
if (cma_message_filter_proxy_.get()) {
thread->RemoveFilter(cma_message_filter_proxy_.get());
- cma_message_filter_proxy_ = NULL;
+ cma_message_filter_proxy_ = nullptr;
}
#endif // !defined(OS_ANDROID)
+ if (capabilities_message_filter_.get()) {
+ thread->RemoveFilter(capabilities_message_filter_.get());
+ capabilities_message_filter_ = nullptr;
+ }
for (auto& filter : platform_message_filters_) {
if (filter.get()) {
thread->RemoveFilter(filter.get());
diff --git a/chromecast/renderer/cast_render_process_observer.h b/chromecast/renderer/cast_render_process_observer.h
index 0c28b581..479026c 100644
--- a/chromecast/renderer/cast_render_process_observer.h
+++ b/chromecast/renderer/cast_render_process_observer.h
@@ -16,6 +16,7 @@ class MessageFilter;
}
namespace chromecast {
+class CapabilitiesMessageFilter;
namespace media {
class CmaMessageFilterProxy;
}
@@ -38,6 +39,7 @@ class CastRenderProcessObserver : public content::RenderProcessObserver {
#if !defined(OS_ANDROID)
scoped_refptr<media::CmaMessageFilterProxy> cma_message_filter_proxy_;
#endif // !defined(OS_ANDROID)
+ scoped_refptr<CapabilitiesMessageFilter> capabilities_message_filter_;
std::vector<scoped_refptr<IPC::MessageFilter>> platform_message_filters_;
DISALLOW_COPY_AND_ASSIGN(CastRenderProcessObserver);
diff --git a/chromecast/renderer/media/capabilities_message_filter.cc b/chromecast/renderer/media/capabilities_message_filter.cc
new file mode 100644
index 0000000..fb10972
--- /dev/null
+++ b/chromecast/renderer/media/capabilities_message_filter.cc
@@ -0,0 +1,32 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromecast/renderer/media/capabilities_message_filter.h"
+
+#include "chromecast/common/media/cast_messages.h"
+#include "chromecast/media/base/media_caps.h"
+
+namespace chromecast {
+
+CapabilitiesMessageFilter::CapabilitiesMessageFilter() {
+}
+
+CapabilitiesMessageFilter::~CapabilitiesMessageFilter() {
+}
+
+bool CapabilitiesMessageFilter::OnMessageReceived(const IPC::Message& message) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(CapabilitiesMessageFilter, message)
+ IPC_MESSAGE_HANDLER(CmaMsg_UpdateSupportedHdmiSinkCodecs,
+ OnUpdateSupportedHdmiSinkCodecs)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
+void CapabilitiesMessageFilter::OnUpdateSupportedHdmiSinkCodecs(int codecs) {
+ ::media::SetHdmiSinkCodecs(codecs);
+}
+
+} // namespace chromecast
diff --git a/chromecast/renderer/media/capabilities_message_filter.h b/chromecast/renderer/media/capabilities_message_filter.h
new file mode 100644
index 0000000..6c9c1de
--- /dev/null
+++ b/chromecast/renderer/media/capabilities_message_filter.h
@@ -0,0 +1,29 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMECAST_RENDERER_MEDIA_CAPABILITIES_MESSAGE_FILTER_H_
+#define CHROMECAST_RENDERER_MEDIA_CAPABILITIES_MESSAGE_FILTER_H_
+
+#include "ipc/message_filter.h"
+
+namespace chromecast {
+
+class CapabilitiesMessageFilter : public IPC::MessageFilter {
+ public:
+ CapabilitiesMessageFilter();
+
+ // IPC::ChannelProxy::MessageFilter implementation:
+ bool OnMessageReceived(const IPC::Message& message) override;
+
+ private:
+ ~CapabilitiesMessageFilter() override;
+
+ void OnUpdateSupportedHdmiSinkCodecs(int codecs);
+
+ DISALLOW_COPY_AND_ASSIGN(CapabilitiesMessageFilter);
+};
+
+} // namespace chromecast
+
+#endif // CHROMECAST_RENDERER_MEDIA_CAPABILITIES_MESSAGE_FILTER_H_