diff options
author | gunsch <gunsch@chromium.org> | 2015-03-04 09:21:06 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-04 17:21:57 +0000 |
commit | 7ee951aad36bcd3d9cb5c1ef5ce504822a53073e (patch) | |
tree | a3f9dcb3a2e5caf3a6a713e44c1b2a5c015dcc2b /chromecast | |
parent | 090c49d7c2001d5279218ecdc6c046cb78cf7c51 (diff) | |
download | chromium_src-7ee951aad36bcd3d9cb5c1ef5ce504822a53073e.zip chromium_src-7ee951aad36bcd3d9cb5c1ef5ce504822a53073e.tar.gz chromium_src-7ee951aad36bcd3d9cb5c1ef5ce504822a53073e.tar.bz2 |
Chromecast: communicate HDMI-sink codec changes over IPC.
R=lcwu@chromium.org,servolk@chromium.org,tsepez@chromium.org
BUG=
Review URL: https://codereview.chromium.org/971913002
Cr-Commit-Position: refs/heads/master@{#319078}
Diffstat (limited to 'chromecast')
-rw-r--r-- | chromecast/chromecast.gyp | 5 | ||||
-rw-r--r-- | chromecast/common/chromecast_switches.cc | 3 | ||||
-rw-r--r-- | chromecast/common/chromecast_switches.h | 2 | ||||
-rw-r--r-- | chromecast/common/media/cast_message_generator.cc | 15 | ||||
-rw-r--r-- | chromecast/common/media/cast_message_generator.h | 8 | ||||
-rw-r--r-- | chromecast/common/media/cast_messages.h | 17 | ||||
-rw-r--r-- | chromecast/media/base/media_caps.cc | 38 | ||||
-rw-r--r-- | chromecast/media/base/media_caps.h | 12 | ||||
-rw-r--r-- | chromecast/media/media.gyp | 2 | ||||
-rw-r--r-- | chromecast/renderer/cast_content_renderer_client.cc | 12 | ||||
-rw-r--r-- | chromecast/renderer/cast_render_process_observer.cc | 9 | ||||
-rw-r--r-- | chromecast/renderer/cast_render_process_observer.h | 2 | ||||
-rw-r--r-- | chromecast/renderer/media/capabilities_message_filter.cc | 32 | ||||
-rw-r--r-- | chromecast/renderer/media/capabilities_message_filter.h | 29 |
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_ |