Commit 7ee951aa authored by gunsch's avatar gunsch Committed by Commit bot

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}
parent 090c49d7
...@@ -227,6 +227,9 @@ ...@@ -227,6 +227,9 @@
'common/cast_resource_delegate.h', 'common/cast_resource_delegate.h',
'common/chromecast_switches.cc', 'common/chromecast_switches.cc',
'common/chromecast_switches.h', '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/platform_client_auth.h',
'common/pref_names.cc', 'common/pref_names.cc',
'common/pref_names.h', 'common/pref_names.h',
...@@ -238,6 +241,8 @@ ...@@ -238,6 +241,8 @@
'renderer/cast_render_process_observer.h', 'renderer/cast_render_process_observer.h',
'renderer/key_systems_cast.cc', 'renderer/key_systems_cast.cc',
'renderer/key_systems_cast.h', 'renderer/key_systems_cast.h',
'renderer/media/capabilities_message_filter.cc',
'renderer/media/capabilities_message_filter.h',
], ],
'conditions': [ 'conditions': [
['chromecast_branding=="Chrome"', { ['chromecast_branding=="Chrome"', {
......
...@@ -9,6 +9,9 @@ namespace switches { ...@@ -9,6 +9,9 @@ namespace switches {
// Enable the CMA media pipeline. // Enable the CMA media pipeline.
const char kEnableCmaMediaPipeline[] = "enable-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) #if defined(OS_ANDROID)
// Enable file accesses for debug. // Enable file accesses for debug.
const char kEnableLocalFileAccesses[] = "enable-local-file-accesses"; const char kEnableLocalFileAccesses[] = "enable-local-file-accesses";
......
...@@ -9,7 +9,9 @@ ...@@ -9,7 +9,9 @@
namespace switches { namespace switches {
// Media switches
extern const char kEnableCmaMediaPipeline[]; extern const char kEnableCmaMediaPipeline[];
extern const char kHdmiSinkSupportedCodecs[];
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
// Content-implementation switches // Content-implementation switches
......
// 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"
// 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"
// 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 */)
// 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
...@@ -7,6 +7,18 @@ ...@@ -7,6 +7,18 @@
namespace media { 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 HdmiSinkSupportsAC3();
bool HdmiSinkSupportsDTS(); bool HdmiSinkSupportsDTS();
bool HdmiSinkSupportsDTSHD(); bool HdmiSinkSupportsDTSHD();
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
'base/decrypt_context_clearkey.h', 'base/decrypt_context_clearkey.h',
'base/key_systems_common.cc', 'base/key_systems_common.cc',
'base/key_systems_common.h', 'base/key_systems_common.h',
'base/media_caps.cc',
'base/media_caps.h',
'base/switching_media_renderer.cc', 'base/switching_media_renderer.cc',
'base/switching_media_renderer.h', 'base/switching_media_renderer.h',
], ],
......
...@@ -8,8 +8,10 @@ ...@@ -8,8 +8,10 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/memory/memory_pressure_listener.h" #include "base/memory/memory_pressure_listener.h"
#include "base/strings/string_number_conversions.h"
#include "chromecast/common/chromecast_switches.h" #include "chromecast/common/chromecast_switches.h"
#include "chromecast/crash/cast_crash_keys.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_media_load_deferrer.h"
#include "chromecast/renderer/cast_render_process_observer.h" #include "chromecast/renderer/cast_render_process_observer.h"
#include "chromecast/renderer/key_systems_cast.h" #include "chromecast/renderer/key_systems_cast.h"
...@@ -107,6 +109,16 @@ void CastContentRendererClient::RenderThreadStarted() { ...@@ -107,6 +109,16 @@ void CastContentRendererClient::RenderThreadStarted() {
PlatformPollFreemem(); PlatformPollFreemem();
#endif #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( cast_observer_.reset(
new CastRenderProcessObserver(PlatformGetRendererMessageFilters())); new CastRenderProcessObserver(PlatformGetRendererMessageFilters()));
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "chromecast/renderer/cast_render_process_observer.h" #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 "chromecast/renderer/media/cma_message_filter_proxy.h"
#include "content/public/renderer/render_thread.h" #include "content/public/renderer/render_thread.h"
...@@ -31,6 +32,8 @@ void CastRenderProcessObserver::CreateCustomFilters() { ...@@ -31,6 +32,8 @@ void CastRenderProcessObserver::CreateCustomFilters() {
new media::CmaMessageFilterProxy(thread->GetIOMessageLoopProxy()); new media::CmaMessageFilterProxy(thread->GetIOMessageLoopProxy());
thread->AddFilter(cma_message_filter_proxy_.get()); thread->AddFilter(cma_message_filter_proxy_.get());
#endif // !defined(OS_ANDROID) #endif // !defined(OS_ANDROID)
capabilities_message_filter_ = new CapabilitiesMessageFilter;
thread->AddFilter(capabilities_message_filter_.get());
for (const auto& filter : platform_message_filters_) { for (const auto& filter : platform_message_filters_) {
thread->AddFilter(filter.get()); thread->AddFilter(filter.get());
} }
...@@ -41,9 +44,13 @@ void CastRenderProcessObserver::OnRenderProcessShutdown() { ...@@ -41,9 +44,13 @@ void CastRenderProcessObserver::OnRenderProcessShutdown() {
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID)
if (cma_message_filter_proxy_.get()) { if (cma_message_filter_proxy_.get()) {
thread->RemoveFilter(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) #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_) { for (auto& filter : platform_message_filters_) {
if (filter.get()) { if (filter.get()) {
thread->RemoveFilter(filter.get()); thread->RemoveFilter(filter.get());
......
...@@ -16,6 +16,7 @@ class MessageFilter; ...@@ -16,6 +16,7 @@ class MessageFilter;
} }
namespace chromecast { namespace chromecast {
class CapabilitiesMessageFilter;
namespace media { namespace media {
class CmaMessageFilterProxy; class CmaMessageFilterProxy;
} }
...@@ -38,6 +39,7 @@ class CastRenderProcessObserver : public content::RenderProcessObserver { ...@@ -38,6 +39,7 @@ class CastRenderProcessObserver : public content::RenderProcessObserver {
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID)
scoped_refptr<media::CmaMessageFilterProxy> cma_message_filter_proxy_; scoped_refptr<media::CmaMessageFilterProxy> cma_message_filter_proxy_;
#endif // !defined(OS_ANDROID) #endif // !defined(OS_ANDROID)
scoped_refptr<CapabilitiesMessageFilter> capabilities_message_filter_;
std::vector<scoped_refptr<IPC::MessageFilter>> platform_message_filters_; std::vector<scoped_refptr<IPC::MessageFilter>> platform_message_filters_;
DISALLOW_COPY_AND_ASSIGN(CastRenderProcessObserver); DISALLOW_COPY_AND_ASSIGN(CastRenderProcessObserver);
......
// 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
// 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_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment