Index: media/remoting/rpc/proto_utils.cc |
diff --git a/media/remoting/rpc/proto_utils.cc b/media/remoting/rpc/proto_utils.cc |
deleted file mode 100644 |
index 026ab7962640c5b4370d4126db201cda68b8dec6..0000000000000000000000000000000000000000 |
--- a/media/remoting/rpc/proto_utils.cc |
+++ /dev/null |
@@ -1,473 +0,0 @@ |
-// Copyright 2016 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 "media/remoting/rpc/proto_utils.h" |
- |
-#include <algorithm> |
- |
-#include "base/big_endian.h" |
-#include "base/logging.h" |
-#include "base/time/time.h" |
-#include "base/values.h" |
-#include "media/base/encryption_scheme.h" |
-#include "media/remoting/rpc/proto_enum_utils.h" |
- |
-namespace media { |
-namespace remoting { |
- |
-namespace { |
- |
-constexpr size_t kPayloadVersionFieldSize = sizeof(uint8_t); |
-constexpr size_t kProtoBufferHeaderSize = sizeof(uint16_t); |
-constexpr size_t kDataBufferHeaderSize = sizeof(uint32_t); |
- |
-std::unique_ptr<::media::DecryptConfig> ConvertProtoToDecryptConfig( |
- const pb::DecryptConfig& config_message) { |
- if (!config_message.has_key_id()) |
- return nullptr; |
- if (!config_message.has_iv()) |
- return nullptr; |
- |
- std::vector<::media::SubsampleEntry> entries( |
- config_message.sub_samples_size()); |
- for (int i = 0; i < config_message.sub_samples_size(); ++i) { |
- entries.push_back( |
- ::media::SubsampleEntry(config_message.sub_samples(i).clear_bytes(), |
- config_message.sub_samples(i).cypher_bytes())); |
- } |
- |
- std::unique_ptr<::media::DecryptConfig> decrypt_config( |
- new ::media::DecryptConfig(config_message.key_id(), config_message.iv(), |
- entries)); |
- return decrypt_config; |
-} |
- |
-scoped_refptr<::media::DecoderBuffer> ConvertProtoToDecoderBuffer( |
- const pb::DecoderBuffer& buffer_message, |
- scoped_refptr<::media::DecoderBuffer> buffer) { |
- if (buffer_message.is_eos()) { |
- VLOG(1) << "EOS data"; |
- return ::media::DecoderBuffer::CreateEOSBuffer(); |
- } |
- |
- if (buffer_message.has_timestamp_usec()) { |
- buffer->set_timestamp( |
- base::TimeDelta::FromMicroseconds(buffer_message.timestamp_usec())); |
- } |
- |
- if (buffer_message.has_duration_usec()) { |
- buffer->set_duration( |
- base::TimeDelta::FromMicroseconds(buffer_message.duration_usec())); |
- } |
- VLOG(3) << "timestamp:" << buffer_message.timestamp_usec() |
- << " duration:" << buffer_message.duration_usec(); |
- |
- if (buffer_message.has_is_key_frame()) |
- buffer->set_is_key_frame(buffer_message.is_key_frame()); |
- |
- if (buffer_message.has_decrypt_config()) { |
- buffer->set_decrypt_config( |
- ConvertProtoToDecryptConfig(buffer_message.decrypt_config())); |
- } |
- |
- bool has_discard = false; |
- base::TimeDelta front_discard; |
- if (buffer_message.has_front_discard_usec()) { |
- has_discard = true; |
- front_discard = |
- base::TimeDelta::FromMicroseconds(buffer_message.front_discard_usec()); |
- } |
- base::TimeDelta back_discard; |
- if (buffer_message.has_back_discard_usec()) { |
- has_discard = true; |
- back_discard = |
- base::TimeDelta::FromMicroseconds(buffer_message.back_discard_usec()); |
- } |
- |
- if (has_discard) { |
- buffer->set_discard_padding( |
- ::media::DecoderBuffer::DiscardPadding(front_discard, back_discard)); |
- } |
- |
- if (buffer_message.has_splice_timestamp_usec()) { |
- buffer->set_splice_timestamp(base::TimeDelta::FromMicroseconds( |
- buffer_message.splice_timestamp_usec())); |
- } |
- |
- if (buffer_message.has_side_data()) { |
- buffer->CopySideDataFrom( |
- reinterpret_cast<const uint8_t*>(buffer_message.side_data().data()), |
- buffer_message.side_data().size()); |
- } |
- |
- return buffer; |
-} |
- |
-void ConvertDecryptConfigToProto(const ::media::DecryptConfig& decrypt_config, |
- pb::DecryptConfig* config_message) { |
- DCHECK(config_message); |
- |
- config_message->set_key_id(decrypt_config.key_id()); |
- config_message->set_iv(decrypt_config.iv()); |
- |
- for (const auto& entry : decrypt_config.subsamples()) { |
- pb::DecryptConfig::SubSample* sub_sample = |
- config_message->add_sub_samples(); |
- sub_sample->set_clear_bytes(entry.clear_bytes); |
- sub_sample->set_cypher_bytes(entry.cypher_bytes); |
- } |
-} |
- |
-void ConvertDecoderBufferToProto( |
- const scoped_refptr<::media::DecoderBuffer>& decoder_buffer, |
- pb::DecoderBuffer* buffer_message) { |
- if (decoder_buffer->end_of_stream()) { |
- buffer_message->set_is_eos(true); |
- return; |
- } |
- |
- VLOG(3) << "timestamp:" << decoder_buffer->timestamp().InMicroseconds() |
- << " duration:" << decoder_buffer->duration().InMicroseconds(); |
- buffer_message->set_timestamp_usec( |
- decoder_buffer->timestamp().InMicroseconds()); |
- buffer_message->set_duration_usec( |
- decoder_buffer->duration().InMicroseconds()); |
- buffer_message->set_is_key_frame(decoder_buffer->is_key_frame()); |
- |
- if (decoder_buffer->decrypt_config()) { |
- ConvertDecryptConfigToProto(*decoder_buffer->decrypt_config(), |
- buffer_message->mutable_decrypt_config()); |
- } |
- |
- buffer_message->set_front_discard_usec( |
- decoder_buffer->discard_padding().first.InMicroseconds()); |
- buffer_message->set_back_discard_usec( |
- decoder_buffer->discard_padding().second.InMicroseconds()); |
- buffer_message->set_splice_timestamp_usec( |
- decoder_buffer->splice_timestamp().InMicroseconds()); |
- |
- if (decoder_buffer->side_data_size()) { |
- buffer_message->set_side_data(decoder_buffer->side_data(), |
- decoder_buffer->side_data_size()); |
- } |
-} |
- |
-} // namespace |
- |
-scoped_refptr<::media::DecoderBuffer> ByteArrayToDecoderBuffer( |
- const uint8_t* data, |
- uint32_t size) { |
- base::BigEndianReader reader(reinterpret_cast<const char*>(data), size); |
- uint8_t payload_version = 0; |
- uint16_t proto_size = 0; |
- pb::DecoderBuffer segment; |
- uint32_t buffer_size = 0; |
- if (reader.ReadU8(&payload_version) && payload_version == 0 && |
- reader.ReadU16(&proto_size) && |
- static_cast<int>(proto_size) < reader.remaining() && |
- segment.ParseFromArray(reader.ptr(), proto_size) && |
- reader.Skip(proto_size) && reader.ReadU32(&buffer_size) && |
- static_cast<int64_t>(buffer_size) <= reader.remaining()) { |
- // Deserialize proto buffer. It passes the pre allocated DecoderBuffer into |
- // the function because the proto buffer may overwrite DecoderBuffer since |
- // it may be EOS buffer. |
- scoped_refptr<media::DecoderBuffer> decoder_buffer = |
- ConvertProtoToDecoderBuffer( |
- segment, |
- DecoderBuffer::CopyFrom( |
- reinterpret_cast<const uint8_t*>(reader.ptr()), buffer_size)); |
- return decoder_buffer; |
- } |
- |
- LOG(ERROR) << "Not able to convert byte array to ::media::DecoderBuffer"; |
- return nullptr; |
-} |
- |
-std::vector<uint8_t> DecoderBufferToByteArray( |
- const scoped_refptr<::media::DecoderBuffer>& decoder_buffer) { |
- pb::DecoderBuffer decoder_buffer_message; |
- ConvertDecoderBufferToProto(decoder_buffer, &decoder_buffer_message); |
- |
- size_t decoder_buffer_size = |
- decoder_buffer->end_of_stream() ? 0 : decoder_buffer->data_size(); |
- size_t size = kPayloadVersionFieldSize + kProtoBufferHeaderSize + |
- decoder_buffer_message.ByteSize() + kDataBufferHeaderSize + |
- decoder_buffer_size; |
- std::vector<uint8_t> buffer(size); |
- base::BigEndianWriter writer(reinterpret_cast<char*>(buffer.data()), |
- buffer.size()); |
- if (writer.WriteU8(0) && |
- writer.WriteU16( |
- static_cast<uint16_t>(decoder_buffer_message.GetCachedSize())) && |
- decoder_buffer_message.SerializeToArray( |
- writer.ptr(), decoder_buffer_message.GetCachedSize()) && |
- writer.Skip(decoder_buffer_message.GetCachedSize()) && |
- writer.WriteU32(decoder_buffer_size)) { |
- if (decoder_buffer_size) { |
- // DecoderBuffer frame data. |
- writer.WriteBytes(reinterpret_cast<const void*>(decoder_buffer->data()), |
- decoder_buffer->data_size()); |
- } |
- return buffer; |
- } |
- |
- // Reset buffer since serialization of the data failed. |
- LOG(ERROR) << "Not able to convert ::media::DecoderBuffer to byte array"; |
- buffer.clear(); |
- return buffer; |
-} |
- |
-void ConvertEncryptionSchemeToProto( |
- const ::media::EncryptionScheme& encryption_scheme, |
- pb::EncryptionScheme* message) { |
- DCHECK(message); |
- message->set_mode( |
- ToProtoEncryptionSchemeCipherMode(encryption_scheme.mode()).value()); |
- message->set_encrypt_blocks(encryption_scheme.pattern().encrypt_blocks()); |
- message->set_skip_blocks(encryption_scheme.pattern().skip_blocks()); |
-} |
- |
-::media::EncryptionScheme ConvertProtoToEncryptionScheme( |
- const pb::EncryptionScheme& message) { |
- return ::media::EncryptionScheme( |
- ToMediaEncryptionSchemeCipherMode(message.mode()).value(), |
- ::media::EncryptionScheme::Pattern(message.encrypt_blocks(), |
- message.skip_blocks())); |
-} |
- |
-void ConvertAudioDecoderConfigToProto( |
- const ::media::AudioDecoderConfig& audio_config, |
- pb::AudioDecoderConfig* audio_message) { |
- DCHECK(audio_config.IsValidConfig()); |
- DCHECK(audio_message); |
- |
- audio_message->set_codec( |
- ToProtoAudioDecoderConfigCodec(audio_config.codec()).value()); |
- audio_message->set_sample_format( |
- ToProtoAudioDecoderConfigSampleFormat(audio_config.sample_format()) |
- .value()); |
- audio_message->set_channel_layout( |
- ToProtoAudioDecoderConfigChannelLayout(audio_config.channel_layout()) |
- .value()); |
- audio_message->set_samples_per_second(audio_config.samples_per_second()); |
- audio_message->set_seek_preroll_usec( |
- audio_config.seek_preroll().InMicroseconds()); |
- audio_message->set_codec_delay(audio_config.codec_delay()); |
- |
- if (!audio_config.extra_data().empty()) { |
- audio_message->set_extra_data(audio_config.extra_data().data(), |
- audio_config.extra_data().size()); |
- } |
- |
- if (audio_config.is_encrypted()) { |
- pb::EncryptionScheme* encryption_scheme_message = |
- audio_message->mutable_encryption_scheme(); |
- ConvertEncryptionSchemeToProto(audio_config.encryption_scheme(), |
- encryption_scheme_message); |
- } |
-} |
- |
-bool ConvertProtoToAudioDecoderConfig( |
- const pb::AudioDecoderConfig& audio_message, |
- ::media::AudioDecoderConfig* audio_config) { |
- DCHECK(audio_config); |
- audio_config->Initialize( |
- ToMediaAudioCodec(audio_message.codec()).value(), |
- ToMediaSampleFormat(audio_message.sample_format()).value(), |
- ToMediaChannelLayout(audio_message.channel_layout()).value(), |
- audio_message.samples_per_second(), |
- std::vector<uint8_t>(audio_message.extra_data().begin(), |
- audio_message.extra_data().end()), |
- ConvertProtoToEncryptionScheme(audio_message.encryption_scheme()), |
- base::TimeDelta::FromMicroseconds(audio_message.seek_preroll_usec()), |
- audio_message.codec_delay()); |
- return audio_config->IsValidConfig(); |
-} |
- |
-void ConvertVideoDecoderConfigToProto( |
- const ::media::VideoDecoderConfig& video_config, |
- pb::VideoDecoderConfig* video_message) { |
- DCHECK(video_config.IsValidConfig()); |
- DCHECK(video_message); |
- |
- video_message->set_codec( |
- ToProtoVideoDecoderConfigCodec(video_config.codec()).value()); |
- video_message->set_profile( |
- ToProtoVideoDecoderConfigProfile(video_config.profile()).value()); |
- video_message->set_format( |
- ToProtoVideoDecoderConfigFormat(video_config.format()).value()); |
- video_message->set_color_space( |
- ToProtoVideoDecoderConfigColorSpace(video_config.color_space()).value()); |
- |
- pb::Size* coded_size_message = video_message->mutable_coded_size(); |
- coded_size_message->set_width(video_config.coded_size().width()); |
- coded_size_message->set_height(video_config.coded_size().height()); |
- |
- pb::Rect* visible_rect_message = video_message->mutable_visible_rect(); |
- visible_rect_message->set_x(video_config.visible_rect().x()); |
- visible_rect_message->set_y(video_config.visible_rect().y()); |
- visible_rect_message->set_width(video_config.visible_rect().width()); |
- visible_rect_message->set_height(video_config.visible_rect().height()); |
- |
- pb::Size* natural_size_message = video_message->mutable_natural_size(); |
- natural_size_message->set_width(video_config.natural_size().width()); |
- natural_size_message->set_height(video_config.natural_size().height()); |
- |
- if (!video_config.extra_data().empty()) { |
- video_message->set_extra_data(video_config.extra_data().data(), |
- video_config.extra_data().size()); |
- } |
- |
- if (video_config.is_encrypted()) { |
- pb::EncryptionScheme* encryption_scheme_message = |
- video_message->mutable_encryption_scheme(); |
- ConvertEncryptionSchemeToProto(video_config.encryption_scheme(), |
- encryption_scheme_message); |
- } |
-} |
- |
-bool ConvertProtoToVideoDecoderConfig( |
- const pb::VideoDecoderConfig& video_message, |
- ::media::VideoDecoderConfig* video_config) { |
- DCHECK(video_config); |
- ::media::EncryptionScheme encryption_scheme; |
- video_config->Initialize( |
- ToMediaVideoCodec(video_message.codec()).value(), |
- ToMediaVideoCodecProfile(video_message.profile()).value(), |
- ToMediaVideoPixelFormat(video_message.format()).value(), |
- ToMediaColorSpace(video_message.color_space()).value(), |
- gfx::Size(video_message.coded_size().width(), |
- video_message.coded_size().height()), |
- gfx::Rect(video_message.visible_rect().x(), |
- video_message.visible_rect().y(), |
- video_message.visible_rect().width(), |
- video_message.visible_rect().height()), |
- gfx::Size(video_message.natural_size().width(), |
- video_message.natural_size().height()), |
- std::vector<uint8_t>(video_message.extra_data().begin(), |
- video_message.extra_data().end()), |
- ConvertProtoToEncryptionScheme(video_message.encryption_scheme())); |
- return video_config->IsValidConfig(); |
-} |
- |
-void ConvertCdmKeyInfoToProto( |
- const ::media::CdmKeysInfo& keys_information, |
- pb::CdmClientOnSessionKeysChange* key_change_message) { |
- for (const auto& info : keys_information) { |
- pb::CdmKeyInformation* key = key_change_message->add_key_information(); |
- key->set_key_id(info->key_id.data(), info->key_id.size()); |
- key->set_status(ToProtoCdmKeyInformation(info->status).value()); |
- key->set_system_code(info->system_code); |
- } |
-} |
- |
-void ConvertProtoToCdmKeyInfo( |
- const pb::CdmClientOnSessionKeysChange keychange_message, |
- CdmKeysInfo* key_information) { |
- DCHECK(key_information); |
- key_information->reserve(keychange_message.key_information_size()); |
- for (int i = 0; i < keychange_message.key_information_size(); ++i) { |
- const pb::CdmKeyInformation key_info_msg = |
- keychange_message.key_information(i); |
- |
- std::unique_ptr<::media::CdmKeyInformation> key( |
- new ::media::CdmKeyInformation( |
- key_info_msg.key_id(), |
- ToMediaCdmKeyInformationKeyStatus(key_info_msg.status()).value(), |
- key_info_msg.system_code())); |
- key_information->push_back(std::move(key)); |
- } |
-} |
- |
-void ConvertCdmPromiseToProto(const CdmPromiseResult& result, |
- pb::CdmPromise* promise_message) { |
- promise_message->set_success(result.success()); |
- if (!result.success()) { |
- promise_message->set_exception( |
- ToProtoCdmException(result.exception()).value()); |
- promise_message->set_system_code(result.system_code()); |
- promise_message->set_error_message(result.error_message()); |
- } |
-} |
- |
-void ConvertCdmPromiseWithSessionIdToProto(const CdmPromiseResult& result, |
- const std::string& session_id, |
- pb::CdmPromise* promise_message) { |
- ConvertCdmPromiseToProto(result, promise_message); |
- promise_message->set_session_id(session_id); |
-} |
- |
-void ConvertCdmPromiseWithCdmIdToProto(const CdmPromiseResult& result, |
- int cdm_id, |
- pb::CdmPromise* promise_message) { |
- ConvertCdmPromiseToProto(result, promise_message); |
- promise_message->set_cdm_id(cdm_id); |
-} |
- |
-bool ConvertProtoToCdmPromise(const pb::CdmPromise& promise_message, |
- CdmPromiseResult* result) { |
- if (!promise_message.has_success()) |
- return false; |
- |
- bool success = promise_message.success(); |
- if (success) { |
- *result = CdmPromiseResult::SuccessResult(); |
- return true; |
- } |
- |
- ::media::CdmPromise::Exception exception = ::media::CdmPromise::UNKNOWN_ERROR; |
- uint32_t system_code = 0; |
- std::string error_message; |
- |
- exception = ToCdmPromiseException(promise_message.exception()).value(); |
- system_code = promise_message.system_code(); |
- error_message = promise_message.error_message(); |
- *result = CdmPromiseResult(exception, system_code, error_message); |
- return true; |
-} |
- |
-bool ConvertProtoToCdmPromiseWithCdmIdSessionId(const pb::RpcMessage& message, |
- CdmPromiseResult* result, |
- int* cdm_id, |
- std::string* session_id) { |
- if (!message.has_cdm_promise_rpc()) |
- return false; |
- |
- const auto& promise_message = message.cdm_promise_rpc(); |
- if (!ConvertProtoToCdmPromise(promise_message, result)) |
- return false; |
- |
- if (cdm_id) |
- *cdm_id = promise_message.cdm_id(); |
- if (session_id) |
- *session_id = promise_message.session_id(); |
- |
- return true; |
-} |
- |
-//============================================================================== |
-CdmPromiseResult::CdmPromiseResult() |
- : CdmPromiseResult(::media::CdmPromise::UNKNOWN_ERROR, 0, "") {} |
- |
-CdmPromiseResult::CdmPromiseResult(::media::CdmPromise::Exception exception, |
- uint32_t system_code, |
- std::string error_message) |
- : success_(false), |
- exception_(exception), |
- system_code_(system_code), |
- error_message_(error_message) {} |
- |
-CdmPromiseResult::CdmPromiseResult(const CdmPromiseResult& other) = default; |
- |
-CdmPromiseResult::~CdmPromiseResult() = default; |
- |
-CdmPromiseResult CdmPromiseResult::SuccessResult() { |
- CdmPromiseResult result(static_cast<::media::CdmPromise::Exception>(0), 0, |
- ""); |
- result.success_ = true; |
- return result; |
-} |
- |
-} // namespace remoting |
-} // namespace media |