Re-subimission of https://codereview.chromium.org/1041213003/
[chromium-blink-merge.git] / content / renderer / media / render_media_client.cc
blob1922f3fbf2fa229e049ef9bacb38af884ccd5b61
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
3 // found in the LICENSE file.
5 #include "content/renderer/media/render_media_client.h"
7 #include "base/lazy_instance.h"
8 #include "base/logging.h"
9 #include "base/time/default_tick_clock.h"
10 #include "content/public/common/content_client.h"
11 #include "content/public/renderer/content_renderer_client.h"
13 namespace content {
15 static base::LazyInstance<RenderMediaClient> g_render_media_client =
16 LAZY_INSTANCE_INITIALIZER;
18 void RenderMediaClient::Initialize() {
19 g_render_media_client.Get();
22 RenderMediaClient::RenderMediaClient()
23 : has_updated_(false),
24 is_update_needed_(true),
25 tick_clock_(new base::DefaultTickClock()) {
26 media::SetMediaClient(this);
29 RenderMediaClient::~RenderMediaClient() {
32 void RenderMediaClient::AddKeySystemsInfoForUMA(
33 std::vector<media::KeySystemInfoForUMA>* key_systems_info_for_uma) {
34 DVLOG(2) << __FUNCTION__;
35 #if defined(WIDEVINE_CDM_AVAILABLE)
36 key_systems_info_for_uma->push_back(media::KeySystemInfoForUMA(
37 kWidevineKeySystem, kWidevineKeySystemNameForUMA, true));
38 #endif // WIDEVINE_CDM_AVAILABLE
41 bool RenderMediaClient::IsKeySystemsUpdateNeeded() {
42 DVLOG(2) << __FUNCTION__;
43 DCHECK(thread_checker_.CalledOnValidThread());
45 // Always needs update if we have never updated, regardless the
46 // |last_update_time_ticks_|'s initial value.
47 if (!has_updated_) {
48 DCHECK(is_update_needed_);
49 return true;
52 if (!is_update_needed_)
53 return false;
55 // The update could be expensive. For example, it could involve a sync IPC to
56 // the browser process. Use a minimum update interval to avoid unnecessarily
57 // frequent update.
58 static const int kMinUpdateIntervalInMilliseconds = 1000;
59 if ((tick_clock_->NowTicks() - last_update_time_ticks_).InMilliseconds() <
60 kMinUpdateIntervalInMilliseconds) {
61 return false;
64 return true;
67 void RenderMediaClient::AddSupportedKeySystems(
68 std::vector<media::KeySystemInfo>* key_systems_info) {
69 DVLOG(2) << __FUNCTION__;
70 DCHECK(thread_checker_.CalledOnValidThread());
72 GetContentClient()->renderer()->AddKeySystems(key_systems_info);
74 has_updated_ = true;
75 last_update_time_ticks_ = tick_clock_->NowTicks();
77 // Check whether all potentially supported key systems are supported. If so,
78 // no need to update again.
79 #if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT)
80 for (const media::KeySystemInfo& key_system_info : *key_systems_info) {
81 if (key_system_info.key_system == kWidevineKeySystem)
82 is_update_needed_ = false;
84 #else
85 is_update_needed_ = false;
86 #endif
89 void RenderMediaClient::SetTickClockForTesting(
90 scoped_ptr<base::TickClock> tick_clock) {
91 tick_clock_.swap(tick_clock);
94 // This functions is for testing purpose only. The declaration in the
95 // header file is guarded by "#if defined(UNIT_TEST)" so that it can be used
96 // by tests but not non-test code. However, this .cc file is compiled as part of
97 // "content" where "UNIT_TEST" is not defined. So we need to specify
98 // "CONTENT_EXPORT" here again so that it is visible to tests.
99 CONTENT_EXPORT RenderMediaClient* GetRenderMediaClientInstanceForTesting() {
100 return g_render_media_client.Pointer();
103 } // namespace content