Commit 4d1b80a4 authored by halliwell's avatar halliwell Committed by Commit bot

[Chromecast] Allow CMA backend to notify of key expiry

This allows CMA backend implementations to notify us when
keys have expired.  We will need a corresponding internal
CL to handle this event in the CDM and send keystatuseschange
event upward to JS.

BUG=internal b/22702612

Review URL: https://codereview.chromium.org/1407253007

Cr-Commit-Position: refs/heads/master@{#360523}
parent 02a37777
...@@ -175,6 +175,10 @@ class CastAudioOutputStream::Backend : public MediaPipelineBackend::Delegate { ...@@ -175,6 +175,10 @@ class CastAudioOutputStream::Backend : public MediaPipelineBackend::Delegate {
OnPushBufferComplete(decoder_, MediaPipelineBackend::kBufferFailed); OnPushBufferComplete(decoder_, MediaPipelineBackend::kBufferFailed);
} }
void OnKeyStatusChanged(const std::string& key_id,
CastKeyStatus key_status,
uint32_t system_code) override {}
base::WeakPtr<CastAudioOutputStream::Backend> GetWeakPtr() { base::WeakPtr<CastAudioOutputStream::Backend> GetWeakPtr() {
return weak_factory_.GetWeakPtr(); return weak_factory_.GetWeakPtr();
} }
......
...@@ -126,17 +126,25 @@ void BrowserCdmCast::OnSessionClosed(const std::string& session_id) { ...@@ -126,17 +126,25 @@ void BrowserCdmCast::OnSessionClosed(const std::string& session_id) {
session_closed_cb_.Run(session_id); session_closed_cb_.Run(session_id);
} }
void BrowserCdmCast::OnSessionKeysChange( void BrowserCdmCast::OnSessionKeysChange(const std::string& session_id,
const std::string& session_id, bool newly_usable_keys,
const ::media::KeyIdAndKeyPairs& keys) { ::media::CdmKeysInfo keys_info) {
::media::CdmKeysInfo cdm_keys_info; session_keys_change_cb_.Run(session_id, newly_usable_keys, keys_info.Pass());
if (newly_usable_keys)
player_tracker_impl_->NotifyNewKey();
}
void BrowserCdmCast::KeyIdAndKeyPairsToInfo(
const ::media::KeyIdAndKeyPairs& keys,
::media::CdmKeysInfo* keys_info) {
DCHECK(keys_info);
for (const std::pair<std::string, std::string>& key : keys) { for (const std::pair<std::string, std::string>& key : keys) {
cdm_keys_info.push_back(new ::media::CdmKeyInformation( scoped_ptr<::media::CdmKeyInformation> cdm_key_information(
key.first, ::media::CdmKeyInformation::USABLE, 0)); new ::media::CdmKeyInformation(key.first,
::media::CdmKeyInformation::USABLE, 0));
keys_info->push_back(cdm_key_information.release());
} }
session_keys_change_cb_.Run(session_id, true, cdm_keys_info.Pass());
player_tracker_impl_->NotifyNewKey();
} }
// A macro runs current member function on |task_runner_| thread. // A macro runs current member function on |task_runner_| thread.
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/sequenced_task_runner_helpers.h" #include "base/sequenced_task_runner_helpers.h"
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
#include "chromecast/public/media/cast_key_status.h"
#include "media/base/media_keys.h" #include "media/base/media_keys.h"
#include "media/base/player_tracker.h" #include "media/base/player_tracker.h"
#include "media/cdm/json_web_key.h" #include "media/cdm/json_web_key.h"
...@@ -62,6 +63,12 @@ class BrowserCdmCast : public ::media::MediaKeys, ...@@ -62,6 +63,12 @@ class BrowserCdmCast : public ::media::MediaKeys,
virtual scoped_ptr<DecryptContextImpl> GetDecryptContext( virtual scoped_ptr<DecryptContextImpl> GetDecryptContext(
const std::string& key_id) const = 0; const std::string& key_id) const = 0;
// Notifies that key status has changed (e.g. if expiry is detected by
// hardware decoder).
virtual void SetKeyStatus(const std::string& key_id,
CastKeyStatus key_status,
uint32_t system_code) = 0;
protected: protected:
~BrowserCdmCast() override; ~BrowserCdmCast() override;
...@@ -71,7 +78,11 @@ class BrowserCdmCast : public ::media::MediaKeys, ...@@ -71,7 +78,11 @@ class BrowserCdmCast : public ::media::MediaKeys,
::media::MediaKeys::MessageType message_type); ::media::MediaKeys::MessageType message_type);
void OnSessionClosed(const std::string& session_id); void OnSessionClosed(const std::string& session_id);
void OnSessionKeysChange(const std::string& session_id, void OnSessionKeysChange(const std::string& session_id,
const ::media::KeyIdAndKeyPairs& keys); bool newly_usable_keys,
::media::CdmKeysInfo keys_info);
void KeyIdAndKeyPairsToInfo(const ::media::KeyIdAndKeyPairs& keys,
::media::CdmKeysInfo* key_info);
private: private:
friend class BrowserCdmCastUi; friend class BrowserCdmCastUi;
......
...@@ -99,6 +99,9 @@ class AudioVideoPipelineDeviceTest : public testing::Test, ...@@ -99,6 +99,9 @@ class AudioVideoPipelineDeviceTest : public testing::Test,
MediaPipelineBackend::BufferStatus status) override; MediaPipelineBackend::BufferStatus status) override;
void OnEndOfStream(MediaPipelineBackend::Decoder* decoder) override; void OnEndOfStream(MediaPipelineBackend::Decoder* decoder) override;
void OnDecoderError(MediaPipelineBackend::Decoder* decoder) override; void OnDecoderError(MediaPipelineBackend::Decoder* decoder) override;
void OnKeyStatusChanged(const std::string& key_id,
CastKeyStatus key_status,
uint32_t system_code) override;
private: private:
void Initialize(); void Initialize();
...@@ -342,6 +345,12 @@ void AudioVideoPipelineDeviceTest::OnDecoderError( ...@@ -342,6 +345,12 @@ void AudioVideoPipelineDeviceTest::OnDecoderError(
ASSERT_TRUE(false); ASSERT_TRUE(false);
} }
void AudioVideoPipelineDeviceTest::OnKeyStatusChanged(const std::string& key_id,
CastKeyStatus key_status,
uint32_t system_code) {
ASSERT_TRUE(false);
}
void AudioVideoPipelineDeviceTest::OnPushBufferComplete( void AudioVideoPipelineDeviceTest::OnPushBufferComplete(
MediaPipelineBackend::Decoder* decoder, MediaPipelineBackend::Decoder* decoder,
MediaPipelineBackend::BufferStatus status) { MediaPipelineBackend::BufferStatus status) {
......
...@@ -155,6 +155,15 @@ void MediaPipelineImpl::OnDecoderError(MediaPipelineBackend::Decoder* decoder) { ...@@ -155,6 +155,15 @@ void MediaPipelineImpl::OnDecoderError(MediaPipelineBackend::Decoder* decoder) {
} }
} }
void MediaPipelineImpl::OnKeyStatusChanged(const std::string& key_id,
CastKeyStatus key_status,
uint32_t system_code) {
CMALOG(kLogControl) << __FUNCTION__;
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(cdm_);
cdm_->SetKeyStatus(key_id, key_status, system_code);
}
void MediaPipelineImpl::SetCdm(BrowserCdmCast* cdm) { void MediaPipelineImpl::SetCdm(BrowserCdmCast* cdm) {
CMALOG(kLogControl) << __FUNCTION__; CMALOG(kLogControl) << __FUNCTION__;
DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(thread_checker_.CalledOnValidThread());
......
...@@ -51,6 +51,9 @@ class MediaPipelineImpl : public MediaPipelineBackend::Delegate { ...@@ -51,6 +51,9 @@ class MediaPipelineImpl : public MediaPipelineBackend::Delegate {
MediaPipelineBackend::BufferStatus status) override; MediaPipelineBackend::BufferStatus status) override;
void OnEndOfStream(MediaPipelineBackend::Decoder* decoder) override; void OnEndOfStream(MediaPipelineBackend::Decoder* decoder) override;
void OnDecoderError(MediaPipelineBackend::Decoder* decoder) override; void OnDecoderError(MediaPipelineBackend::Decoder* decoder) override;
void OnKeyStatusChanged(const std::string& key_id,
CastKeyStatus key_status,
uint32_t system_code) override;
void InitializeAudio(const ::media::AudioDecoderConfig& config, void InitializeAudio(const ::media::AudioDecoderConfig& config,
const AvPipelineClient& client, const AvPipelineClient& client,
......
// 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_PUBLIC_MEDIA_CAST_KEY_STATUS_H_
#define CHROMECAST_PUBLIC_MEDIA_CAST_KEY_STATUS_H_
namespace chromecast {
namespace media {
// Status of encryption key. See EME spec for details:
// https://w3c.github.io/encrypted-media/ - not all key status values
// are supported currently.
enum CastKeyStatus { KEY_STATUS_USABLE = 0, KEY_STATUS_EXPIRED };
} // namespace media
} // namespace chromecast
#endif // CHROMECAST_PUBLIC_MEDIA_CAST_KEY_STATUS_H_
...@@ -5,6 +5,10 @@ ...@@ -5,6 +5,10 @@
#ifndef CHROMECAST_PUBLIC_MEDIA_MEDIA_PIPELINE_BACKEND_H_ #ifndef CHROMECAST_PUBLIC_MEDIA_MEDIA_PIPELINE_BACKEND_H_
#define CHROMECAST_PUBLIC_MEDIA_MEDIA_PIPELINE_BACKEND_H_ #define CHROMECAST_PUBLIC_MEDIA_MEDIA_PIPELINE_BACKEND_H_
#include <stdint.h>
#include <string>
#include "cast_key_status.h"
#include "decoder_config.h" #include "decoder_config.h"
namespace chromecast { namespace chromecast {
...@@ -142,6 +146,11 @@ class MediaPipelineBackend { ...@@ -142,6 +146,11 @@ class MediaPipelineBackend {
// will be made after this is called. // will be made after this is called.
virtual void OnDecoderError(Decoder* decoder) = 0; virtual void OnDecoderError(Decoder* decoder) = 0;
// Must be called when a decryption key status changes.
virtual void OnKeyStatusChanged(const std::string& key_id,
CastKeyStatus key_status,
uint32_t system_code) = 0;
protected: protected:
virtual ~Delegate() {} virtual ~Delegate() {}
}; };
......
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