blob: 63a8b69f99d13270e1bf9ae4071a4c7bd5f839b6 [file] [log] [blame]
erickung1fc58a42016-09-24 03:00:071// Copyright 2016 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.
4
miu9f7788e2017-01-25 00:46:095#ifndef MEDIA_REMOTING_PROTO_UTILS_H_
6#define MEDIA_REMOTING_PROTO_UTILS_H_
erickung1fc58a42016-09-24 03:00:077
8#include <cstdint>
9#include <string>
10#include <vector>
11
12#include "base/macros.h"
13#include "base/memory/ref_counted.h"
14#include "media/base/audio_decoder_config.h"
15#include "media/base/cdm_config.h"
16#include "media/base/cdm_key_information.h"
corona101f1c7d32016-10-27 17:08:1017#include "media/base/cdm_promise.h"
jrummell6e462aa2017-07-13 20:49:4718#include "media/base/content_decryption_module.h"
erickung1fc58a42016-09-24 03:00:0719#include "media/base/decoder_buffer.h"
20#include "media/base/demuxer_stream.h"
21#include "media/base/eme_constants.h"
erickung1fc58a42016-09-24 03:00:0722#include "media/base/pipeline_status.h"
23#include "media/base/video_decoder_config.h"
miu9f7788e2017-01-25 00:46:0924#include "media/remoting/rpc.pb.h"
erickung1fc58a42016-09-24 03:00:0725
26namespace media {
27namespace remoting {
28
29class CdmPromiseResult;
30
miu9f7788e2017-01-25 00:46:0931// Utility class to convert data between media::DecoderBuffer and byte array.
32// It is to serialize media::DecoderBuffer structure except for actual data
erickung1fc58a42016-09-24 03:00:0733// into pb::DecoderBuffer followed by byte array of decoder buffer. The reason
34// data is not part of proto buffer because it would cost unnecessary time to
35// wait for whole proto received before conversion given the fact that decoder
36// buffer data can vary from hundred bytes to 3~5MB. Also, it would costs extra
37// CPU to sirealize/de-serialize decoder buffer which is encoded and encrypted
38// as wire format for data transmission.
39//
40// DecoderBufferSegment {
41// // Payload version. Default value is 0.
42// u8 payload_version;
43//
miu9f7788e2017-01-25 00:46:0944// // Length of pb::DecoderBuffer (protobuf-encoded of media::DecoderBuffer
erickung1fc58a42016-09-24 03:00:0745// except for data).
46// u16 buffer_segment_size;
47// // pb::DecoderBuffer.
48// u8[buffer_segment_size] buffer_segment;
49//
50// // Length of data in media::DecoderBuffer.
51// u32 data_buffer_size;
52// // media::DecoderBuffer data.
53// u8[data_buffer_size] data_buffer;
54//};
55
56// Converts DecoderBufferSegment into byte array.
57std::vector<uint8_t> DecoderBufferToByteArray(
miu9f7788e2017-01-25 00:46:0958 const DecoderBuffer& decoder_buffer);
erickung1fc58a42016-09-24 03:00:0759
60// Converts byte array into DecoderBufferSegment.
miu9f7788e2017-01-25 00:46:0961scoped_refptr<DecoderBuffer> ByteArrayToDecoderBuffer(const uint8_t* data,
62 uint32_t size);
erickung1fc58a42016-09-24 03:00:0763
miu9f7788e2017-01-25 00:46:0964// Data type conversion between media::AudioDecoderConfig and proto buffer.
65void ConvertAudioDecoderConfigToProto(const AudioDecoderConfig& audio_config,
66 pb::AudioDecoderConfig* audio_message);
erickung1fc58a42016-09-24 03:00:0767bool ConvertProtoToAudioDecoderConfig(
68 const pb::AudioDecoderConfig& audio_message,
miu9f7788e2017-01-25 00:46:0969 AudioDecoderConfig* audio_config);
erickung1fc58a42016-09-24 03:00:0770
miu9f7788e2017-01-25 00:46:0971// Data type conversion between media::VideoDecoderConfig and proto buffer.
72void ConvertVideoDecoderConfigToProto(const VideoDecoderConfig& video_config,
73 pb::VideoDecoderConfig* video_message);
erickung1fc58a42016-09-24 03:00:0774bool ConvertProtoToVideoDecoderConfig(
75 const pb::VideoDecoderConfig& video_message,
miu9f7788e2017-01-25 00:46:0976 VideoDecoderConfig* video_config);
erickung1fc58a42016-09-24 03:00:0777
miu9f7788e2017-01-25 00:46:0978// Data type conversion between media::VideoDecoderConfig and proto buffer.
79void ConvertProtoToPipelineStatistics(
80 const pb::PipelineStatistics& stats_message,
81 PipelineStatistics* stats);
82
83// Data type conversion between media::CdmKeysInfo and proto buffer.
erickung1fc58a42016-09-24 03:00:0784void ConvertCdmKeyInfoToProto(
miu9f7788e2017-01-25 00:46:0985 const CdmKeysInfo& keys_information,
erickung1fc58a42016-09-24 03:00:0786 pb::CdmClientOnSessionKeysChange* key_change_message);
87void ConvertProtoToCdmKeyInfo(
88 const pb::CdmClientOnSessionKeysChange keychange_message,
89 CdmKeysInfo* key_information);
90
91// Data type conversion between CdmPromiseResult and proto buffer.
92void ConvertCdmPromiseToProto(const CdmPromiseResult& result,
93 pb::CdmPromise* promise_message);
94void ConvertCdmPromiseWithSessionIdToProto(const CdmPromiseResult& result,
95 const std::string& session_id,
96 pb::CdmPromise* promise_message);
97void ConvertCdmPromiseWithCdmIdToProto(const CdmPromiseResult& result,
98 int cdm_id,
99 pb::CdmPromise* promise_message);
100bool ConvertProtoToCdmPromise(const pb::CdmPromise& promise_message,
101 CdmPromiseResult* result);
102bool ConvertProtoToCdmPromiseWithCdmIdSessionId(const pb::RpcMessage& message,
103 CdmPromiseResult* result,
104 int* cdm_id,
105 std::string* session_id);
106
107//==================================================================
108class CdmPromiseResult {
109 public:
110 CdmPromiseResult();
miu9f7788e2017-01-25 00:46:09111 CdmPromiseResult(CdmPromise::Exception exception,
erickung1fc58a42016-09-24 03:00:07112 uint32_t system_code,
113 std::string error_message);
114 CdmPromiseResult(const CdmPromiseResult& other);
115 ~CdmPromiseResult();
116
117 static CdmPromiseResult SuccessResult();
118
119 bool success() const { return success_; }
miu9f7788e2017-01-25 00:46:09120 CdmPromise::Exception exception() const { return exception_; }
erickung1fc58a42016-09-24 03:00:07121 uint32_t system_code() const { return system_code_; }
122 const std::string& error_message() const { return error_message_; }
123
124 private:
125 bool success_;
miu9f7788e2017-01-25 00:46:09126 CdmPromise::Exception exception_;
erickung1fc58a42016-09-24 03:00:07127 uint32_t system_code_;
128 std::string error_message_;
129};
130
131} // namespace remoting
132} // namespace media
133
miu9f7788e2017-01-25 00:46:09134#endif // MEDIA_REMOTING_PROTO_UTILS_H_