Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(716)

Side by Side Diff: media/remoting/rpc/rpc.cc

Issue 2261503002: Define remote playback proto buffer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // 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
5 #include "media/remoting/rpc/rpc.h"
6
7 #include <algorithm>
8
9 #include "base/logging.h"
10 #include "base/time/time.h"
11 #include "base/values.h"
12 #include "media/base/encryption_scheme.h"
13
14 #define REQUIRED_IMPL(x, ret) \
15 do { \
16 if (!(x)) { \
17 LOG(ERROR) << "failed l" << __LINE__ << ": " << #x; \
18 return (ret); \
19 } \
20 } while (0)
21
22 namespace media {
23 namespace remoting {
24
25 namespace {
26
27 #define RPC(x) pb::x
28
29 #define REQUIRED(x) REQUIRED_IMPL(x, false)
30
31 bool DeserializeEncryptionScheme(const pb::EncryptionScheme& message,
32 ::media::EncryptionScheme* encryption_scheme) {
33 ::media::EncryptionScheme::CipherMode mode =
34 ::media::EncryptionScheme::CIPHER_MODE_UNENCRYPTED;
35 ::media::EncryptionScheme::Pattern pattern;
36 uint32_t encrypt_blocks = 0;
37 uint32_t skip_blocks = 0;
38
39 if (message.has_mode())
40 mode = static_cast<::media::EncryptionScheme::CipherMode>(message.mode());
41 if (message.has_encrypt_blocks())
42 encrypt_blocks = message.encrypt_blocks();
43 if (message.has_skip_blocks())
44 skip_blocks = message.skip_blocks();
45 REQUIRED(encrypt_blocks >= 0 && skip_blocks >= 0);
46
47 pattern = ::media::EncryptionScheme::Pattern(encrypt_blocks, skip_blocks);
48 *encryption_scheme = ::media::EncryptionScheme(mode, pattern);
49 return true;
50 }
51
52 bool DeserializeSize(const pb::Size& message, gfx::Size* size) {
53 DCHECK(size);
54 size->SetSize(message.width(), message.height());
55 return true;
56 }
57
58 bool DeserializeRect(const pb::Rect& message, gfx::Rect* rect) {
59 DCHECK(rect);
60 rect->set_x(message.x());
61 rect->set_x(message.y());
62 rect->set_width(message.width());
63 rect->set_height(message.height());
64 return true;
65 }
66
67 bool DeserializeAudioConfig(const pb::AudioDecoderConfig& audio_message,
68 ::media::AudioDecoderConfig* audio_config) {
69 DCHECK(audio_config);
70
71 ::media::AudioCodec codec = ::media::kUnknownAudioCodec;
72 ::media::SampleFormat sample_format = ::media::kUnknownSampleFormat;
73 ::media::ChannelLayout channel_layout = ::media::CHANNEL_LAYOUT_NONE;
74 int samples_per_second = 0;
75 base::TimeDelta seek_preroll = base::TimeDelta();
76 int codec_delay = 0;
77 ::media::EncryptionScheme encryption_scheme;
78 std::vector<uint8_t> extra_data;
79
80 codec = static_cast<::media::AudioCodec>(audio_message.codec());
81 sample_format =
82 static_cast<::media::SampleFormat>(audio_message.sample_format());
83 channel_layout =
84 static_cast<::media::ChannelLayout>(audio_message.channel_layout());
85 samples_per_second = audio_message.samples_per_second();
86 seek_preroll =
87 base::TimeDelta::FromMicroseconds(audio_message.seek_preroll_usec());
88 codec_delay = audio_message.codec_delay();
89
90 if (audio_message.has_extra_data()) {
91 extra_data.assign(audio_message.extra_data().begin(),
92 audio_message.extra_data().end());
93 }
94
95 const pb::EncryptionScheme encryption_scheme_message =
96 audio_message.encryption_scheme();
97 DeserializeEncryptionScheme(encryption_scheme_message, &encryption_scheme);
98
99 audio_config->Initialize(codec, sample_format, channel_layout,
100 samples_per_second, extra_data, encryption_scheme,
101 seek_preroll, codec_delay);
102 return true;
103 }
104
105 bool DeserializeVideoConfig(const pb::VideoDecoderConfig& video_message,
106 ::media::VideoDecoderConfig* video_config) {
107 ::media::VideoCodec codec = ::media::kUnknownVideoCodec;
108 ::media::VideoCodecProfile profile = ::media::VIDEO_CODEC_PROFILE_UNKNOWN;
109 ::media::VideoPixelFormat format = ::media::PIXEL_FORMAT_UNKNOWN;
110 ::media::ColorSpace color_space = ::media::COLOR_SPACE_UNSPECIFIED;
111 gfx::Size coded_size(1920, 1080);
112 gfx::Rect visible_rect(0, 0, 1920, 1080);
113 gfx::Size natural_size(1920, 1080);
114 ::media::EncryptionScheme encryption_scheme;
115 std::vector<uint8_t> extra_data;
116
117 codec = static_cast<::media::VideoCodec>(video_message.codec());
118 profile = static_cast<::media::VideoCodecProfile>(video_message.profile());
119 format = static_cast<::media::VideoPixelFormat>(video_message.format());
120 color_space = static_cast<::media::ColorSpace>(video_message.color_space());
121
122 if (video_message.has_extra_data()) {
123 extra_data.assign(video_message.extra_data().begin(),
124 video_message.extra_data().end());
125 }
126
127 // DCHECK(video_message.has_coded_size());
128 DeserializeSize(video_message.coded_size(), &coded_size);
129
130 // DCHECK(video_message.has_visible_rect());
131 DeserializeRect(video_message.visible_rect(), &visible_rect);
132
133 // DCHECK(video_message.has_natural_size());
134 DeserializeSize(video_message.natural_size(), &coded_size);
135
136 const pb::EncryptionScheme& encryption_scheme_message =
137 video_message.encryption_scheme();
138 DeserializeEncryptionScheme(encryption_scheme_message, &encryption_scheme);
139
140 video_config->Initialize(codec, profile, format, color_space, coded_size,
141 visible_rect, natural_size, extra_data,
142 encryption_scheme);
143 return true;
144 }
145
146 bool DeserializeCdmPromiseResult(const pb::CdmPromise& promise_message,
147 CdmPromiseResult* result) {
148 REQUIRED(promise_message.has_success());
149 bool success = promise_message.success();
150 if (success) {
151 *result = CdmPromiseResult::SuccessResult();
152 return true;
153 }
154
155 ::media::MediaKeys::Exception exception = ::media::MediaKeys::UNKNOWN_ERROR;
156 uint32_t system_code = 0;
157 std::string error_message;
158
159 exception =
160 static_cast<::media::MediaKeys::Exception>(promise_message.exception());
161 system_code = promise_message.system_code();
162 error_message = promise_message.error_message();
163 *result = CdmPromiseResult(exception, system_code, error_message);
164 return true;
165 }
166
167 bool DeserializeCdmKeyInformation(
168 const pb::CdmClientOnSessionKeysChange keychange_message,
169 std::vector<::media::CdmKeyInformation>* key_information) {
170 std::vector<::media::CdmKeyInformation> info;
171
172 for (int i = 0; i < keychange_message.key_information_size(); ++i) {
173 const pb::CdmKeyInformation key = keychange_message.key_information(i);
174
175 ::media::CdmKeyInformation::KeyStatus status =
176 ::media::CdmKeyInformation::USABLE;
177 uint32_t system_code = 0;
178
179 status = static_cast<::media::CdmKeyInformation::KeyStatus>(key.status());
180 system_code = key.system_code();
181
182 info.push_back(
183 ::media::CdmKeyInformation(key.key_id(), status, system_code));
184 }
185
186 *key_information = std::move(info);
187 return true;
188 }
189
190 #undef REQUIRED
191
192 void SerializeEncryptionScheme(
193 pb::EncryptionScheme* message,
194 const ::media::EncryptionScheme& encryption_scheme) {
195 message->set_mode(
196 static_cast<pb::EncryptionScheme::CipherMode>(encryption_scheme.mode()));
197 message->set_encrypt_blocks(encryption_scheme.pattern().encrypt_blocks());
198 message->set_skip_blocks(encryption_scheme.pattern().skip_blocks());
199 }
200
201 void SerializeSize(const gfx::Size& size, pb::Size* message) {
202 DCHECK(message);
203 message->set_width(size.width());
204 message->set_height(size.height());
205 }
206
207 void SerializeRect(pb::Rect* message, const gfx::Rect& rect) {
208 message->set_x(rect.x());
209 message->set_y(rect.y());
210 message->set_width(rect.width());
211 message->set_height(rect.height());
212 }
213
214 template <class DecoderConfig, class DecoderConfigMessage>
215 void SerializeExtraData(const DecoderConfig& config,
216 DecoderConfigMessage* decoder_config_message) {
217 if (config.extra_data().empty())
218 return;
219
220 decoder_config_message->set_extra_data(&config.extra_data()[0],
221 config.extra_data().size());
222 }
223
224 void SerializeAudioConfig(const ::media::AudioDecoderConfig& audio_config,
225 pb::AudioDecoderConfig* audio_message) {
226 if (!audio_config.IsValidConfig())
227 return;
228
229 audio_message->set_codec(
230 static_cast<pb::AudioDecoderConfig_Codec>(audio_config.codec()));
231 audio_message->set_sample_format(
232 static_cast<pb::AudioDecoderConfig_SampleFormat>(
233 audio_config.sample_format()));
234 audio_message->set_channel_layout(
235 static_cast<pb::AudioDecoderConfig_ChannelLayout>(
236 audio_config.channel_layout()));
237 audio_message->set_samples_per_second(audio_config.samples_per_second());
238 audio_message->set_seek_preroll_usec(
239 audio_config.seek_preroll().InMicroseconds());
240 audio_message->set_codec_delay(audio_config.codec_delay());
241
242 SerializeExtraData(audio_config, audio_message);
243
244 if (audio_config.is_encrypted()) {
245 pb::EncryptionScheme* encryption_scheme_message =
246 audio_message->mutable_encryption_scheme();
247 SerializeEncryptionScheme(encryption_scheme_message,
248 audio_config.encryption_scheme());
249 }
250 }
251
252 void SerializeVideoConfig(const ::media::VideoDecoderConfig& video_config,
253 pb::VideoDecoderConfig* video_message) {
254 if (!video_config.IsValidConfig())
255 return;
256
257 video_message->set_codec(
258 static_cast<pb::VideoDecoderConfig_Codec>(video_config.codec()));
259 video_message->set_profile(
260 static_cast<pb::VideoDecoderConfig_Profile>(video_config.profile()));
261 video_message->set_format(
262 static_cast<pb::VideoDecoderConfig_Format>(video_config.format()));
263 video_message->set_color_space(static_cast<pb::VideoDecoderConfig_ColorSpace>(
264 video_config.color_space()));
265
266 pb::Size* coded_size_message = video_message->mutable_coded_size();
267 SerializeSize(video_config.coded_size(), coded_size_message);
268
269 pb::Rect* visible_rect_message = video_message->mutable_visible_rect();
270 SerializeRect(visible_rect_message, video_config.visible_rect());
271
272 pb::Size* natural_size_message = video_message->mutable_natural_size();
273 SerializeSize(video_config.natural_size(), natural_size_message);
274
275 SerializeExtraData(video_config, video_message);
276
277 if (video_config.is_encrypted()) {
278 pb::EncryptionScheme* encryption_scheme_message =
279 video_message->mutable_encryption_scheme();
280 SerializeEncryptionScheme(encryption_scheme_message,
281 video_config.encryption_scheme());
282 }
283 }
284
285 void SerializeCdmConfig(const ::media::CdmConfig& cdm_config,
286 pb::CdmInitialize* message) {
287 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
288
289 message->set_allow_distinctive_identifier(
290 cdm_config.allow_distinctive_identifier);
291 message->set_allow_persistent_state(cdm_config.allow_persistent_state);
292 message->set_use_hw_secure_codecs(cdm_config.use_hw_secure_codecs);
293 }
294
295 void SerializeCdmPromiseResult(pb::CdmPromise* promise_message,
296 const CdmPromiseResult& result) {
297 promise_message->set_success(result.success());
298 if (!result.success()) {
299 promise_message->set_exception(
300 static_cast<pb::MediaKeysException>(result.exception()));
301 promise_message->set_system_code(result.system_code());
302 promise_message->set_error_message(result.error_message());
303 }
304 }
305
306 void SerializeCdmKeyInformation(
307 pb::CdmClientOnSessionKeysChange* key_change_message,
308 const std::vector<::media::CdmKeyInformation>& key_information) {
309 for (const auto& info : key_information) {
310 pb::CdmKeyInformation* key = key_change_message->add_key_information();
311 key->set_key_id(&(info.key_id[0]), info.key_id.size());
312 key->set_status(static_cast<pb::CdmKeyInformation::KeyStatus>(info.status));
313 key->set_system_code(info.system_code);
314 }
315 }
316
317 } // namespace
318
319 namespace internal {
320
321 #define REQUIRED(x) REQUIRED_IMPL(x, false)
322 bool CdmPromiseFromMessage(const pb::CdmPromise& promise_message,
323 CdmPromiseResult* result,
324 std::string* session_id) {
325 REQUIRED(DeserializeCdmPromiseResult(promise_message, result));
326
327 if (session_id)
328 *session_id = promise_message.session_id();
329
330 return true;
331 }
332 #undef REQUIRED
333
334 void CdmPromiseToMessage(pb::CdmPromise* promise_message,
335 const CdmPromiseResult& result,
336 const std::string& session_id) {
337 SerializeCdmPromiseResult(promise_message, result);
338 if (!session_id.empty())
339 promise_message->set_session_id(session_id);
340 }
341
342 } // namespace internal
343
344 Rpc::Rpc(int handle) : handle_(handle) {}
345
346 Rpc::~Rpc() = default;
347
348 scoped_refptr<Rpc> Rpc::FromMessage(const std::string& proto_message) {
349 DCHECK(!proto_message.empty());
350
351 pb::RpcMessage rpc;
352 if (!rpc.ParseFromString(proto_message)) {
353 LOG(ERROR) << "Bad proto buffer";
354 return nullptr;
355 }
356
357 #define CASE(proc, cls) \
358 case proc: \
359 return cls::FromRpcMessage(&rpc)
360 switch (rpc.proc()) {
361 CASE(RPC(RPC_ACQUIRE_RENDERER), AcquireRendererRpc);
362 CASE(RPC(RPC_ACQUIRE_RENDERER_DONE), AcquireRendererDoneRpc);
363 CASE(RPC(RPC_ACQUIRE_CDM), AcquireCdmRpc);
364 CASE(RPC(RPC_ACQUIRE_CDM_DONE), AcquireCdmDoneRpc);
365 CASE(RPC(RPC_R_INITIALIZE), RendererInitializeRpc);
366 CASE(RPC(RPC_R_FLUSH), RendererFlushRpc);
367 CASE(RPC(RPC_R_STARTPLAYINGFROM), RendererStartPlayingFromRpc);
368 CASE(RPC(RPC_R_SETPLAYBACKRATE), RendererSetPlaybackRateRpc);
369 CASE(RPC(RPC_R_SETVOLUME), RendererSetVolumeRpc);
370 CASE(RPC(RPC_R_SETCDM), RendererSetCdmRpc);
371 CASE(RPC(RPC_R_INITIALIZE_CALLBACK), RendererInitializeCallbackRpc);
372 CASE(RPC(RPC_R_FLUSH_CALLBACK), RendererFlushCallbackRpc);
373 CASE(RPC(RPC_R_SETCDM_CALLBACK), RendererSetCdmCallbackRpc);
374 CASE(RPC(RPC_RC_ONTIMEUPDATE), RendererClientOnTimeUpdateRpc);
375 CASE(RPC(RPC_RC_ONBUFFERINGSTATECHANGE),
376 RendererClientOnBufferingStateChangeRpc);
377 CASE(RPC(RPC_RC_ONENDED), RendererClientOnEndedRpc);
378 CASE(RPC(RPC_RC_ONERROR), RendererClientOnErrorRpc);
379 CASE(RPC(RPC_RC_ONVIDEONATURALSIZECHANGE),
380 RendererClientOnVideoNaturalSizeChangeRpc);
381 CASE(RPC(RPC_RC_ONVIDEOOPACITYCHANGE),
382 RendererClientOnVideoOpacityChangeRpc);
383 CASE(RPC(RPC_DS_INITIALIZE), DemuxerStreamInitializeRpc);
384 CASE(RPC(RPC_DS_ENABLEBITSTREAMCONVERTER),
385 DemuxerStreamEnableBitstreamConverterRpc);
386 CASE(RPC(RPC_DS_READUNTIL), DemuxerStreamReadUntilRpc);
387 CASE(RPC(RPC_DS_INITIALIZE_CALLBACK), DemuxerStreamInitializeCallbackRpc);
388 CASE(RPC(RPC_DS_READUNTIL_CALLBACK), DemuxerStreamReadUntilCallbackRpc);
389 CASE(RPC(RPC_CDM_SETCLIENT), CdmSetClientRpc);
390 CASE(RPC(RPC_CDM_INITIALIZE), CdmInitializeRpc);
391 CASE(RPC(RPC_CDM_SETSERVERCERTIFICATE), CdmSetServerCertificateRpc);
392 CASE(RPC(RPC_CDM_CREATESESSIONANDGENERATEREQUEST),
393 CdmCreateSessionAndGenerateRequestRpc);
394 CASE(RPC(RPC_CDM_LOADSESSION), CdmLoadSessionRpc);
395 CASE(RPC(RPC_CDM_UPDATESESSION), CdmUpdateSessionRpc);
396 CASE(RPC(RPC_CDM_CLOSESESSION), CdmCloseSessionRpc);
397 CASE(RPC(RPC_CDM_REMOVESESSION), CdmRemoveSessionRpc);
398 CASE(RPC(RPC_CDM_INITIALIZE_CALLBACK), CdmInitializeCallbackRpc);
399 CASE(RPC(RPC_CDM_SETSERVERCERTIFICATE_CALLBACK),
400 CdmSetServerCertificateCallbackRpc);
401 CASE(RPC(RPC_CDM_CREATESESSIONANDGENERATEREQUEST_CALLBACK),
402 CdmCreateSessionAndGenerateRequestCallbackRpc);
403 CASE(RPC(RPC_CDM_UPDATESESSION_CALLBACK), CdmUpdateSessionCallbackRpc);
404 CASE(RPC(RPC_CDM_CLOSESESSION_CALLBACK), CdmCloseSessionCallbackRpc);
405 CASE(RPC(RPC_CDM_REMOVESESSION_CALLBACK), CdmRemoveSessionCallbackRpc);
406 CASE(RPC(RPC_CDMC_ONSESSIONMESSAGE), CdmClientOnSessionMessageRpc);
407 CASE(RPC(RPC_CDMC_ONSESSIONCLOSED), CdmClientOnSessionClosedRpc);
408 CASE(RPC(RPC_CDMC_ONLEGACYSESSIONERROR), CdmClientOnLegacySessionErrorRpc);
409 CASE(RPC(RPC_CDMC_ONSESSIONKEYSCHANGE), CdmClientOnSessionKeysChangeRpc);
410 CASE(RPC(RPC_CDMC_ONSESSIONEXPIRATIONUPDATE),
411 CdmClientOnSessionExpirationUpdateRpc);
412 default:
413 LOG(ERROR) << "Unknown Rpc: " << rpc.proc();
414 return nullptr;
415 }
416 #undef CASE
417 }
418
419 #define REQUIRED(x) REQUIRED_IMPL(x, nullptr)
420
421 std::string Rpc::ToMessage() const {
422 pb::RpcMessage rpc;
423 ToMessageInternal(&rpc);
424 rpc.set_handle(handle_);
425 rpc.set_proc(GetProc());
426 std::string proto_msg;
427 bool valid = rpc.ByteSize() > 0 && rpc.SerializeToString(&proto_msg);
428 DCHECK(valid);
429 return proto_msg;
430 }
431
432 //==============================================================================
433 RendererInitializeRpc::RendererInitializeRpc(int handle,
434 int client_handle,
435 int audio_demuxer_handle,
436 int video_demuxer_handle,
437 int callback_handle)
438 : Rpc(handle),
439 client_handle_(client_handle),
440 audio_demuxer_handle_(audio_demuxer_handle),
441 video_demuxer_handle_(video_demuxer_handle),
442 callback_handle_(callback_handle) {}
443
444 RendererInitializeRpc::~RendererInitializeRpc() = default;
445
446 scoped_refptr<RendererInitializeRpc> RendererInitializeRpc::FromRpcMessage(
447 const pb::RpcMessage* rpc) {
448 DCHECK_EQ(RPC(RPC_R_INITIALIZE), rpc->proc());
449
450 int client_handle = kInvalidHandle;
451 int audio_demuxer_handle = kInvalidHandle;
452 int video_demuxer_handle = kInvalidHandle;
453 int callback_handle = kInvalidHandle;
454
455 DCHECK(rpc->has_renderer_initialize_rpc());
456 const pb::RendererInitialize rpc_message = rpc->renderer_initialize_rpc();
457 client_handle = rpc_message.client_handle();
458 audio_demuxer_handle = rpc_message.audio_demuxer_handle();
459 video_demuxer_handle = rpc_message.video_demuxer_handle();
460 callback_handle = rpc_message.callback_handle();
461
462 VLOG(2) << "client_handle:" << client_handle
463 << " audio_demuxer_handle:" << audio_demuxer_handle
464 << " video_demuxer_handle:" << video_demuxer_handle
465 << " callback_handle:" << callback_handle;
466 return new RendererInitializeRpc(rpc->handle(), client_handle,
467 audio_demuxer_handle, video_demuxer_handle,
468 callback_handle);
469 }
470
471 pb::RpcProc RendererInitializeRpc::GetProc() const {
472 return RPC(RPC_R_INITIALIZE);
473 }
474
475 void RendererInitializeRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
476 VLOG(2) << __FUNCTION__ << "client_handle:" << client_handle_
477 << " audio_demuxer_handle:" << audio_demuxer_handle_
478 << " video_demuxer_handle:" << video_demuxer_handle_
479 << " callback_handle:" << callback_handle_;
480 pb::RendererInitialize* message = rpc->mutable_renderer_initialize_rpc();
481 message->set_client_handle(client_handle_);
482 message->set_audio_demuxer_handle(audio_demuxer_handle_);
483 message->set_video_demuxer_handle(video_demuxer_handle_);
484 message->set_callback_handle(callback_handle_);
485 }
486
487 //==============================================================================
488 RendererStartPlayingFromRpc::RendererStartPlayingFromRpc(
489 int handle,
490 int64_t time_delta_usec)
491 : Rpc(handle), time_delta_usec_(time_delta_usec) {}
492
493 RendererStartPlayingFromRpc::~RendererStartPlayingFromRpc() = default;
494
495 // static
496 scoped_refptr<RendererStartPlayingFromRpc>
497 RendererStartPlayingFromRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
498 DCHECK_EQ(RPC(RPC_R_STARTPLAYINGFROM), rpc->proc());
499
500 int64_t time_delta_usec = 0;
501
502 DCHECK(rpc->has_renderer_startplayingfrom_rpc());
503 const pb::RendererStartPlayingFrom rpc_message =
504 rpc->renderer_startplayingfrom_rpc();
505 time_delta_usec = rpc_message.time_delta_usec();
506
507 VLOG(2) << "time_delta_usec:" << time_delta_usec;
508 return new RendererStartPlayingFromRpc(rpc->handle(), time_delta_usec);
509 }
510
511 pb::RpcProc RendererStartPlayingFromRpc::GetProc() const {
512 return RPC(RPC_R_STARTPLAYINGFROM);
513 }
514
515 void RendererStartPlayingFromRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
516 VLOG(2) << __FUNCTION__ << "time_delta_usec:" << time_delta_usec_;
517 pb::RendererStartPlayingFrom* message =
518 rpc->mutable_renderer_startplayingfrom_rpc();
519 message->set_time_delta_usec(time_delta_usec_);
520 }
521
522 //==============================================================================
523 RendererSetCdmRpc::RendererSetCdmRpc(int handle,
524 int cdm_id,
525 int callback_handle)
526 : Rpc(handle), cdm_id_(cdm_id), callback_handle_(callback_handle) {}
527
528 RendererSetCdmRpc::~RendererSetCdmRpc() = default;
529
530 scoped_refptr<RendererSetCdmRpc> RendererSetCdmRpc::FromRpcMessage(
531 const pb::RpcMessage* rpc) {
532 DCHECK_EQ(RPC(RPC_R_SETCDM), rpc->proc());
533
534 REQUIRED(rpc->has_renderer_set_cdm_rpc());
535 const pb::RendererSetCdm rpc_message = rpc->renderer_set_cdm_rpc();
536 int cdm_id = rpc_message.cdm_id();
537 int callback_handle = rpc_message.callback_handle();
538
539 VLOG(2) << "cdm_id:" << cdm_id << " callback_handle:" << callback_handle;
540 return new RendererSetCdmRpc(rpc->handle(), cdm_id, callback_handle);
541 }
542
543 pb::RpcProc RendererSetCdmRpc::GetProc() const {
544 return RPC(RPC_R_SETCDM);
545 }
546
547 void RendererSetCdmRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
548 pb::RendererSetCdm* message = rpc->mutable_renderer_set_cdm_rpc();
549 VLOG(2) << __FUNCTION__ << " cdm_id:" << cdm_id_
550 << " callback_handle:" << callback_handle_;
551 message->set_cdm_id(cdm_id_);
552 message->set_callback_handle(callback_handle_);
553 }
554
555 //==============================================================================
556 RendererClientOnTimeUpdateRpc::RendererClientOnTimeUpdateRpc(
557 int handle,
558 int64_t time_usec,
559 int64_t max_time_usec)
560 : Rpc(handle), time_usec_(time_usec), max_time_usec_(max_time_usec) {}
561
562 RendererClientOnTimeUpdateRpc::~RendererClientOnTimeUpdateRpc() = default;
563
564 scoped_refptr<RendererClientOnTimeUpdateRpc>
565 RendererClientOnTimeUpdateRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
566 DCHECK_EQ(RPC(RPC_RC_ONTIMEUPDATE), rpc->proc());
567
568 REQUIRED(rpc->has_rendererclient_ontimeupdate_rpc());
569 const pb::RendererClientOnTimeUpdate rpc_message =
570 rpc->rendererclient_ontimeupdate_rpc();
571 int64_t time_usec = rpc_message.time_usec();
572 int64_t max_time_usec = rpc_message.max_time_usec();
573
574 VLOG(2) << __FUNCTION__ << " time_usec:" << time_usec
575 << " max_time_usec:" << max_time_usec;
576 return new RendererClientOnTimeUpdateRpc(rpc->handle(), time_usec,
577 max_time_usec);
578 }
579
580 pb::RpcProc RendererClientOnTimeUpdateRpc::GetProc() const {
581 return RPC(RPC_RC_ONTIMEUPDATE);
582 }
583
584 void RendererClientOnTimeUpdateRpc::ToMessageInternal(
585 pb::RpcMessage* rpc) const {
586 pb::RendererClientOnTimeUpdate* message =
587 rpc->mutable_rendererclient_ontimeupdate_rpc();
588 VLOG(2) << __FUNCTION__ << " time_usec:" << time_usec_
589 << " max_time_usec:" << time_usec_;
590 message->set_time_usec(time_usec_);
591 message->set_max_time_usec(max_time_usec_);
592 }
593
594 //==============================================================================
595 RendererClientOnVideoNaturalSizeChangeRpc::
596 RendererClientOnVideoNaturalSizeChangeRpc(int handle, const gfx::Size& size)
597 : Rpc(handle), size_(size) {}
598
599 RendererClientOnVideoNaturalSizeChangeRpc::
600 ~RendererClientOnVideoNaturalSizeChangeRpc() = default;
601
602 scoped_refptr<RendererClientOnVideoNaturalSizeChangeRpc>
603 RendererClientOnVideoNaturalSizeChangeRpc::FromRpcMessage(
604 const pb::RpcMessage* rpc) {
605 DCHECK_EQ(RPC(RPC_RC_ONVIDEONATURALSIZECHANGE), rpc->proc());
606
607 REQUIRED(rpc->has_rendererclient_onvideonatualsizechange_rpc());
608 const pb::Size rpc_message =
609 rpc->rendererclient_onvideonatualsizechange_rpc();
610 gfx::Size size;
611 DeserializeSize(rpc_message, &size);
612
613 VLOG(2) << "size:" << size.ToString();
614 return new RendererClientOnVideoNaturalSizeChangeRpc(rpc->handle(), size);
615 }
616
617 pb::RpcProc RendererClientOnVideoNaturalSizeChangeRpc::GetProc() const {
618 return RPC(RPC_RC_ONVIDEONATURALSIZECHANGE);
619 }
620
621 void RendererClientOnVideoNaturalSizeChangeRpc::ToMessageInternal(
622 pb::RpcMessage* rpc) const {
623 VLOG(2) << __FUNCTION__ << "size:" << size_.ToString();
624 pb::Size* message = rpc->mutable_rendererclient_onvideonatualsizechange_rpc();
625 SerializeSize(size_, message);
626 }
627
628 //==============================================================================
629 DemuxerStreamReadUntilRpc::DemuxerStreamReadUntilRpc(int handle,
630 uint32_t frame_id,
631 int callback_handle)
632 : Rpc(handle), frame_id_(frame_id), callback_handle_(callback_handle) {}
633
634 DemuxerStreamReadUntilRpc::~DemuxerStreamReadUntilRpc() = default;
635
636 scoped_refptr<DemuxerStreamReadUntilRpc>
637 DemuxerStreamReadUntilRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
638 DCHECK_EQ(RPC(RPC_DS_READUNTIL), rpc->proc());
639
640 REQUIRED(rpc->has_demuxerstream_readuntil_rpc());
641 const pb::DemuxerStreamReadUntil rpc_message =
642 rpc->demuxerstream_readuntil_rpc();
643 int frame_id = rpc_message.frame_id();
644 int callback_handle = rpc_message.callback_handle();
645
646 VLOG(2) << "frame_id:" << frame_id << " callback_handle:" << callback_handle;
647 return new DemuxerStreamReadUntilRpc(rpc->handle(), frame_id,
648 callback_handle);
649 }
650
651 pb::RpcProc DemuxerStreamReadUntilRpc::GetProc() const {
652 return RPC(RPC_DS_READUNTIL);
653 }
654
655 void DemuxerStreamReadUntilRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
656 VLOG(2) << __FUNCTION__ << " frame_id:" << frame_id_
657 << " callback_handle:" << callback_handle_;
658 pb::DemuxerStreamReadUntil* message =
659 rpc->mutable_demuxerstream_readuntil_rpc();
660 message->set_callback_handle(callback_handle_);
661 message->set_frame_id(frame_id_);
662 }
663
664 //==============================================================================
665 DemuxerStreamInitializeCallbackRpc::DemuxerStreamInitializeCallbackRpc(
666 int handle,
667 ::media::DemuxerStream::Type type,
668 const ::media::AudioDecoderConfig& audio_config,
669 const ::media::VideoDecoderConfig& video_config)
670 : Rpc(handle),
671 type_(type),
672 audio_config_(audio_config),
673 video_config_(video_config) {}
674
675 DemuxerStreamInitializeCallbackRpc::~DemuxerStreamInitializeCallbackRpc() =
676 default;
677
678 scoped_refptr<DemuxerStreamInitializeCallbackRpc>
679 DemuxerStreamInitializeCallbackRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
680 DCHECK_EQ(RPC(RPC_DS_INITIALIZE_CALLBACK), rpc->proc());
681
682 REQUIRED(rpc->has_demuxerstream_initializecb_rpc());
683 const pb::DemuxerStreamInitializeCallback rpc_message =
684 rpc->demuxerstream_initializecb_rpc();
685 ::media::DemuxerStream::Type type =
686 static_cast<::media::DemuxerStream::Type>(rpc_message.type());
687 ::media::AudioDecoderConfig audio_config;
688 ::media::VideoDecoderConfig video_config;
689 switch (type) {
690 case ::media::DemuxerStream::Type::AUDIO: {
691 const pb::AudioDecoderConfig& audio_message =
692 rpc_message.audio_decoder_config();
693 REQUIRED(DeserializeAudioConfig(audio_message, &audio_config));
694 break;
695 }
696 case ::media::DemuxerStream::Type::VIDEO: {
697 const pb::VideoDecoderConfig& video_message =
698 rpc_message.video_decoder_config();
699 REQUIRED(DeserializeVideoConfig(video_message, &video_config));
700 break;
701 }
702 default:
703 LOG(ERROR) << "stream type unsupported";
704 return nullptr;
705 }
706
707 VLOG(2) << "type:" << type
708 << " audio_config:" << audio_config.AsHumanReadableString()
709 << " video_config:" << video_config.AsHumanReadableString();
710 return new DemuxerStreamInitializeCallbackRpc(rpc->handle(), type,
711 audio_config, video_config);
712 }
713
714 pb::RpcProc DemuxerStreamInitializeCallbackRpc::GetProc() const {
715 return RPC(RPC_DS_INITIALIZE_CALLBACK);
716 }
717
718 void DemuxerStreamInitializeCallbackRpc::ToMessageInternal(
719 pb::RpcMessage* rpc) const {
720 VLOG(2) << __FUNCTION__ << " type:" << type_
721 << " audio_config:" << audio_config_.AsHumanReadableString()
722 << " video_config:" << video_config_.AsHumanReadableString();
723 DCHECK(type_ == ::media::DemuxerStream::Type::AUDIO ||
724 type_ == ::media::DemuxerStream::Type::VIDEO);
725
726 pb::DemuxerStreamInitializeCallback* message =
727 rpc->mutable_demuxerstream_initializecb_rpc();
728 message->set_type(type_);
729
730 switch (type_) {
731 case ::media::DemuxerStream::Type::AUDIO: {
732 pb::AudioDecoderConfig* audio_message =
733 message->mutable_audio_decoder_config();
734 SerializeAudioConfig(audio_config_, audio_message);
735 break;
736 }
737 case ::media::DemuxerStream::Type::VIDEO: {
738 pb::VideoDecoderConfig* video_message =
739 message->mutable_video_decoder_config();
740 SerializeVideoConfig(video_config_, video_message);
741 break;
742 }
743 default:
744 NOTREACHED();
745 }
746 }
747
748 //==============================================================================
749 DemuxerStreamReadUntilCallbackRpc::DemuxerStreamReadUntilCallbackRpc(
750 int handle,
751 uint32_t frame_id,
752 ::media::DemuxerStream::Status status,
753 const ::media::AudioDecoderConfig& audio_config,
754 const ::media::VideoDecoderConfig& video_config)
755 : Rpc(handle),
756 frame_id_(frame_id),
757 status_(status),
758 audio_config_(audio_config),
759 video_config_(video_config) {}
760
761 DemuxerStreamReadUntilCallbackRpc::~DemuxerStreamReadUntilCallbackRpc() =
762 default;
763
764 scoped_refptr<DemuxerStreamReadUntilCallbackRpc>
765 DemuxerStreamReadUntilCallbackRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
766 DCHECK_EQ(RPC(RPC_DS_READUNTIL_CALLBACK), rpc->proc());
767
768 REQUIRED(rpc->has_demuxerstream_readuntilcb_rpc());
769 const pb::DemuxerStreamReadUntilCallback rpc_message =
770 rpc->demuxerstream_readuntilcb_rpc();
771 int frame_id = rpc_message.frame_id();
772 ::media::DemuxerStream::Status status =
773 static_cast<::media::DemuxerStream::Status>(rpc_message.status());
774
775 ::media::AudioDecoderConfig audio_config;
776 ::media::VideoDecoderConfig video_config;
777 if (status == ::media::DemuxerStream::kConfigChanged) {
778 if (rpc_message.has_audio_decoder_config()) {
779 REQUIRED(DeserializeAudioConfig(rpc_message.audio_decoder_config(),
780 &audio_config));
781 } else if (rpc_message.has_video_decoder_config()) {
782 REQUIRED(DeserializeVideoConfig(rpc_message.video_decoder_config(),
783 &video_config));
784 } else {
785 LOG(ERROR) << "packet has neither 'audio_config' nor 'video_config'";
786 return nullptr;
787 }
788 }
789
790 VLOG(2) << "status:" << status << " frame_id:" << frame_id;
791 return new DemuxerStreamReadUntilCallbackRpc(rpc->handle(), frame_id, status,
792 audio_config, video_config);
793 }
794
795 pb::RpcProc DemuxerStreamReadUntilCallbackRpc::GetProc() const {
796 return RPC(RPC_DS_READUNTIL_CALLBACK);
797 }
798
799 void DemuxerStreamReadUntilCallbackRpc::ToMessageInternal(
800 pb::RpcMessage* rpc) const {
801 VLOG(2) << __FUNCTION__ << " frame_id:" << frame_id_ << " status:" << status_;
802
803 pb::DemuxerStreamReadUntilCallback* message =
804 rpc->mutable_demuxerstream_readuntilcb_rpc();
805 message->set_frame_id(frame_id_);
806 message->set_status(status_);
807
808 if (status_ == ::media::DemuxerStream::kConfigChanged) {
809 if (audio_config_.IsValidConfig()) {
810 pb::AudioDecoderConfig* audio_message =
811 message->mutable_audio_decoder_config();
812 SerializeAudioConfig(audio_config_, audio_message);
813 } else if (video_config_.IsValidConfig()) {
814 pb::VideoDecoderConfig* video_message =
815 message->mutable_video_decoder_config();
816 SerializeVideoConfig(video_config_, video_message);
817 } else {
818 NOTREACHED();
819 }
820 }
821 }
822
823 //==============================================================================
824 CdmInitializeRpc::CdmInitializeRpc(int handle,
825 const std::string& key_system,
826 const std::string& security_origin,
827 const ::media::CdmConfig& cdm_config,
828 int callback_handle)
829 : Rpc(handle),
830 key_system_(key_system),
831 security_origin_(security_origin),
832 cdm_config_(cdm_config),
833 callback_handle_(callback_handle) {}
834
835 CdmInitializeRpc::~CdmInitializeRpc() = default;
836
837 scoped_refptr<CdmInitializeRpc> CdmInitializeRpc::FromRpcMessage(
838 const pb::RpcMessage* rpc) {
839 DCHECK_EQ(RPC(RPC_CDM_INITIALIZE), rpc->proc());
840
841 REQUIRED(rpc->has_cdm_initialize_rpc());
842 const pb::CdmInitialize rpc_message = rpc->cdm_initialize_rpc();
843 std::string key_system = rpc_message.key_system();
844 std::string security_origin = rpc_message.security_origin();
845 ::media::CdmConfig cdm_config;
846 cdm_config.allow_distinctive_identifier =
847 rpc_message.allow_distinctive_identifier();
848 cdm_config.allow_persistent_state = rpc_message.allow_persistent_state();
849 cdm_config.use_hw_secure_codecs = rpc_message.use_hw_secure_codecs();
850 int callback_handle = rpc_message.callback_handle();
851
852 VLOG(2) << "key_system:" << key_system
853 << " security_origin:" << security_origin
854 << " allow_distinctive_identifier:"
855 << cdm_config.allow_distinctive_identifier
856 << " allow_persistent_state:" << cdm_config.allow_persistent_state
857 << " use_hw_secure_codecs:" << cdm_config.use_hw_secure_codecs
858 << " callback_handle:" << callback_handle;
859 return new CdmInitializeRpc(rpc->handle(), key_system, security_origin,
860 cdm_config, callback_handle);
861 }
862
863 pb::RpcProc CdmInitializeRpc::GetProc() const {
864 return RPC(RPC_CDM_INITIALIZE);
865 }
866
867 void CdmInitializeRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
868 VLOG(2) << __FUNCTION__ << " key_system:" << key_system_
869 << " security_origin:" << security_origin_
870 << " allow_distinctive_identifier:"
871 << cdm_config_.allow_distinctive_identifier
872 << " allow_persistent_state:" << cdm_config_.allow_persistent_state
873 << " use_hw_secure_codecs:" << cdm_config_.use_hw_secure_codecs
874 << " callback_handle:" << callback_handle_;
875
876 pb::CdmInitialize* message = rpc->mutable_cdm_initialize_rpc();
877 message->set_key_system(key_system_);
878 message->set_security_origin(security_origin_);
879 SerializeCdmConfig(cdm_config_, message);
880 message->set_callback_handle(callback_handle_);
881 }
882
883 //==============================================================================
884 CdmSetServerCertificateRpc::CdmSetServerCertificateRpc(
885 int handle,
886 const uint8_t* certificate_data,
887 size_t certificate_data_size,
888 int callback_handle)
889 : Rpc(handle),
890 certificate_data_(certificate_data,
891 certificate_data + certificate_data_size),
892 callback_handle_(callback_handle) {}
893
894 CdmSetServerCertificateRpc::~CdmSetServerCertificateRpc() = default;
895
896 scoped_refptr<CdmSetServerCertificateRpc>
897 CdmSetServerCertificateRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
898 DCHECK_EQ(RPC(RPC_CDM_SETSERVERCERTIFICATE), rpc->proc());
899
900 REQUIRED(rpc->has_cdm_setservercertificate_rpc());
901 const pb::CdmSetServerCertificate rpc_message =
902 rpc->cdm_setservercertificate_rpc();
903 int callback_handle = rpc_message.callback_handle();
904
905 std::vector<uint8_t> certificate;
906 certificate.assign(rpc_message.certificate_data().begin(),
907 rpc_message.certificate_data().end());
908
909 VLOG(2) << "callback_handle:" << callback_handle
910 << " certificate size:" << certificate.size();
911 return new CdmSetServerCertificateRpc(rpc->handle(), &certificate[0],
912 certificate.size(), callback_handle);
913 }
914
915 pb::RpcProc CdmSetServerCertificateRpc::GetProc() const {
916 return RPC(RPC_CDM_SETSERVERCERTIFICATE);
917 }
918
919 void CdmSetServerCertificateRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
920 VLOG(2) << __FUNCTION__ << " callback_handle:" << callback_handle_
921 << " certificate size:" << certificate_data_.size();
922 pb::CdmSetServerCertificate* message =
923 rpc->mutable_cdm_setservercertificate_rpc();
924 message->set_callback_handle(callback_handle_);
925 message->set_certificate_data(&certificate_data_[0],
926 certificate_data_.size());
927 }
928
929 //==============================================================================
930 CdmCreateSessionAndGenerateRequestRpc::CdmCreateSessionAndGenerateRequestRpc(
931 int handle,
932 ::media::MediaKeys::SessionType session_type,
933 ::media::EmeInitDataType init_data_type,
934 const uint8_t* init_data,
935 size_t init_data_size,
936 int callback_handle)
937 : Rpc(handle),
938 session_type_(session_type),
939 init_data_type_(init_data_type),
940 init_data_(init_data, init_data + init_data_size),
941 callback_handle_(callback_handle) {}
942
943 CdmCreateSessionAndGenerateRequestRpc::
944 ~CdmCreateSessionAndGenerateRequestRpc() = default;
945
946 scoped_refptr<CdmCreateSessionAndGenerateRequestRpc>
947 CdmCreateSessionAndGenerateRequestRpc::FromRpcMessage(
948 const pb::RpcMessage* rpc) {
949 DCHECK_EQ(RPC(RPC_CDM_CREATESESSIONANDGENERATEREQUEST), rpc->proc());
950
951 REQUIRED(rpc->has_cdm_createsessionandgeneraterequest_rpc());
952 const pb::CdmCreateSessionAndGenerateRequest rpc_message =
953 rpc->cdm_createsessionandgeneraterequest_rpc();
954 ::media::MediaKeys::SessionType session_type =
955 static_cast<::media::MediaKeys::SessionType>(rpc_message.session_type());
956 ::media::EmeInitDataType init_data_type =
957 static_cast<::media::EmeInitDataType>(rpc_message.init_data_type());
958 int callback_handle = rpc_message.callback_handle();
959 std::vector<uint8_t> init_data;
960 init_data.assign(rpc_message.init_data().begin(),
961 rpc_message.init_data().end());
962
963 VLOG(2) << "session_type:" << session_type
964 << " init_data_type:" << static_cast<int>(init_data_type)
965 << " callback_handle:" << callback_handle
966 << " init_data size:" << init_data.size();
967 return new CdmCreateSessionAndGenerateRequestRpc(
968 rpc->handle(), session_type, init_data_type, &init_data[0],
969 init_data.size(), callback_handle);
970 }
971
972 pb::RpcProc CdmCreateSessionAndGenerateRequestRpc::GetProc() const {
973 return RPC(RPC_CDM_CREATESESSIONANDGENERATEREQUEST);
974 }
975
976 void CdmCreateSessionAndGenerateRequestRpc::ToMessageInternal(
977 pb::RpcMessage* rpc) const {
978 VLOG(2) << __FUNCTION__ << " session_type:" << session_type_
979 << " init_data_type:" << static_cast<int>(init_data_type_)
980 << " callback_handle:" << callback_handle_
981 << " init_data size:" << init_data_.size();
982
983 pb::CdmCreateSessionAndGenerateRequest* message =
984 rpc->mutable_cdm_createsessionandgeneraterequest_rpc();
985 message->set_session_type(session_type_);
986 message->set_init_data_type(static_cast<int>(init_data_type_));
987 message->set_callback_handle(callback_handle_);
988 message->set_init_data(&init_data_[0], init_data_.size());
989 }
990
991 //==============================================================================
992 CdmLoadSessionRpc::CdmLoadSessionRpc(
993 int handle,
994 ::media::MediaKeys::SessionType session_type,
995 const std::string& session_id,
996 int callback_handle)
997 : Rpc(handle),
998 session_type_(session_type),
999 session_id_(session_id),
1000 callback_handle_(callback_handle) {}
1001
1002 CdmLoadSessionRpc::~CdmLoadSessionRpc() = default;
1003
1004 scoped_refptr<CdmLoadSessionRpc> CdmLoadSessionRpc::FromRpcMessage(
1005 const pb::RpcMessage* rpc) {
1006 DCHECK_EQ(RPC(RPC_CDM_LOADSESSION), rpc->proc());
1007
1008 REQUIRED(rpc->has_cdm_loadsession_rpc());
1009 const pb::CdmLoadSession rpc_message = rpc->cdm_loadsession_rpc();
1010 ::media::MediaKeys::SessionType session_type =
1011 static_cast<::media::MediaKeys::SessionType>(rpc_message.session_type());
1012 std::string session_id = rpc_message.session_id();
1013 int callback_handle = rpc_message.callback_handle();
1014
1015 VLOG(2) << "session_type:" << session_type << " session_id:" << session_id
1016 << " callback_handle:" << callback_handle;
1017 return new CdmLoadSessionRpc(rpc->handle(), session_type, session_id,
1018 callback_handle);
1019 }
1020
1021 pb::RpcProc CdmLoadSessionRpc::GetProc() const {
1022 return RPC(RPC_CDM_LOADSESSION);
1023 }
1024
1025 void CdmLoadSessionRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
1026 VLOG(2) << __FUNCTION__ << " session_type:" << session_type_
1027 << " session_id:" << session_id_
1028 << " callback_handle:" << callback_handle_;
1029
1030 pb::CdmLoadSession* message = rpc->mutable_cdm_loadsession_rpc();
1031 message->set_session_type(session_type_);
1032 message->set_session_id(session_id_);
1033 message->set_callback_handle(callback_handle_);
1034 }
1035
1036 //==============================================================================
1037 CdmUpdateSessionRpc::CdmUpdateSessionRpc(int handle,
1038 const std::string& session_id,
1039 const uint8_t* response,
1040 size_t response_size,
1041 int callback_handle)
1042 : Rpc(handle),
1043 session_id_(session_id),
1044 response_(response, response + response_size),
1045 callback_handle_(callback_handle) {}
1046 CdmUpdateSessionRpc::~CdmUpdateSessionRpc() = default;
1047
1048 scoped_refptr<CdmUpdateSessionRpc> CdmUpdateSessionRpc::FromRpcMessage(
1049 const pb::RpcMessage* rpc) {
1050 DCHECK_EQ(RPC(RPC_CDM_UPDATESESSION), rpc->proc());
1051
1052 REQUIRED(rpc->has_cdm_updatesession_rpc());
1053 const pb::CdmUpdateSession rpc_message = rpc->cdm_updatesession_rpc();
1054 std::string session_id = rpc_message.session_id();
1055 int callback_handle = rpc_message.callback_handle();
1056 std::vector<uint8_t> response;
1057 response.assign(rpc_message.response().begin(), rpc_message.response().end());
1058 VLOG(2) << " session_id:" << session_id
1059 << " callback_handle:" << callback_handle
1060 << " response size:" << response.size();
1061
1062 return new CdmUpdateSessionRpc(rpc->handle(), session_id, &response[0],
1063 response.size(), callback_handle);
1064 }
1065
1066 pb::RpcProc CdmUpdateSessionRpc::GetProc() const {
1067 return RPC(RPC_CDM_UPDATESESSION);
1068 }
1069
1070 void CdmUpdateSessionRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
1071 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1072 << " callback_handle:" << callback_handle_
1073 << " response size:" << response_.size();
1074
1075 pb::CdmUpdateSession* message = rpc->mutable_cdm_updatesession_rpc();
1076 message->set_session_id(session_id_);
1077 message->set_callback_handle(callback_handle_);
1078 message->set_response(&response_[0], response_.size());
1079 }
1080
1081 //==============================================================================
1082 CdmCloseSessionRpc::CdmCloseSessionRpc(int handle,
1083 const std::string& session_id,
1084 int callback_handle)
1085 : Rpc(handle), session_id_(session_id), callback_handle_(callback_handle) {}
1086
1087 CdmCloseSessionRpc::~CdmCloseSessionRpc() = default;
1088
1089 scoped_refptr<CdmCloseSessionRpc> CdmCloseSessionRpc::FromRpcMessage(
1090 const pb::RpcMessage* rpc) {
1091 DCHECK_EQ(RPC(RPC_CDM_CLOSESESSION), rpc->proc());
1092
1093 REQUIRED(rpc->has_cdm_closesession_rpc());
1094 const pb::CdmCloseSession rpc_message = rpc->cdm_closesession_rpc();
1095 std::string session_id = rpc_message.session_id();
1096 int callback_handle = rpc_message.callback_handle();
1097
1098 VLOG(2) << " session_id:" << session_id
1099 << " callback_handle:" << callback_handle;
1100 return new CdmCloseSessionRpc(rpc->handle(), session_id, callback_handle);
1101 }
1102
1103 pb::RpcProc CdmCloseSessionRpc::GetProc() const {
1104 return RPC(RPC_CDM_CLOSESESSION);
1105 }
1106
1107 void CdmCloseSessionRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
1108 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1109 << " callback_handle:" << callback_handle_;
1110
1111 pb::CdmCloseSession* message = rpc->mutable_cdm_closesession_rpc();
1112 message->set_session_id(session_id_);
1113 message->set_callback_handle(callback_handle_);
1114 }
1115
1116 //==============================================================================
1117 CdmRemoveSessionRpc::CdmRemoveSessionRpc(int handle,
1118 const std::string& session_id,
1119 int callback_handle)
1120 : Rpc(handle), session_id_(session_id), callback_handle_(callback_handle) {}
1121
1122 CdmRemoveSessionRpc::~CdmRemoveSessionRpc() = default;
1123
1124 scoped_refptr<CdmRemoveSessionRpc> CdmRemoveSessionRpc::FromRpcMessage(
1125 const pb::RpcMessage* rpc) {
1126 DCHECK_EQ(RPC(RPC_CDM_REMOVESESSION), rpc->proc());
1127
1128 REQUIRED(rpc->has_cdm_removesession_rpc());
1129 const pb::CdmRemoveSession rpc_message = rpc->cdm_removesession_rpc();
1130 std::string session_id = rpc_message.session_id();
1131 int callback_handle = rpc_message.callback_handle();
1132
1133 VLOG(2) << " session_id:" << session_id
1134 << " callback_handle:" << callback_handle;
1135 return new CdmRemoveSessionRpc(rpc->handle(), session_id, callback_handle);
1136 }
1137
1138 pb::RpcProc CdmRemoveSessionRpc::GetProc() const {
1139 return RPC(RPC_CDM_REMOVESESSION);
1140 }
1141
1142 void CdmRemoveSessionRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
1143 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1144 << " callback_handle:" << callback_handle_;
1145
1146 pb::CdmRemoveSession* message = rpc->mutable_cdm_removesession_rpc();
1147 message->set_session_id(session_id_);
1148 message->set_callback_handle(callback_handle_);
1149 }
1150
1151 //==============================================================================
1152 CdmPromiseResult::CdmPromiseResult()
1153 : CdmPromiseResult(::media::MediaKeys::UNKNOWN_ERROR, 0, "") {}
1154
1155 CdmPromiseResult::CdmPromiseResult(::media::MediaKeys::Exception exception,
1156 uint32_t system_code,
1157 std::string error_message)
1158 : success_(false),
1159 exception_(exception),
1160 system_code_(system_code),
1161 error_message_(error_message) {}
1162
1163 CdmPromiseResult::CdmPromiseResult(const CdmPromiseResult& other) = default;
1164
1165 CdmPromiseResult::~CdmPromiseResult() = default;
1166
1167 CdmPromiseResult CdmPromiseResult::SuccessResult() {
1168 CdmPromiseResult result(static_cast<::media::MediaKeys::Exception>(0), 0, "");
1169 result.success_ = true;
1170 return result;
1171 }
1172
1173 //==============================================================================
1174 CdmInitializeCallbackRpc::CdmInitializeCallbackRpc(
1175 int handle,
1176 const CdmPromiseResult& result,
1177 int cdm_id,
1178 int decryptor_handle)
1179 : CdmPromiseCallbackRpc(handle, result),
1180 cdm_id_(cdm_id),
1181 decryptor_handle_(decryptor_handle) {}
1182
1183 CdmInitializeCallbackRpc::~CdmInitializeCallbackRpc() = default;
1184
1185 scoped_refptr<CdmInitializeCallbackRpc>
1186 CdmInitializeCallbackRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
1187 DCHECK_EQ(RPC(RPC_CDM_INITIALIZE_CALLBACK), rpc->proc());
1188
1189 REQUIRED(rpc->has_cdm_promise_rpc());
1190 const pb::CdmPromise promise_message = rpc->cdm_promise_rpc();
1191 CdmPromiseResult result;
1192 REQUIRED(internal::CdmPromiseFromMessage(promise_message, &result, nullptr));
1193 int cdm_id = promise_message.cdm_id();
1194 int decryptor_handle = promise_message.decryptor_handle();
1195
1196 VLOG(2) << "cdm_id:" << cdm_id << " decryptor_handle:" << decryptor_handle;
1197 return new CdmInitializeCallbackRpc(rpc->handle(), result, cdm_id,
1198 decryptor_handle);
1199 }
1200
1201 void CdmInitializeCallbackRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
1202 VLOG(2) << __FUNCTION__ << " cdm_id:" << cdm_id_
1203 << " decryptor_handle:" << decryptor_handle_;
1204
1205 CdmPromiseCallbackRpc<RPC(RPC_CDM_INITIALIZE_CALLBACK)>::ToMessageInternal(
1206 rpc);
1207 pb::CdmPromise* message = rpc->mutable_cdm_promise_rpc();
1208 message->set_cdm_id(cdm_id_);
1209 message->set_decryptor_handle(decryptor_handle_);
1210 }
1211
1212 //==============================================================================
1213 CdmClientOnSessionMessageRpc::CdmClientOnSessionMessageRpc(
1214 int handle,
1215 const std::string& session_id,
1216 ::media::MediaKeys::MessageType message_type,
1217 const uint8_t* message,
1218 size_t message_size,
1219 const std::string& legacy_destination_url)
1220 : Rpc(handle),
1221 session_id_(session_id),
1222 message_type_(message_type),
1223 message_(message, message + message_size),
1224 legacy_destination_url_(legacy_destination_url) {}
1225
1226 CdmClientOnSessionMessageRpc::~CdmClientOnSessionMessageRpc() = default;
1227
1228 scoped_refptr<CdmClientOnSessionMessageRpc>
1229 CdmClientOnSessionMessageRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
1230 DCHECK_EQ(RPC(RPC_CDMC_ONSESSIONMESSAGE), rpc->proc());
1231
1232 REQUIRED(rpc->has_cdm_onsessionmessage_rpc());
1233 const pb::CdmClientOnSessionMessage onsession_message =
1234 rpc->cdm_onsessionmessage_rpc();
1235 std::string session_id = onsession_message.session_id();
1236 ::media::MediaKeys::MessageType message_type =
1237 static_cast<::media::MediaKeys::MessageType>(
1238 onsession_message.message_type());
1239 std::string legacy_destination_url =
1240 onsession_message.legacy_destination_url();
1241 std::vector<uint8_t> message_data;
1242 message_data.assign(onsession_message.message().begin(),
1243 onsession_message.message().end());
1244
1245 return new CdmClientOnSessionMessageRpc(
1246 rpc->handle(), session_id, message_type, &message_data[0],
1247 message_data.size(), legacy_destination_url);
1248 }
1249
1250 pb::RpcProc CdmClientOnSessionMessageRpc::GetProc() const {
1251 return RPC(RPC_CDMC_ONSESSIONMESSAGE);
1252 }
1253
1254 void CdmClientOnSessionMessageRpc::ToMessageInternal(
1255 pb::RpcMessage* rpc) const {
1256 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1257 << " message_type:" << message_type_
1258 << " legacy_destination_url:" << legacy_destination_url_;
1259
1260 pb::CdmClientOnSessionMessage* message =
1261 rpc->mutable_cdm_onsessionmessage_rpc();
1262 message->set_session_id(session_id_);
1263 message->set_message_type(
1264 static_cast<pb::MediaKeysMessageType>(message_type_));
1265 message->set_legacy_destination_url(legacy_destination_url_);
1266 message->set_message(&message_[0], message_.size());
1267 }
1268
1269 //==============================================================================
1270 CdmClientOnLegacySessionErrorRpc::CdmClientOnLegacySessionErrorRpc(
1271 int handle,
1272 const std::string& session_id,
1273 ::media::MediaKeys::Exception exception,
1274 uint32_t system_code,
1275 const std::string& error_message)
1276 : Rpc(handle),
1277 session_id_(session_id),
1278 exception_(exception),
1279 system_code_(system_code),
1280 error_message_(error_message) {}
1281
1282 CdmClientOnLegacySessionErrorRpc::~CdmClientOnLegacySessionErrorRpc() = default;
1283
1284 scoped_refptr<CdmClientOnLegacySessionErrorRpc>
1285 CdmClientOnLegacySessionErrorRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
1286 DCHECK_EQ(RPC(RPC_CDMC_ONLEGACYSESSIONERROR), rpc->proc());
1287
1288 REQUIRED(rpc->has_cdm_onlegacysessionerror_rpc());
1289 const pb::CdmClientOnLegacySessionError legacyerror_message =
1290 rpc->cdm_onlegacysessionerror_rpc();
1291 std::string session_id = legacyerror_message.session_id();
1292 ::media::MediaKeys::Exception exception =
1293 static_cast<::media::MediaKeys::Exception>(
1294 legacyerror_message.exception());
1295 uint32_t system_code = legacyerror_message.system_code();
1296 std::string error_message = legacyerror_message.error_message();
1297
1298 return new CdmClientOnLegacySessionErrorRpc(
1299 rpc->handle(), session_id, exception, system_code, error_message);
1300 }
1301
1302 pb::RpcProc CdmClientOnLegacySessionErrorRpc::GetProc() const {
1303 return RPC(RPC_CDMC_ONLEGACYSESSIONERROR);
1304 }
1305
1306 void CdmClientOnLegacySessionErrorRpc::ToMessageInternal(
1307 pb::RpcMessage* rpc) const {
1308 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1309 << " exception:" << exception_ << " system_code:" << system_code_
1310 << " error_message:" << error_message_;
1311
1312 pb::CdmClientOnLegacySessionError* message =
1313 rpc->mutable_cdm_onlegacysessionerror_rpc();
1314 message->set_session_id(session_id_);
1315 message->set_exception(static_cast<pb::MediaKeysException>(exception_));
1316 message->set_system_code(system_code_);
1317 message->set_error_message(error_message_);
1318 }
1319
1320 //==============================================================================
1321 CdmClientOnSessionKeysChangeRpc::CdmClientOnSessionKeysChangeRpc(
1322 int handle,
1323 const std::string& session_id,
1324 bool has_additional_usable_key,
1325 const ::media::CdmKeyInformation* key_information,
1326 size_t key_information_size)
1327 : Rpc(handle),
1328 session_id_(session_id),
1329 has_additional_usable_key_(has_additional_usable_key),
1330 key_information_(key_information,
1331 key_information + key_information_size) {}
1332
1333 CdmClientOnSessionKeysChangeRpc::~CdmClientOnSessionKeysChangeRpc() = default;
1334
1335 scoped_refptr<CdmClientOnSessionKeysChangeRpc>
1336 CdmClientOnSessionKeysChangeRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
1337 DCHECK_EQ(RPC(RPC_CDMC_ONSESSIONKEYSCHANGE), rpc->proc());
1338
1339 REQUIRED(rpc->has_cdm_onsessionkeychange_rpc());
1340 const pb::CdmClientOnSessionKeysChange keychange_message =
1341 rpc->cdm_onsessionkeychange_rpc();
1342 std::string session_id = keychange_message.session_id();
1343 bool has_additional_usable_key =
1344 keychange_message.has_additional_usable_key();
1345 std::vector<::media::CdmKeyInformation> key_information;
1346 if (has_additional_usable_key) {
1347 REQUIRED(keychange_message.key_information_size());
1348 REQUIRED(DeserializeCdmKeyInformation(keychange_message, &key_information));
1349 }
1350
1351 return new CdmClientOnSessionKeysChangeRpc(
1352 rpc->handle(), session_id, has_additional_usable_key,
1353 key_information.data(), key_information.size());
1354 }
1355
1356 pb::RpcProc CdmClientOnSessionKeysChangeRpc::GetProc() const {
1357 return RPC(RPC_CDMC_ONSESSIONKEYSCHANGE);
1358 }
1359
1360 void CdmClientOnSessionKeysChangeRpc::ToMessageInternal(
1361 pb::RpcMessage* rpc) const {
1362 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1363 << " has_additional_usable_key:" << has_additional_usable_key_;
1364
1365 pb::CdmClientOnSessionKeysChange* message =
1366 rpc->mutable_cdm_onsessionkeychange_rpc();
1367 message->set_session_id(session_id_);
1368 message->set_has_additional_usable_key(has_additional_usable_key_);
1369 SerializeCdmKeyInformation(message, key_information_);
1370 }
1371
1372 //==============================================================================
1373 CdmClientOnSessionExpirationUpdateRpc::CdmClientOnSessionExpirationUpdateRpc(
1374 int handle,
1375 const std::string& session_id,
1376 double new_expiry_time_sec)
1377 : Rpc(handle),
1378 session_id_(session_id),
1379 new_expiry_time_sec_(new_expiry_time_sec) {}
1380
1381 CdmClientOnSessionExpirationUpdateRpc::
1382 ~CdmClientOnSessionExpirationUpdateRpc() = default;
1383
1384 scoped_refptr<CdmClientOnSessionExpirationUpdateRpc>
1385 CdmClientOnSessionExpirationUpdateRpc::FromRpcMessage(
1386 const pb::RpcMessage* rpc) {
1387 DCHECK_EQ(RPC(RPC_CDMC_ONSESSIONEXPIRATIONUPDATE), rpc->proc());
1388
1389 REQUIRED(rpc->has_cdm_onsessionexpirationupdate_rpc());
1390 const pb::CdmClientOnSessionExpirationUpdate expire_message =
1391 rpc->cdm_onsessionexpirationupdate_rpc();
1392 std::string session_id = expire_message.session_id();
1393 double new_expiry_time_sec = expire_message.new_expiry_time_sec();
1394
1395 return new CdmClientOnSessionExpirationUpdateRpc(rpc->handle(), session_id,
1396 new_expiry_time_sec);
1397 }
1398
1399 pb::RpcProc CdmClientOnSessionExpirationUpdateRpc::GetProc() const {
1400 return RPC(RPC_CDMC_ONSESSIONEXPIRATIONUPDATE);
1401 }
1402
1403 void CdmClientOnSessionExpirationUpdateRpc::ToMessageInternal(
1404 pb::RpcMessage* rpc) const {
1405 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1406 << " new_expiry_time_sec_:" << new_expiry_time_sec_;
1407
1408 pb::CdmClientOnSessionExpirationUpdate* message =
1409 rpc->mutable_cdm_onsessionexpirationupdate_rpc();
1410 message->set_session_id(session_id_);
1411 message->set_new_expiry_time_sec(new_expiry_time_sec_);
1412 }
1413
1414 #undef REQUIRED
1415
1416 } // namespace remoting
1417 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698