Commit 7edc7917 authored by John Rummell's avatar John Rummell Committed by Commit Bot

Add support for CDM_9 interface

Adding support for CDM_9 interface. For mojo CDMs, this is only available
if the new flag "support-experimental-cdm-interface" is specified. For pepper
CDMs, a #define flag is used due to limited support for flags inside the
CDM adapter.

BUG=723357
TEST=locally with CDM_9 CDM

Change-Id: Ic54c7c51a2037ee1661ef5e52f00e24678fe855c
Reviewed-on: https://chromium-review.googlesource.com/554039
Commit-Queue: John Rummell <jrummell@chromium.org>
Reviewed-by: default avatarXiaohan Wang <xhwang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#485004}
parent b320f2c6
......@@ -262,7 +262,7 @@ deps = {
Var('chromium_git') + '/external/github.com/google/pywebsocket.git' + '@' + '2d7b73c3acbd0f41dcab487ae5c97c6feae06ce2',
'src/media/cdm/api':
Var('chromium_git') + '/chromium/cdm.git' + '@' + '46eebfa522b06c1f0b52b4233caa56793badf112',
Var('chromium_git') + '/chromium/cdm.git' + '@' + '6e4c388c0117fe408b66fbede91081fb1018c5fe',
'src/third_party/mesa/src':
Var('chromium_git') + '/chromium/deps/mesa.git' + '@' + 'ef811c6bd4de74e13e7035ca882cc77f85793fef',
......
......@@ -257,6 +257,9 @@ const base::Feature kVideoBlitColorAccuracy{"video-blit-color-accuracy",
const base::Feature kExternalClearKeyForTesting{
"external-clear-key-for-testing", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kSupportExperimentalCdmInterface{
"SupportExperimentalCdmInterface", base::FEATURE_DISABLED_BY_DEFAULT};
// Enables low-delay video rendering in media pipeline on "live" stream.
const base::Feature kLowDelayVideoRenderingOnLiveStream{
"low-delay-video-rendering-on-live-stream",
......
......@@ -108,6 +108,7 @@ MEDIA_EXPORT extern const base::Feature kComplexityBasedVideoBuffering;
MEDIA_EXPORT extern const base::Feature kExternalClearKeyForTesting;
MEDIA_EXPORT extern const base::Feature kLowDelayVideoRenderingOnLiveStream;
MEDIA_EXPORT extern const base::Feature kMediaCastOverlayButton;
MEDIA_EXPORT extern const base::Feature kMediaEngagement;
MEDIA_EXPORT extern const base::Feature kMemoryPressureBasedSourceBufferGC;
MEDIA_EXPORT extern const base::Feature kMojoCdm;
MEDIA_EXPORT extern const base::Feature kNewAudioRenderingMixingStrategy;
......@@ -115,12 +116,12 @@ MEDIA_EXPORT extern const base::Feature kNewRemotePlaybackPipeline;
MEDIA_EXPORT extern const base::Feature kOverlayFullscreenVideo;
MEDIA_EXPORT extern const base::Feature kResumeBackgroundVideo;
MEDIA_EXPORT extern const base::Feature kSpecCompliantCanPlayThrough;
MEDIA_EXPORT extern const base::Feature kSupportExperimentalCdmInterface;
MEDIA_EXPORT extern const base::Feature kUseAndroidOverlay;
MEDIA_EXPORT extern const base::Feature kUseNewMediaCache;
MEDIA_EXPORT extern const base::Feature kVideoBlitColorAccuracy;
MEDIA_EXPORT extern const base::Feature kVideoColorManagement;
MEDIA_EXPORT extern const base::Feature kUseSurfaceLayerForVideo;
MEDIA_EXPORT extern const base::Feature kMediaEngagement;
#if defined(OS_ANDROID)
MEDIA_EXPORT extern const base::Feature kVideoFullscreenOrientationLock;
......
......@@ -66,26 +66,40 @@ cdm::InitDataType ToCdmInitDataType(EmeInitDataType init_data_type) {
return cdm::kKeyIds;
}
CdmPromise::Exception ToMediaExceptionType(cdm::Error error) {
CdmPromise::Exception ToMediaExceptionType(cdm::Exception exception) {
switch (exception) {
case cdm::kExceptionTypeError:
return CdmPromise::INVALID_ACCESS_ERROR;
case cdm::kExceptionNotSupportedError:
return CdmPromise::NOT_SUPPORTED_ERROR;
case cdm::kExceptionInvalidStateError:
return CdmPromise::INVALID_STATE_ERROR;
case cdm::kExceptionQuotaExceededError:
return CdmPromise::QUOTA_EXCEEDED_ERROR;
}
NOTREACHED() << "Unexpected cdm::Exception " << exception;
return CdmPromise::INVALID_STATE_ERROR;
}
cdm::Exception ToCdmExceptionType(cdm::Error error) {
switch (error) {
case cdm::kNotSupportedError:
return CdmPromise::NOT_SUPPORTED_ERROR;
return cdm::kExceptionNotSupportedError;
case cdm::kInvalidStateError:
return CdmPromise::INVALID_STATE_ERROR;
return cdm::kExceptionTypeError;
case cdm::kInvalidAccessError:
return CdmPromise::INVALID_ACCESS_ERROR;
return cdm::kExceptionInvalidStateError;
case cdm::kQuotaExceededError:
return CdmPromise::QUOTA_EXCEEDED_ERROR;
return cdm::kExceptionQuotaExceededError;
case cdm::kUnknownError:
return CdmPromise::UNKNOWN_ERROR;
case cdm::kClientError:
return CdmPromise::CLIENT_ERROR;
case cdm::kOutputError:
return CdmPromise::OUTPUT_ERROR;
break;
}
NOTREACHED() << "Unexpected cdm::Error " << error;
return CdmPromise::UNKNOWN_ERROR;
return cdm::kExceptionInvalidStateError;
}
CdmMessageType ToMediaMessageType(cdm::MessageType message_type) {
......@@ -220,7 +234,7 @@ Decryptor::Status ToMediaDecryptorStatus(cdm::Status status) {
return Decryptor::kError;
case cdm::kDecodeError:
return Decryptor::kError;
case cdm::kSessionError:
case cdm::kInitializationError:
case cdm::kDeferredInitialization:
break;
}
......@@ -294,7 +308,7 @@ void* GetCdmHost(int host_interface_version, void* user_data) {
return nullptr;
static_assert(
cdm::ContentDecryptionModule::Host::kVersion == cdm::Host_8::kVersion,
cdm::ContentDecryptionModule::Host::kVersion == cdm::Host_9::kVersion,
"update the code below");
// Ensure IsSupportedCdmHostVersion matches implementation of this function.
......@@ -304,10 +318,11 @@ void* GetCdmHost(int host_interface_version, void* user_data) {
DCHECK(
// Future version is not supported.
!IsSupportedCdmHostVersion(cdm::Host_8::kVersion + 1) &&
!IsSupportedCdmHostVersion(cdm::Host_9::kVersion + 1) &&
// Current version is supported.
IsSupportedCdmHostVersion(cdm::Host_8::kVersion) &&
IsSupportedCdmHostVersion(cdm::Host_9::kVersion) &&
// Include all previous supported versions (if any) here.
IsSupportedCdmHostVersion(cdm::Host_8::kVersion) &&
// One older than the oldest supported version is not supported.
!IsSupportedCdmHostVersion(cdm::Host_8::kVersion - 1));
DCHECK(IsSupportedCdmHostVersion(host_interface_version));
......@@ -317,6 +332,8 @@ void* GetCdmHost(int host_interface_version, void* user_data) {
switch (host_interface_version) {
case cdm::Host_8::kVersion:
return static_cast<cdm::Host_8*>(cdm_adapter);
case cdm::Host_9::kVersion:
return static_cast<cdm::Host_9*>(cdm_adapter);
default:
NOTREACHED() << "Unexpected host interface version "
<< host_interface_version;
......@@ -734,6 +751,15 @@ cdm::Time CdmAdapter::GetCurrentWallTime() {
return base::Time::Now().ToDoubleT();
}
void CdmAdapter::OnResolveKeyStatusPromise(uint32_t promise_id,
cdm::KeyStatus key_status) {
// TODO(xhwang): Implement HDCP Policy Check. https://crbug.com/709348.
NOTIMPLEMENTED();
cdm_promise_adapter_.RejectPromise(promise_id,
CdmPromise::NOT_SUPPORTED_ERROR, 0,
"HDCP Policy Check not implemented.");
}
void CdmAdapter::OnResolvePromise(uint32_t promise_id) {
DCHECK(task_runner_->BelongsToCurrentThread());
cdm_promise_adapter_.ResolvePromise(promise_id);
......@@ -748,27 +774,33 @@ void CdmAdapter::OnResolveNewSessionPromise(uint32_t promise_id,
}
void CdmAdapter::OnRejectPromise(uint32_t promise_id,
cdm::Error error,
cdm::Exception exception,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) {
DCHECK(task_runner_->BelongsToCurrentThread());
cdm_promise_adapter_.RejectPromise(
promise_id, ToMediaExceptionType(error), system_code,
promise_id, ToMediaExceptionType(exception), system_code,
std::string(error_message, error_message_size));
}
void CdmAdapter::OnRejectPromise(uint32_t promise_id,
cdm::Error error,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) {
// cdm::Host_8 version. Remove when CDM_8 no longer supported.
// https://crbug.com/737296.
OnRejectPromise(promise_id, ToCdmExceptionType(error), system_code,
error_message, error_message_size);
}
void CdmAdapter::OnSessionMessage(const char* session_id,
uint32_t session_id_size,
cdm::MessageType message_type,
const char* message,
uint32_t message_size,
const char* legacy_destination_url,
uint32_t legacy_destination_url_size) {
uint32_t message_size) {
DCHECK(task_runner_->BelongsToCurrentThread());
// |legacy_destination_url| is obsolete and will be removed as part of
// https://crbug.com/570216.
const uint8_t* message_ptr = reinterpret_cast<const uint8_t*>(message);
session_message_cb_.Run(
std::string(session_id, session_id_size),
......@@ -776,6 +808,19 @@ void CdmAdapter::OnSessionMessage(const char* session_id,
std::vector<uint8_t>(message_ptr, message_ptr + message_size));
}
void CdmAdapter::OnSessionMessage(const char* session_id,
uint32_t session_id_size,
cdm::MessageType message_type,
const char* message,
uint32_t message_size,
const char* /* legacy_destination_url */,
uint32_t /* legacy_destination_url_size */) {
// cdm::Host_8 version. Remove when CDM_8 no longer supported.
// https://crbug.com/737296.
OnSessionMessage(session_id, session_id_size, message_type, message,
message_size);
}
void CdmAdapter::OnSessionKeysChange(const char* session_id,
uint32_t session_id_size,
bool has_additional_usable_key,
......@@ -827,8 +872,9 @@ void CdmAdapter::OnLegacySessionError(const char* session_id,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) {
// cdm::Host_8 version. Remove when CDM_8 no longer supported.
// https://crbug.com/737296.
DCHECK(task_runner_->BelongsToCurrentThread());
// Obsolete and will be removed as part of https://crbug.com/570216.
}
void CdmAdapter::SendPlatformChallenge(const char* service_id,
......@@ -888,6 +934,12 @@ cdm::FileIO* CdmAdapter::CreateFileIO(cdm::FileIOClient* client) {
return file_io.release();
}
void CdmAdapter::RequestStorageId() {
// TODO(jrummell): Implement Storage Id. https://crbug.com/478960.
NOTIMPLEMENTED();
cdm_->OnStorageId(nullptr, 0);
}
bool CdmAdapter::AudioFramesDataToAudioFrames(
std::unique_ptr<AudioFramesImpl> audio_frames,
Decryptor::AudioFrames* result_frames) {
......
......@@ -48,7 +48,8 @@ using CreateCdmFileIOCB =
class MEDIA_EXPORT CdmAdapter : public ContentDecryptionModule,
public CdmContext,
public Decryptor,
NON_EXPORTED_BASE(public cdm::Host_8) {
NON_EXPORTED_BASE(public cdm::Host_8),
NON_EXPORTED_BASE(public cdm::Host_9) {
public:
// Create the CDM using |cdm_path| and initialize it using |key_system| and
// |cdm_config|. |allocator| is to be used whenever the CDM needs memory
......@@ -110,16 +111,18 @@ class MEDIA_EXPORT CdmAdapter : public ContentDecryptionModule,
void ResetDecoder(StreamType stream_type) final;
void DeinitializeDecoder(StreamType stream_type) final;
// cdm::Host_8 implementation.
// cdm::Host_9 implementation.
cdm::Buffer* Allocate(uint32_t capacity) override;
void SetTimer(int64_t delay_ms, void* context) override;
cdm::Time GetCurrentWallTime() override;
void OnResolveKeyStatusPromise(uint32_t promise_id,
cdm::KeyStatus key_status) override;
void OnResolveNewSessionPromise(uint32_t promise_id,
const char* session_id,
uint32_t session_id_size) override;
void OnResolvePromise(uint32_t promise_id) override;
void OnRejectPromise(uint32_t promise_id,
cdm::Error error,
cdm::Exception exception,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) override;
......@@ -127,9 +130,7 @@ class MEDIA_EXPORT CdmAdapter : public ContentDecryptionModule,
uint32_t session_id_size,
cdm::MessageType message_type,
const char* message,
uint32_t message_size,
const char* legacy_destination_url,
uint32_t legacy_destination_url_size) override;
uint32_t message_size) override;
void OnSessionKeysChange(const char* session_id,
uint32_t session_id_size,
bool has_additional_usable_key,
......@@ -140,12 +141,6 @@ class MEDIA_EXPORT CdmAdapter : public ContentDecryptionModule,
cdm::Time new_expiry_time) override;
void OnSessionClosed(const char* session_id,
uint32_t session_id_size) override;
void OnLegacySessionError(const char* session_id,
uint32_t session_id_size,
cdm::Error error,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) override;
void SendPlatformChallenge(const char* service_id,
uint32_t service_id_size,
const char* challenge,
......@@ -155,6 +150,27 @@ class MEDIA_EXPORT CdmAdapter : public ContentDecryptionModule,
void OnDeferredInitializationDone(cdm::StreamType stream_type,
cdm::Status decoder_status) override;
cdm::FileIO* CreateFileIO(cdm::FileIOClient* client) override;
void RequestStorageId() override;
// cdm::Host_8 specific implementation.
void OnRejectPromise(uint32_t promise_id,
cdm::Error error,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) override;
void OnSessionMessage(const char* session_id,
uint32_t session_id_size,
cdm::MessageType message_type,
const char* message,
uint32_t message_size,
const char* legacy_destination_url,
uint32_t legacy_destination_url_size) override;
void OnLegacySessionError(const char* session_id,
uint32_t session_id_size,
cdm::Error error,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) override;
private:
CdmAdapter(const std::string& key_system,
......
......@@ -19,11 +19,28 @@
#define PLATFORM_DCHECK PP_DCHECK
#else
#include "base/logging.h"
#include "media/base/media_switches.h" // nogncheck
#define PLATFORM_DCHECK DCHECK
#endif
namespace media {
namespace {
bool IsExperimentalCdmInterfaceSupported() {
#if defined(USE_PPAPI_CDM_ADAPTER)
#if defined(SUPPORT_EXPERIMENTAL_CDM_INTERFACE)
return true;
#else
return false;
#endif // defined(SUPPORT_EXPERIMENTAL_CDM_INTERFACE)
#else
return base::FeatureList::IsEnabled(media::kSupportExperimentalCdmInterface);
#endif // defined(USE_PPAPI_CDM_ADAPTER)
}
} // namespace
// Returns a pointer to the requested CDM upon success.
// Returns NULL if an error occurs or the requested |cdm_interface_version| or
// |key_system| is not supported or another error occurs.
......@@ -109,6 +126,8 @@ class CdmWrapper {
cdm::QueryResult result,
uint32_t link_mask,
uint32_t output_protection_mask) = 0;
virtual void OnStorageId(const uint8_t* storage_id,
uint32_t storage_id_size) = 0;
protected:
CdmWrapper() {}
......@@ -238,6 +257,10 @@ class CdmWrapperImpl : public CdmWrapper {
output_protection_mask);
}
void OnStorageId(const uint8_t* storage_id, uint32_t storage_id_size) {
cdm_->OnStorageId(storage_id, storage_id_size);
}
private:
CdmWrapperImpl(CdmInterface* cdm) : cdm_(cdm) { PLATFORM_DCHECK(cdm_); }
......@@ -246,13 +269,22 @@ class CdmWrapperImpl : public CdmWrapper {
DISALLOW_COPY_AND_ASSIGN(CdmWrapperImpl);
};
// Overrides for cdm::Host_8 methods.
// TODO(jrummell): Remove when CDM_8 no longer supported.
// https://crbug.com/737296.
template <>
void CdmWrapperImpl<cdm::ContentDecryptionModule_8>::OnStorageId(
const uint8_t* storage_id,
uint32_t storage_id_size) {}
CdmWrapper* CdmWrapper::Create(CreateCdmFunc create_cdm_func,
const char* key_system,
uint32_t key_system_size,
GetCdmHostFunc get_cdm_host_func,
void* user_data) {
static_assert(cdm::ContentDecryptionModule::kVersion ==
cdm::ContentDecryptionModule_8::kVersion,
cdm::ContentDecryptionModule_9::kVersion,
"update the code below");
// Ensure IsSupportedCdmInterfaceVersion() matches this implementation.
......@@ -260,17 +292,32 @@ CdmWrapper* CdmWrapper::Create(CreateCdmFunc create_cdm_func,
// If this check fails, update this function and DCHECK or update
// IsSupportedCdmInterfaceVersion().
PLATFORM_DCHECK(!IsSupportedCdmInterfaceVersion(
cdm::ContentDecryptionModule_8::kVersion + 1) &&
cdm::ContentDecryptionModule_9::kVersion + 1) &&
IsSupportedCdmInterfaceVersion(
cdm::ContentDecryptionModule_9::kVersion) &&
IsSupportedCdmInterfaceVersion(
cdm::ContentDecryptionModule_8::kVersion) &&
!IsSupportedCdmInterfaceVersion(
cdm::ContentDecryptionModule_8::kVersion - 1));
// Try to create the CDM using the latest CDM interface version.
CdmWrapper* cdm_wrapper =
CdmWrapperImpl<cdm::ContentDecryptionModule>::Create(
create_cdm_func, key_system, key_system_size, get_cdm_host_func,
user_data);
// This is only attempted if requested. For pepper plugins, this is done
// at compile time. For mojo, it is done using a media feature setting.
CdmWrapper* cdm_wrapper = nullptr;
if (IsExperimentalCdmInterfaceSupported()) {
cdm_wrapper = CdmWrapperImpl<cdm::ContentDecryptionModule_9>::Create(
create_cdm_func, key_system, key_system_size, get_cdm_host_func,
user_data);
}
// If |cdm_wrapper| is NULL, try to create the CDM using older supported
// versions of the CDM interface here.
if (!cdm_wrapper) {
cdm_wrapper = CdmWrapperImpl<cdm::ContentDecryptionModule_8>::Create(
create_cdm_func, key_system, key_system_size, get_cdm_host_func,
user_data);
}
return cdm_wrapper;
}
......@@ -280,7 +327,7 @@ CdmWrapper* CdmWrapper::Create(CreateCdmFunc create_cdm_func,
// does not have.
// Also update supported_cdm_versions.h.
static_assert(cdm::ContentDecryptionModule::kVersion ==
cdm::ContentDecryptionModule_8::kVersion,
cdm::ContentDecryptionModule_9::kVersion,
"ensure cdm wrapper templates have old version support");
} // namespace media
......
......@@ -65,7 +65,10 @@ ppapi_cdm_adapter("clearkeycdmadapter") {
output_dir = "$root_out_dir/$clearkey_cdm_path"
# Check whether the plugin's origin URL is valid.
defines = [ "CHECK_DOCUMENT_URL" ]
defines = [
"CHECK_DOCUMENT_URL",
"SUPPORT_EXPERIMENTAL_CDM_INTERFACE",
]
deps = [
":clearkeycdm",
":clearkeycdmadapter_resources",
......
......@@ -548,14 +548,14 @@ cdm::Status ClearKeyCdm::Decrypt(const cdm::InputBuffer& encrypted_buffer,
cdm::Status ClearKeyCdm::InitializeAudioDecoder(
const cdm::AudioDecoderConfig& audio_decoder_config) {
if (key_system_ == kExternalClearKeyDecryptOnlyKeySystem)
return cdm::kSessionError;
return cdm::kInitializationError;
#if defined(CLEAR_KEY_CDM_USE_FFMPEG_DECODER)
if (!audio_decoder_)
audio_decoder_.reset(new media::FFmpegCdmAudioDecoder(host_));
if (!audio_decoder_->Initialize(audio_decoder_config))
return cdm::kSessionError;
return cdm::kInitializationError;
return cdm::kSuccess;
#elif defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER)
......@@ -572,17 +572,17 @@ cdm::Status ClearKeyCdm::InitializeAudioDecoder(
cdm::Status ClearKeyCdm::InitializeVideoDecoder(
const cdm::VideoDecoderConfig& video_decoder_config) {
if (key_system_ == kExternalClearKeyDecryptOnlyKeySystem)
return cdm::kSessionError;
return cdm::kInitializationError;
if (video_decoder_ && video_decoder_->is_initialized()) {
DCHECK(!video_decoder_->is_initialized());
return cdm::kSessionError;
return cdm::kInitializationError;
}
// Any uninitialized decoder will be replaced.
video_decoder_ = CreateVideoDecoder(host_, video_decoder_config);
if (!video_decoder_)
return cdm::kSessionError;
return cdm::kInitializationError;
return cdm::kSuccess;
}
......
This diff is collapsed.
......@@ -35,7 +35,8 @@ void* GetCdmHost(int host_interface_version, void* user_data);
// Content Decryption Module (CDM).
class PpapiCdmAdapter : public pp::Instance,
public pp::ContentDecryptor_Private,
public cdm::Host_8 {
public cdm::Host_8,
public cdm::Host_9 {
public:
PpapiCdmAdapter(PP_Instance instance, pp::Module* module);
virtual ~PpapiCdmAdapter();
......@@ -82,16 +83,18 @@ class PpapiCdmAdapter : public pp::Instance,
pp::Buffer_Dev encrypted_buffer,
const PP_EncryptedBlockInfo& encrypted_block_info) override;
// cdm::Host_8 implementation.
// cdm::Host_9 implementation.
cdm::Buffer* Allocate(uint32_t capacity) override;
void SetTimer(int64_t delay_ms, void* context) override;
cdm::Time GetCurrentWallTime() override;
void OnResolveKeyStatusPromise(uint32_t promise_id,
cdm::KeyStatus key_status) override;
void OnResolveNewSessionPromise(uint32_t promise_id,
const char* session_id,
uint32_t session_id_size) override;
void OnResolvePromise(uint32_t promise_id) override;
void OnRejectPromise(uint32_t promise_id,
cdm::Error error,
cdm::Exception exception,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) override;
......@@ -99,9 +102,7 @@ class PpapiCdmAdapter : public pp::Instance,
uint32_t session_id_size,
cdm::MessageType message_type,
const char* message,
uint32_t message_size,
const char* legacy_destination_url,
uint32_t legacy_destination_url_size) override;
uint32_t message_size) override;
void OnSessionKeysChange(const char* session_id,
uint32_t session_id_size,
bool has_additional_usable_key,
......@@ -112,12 +113,6 @@ class PpapiCdmAdapter : public pp::Instance,
cdm::Time new_expiry_time) override;
void OnSessionClosed(const char* session_id,
uint32_t session_id_size) override;
void OnLegacySessionError(const char* session_id,
uint32_t session_id_size,
cdm::Error error,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) override;
void SendPlatformChallenge(const char* service_id,
uint32_t service_id_size,
const char* challenge,
......@@ -126,8 +121,29 @@ class PpapiCdmAdapter : public pp::Instance,
void QueryOutputProtectionStatus() override;
void OnDeferredInitializationDone(cdm::StreamType stream_type,
cdm::Status decoder_status) override;
void RequestStorageId() override;
cdm::FileIO* CreateFileIO(cdm::FileIOClient* client) override;
// cdm::Host_8 implementation (differences from Host_9).
void OnSessionMessage(const char* session_id,
uint32_t session_id_size,
cdm::MessageType message_type,
const char* message,
uint32_t message_size,
const char* legacy_destination_url,
uint32_t legacy_destination_url_size) override;
void OnRejectPromise(uint32_t promise_id,
cdm::Error error,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) override;
void OnLegacySessionError(const char* session_id,
uint32_t session_id_size,
cdm::Error error,
uint32_t system_code,
const char* error_message,
uint32_t error_message_size) override;
private:
// These are reported to UMA server. Do not change the existing values!
enum OutputProtectionStatus {
......@@ -142,10 +158,10 @@ class PpapiCdmAdapter : public pp::Instance,
typedef linked_ptr<AudioFramesImpl> LinkedAudioFrames;
struct SessionError {
SessionError(cdm::Error error,
SessionError(cdm::Exception exception,
uint32_t system_code,
const std::string& error_description);
cdm::Error error;
cdm::Exception exception;
uint32_t system_code;
std::string error_description;
};
......@@ -187,7 +203,7 @@ class PpapiCdmAdapter : public pp::Instance,
const std::string& session_id,
cdm::Time new_expiry_time);
void RejectPromise(uint32_t promise_id,
cdm::Error error,
cdm::Exception exception,
uint32_t system_code,
const std::string& error_message);
......
......@@ -20,10 +20,11 @@ bool IsSupportedCdmModuleVersion(int version) {
bool IsSupportedCdmInterfaceVersion(int version) {
static_assert(cdm::ContentDecryptionModule::kVersion ==
cdm::ContentDecryptionModule_8::kVersion,
cdm::ContentDecryptionModule_9::kVersion,
"update the code below");
switch (version) {
// Supported versions in decreasing order.
case cdm::ContentDecryptionModule_9::kVersion:
case cdm::ContentDecryptionModule_8::kVersion:
return true;
default:
......@@ -33,10 +34,11 @@ bool IsSupportedCdmInterfaceVersion(int version) {
bool IsSupportedCdmHostVersion(int version) {
static_assert(cdm::ContentDecryptionModule::Host::kVersion ==
cdm::ContentDecryptionModule_8::Host::kVersion,
cdm::ContentDecryptionModule_9::Host::kVersion,
"update the code below");
switch (version) {
// Supported versions in decreasing order.
case cdm::Host_9::kVersion:
case cdm::Host_8::kVersion:
return true;
default:
......
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