Commit 164391c5 authored by Xiaohan Wang's avatar Xiaohan Wang Committed by Commit Bot

media: Move library CDM type converters to a central file

Adds cdm_type_converters.{h,cc} which collects all type converters
between cdm:: and media:: types.

Some conversion functions are renamed for consistency.

Bug: 707128
Test: No functionality change.
Change-Id: I0ac755f8820d4cf719f3b2c6c6885ec21f45f129
Reviewed-on: https://chromium-review.googlesource.com/c/1260488
Commit-Queue: Xiaohan Wang <xhwang@chromium.org>
Reviewed-by: default avatarJohn Rummell <jrummell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#597347}
parent 88206a41
......@@ -86,6 +86,8 @@ source_set("cdm") {
"cdm_helpers.h",
"cdm_module.cc",
"cdm_module.h",
"cdm_type_conversion.cc",
"cdm_type_conversion.h",
"cdm_wrapper.h",
"output_protection.h",
"platform_verification.h",
......
This diff is collapsed.
This diff is collapsed.
// Copyright 2018 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 MEDIA_CDM_CDM_TYPE_CONVERSION_H_
#define MEDIA_CDM_CDM_TYPE_CONVERSION_H_
#include <vector>
#include "media/base/audio_codecs.h"
#include "media/base/audio_decoder_config.h"
#include "media/base/cdm_key_information.h"
#include "media/base/cdm_promise.h"
#include "media/base/channel_layout.h"
#include "media/base/content_decryption_module.h"
#include "media/base/decoder_buffer.h"
#include "media/base/decrypt_config.h"
#include "media/base/decryptor.h"
#include "media/base/encryption_scheme.h"
#include "media/base/media_export.h"
#include "media/base/sample_format.h"
#include "media/base/video_codecs.h"
#include "media/base/video_color_space.h"
#include "media/base/video_decoder_config.h"
#include "media/base/video_types.h"
#include "media/cdm/api/content_decryption_module.h"
namespace media {
// Color Converters
MEDIA_EXPORT cdm::ColorSpace ToCdmColorSpace(
const VideoColorSpace& color_space);
MEDIA_EXPORT VideoColorSpace
ToMediaColorSpace(const cdm::ColorSpace& color_space);
// CDM Converters
MEDIA_EXPORT cdm::HdcpVersion ToCdmHdcpVersion(HdcpVersion hdcp_version);
MEDIA_EXPORT cdm::SessionType ToCdmSessionType(CdmSessionType session_type);
MEDIA_EXPORT CdmSessionType ToMediaSessionType(cdm::SessionType session_type);
MEDIA_EXPORT cdm::InitDataType ToCdmInitDataType(
EmeInitDataType init_data_type);
MEDIA_EXPORT EmeInitDataType
ToEmeInitDataType(cdm::InitDataType init_data_type);
MEDIA_EXPORT CdmKeyInformation::KeyStatus ToMediaKeyStatus(
cdm::KeyStatus status);
MEDIA_EXPORT cdm::KeyStatus ToCdmKeyStatus(CdmKeyInformation::KeyStatus status);
MEDIA_EXPORT cdm::EncryptionScheme ToCdmEncryptionScheme(
const EncryptionScheme& scheme);
MEDIA_EXPORT cdm::EncryptionScheme ToCdmEncryptionScheme(
const EncryptionMode& mode);
MEDIA_EXPORT CdmPromise::Exception ToMediaCdmPromiseException(
cdm::Exception exception);
MEDIA_EXPORT cdm::Exception ToCdmException(CdmPromise::Exception exception);
MEDIA_EXPORT CdmMessageType ToMediaMessageType(cdm::MessageType message_type);
MEDIA_EXPORT cdm::MessageType ToCdmMessageType(CdmMessageType message_type);
MEDIA_EXPORT cdm::StreamType ToCdmStreamType(Decryptor::StreamType stream_type);
MEDIA_EXPORT Decryptor::Status ToMediaDecryptorStatus(cdm::Status status);
// Audio Converters
MEDIA_EXPORT cdm::AudioCodec ToCdmAudioCodec(AudioCodec codec);
MEDIA_EXPORT SampleFormat ToMediaSampleFormat(cdm::AudioFormat format);
// Video Converters
MEDIA_EXPORT cdm::VideoCodec ToCdmVideoCodec(VideoCodec codec);
MEDIA_EXPORT VideoCodec ToMediaVideoCodec(cdm::VideoCodec codec);
MEDIA_EXPORT cdm::VideoCodecProfile ToCdmVideoCodecProfile(
VideoCodecProfile profile);
MEDIA_EXPORT VideoCodecProfile
ToMediaVideoCodecProfile(cdm::VideoCodecProfile profile);
MEDIA_EXPORT cdm::VideoFormat ToCdmVideoFormat(VideoPixelFormat format);
MEDIA_EXPORT VideoPixelFormat ToMediaVideoFormat(cdm::VideoFormat format);
// Aggregated Types
// Warning: The returned config contains raw pointers to the extra data in the
// input |config|. Hence, the caller must make sure the input |config| outlives
// the returned config.
MEDIA_EXPORT cdm::AudioDecoderConfig_2 ToCdmAudioDecoderConfig(
const AudioDecoderConfig& config);
// Warning: The returned config contains raw pointers to the extra data in the
// input |config|. Hence, the caller must make sure the input |config| outlives
// the returned config.
MEDIA_EXPORT cdm::VideoDecoderConfig_3 ToCdmVideoDecoderConfig(
const VideoDecoderConfig& config);
// Fill |input_buffer| based on the values in |encrypted|. |subsamples|
// is used to hold some of the data. |input_buffer| will contain pointers
// to data contained in |encrypted| and |subsamples|, so the lifetime of
// |input_buffer| must be <= the lifetime of |encrypted| and |subsamples|.
MEDIA_EXPORT void ToCdmInputBuffer(const DecoderBuffer& encrypted_buffer,
std::vector<cdm::SubsampleEntry>* subsamples,
cdm::InputBuffer_2* input_buffer);
} // namespace media
#endif // MEDIA_CDM_CDM_TYPE_CONVERSION_H_
......@@ -21,6 +21,7 @@
#include "base/run_loop.h"
#include "media/base/decode_status.h"
#include "media/base/media_util.h"
#include "media/cdm/cdm_type_conversion.h"
#include "media/cdm/library_cdm/cdm_host_proxy.h"
#include "media/media_buildflags.h"
#include "third_party/libyuv/include/libyuv/planar_functions.h"
......@@ -37,93 +38,6 @@ namespace media {
namespace {
VideoCodec ToMediaVideoCodec(cdm::VideoCodec codec) {
switch (codec) {
case cdm::kUnknownVideoCodec:
return kUnknownVideoCodec;
case cdm::kCodecVp8:
return kCodecVP8;
case cdm::kCodecH264:
return kCodecH264;
case cdm::kCodecVp9:
return kCodecVP9;
case cdm::kCodecAv1:
return kCodecAV1;
}
}
VideoCodecProfile ToMediaVideoCodecProfile(cdm::VideoCodecProfile profile) {
switch (profile) {
case cdm::kUnknownVideoCodecProfile:
return VIDEO_CODEC_PROFILE_UNKNOWN;
case cdm::kProfileNotNeeded:
// There's no corresponding value for "not needed". Given CdmAdapter only
// converts VP8PROFILE_ANY to cdm::kProfileNotNeeded, and this code is
// only used for testing, it's okay to convert it back to VP8PROFILE_ANY.
return VP8PROFILE_ANY;
case cdm::kVP9Profile0:
return VP9PROFILE_PROFILE0;
case cdm::kVP9Profile1:
return VP9PROFILE_PROFILE1;
case cdm::kVP9Profile2:
return VP9PROFILE_PROFILE2;
case cdm::kVP9Profile3:
return VP9PROFILE_PROFILE3;
case cdm::kH264ProfileBaseline:
return H264PROFILE_BASELINE;
case cdm::kH264ProfileMain:
return H264PROFILE_MAIN;
case cdm::kH264ProfileExtended:
return H264PROFILE_EXTENDED;
case cdm::kH264ProfileHigh:
return H264PROFILE_HIGH;
case cdm::kH264ProfileHigh10:
return H264PROFILE_HIGH10PROFILE;
case cdm::kH264ProfileHigh422:
return H264PROFILE_HIGH422PROFILE;
case cdm::kH264ProfileHigh444Predictive:
return H264PROFILE_HIGH444PREDICTIVEPROFILE;
case cdm::kAv1ProfileMain:
return AV1PROFILE_PROFILE_MAIN;
case cdm::kAv1ProfileHigh:
return AV1PROFILE_PROFILE_HIGH;
case cdm::kAv1ProfilePro:
return AV1PROFILE_PROFILE_PRO;
}
}
// TODO(xhwang): Support all media video formats.
VideoPixelFormat ToMediaVideoFormat(cdm::VideoFormat format) {
switch (format) {
case cdm::kYv12:
return PIXEL_FORMAT_YV12;
case cdm::kI420:
return PIXEL_FORMAT_I420;
default:
DVLOG(1) << "Unsupported VideoFormat " << format;
return PIXEL_FORMAT_UNKNOWN;
}
}
gfx::ColorSpace::RangeID ToGfxColorRange(cdm::ColorRange range) {
switch (range) {
case cdm::ColorRange::kInvalid:
return gfx::ColorSpace::RangeID::INVALID;
case cdm::ColorRange::kLimited:
return gfx::ColorSpace::RangeID::LIMITED;
case cdm::ColorRange::kFull:
return gfx::ColorSpace::RangeID::FULL;
case cdm::ColorRange::kDerived:
return gfx::ColorSpace::RangeID::DERIVED;
}
}
VideoColorSpace ToMediaColorSpace(const cdm::ColorSpace& color_space) {
return VideoColorSpace(color_space.primary_id, color_space.transfer_id,
color_space.matrix_id,
ToGfxColorRange(color_space.range));
}
media::VideoDecoderConfig ToClearMediaVideoDecoderConfig(
const cdm::VideoDecoderConfig_3& config) {
gfx::Size coded_size(config.coded_size.width, config.coded_size.width);
......
......@@ -23,6 +23,7 @@
#include "media/base/decrypt_config.h"
#include "media/base/encryption_pattern.h"
#include "media/cdm/api/content_decryption_module_ext.h"
#include "media/cdm/cdm_type_conversion.h"
#include "media/cdm/json_web_key.h"
#include "media/cdm/library_cdm/cdm_host_proxy.h"
#include "media/cdm/library_cdm/cdm_host_proxy_impl.h"
......@@ -132,86 +133,6 @@ static std::string GetUnitTestResultMessage(bool success) {
return message;
}
static cdm::Exception ConvertException(
media::CdmPromise::Exception exception_code) {
switch (exception_code) {
case media::CdmPromise::Exception::NOT_SUPPORTED_ERROR:
return cdm::kExceptionNotSupportedError;
case media::CdmPromise::Exception::INVALID_STATE_ERROR:
return cdm::kExceptionInvalidStateError;
case media::CdmPromise::Exception::TYPE_ERROR:
return cdm::kExceptionTypeError;
case media::CdmPromise::Exception::QUOTA_EXCEEDED_ERROR:
return cdm::kExceptionQuotaExceededError;
}
NOTREACHED();
return cdm::kExceptionInvalidStateError;
}
static media::CdmSessionType ConvertSessionType(cdm::SessionType session_type) {
switch (session_type) {
case cdm::kTemporary:
return media::CdmSessionType::kTemporary;
case cdm::kPersistentLicense:
return media::CdmSessionType::kPersistentLicense;
case cdm::kPersistentUsageRecord:
return media::CdmSessionType::kPersistentUsageRecord;
}
NOTREACHED();
return media::CdmSessionType::kTemporary;
}
static media::EmeInitDataType ConvertInitDataType(
cdm::InitDataType init_data_type) {
switch (init_data_type) {
case cdm::kCenc:
return media::EmeInitDataType::CENC;
case cdm::kKeyIds:
return media::EmeInitDataType::KEYIDS;
case cdm::kWebM:
return media::EmeInitDataType::WEBM;
}
NOTREACHED();
return media::EmeInitDataType::UNKNOWN;
}
cdm::KeyStatus ConvertKeyStatus(media::CdmKeyInformation::KeyStatus status) {
switch (status) {
case media::CdmKeyInformation::KeyStatus::USABLE:
return cdm::kUsable;
case media::CdmKeyInformation::KeyStatus::INTERNAL_ERROR:
return cdm::kInternalError;
case media::CdmKeyInformation::KeyStatus::EXPIRED:
return cdm::kExpired;
case media::CdmKeyInformation::KeyStatus::OUTPUT_RESTRICTED:
return cdm::kOutputRestricted;
case media::CdmKeyInformation::KeyStatus::OUTPUT_DOWNSCALED:
return cdm::kOutputDownscaled;
case media::CdmKeyInformation::KeyStatus::KEY_STATUS_PENDING:
return cdm::kStatusPending;
case media::CdmKeyInformation::KeyStatus::RELEASED:
return cdm::kReleased;
}
NOTREACHED();
return cdm::kInternalError;
}
cdm::MessageType ConvertMessageType(media::CdmMessageType message_type) {
switch (message_type) {
case media::CdmMessageType::LICENSE_REQUEST:
return cdm::kLicenseRequest;
case media::CdmMessageType::LICENSE_RENEWAL:
return cdm::kLicenseRenewal;
case media::CdmMessageType::LICENSE_RELEASE:
return cdm::kLicenseRelease;
case media::CdmMessageType::INDIVIDUALIZATION_REQUEST:
return cdm::kIndividualizationRequest;
}
NOTREACHED();
return cdm::kLicenseRequest;
}
// Shallow copy all the key information from |keys_info| into |keys_vector|.
// |keys_vector| is only valid for the lifetime of |keys_info| because it
// contains pointers into the latter.
......@@ -222,7 +143,7 @@ void ConvertCdmKeysInfo(const media::CdmKeysInfo& keys_info,
cdm::KeyInformation key = {};
key.key_id = key_info->key_id.data();
key.key_id_size = key_info->key_id.size();
key.status = ConvertKeyStatus(key_info->status);
key.status = ToCdmKeyStatus(key_info->status);
key.system_code = key_info->system_code;
keys_vector->push_back(key);
}
......@@ -520,7 +441,7 @@ void ClearKeyCdm::CreateSessionAndGenerateRequest(
base::Bind(&ClearKeyCdm::OnPromiseFailed, base::Unretained(this),
promise_id)));
cdm_->CreateSessionAndGenerateRequest(
ConvertSessionType(session_type), ConvertInitDataType(init_data_type),
ToMediaSessionType(session_type), ToEmeInitDataType(init_data_type),
std::vector<uint8_t>(init_data, init_data + init_data_size),
std::move(promise));
......@@ -555,7 +476,7 @@ void ClearKeyCdm::LoadSession(uint32_t promise_id,
promise_id),
base::Bind(&ClearKeyCdm::OnPromiseFailed, base::Unretained(this),
promise_id)));
cdm_->LoadSession(ConvertSessionType(session_type),
cdm_->LoadSession(ToMediaSessionType(session_type),
std::move(web_session_str), std::move(promise));
}
......@@ -1056,7 +977,7 @@ void ClearKeyCdm::OnSessionMessage(const std::string& session_id,
DVLOG(1) << __func__ << ": size = " << message.size();
cdm_host_proxy_->OnSessionMessage(
session_id.data(), session_id.length(), ConvertMessageType(message_type),
session_id.data(), session_id.length(), ToCdmMessageType(message_type),
reinterpret_cast<const char*>(message.data()), message.size());
}
......@@ -1108,7 +1029,7 @@ void ClearKeyCdm::OnPromiseFailed(uint32_t promise_id,
uint32_t system_code,
const std::string& error_message) {
DVLOG(1) << __func__ << ": error = " << error_message;
cdm_host_proxy_->OnRejectPromise(promise_id, ConvertException(exception_code),
cdm_host_proxy_->OnRejectPromise(promise_id, ToCdmException(exception_code),
system_code, error_message.data(),
error_message.length());
}
......
......@@ -14,6 +14,7 @@
#include "base/numerics/safe_math.h"
#include "media/cdm/api/content_decryption_module.h"
#include "media/cdm/cdm_helpers.h"
#include "media/cdm/cdm_type_conversion.h"
#include "media/mojo/common/mojo_shared_buffer_video_frame.h"
#include "mojo/public/cpp/system/buffer.h"
#include "ui/gfx/geometry/rect.h"
......@@ -27,18 +28,6 @@ typedef base::Callback<void(mojo::ScopedSharedBufferHandle buffer,
size_t capacity)>
MojoSharedBufferDoneCB;
VideoPixelFormat CdmVideoFormatToVideoPixelFormat(cdm::VideoFormat format) {
switch (format) {
case cdm::kYv12:
return PIXEL_FORMAT_YV12;
case cdm::kI420:
return PIXEL_FORMAT_I420;
default:
NOTREACHED();
return PIXEL_FORMAT_UNKNOWN;
}
}
// cdm::Buffer implementation that provides access to mojo shared memory.
// It owns the memory until Destroy() is called.
class MojoCdmBuffer : public cdm::Buffer {
......@@ -143,8 +132,8 @@ class MojoCdmVideoFrame : public VideoFrameImpl {
scoped_refptr<MojoSharedBufferVideoFrame> frame =
media::MojoSharedBufferVideoFrame::Create(
CdmVideoFormatToVideoPixelFormat(Format()), frame_size,
gfx::Rect(frame_size), natural_size, std::move(handle), buffer_size,
ToMediaVideoFormat(Format()), frame_size, gfx::Rect(frame_size),
natural_size, std::move(handle), buffer_size,
PlaneOffset(cdm::kYPlane), PlaneOffset(cdm::kUPlane),
PlaneOffset(cdm::kVPlane), Stride(cdm::kYPlane),
Stride(cdm::kUPlane), Stride(cdm::kVPlane),
......
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