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

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: Add OWNERS file Created 4 years, 3 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_FLUSHUNTIL), RendererFlushUntilRpc);
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_FLUSHUNTIL_CALLBACK), RendererFlushUntilCallbackRpc);
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_ONSESSIONKEYSCHANGE), CdmClientOnSessionKeysChangeRpc);
409 CASE(RPC(RPC_CDMC_ONSESSIONEXPIRATIONUPDATE),
410 CdmClientOnSessionExpirationUpdateRpc);
411 default:
412 LOG(ERROR) << "Unknown Rpc: " << rpc.proc();
413 return nullptr;
414 }
415 #undef CASE
416 }
417
418 #define REQUIRED(x) REQUIRED_IMPL(x, nullptr)
419
420 std::string Rpc::ToMessage() const {
421 pb::RpcMessage rpc;
422 ToMessageInternal(&rpc);
423 rpc.set_handle(handle_);
424 rpc.set_proc(GetProc());
425 std::string proto_msg;
426 bool valid = rpc.ByteSize() > 0 && rpc.SerializeToString(&proto_msg);
427 DCHECK(valid);
428 return proto_msg;
429 }
430
431 //==============================================================================
432 RendererInitializeRpc::RendererInitializeRpc(int handle,
433 int client_handle,
434 int audio_demuxer_handle,
435 int video_demuxer_handle,
436 int callback_handle)
437 : Rpc(handle),
438 client_handle_(client_handle),
439 audio_demuxer_handle_(audio_demuxer_handle),
440 video_demuxer_handle_(video_demuxer_handle),
441 callback_handle_(callback_handle) {}
442
443 RendererInitializeRpc::~RendererInitializeRpc() = default;
444
445 scoped_refptr<RendererInitializeRpc> RendererInitializeRpc::FromRpcMessage(
446 const pb::RpcMessage* rpc) {
447 DCHECK_EQ(RPC(RPC_R_INITIALIZE), rpc->proc());
448
449 int client_handle = kInvalidHandle;
450 int audio_demuxer_handle = kInvalidHandle;
451 int video_demuxer_handle = kInvalidHandle;
452 int callback_handle = kInvalidHandle;
453
454 DCHECK(rpc->has_renderer_initialize_rpc());
455 const pb::RendererInitialize rpc_message = rpc->renderer_initialize_rpc();
456 client_handle = rpc_message.client_handle();
457 audio_demuxer_handle = rpc_message.audio_demuxer_handle();
458 video_demuxer_handle = rpc_message.video_demuxer_handle();
459 callback_handle = rpc_message.callback_handle();
460
461 VLOG(2) << "client_handle:" << client_handle
462 << " audio_demuxer_handle:" << audio_demuxer_handle
463 << " video_demuxer_handle:" << video_demuxer_handle
464 << " callback_handle:" << callback_handle;
465 return new RendererInitializeRpc(rpc->handle(), client_handle,
466 audio_demuxer_handle, video_demuxer_handle,
467 callback_handle);
468 }
469
470 pb::RpcProc RendererInitializeRpc::GetProc() const {
471 return RPC(RPC_R_INITIALIZE);
472 }
473
474 void RendererInitializeRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
475 VLOG(2) << __FUNCTION__ << "client_handle:" << client_handle_
476 << " audio_demuxer_handle:" << audio_demuxer_handle_
477 << " video_demuxer_handle:" << video_demuxer_handle_
478 << " callback_handle:" << callback_handle_;
479 pb::RendererInitialize* message = rpc->mutable_renderer_initialize_rpc();
480 message->set_client_handle(client_handle_);
481 message->set_audio_demuxer_handle(audio_demuxer_handle_);
482 message->set_video_demuxer_handle(video_demuxer_handle_);
483 message->set_callback_handle(callback_handle_);
484 }
485
486 //==============================================================================
487 RendererFlushUntilRpc::RendererFlushUntilRpc(int handle,
488 uint32_t audio_frame_id,
489 uint32_t video_frame_id,
490 int callback_handle)
491 : Rpc(handle),
492 audio_frame_id_(audio_frame_id),
493 video_frame_id_(video_frame_id),
494 callback_handle_(callback_handle) {}
495
496 RendererFlushUntilRpc::~RendererFlushUntilRpc() = default;
497
498 scoped_refptr<RendererFlushUntilRpc> RendererFlushUntilRpc::FromRpcMessage(
499 const pb::RpcMessage* rpc) {
500 DCHECK_EQ(RPC(RPC_R_FLUSHUNTIL), rpc->proc());
501
502 uint32_t audio_frame_id = 0;
503 uint32_t video_frame_id = 0;
504 int callback_handle = kInvalidHandle;
505
506 DCHECK(rpc->has_renderer_flushuntil_rpc());
507 audio_frame_id = rpc->renderer_flushuntil_rpc().audio_frame_id();
508 video_frame_id = rpc->renderer_flushuntil_rpc().video_frame_id();
509 callback_handle = rpc->renderer_flushuntil_rpc().callback_handle();
510
511 VLOG(2) << "audio_frame_id:" << audio_frame_id
512 << " video_frame_id:" << video_frame_id
513 << " callback_handle:" << callback_handle;
514 return new RendererFlushUntilRpc(rpc->handle(), audio_frame_id,
515 video_frame_id, callback_handle);
516 }
517
518 pb::RpcProc RendererFlushUntilRpc::GetProc() const {
519 return RPC(RPC_R_FLUSHUNTIL);
520 }
521
522 void RendererFlushUntilRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
523 VLOG(2) << __FUNCTION__ << "audio_frame_id:" << audio_frame_id_
524 << " video_frame_id:" << video_frame_id_
525 << " callback_handle:" << callback_handle_;
526 pb::RendererFlushUntil* message = rpc->mutable_renderer_flushuntil_rpc();
527 message->set_audio_frame_id(audio_frame_id_);
528 message->set_video_frame_id(video_frame_id_);
529 message->set_callback_handle(callback_handle_);
530 }
531
532 //==============================================================================
533 RendererStartPlayingFromRpc::RendererStartPlayingFromRpc(
534 int handle,
535 int64_t time_delta_usec)
536 : Rpc(handle), time_delta_usec_(time_delta_usec) {}
537
538 RendererStartPlayingFromRpc::~RendererStartPlayingFromRpc() = default;
539
540 // static
541 scoped_refptr<RendererStartPlayingFromRpc>
542 RendererStartPlayingFromRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
543 DCHECK_EQ(RPC(RPC_R_STARTPLAYINGFROM), rpc->proc());
544
545 int64_t time_delta_usec = 0;
546
547 DCHECK(rpc->has_renderer_startplayingfrom_rpc());
548 const pb::RendererStartPlayingFrom rpc_message =
549 rpc->renderer_startplayingfrom_rpc();
550 time_delta_usec = rpc_message.time_delta_usec();
551
552 VLOG(2) << "time_delta_usec:" << time_delta_usec;
553 return new RendererStartPlayingFromRpc(rpc->handle(), time_delta_usec);
554 }
555
556 pb::RpcProc RendererStartPlayingFromRpc::GetProc() const {
557 return RPC(RPC_R_STARTPLAYINGFROM);
558 }
559
560 void RendererStartPlayingFromRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
561 VLOG(2) << __FUNCTION__ << "time_delta_usec:" << time_delta_usec_;
562 pb::RendererStartPlayingFrom* message =
563 rpc->mutable_renderer_startplayingfrom_rpc();
564 message->set_time_delta_usec(time_delta_usec_);
565 }
566
567 //==============================================================================
568 RendererSetCdmRpc::RendererSetCdmRpc(int handle,
569 int cdm_id,
570 int callback_handle)
571 : Rpc(handle), cdm_id_(cdm_id), callback_handle_(callback_handle) {}
572
573 RendererSetCdmRpc::~RendererSetCdmRpc() = default;
574
575 scoped_refptr<RendererSetCdmRpc> RendererSetCdmRpc::FromRpcMessage(
576 const pb::RpcMessage* rpc) {
577 DCHECK_EQ(RPC(RPC_R_SETCDM), rpc->proc());
578
579 REQUIRED(rpc->has_renderer_set_cdm_rpc());
580 const pb::RendererSetCdm rpc_message = rpc->renderer_set_cdm_rpc();
581 int cdm_id = rpc_message.cdm_id();
582 int callback_handle = rpc_message.callback_handle();
583
584 VLOG(2) << "cdm_id:" << cdm_id << " callback_handle:" << callback_handle;
585 return new RendererSetCdmRpc(rpc->handle(), cdm_id, callback_handle);
586 }
587
588 pb::RpcProc RendererSetCdmRpc::GetProc() const {
589 return RPC(RPC_R_SETCDM);
590 }
591
592 void RendererSetCdmRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
593 pb::RendererSetCdm* message = rpc->mutable_renderer_set_cdm_rpc();
594 VLOG(2) << __FUNCTION__ << " cdm_id:" << cdm_id_
595 << " callback_handle:" << callback_handle_;
596 message->set_cdm_id(cdm_id_);
597 message->set_callback_handle(callback_handle_);
598 }
599
600 //==============================================================================
601 RendererClientOnTimeUpdateRpc::RendererClientOnTimeUpdateRpc(
602 int handle,
603 int64_t time_usec,
604 int64_t max_time_usec)
605 : Rpc(handle), time_usec_(time_usec), max_time_usec_(max_time_usec) {}
606
607 RendererClientOnTimeUpdateRpc::~RendererClientOnTimeUpdateRpc() = default;
608
609 scoped_refptr<RendererClientOnTimeUpdateRpc>
610 RendererClientOnTimeUpdateRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
611 DCHECK_EQ(RPC(RPC_RC_ONTIMEUPDATE), rpc->proc());
612
613 REQUIRED(rpc->has_rendererclient_ontimeupdate_rpc());
614 const pb::RendererClientOnTimeUpdate rpc_message =
615 rpc->rendererclient_ontimeupdate_rpc();
616 int64_t time_usec = rpc_message.time_usec();
617 int64_t max_time_usec = rpc_message.max_time_usec();
618
619 VLOG(2) << __FUNCTION__ << " time_usec:" << time_usec
620 << " max_time_usec:" << max_time_usec;
621 return new RendererClientOnTimeUpdateRpc(rpc->handle(), time_usec,
622 max_time_usec);
623 }
624
625 pb::RpcProc RendererClientOnTimeUpdateRpc::GetProc() const {
626 return RPC(RPC_RC_ONTIMEUPDATE);
627 }
628
629 void RendererClientOnTimeUpdateRpc::ToMessageInternal(
630 pb::RpcMessage* rpc) const {
631 pb::RendererClientOnTimeUpdate* message =
632 rpc->mutable_rendererclient_ontimeupdate_rpc();
633 VLOG(2) << __FUNCTION__ << " time_usec:" << time_usec_
634 << " max_time_usec:" << time_usec_;
635 message->set_time_usec(time_usec_);
636 message->set_max_time_usec(max_time_usec_);
637 }
638
639 //==============================================================================
640 RendererClientOnVideoNaturalSizeChangeRpc::
641 RendererClientOnVideoNaturalSizeChangeRpc(int handle, const gfx::Size& size)
642 : Rpc(handle), size_(size) {}
643
644 RendererClientOnVideoNaturalSizeChangeRpc::
645 ~RendererClientOnVideoNaturalSizeChangeRpc() = default;
646
647 scoped_refptr<RendererClientOnVideoNaturalSizeChangeRpc>
648 RendererClientOnVideoNaturalSizeChangeRpc::FromRpcMessage(
649 const pb::RpcMessage* rpc) {
650 DCHECK_EQ(RPC(RPC_RC_ONVIDEONATURALSIZECHANGE), rpc->proc());
651
652 REQUIRED(rpc->has_rendererclient_onvideonatualsizechange_rpc());
653 const pb::Size rpc_message =
654 rpc->rendererclient_onvideonatualsizechange_rpc();
655 gfx::Size size;
656 DeserializeSize(rpc_message, &size);
657
658 VLOG(2) << "size:" << size.ToString();
659 return new RendererClientOnVideoNaturalSizeChangeRpc(rpc->handle(), size);
660 }
661
662 pb::RpcProc RendererClientOnVideoNaturalSizeChangeRpc::GetProc() const {
663 return RPC(RPC_RC_ONVIDEONATURALSIZECHANGE);
664 }
665
666 void RendererClientOnVideoNaturalSizeChangeRpc::ToMessageInternal(
667 pb::RpcMessage* rpc) const {
668 VLOG(2) << __FUNCTION__ << "size:" << size_.ToString();
669 pb::Size* message = rpc->mutable_rendererclient_onvideonatualsizechange_rpc();
670 SerializeSize(size_, message);
671 }
672
673 //==============================================================================
674 DemuxerStreamReadUntilRpc::DemuxerStreamReadUntilRpc(int handle,
675 uint32_t frame_id,
676 int callback_handle)
677 : Rpc(handle), frame_id_(frame_id), callback_handle_(callback_handle) {}
678
679 DemuxerStreamReadUntilRpc::~DemuxerStreamReadUntilRpc() = default;
680
681 scoped_refptr<DemuxerStreamReadUntilRpc>
682 DemuxerStreamReadUntilRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
683 DCHECK_EQ(RPC(RPC_DS_READUNTIL), rpc->proc());
684
685 REQUIRED(rpc->has_demuxerstream_readuntil_rpc());
686 const pb::DemuxerStreamReadUntil rpc_message =
687 rpc->demuxerstream_readuntil_rpc();
688 int frame_id = rpc_message.frame_id();
689 int callback_handle = rpc_message.callback_handle();
690
691 VLOG(2) << "frame_id:" << frame_id << " callback_handle:" << callback_handle;
692 return new DemuxerStreamReadUntilRpc(rpc->handle(), frame_id,
693 callback_handle);
694 }
695
696 pb::RpcProc DemuxerStreamReadUntilRpc::GetProc() const {
697 return RPC(RPC_DS_READUNTIL);
698 }
699
700 void DemuxerStreamReadUntilRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
701 VLOG(2) << __FUNCTION__ << " frame_id:" << frame_id_
702 << " callback_handle:" << callback_handle_;
703 pb::DemuxerStreamReadUntil* message =
704 rpc->mutable_demuxerstream_readuntil_rpc();
705 message->set_callback_handle(callback_handle_);
706 message->set_frame_id(frame_id_);
707 }
708
709 //==============================================================================
710 DemuxerStreamInitializeCallbackRpc::DemuxerStreamInitializeCallbackRpc(
711 int handle,
712 ::media::DemuxerStream::Type type,
713 const ::media::AudioDecoderConfig& audio_config,
714 const ::media::VideoDecoderConfig& video_config)
715 : Rpc(handle),
716 type_(type),
717 audio_config_(audio_config),
718 video_config_(video_config) {}
719
720 DemuxerStreamInitializeCallbackRpc::~DemuxerStreamInitializeCallbackRpc() =
721 default;
722
723 scoped_refptr<DemuxerStreamInitializeCallbackRpc>
724 DemuxerStreamInitializeCallbackRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
725 DCHECK_EQ(RPC(RPC_DS_INITIALIZE_CALLBACK), rpc->proc());
726
727 REQUIRED(rpc->has_demuxerstream_initializecb_rpc());
728 const pb::DemuxerStreamInitializeCallback rpc_message =
729 rpc->demuxerstream_initializecb_rpc();
730 ::media::DemuxerStream::Type type =
731 static_cast<::media::DemuxerStream::Type>(rpc_message.type());
732 ::media::AudioDecoderConfig audio_config;
733 ::media::VideoDecoderConfig video_config;
734 switch (type) {
735 case ::media::DemuxerStream::Type::AUDIO: {
736 const pb::AudioDecoderConfig& audio_message =
737 rpc_message.audio_decoder_config();
738 REQUIRED(DeserializeAudioConfig(audio_message, &audio_config));
739 break;
740 }
741 case ::media::DemuxerStream::Type::VIDEO: {
742 const pb::VideoDecoderConfig& video_message =
743 rpc_message.video_decoder_config();
744 REQUIRED(DeserializeVideoConfig(video_message, &video_config));
745 break;
746 }
747 default:
748 LOG(ERROR) << "stream type unsupported";
749 return nullptr;
750 }
751
752 VLOG(2) << "type:" << type
753 << " audio_config:" << audio_config.AsHumanReadableString()
754 << " video_config:" << video_config.AsHumanReadableString();
755 return new DemuxerStreamInitializeCallbackRpc(rpc->handle(), type,
756 audio_config, video_config);
757 }
758
759 pb::RpcProc DemuxerStreamInitializeCallbackRpc::GetProc() const {
760 return RPC(RPC_DS_INITIALIZE_CALLBACK);
761 }
762
763 void DemuxerStreamInitializeCallbackRpc::ToMessageInternal(
764 pb::RpcMessage* rpc) const {
765 VLOG(2) << __FUNCTION__ << " type:" << type_
766 << " audio_config:" << audio_config_.AsHumanReadableString()
767 << " video_config:" << video_config_.AsHumanReadableString();
768 DCHECK(type_ == ::media::DemuxerStream::Type::AUDIO ||
769 type_ == ::media::DemuxerStream::Type::VIDEO);
770
771 pb::DemuxerStreamInitializeCallback* message =
772 rpc->mutable_demuxerstream_initializecb_rpc();
773 message->set_type(type_);
774
775 switch (type_) {
776 case ::media::DemuxerStream::Type::AUDIO: {
777 pb::AudioDecoderConfig* audio_message =
778 message->mutable_audio_decoder_config();
779 SerializeAudioConfig(audio_config_, audio_message);
780 break;
781 }
782 case ::media::DemuxerStream::Type::VIDEO: {
783 pb::VideoDecoderConfig* video_message =
784 message->mutable_video_decoder_config();
785 SerializeVideoConfig(video_config_, video_message);
786 break;
787 }
788 default:
789 NOTREACHED();
790 }
791 }
792
793 //==============================================================================
794 DemuxerStreamReadUntilCallbackRpc::DemuxerStreamReadUntilCallbackRpc(
795 int handle,
796 uint32_t frame_id,
797 ::media::DemuxerStream::Status status,
798 const ::media::AudioDecoderConfig& audio_config,
799 const ::media::VideoDecoderConfig& video_config)
800 : Rpc(handle),
801 frame_id_(frame_id),
802 status_(status),
803 audio_config_(audio_config),
804 video_config_(video_config) {}
805
806 DemuxerStreamReadUntilCallbackRpc::~DemuxerStreamReadUntilCallbackRpc() =
807 default;
808
809 scoped_refptr<DemuxerStreamReadUntilCallbackRpc>
810 DemuxerStreamReadUntilCallbackRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
811 DCHECK_EQ(RPC(RPC_DS_READUNTIL_CALLBACK), rpc->proc());
812
813 REQUIRED(rpc->has_demuxerstream_readuntilcb_rpc());
814 const pb::DemuxerStreamReadUntilCallback rpc_message =
815 rpc->demuxerstream_readuntilcb_rpc();
816 int frame_id = rpc_message.frame_id();
817 ::media::DemuxerStream::Status status =
818 static_cast<::media::DemuxerStream::Status>(rpc_message.status());
819
820 ::media::AudioDecoderConfig audio_config;
821 ::media::VideoDecoderConfig video_config;
822 if (status == ::media::DemuxerStream::kConfigChanged) {
823 if (rpc_message.has_audio_decoder_config()) {
824 REQUIRED(DeserializeAudioConfig(rpc_message.audio_decoder_config(),
825 &audio_config));
826 } else if (rpc_message.has_video_decoder_config()) {
827 REQUIRED(DeserializeVideoConfig(rpc_message.video_decoder_config(),
828 &video_config));
829 } else {
830 LOG(ERROR) << "packet has neither 'audio_config' nor 'video_config'";
831 return nullptr;
832 }
833 }
834
835 VLOG(2) << "status:" << status << " frame_id:" << frame_id;
836 return new DemuxerStreamReadUntilCallbackRpc(rpc->handle(), frame_id, status,
837 audio_config, video_config);
838 }
839
840 pb::RpcProc DemuxerStreamReadUntilCallbackRpc::GetProc() const {
841 return RPC(RPC_DS_READUNTIL_CALLBACK);
842 }
843
844 void DemuxerStreamReadUntilCallbackRpc::ToMessageInternal(
845 pb::RpcMessage* rpc) const {
846 VLOG(2) << __FUNCTION__ << " frame_id:" << frame_id_ << " status:" << status_;
847
848 pb::DemuxerStreamReadUntilCallback* message =
849 rpc->mutable_demuxerstream_readuntilcb_rpc();
850 message->set_frame_id(frame_id_);
851 message->set_status(status_);
852
853 if (status_ == ::media::DemuxerStream::kConfigChanged) {
854 if (audio_config_.IsValidConfig()) {
855 pb::AudioDecoderConfig* audio_message =
856 message->mutable_audio_decoder_config();
857 SerializeAudioConfig(audio_config_, audio_message);
858 } else if (video_config_.IsValidConfig()) {
859 pb::VideoDecoderConfig* video_message =
860 message->mutable_video_decoder_config();
861 SerializeVideoConfig(video_config_, video_message);
862 } else {
863 NOTREACHED();
864 }
865 }
866 }
867
868 //==============================================================================
869 CdmInitializeRpc::CdmInitializeRpc(int handle,
870 const std::string& key_system,
871 const std::string& security_origin,
872 const ::media::CdmConfig& cdm_config,
873 int callback_handle)
874 : Rpc(handle),
875 key_system_(key_system),
876 security_origin_(security_origin),
877 cdm_config_(cdm_config),
878 callback_handle_(callback_handle) {}
879
880 CdmInitializeRpc::~CdmInitializeRpc() = default;
881
882 scoped_refptr<CdmInitializeRpc> CdmInitializeRpc::FromRpcMessage(
883 const pb::RpcMessage* rpc) {
884 DCHECK_EQ(RPC(RPC_CDM_INITIALIZE), rpc->proc());
885
886 REQUIRED(rpc->has_cdm_initialize_rpc());
887 const pb::CdmInitialize rpc_message = rpc->cdm_initialize_rpc();
888 std::string key_system = rpc_message.key_system();
889 std::string security_origin = rpc_message.security_origin();
890 ::media::CdmConfig cdm_config;
891 cdm_config.allow_distinctive_identifier =
892 rpc_message.allow_distinctive_identifier();
893 cdm_config.allow_persistent_state = rpc_message.allow_persistent_state();
894 cdm_config.use_hw_secure_codecs = rpc_message.use_hw_secure_codecs();
895 int callback_handle = rpc_message.callback_handle();
896
897 VLOG(2) << "key_system:" << key_system
898 << " security_origin:" << security_origin
899 << " allow_distinctive_identifier:"
900 << cdm_config.allow_distinctive_identifier
901 << " allow_persistent_state:" << cdm_config.allow_persistent_state
902 << " use_hw_secure_codecs:" << cdm_config.use_hw_secure_codecs
903 << " callback_handle:" << callback_handle;
904 return new CdmInitializeRpc(rpc->handle(), key_system, security_origin,
905 cdm_config, callback_handle);
906 }
907
908 pb::RpcProc CdmInitializeRpc::GetProc() const {
909 return RPC(RPC_CDM_INITIALIZE);
910 }
911
912 void CdmInitializeRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
913 VLOG(2) << __FUNCTION__ << " key_system:" << key_system_
914 << " security_origin:" << security_origin_
915 << " allow_distinctive_identifier:"
916 << cdm_config_.allow_distinctive_identifier
917 << " allow_persistent_state:" << cdm_config_.allow_persistent_state
918 << " use_hw_secure_codecs:" << cdm_config_.use_hw_secure_codecs
919 << " callback_handle:" << callback_handle_;
920
921 pb::CdmInitialize* message = rpc->mutable_cdm_initialize_rpc();
922 message->set_key_system(key_system_);
923 message->set_security_origin(security_origin_);
924 SerializeCdmConfig(cdm_config_, message);
925 message->set_callback_handle(callback_handle_);
926 }
927
928 //==============================================================================
929 CdmSetServerCertificateRpc::CdmSetServerCertificateRpc(
930 int handle,
931 const uint8_t* certificate_data,
932 size_t certificate_data_size,
933 int callback_handle)
934 : Rpc(handle),
935 certificate_data_(certificate_data,
936 certificate_data + certificate_data_size),
937 callback_handle_(callback_handle) {}
938
939 CdmSetServerCertificateRpc::~CdmSetServerCertificateRpc() = default;
940
941 scoped_refptr<CdmSetServerCertificateRpc>
942 CdmSetServerCertificateRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
943 DCHECK_EQ(RPC(RPC_CDM_SETSERVERCERTIFICATE), rpc->proc());
944
945 REQUIRED(rpc->has_cdm_setservercertificate_rpc());
946 const pb::CdmSetServerCertificate rpc_message =
947 rpc->cdm_setservercertificate_rpc();
948 int callback_handle = rpc_message.callback_handle();
949
950 std::vector<uint8_t> certificate;
951 certificate.assign(rpc_message.certificate_data().begin(),
952 rpc_message.certificate_data().end());
953
954 VLOG(2) << "callback_handle:" << callback_handle
955 << " certificate size:" << certificate.size();
956 return new CdmSetServerCertificateRpc(rpc->handle(), &certificate[0],
957 certificate.size(), callback_handle);
958 }
959
960 pb::RpcProc CdmSetServerCertificateRpc::GetProc() const {
961 return RPC(RPC_CDM_SETSERVERCERTIFICATE);
962 }
963
964 void CdmSetServerCertificateRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
965 VLOG(2) << __FUNCTION__ << " callback_handle:" << callback_handle_
966 << " certificate size:" << certificate_data_.size();
967 pb::CdmSetServerCertificate* message =
968 rpc->mutable_cdm_setservercertificate_rpc();
969 message->set_callback_handle(callback_handle_);
970 message->set_certificate_data(&certificate_data_[0],
971 certificate_data_.size());
972 }
973
974 //==============================================================================
975 CdmCreateSessionAndGenerateRequestRpc::CdmCreateSessionAndGenerateRequestRpc(
976 int handle,
977 ::media::MediaKeys::SessionType session_type,
978 ::media::EmeInitDataType init_data_type,
979 const uint8_t* init_data,
980 size_t init_data_size,
981 int callback_handle)
982 : Rpc(handle),
983 session_type_(session_type),
984 init_data_type_(init_data_type),
985 init_data_(init_data, init_data + init_data_size),
986 callback_handle_(callback_handle) {}
987
988 CdmCreateSessionAndGenerateRequestRpc::
989 ~CdmCreateSessionAndGenerateRequestRpc() = default;
990
991 scoped_refptr<CdmCreateSessionAndGenerateRequestRpc>
992 CdmCreateSessionAndGenerateRequestRpc::FromRpcMessage(
993 const pb::RpcMessage* rpc) {
994 DCHECK_EQ(RPC(RPC_CDM_CREATESESSIONANDGENERATEREQUEST), rpc->proc());
995
996 REQUIRED(rpc->has_cdm_createsessionandgeneraterequest_rpc());
997 const pb::CdmCreateSessionAndGenerateRequest rpc_message =
998 rpc->cdm_createsessionandgeneraterequest_rpc();
999 ::media::MediaKeys::SessionType session_type =
1000 static_cast<::media::MediaKeys::SessionType>(rpc_message.session_type());
1001 ::media::EmeInitDataType init_data_type =
1002 static_cast<::media::EmeInitDataType>(rpc_message.init_data_type());
1003 int callback_handle = rpc_message.callback_handle();
1004 std::vector<uint8_t> init_data;
1005 init_data.assign(rpc_message.init_data().begin(),
1006 rpc_message.init_data().end());
1007
1008 VLOG(2) << "session_type:" << session_type
1009 << " init_data_type:" << static_cast<int>(init_data_type)
1010 << " callback_handle:" << callback_handle
1011 << " init_data size:" << init_data.size();
1012 return new CdmCreateSessionAndGenerateRequestRpc(
1013 rpc->handle(), session_type, init_data_type, &init_data[0],
1014 init_data.size(), callback_handle);
1015 }
1016
1017 pb::RpcProc CdmCreateSessionAndGenerateRequestRpc::GetProc() const {
1018 return RPC(RPC_CDM_CREATESESSIONANDGENERATEREQUEST);
1019 }
1020
1021 void CdmCreateSessionAndGenerateRequestRpc::ToMessageInternal(
1022 pb::RpcMessage* rpc) const {
1023 VLOG(2) << __FUNCTION__ << " session_type:" << session_type_
1024 << " init_data_type:" << static_cast<int>(init_data_type_)
1025 << " callback_handle:" << callback_handle_
1026 << " init_data size:" << init_data_.size();
1027
1028 pb::CdmCreateSessionAndGenerateRequest* message =
1029 rpc->mutable_cdm_createsessionandgeneraterequest_rpc();
1030 message->set_session_type(session_type_);
1031 message->set_init_data_type(static_cast<int>(init_data_type_));
1032 message->set_callback_handle(callback_handle_);
1033 message->set_init_data(&init_data_[0], init_data_.size());
1034 }
1035
1036 //==============================================================================
1037 CdmLoadSessionRpc::CdmLoadSessionRpc(
1038 int handle,
1039 ::media::MediaKeys::SessionType session_type,
1040 const std::string& session_id,
1041 int callback_handle)
1042 : Rpc(handle),
1043 session_type_(session_type),
1044 session_id_(session_id),
1045 callback_handle_(callback_handle) {}
1046
1047 CdmLoadSessionRpc::~CdmLoadSessionRpc() = default;
1048
1049 scoped_refptr<CdmLoadSessionRpc> CdmLoadSessionRpc::FromRpcMessage(
1050 const pb::RpcMessage* rpc) {
1051 DCHECK_EQ(RPC(RPC_CDM_LOADSESSION), rpc->proc());
1052
1053 REQUIRED(rpc->has_cdm_loadsession_rpc());
1054 const pb::CdmLoadSession rpc_message = rpc->cdm_loadsession_rpc();
1055 ::media::MediaKeys::SessionType session_type =
1056 static_cast<::media::MediaKeys::SessionType>(rpc_message.session_type());
1057 std::string session_id = rpc_message.session_id();
1058 int callback_handle = rpc_message.callback_handle();
1059
1060 VLOG(2) << "session_type:" << session_type << " session_id:" << session_id
1061 << " callback_handle:" << callback_handle;
1062 return new CdmLoadSessionRpc(rpc->handle(), session_type, session_id,
1063 callback_handle);
1064 }
1065
1066 pb::RpcProc CdmLoadSessionRpc::GetProc() const {
1067 return RPC(RPC_CDM_LOADSESSION);
1068 }
1069
1070 void CdmLoadSessionRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
1071 VLOG(2) << __FUNCTION__ << " session_type:" << session_type_
1072 << " session_id:" << session_id_
1073 << " callback_handle:" << callback_handle_;
1074
1075 pb::CdmLoadSession* message = rpc->mutable_cdm_loadsession_rpc();
1076 message->set_session_type(session_type_);
1077 message->set_session_id(session_id_);
1078 message->set_callback_handle(callback_handle_);
1079 }
1080
1081 //==============================================================================
1082 CdmUpdateSessionRpc::CdmUpdateSessionRpc(int handle,
1083 const std::string& session_id,
1084 const uint8_t* response,
1085 size_t response_size,
1086 int callback_handle)
1087 : Rpc(handle),
1088 session_id_(session_id),
1089 response_(response, response + response_size),
1090 callback_handle_(callback_handle) {}
1091 CdmUpdateSessionRpc::~CdmUpdateSessionRpc() = default;
1092
1093 scoped_refptr<CdmUpdateSessionRpc> CdmUpdateSessionRpc::FromRpcMessage(
1094 const pb::RpcMessage* rpc) {
1095 DCHECK_EQ(RPC(RPC_CDM_UPDATESESSION), rpc->proc());
1096
1097 REQUIRED(rpc->has_cdm_updatesession_rpc());
1098 const pb::CdmUpdateSession rpc_message = rpc->cdm_updatesession_rpc();
1099 std::string session_id = rpc_message.session_id();
1100 int callback_handle = rpc_message.callback_handle();
1101 std::vector<uint8_t> response;
1102 response.assign(rpc_message.response().begin(), rpc_message.response().end());
1103 VLOG(2) << " session_id:" << session_id
1104 << " callback_handle:" << callback_handle
1105 << " response size:" << response.size();
1106
1107 return new CdmUpdateSessionRpc(rpc->handle(), session_id, &response[0],
1108 response.size(), callback_handle);
1109 }
1110
1111 pb::RpcProc CdmUpdateSessionRpc::GetProc() const {
1112 return RPC(RPC_CDM_UPDATESESSION);
1113 }
1114
1115 void CdmUpdateSessionRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
1116 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1117 << " callback_handle:" << callback_handle_
1118 << " response size:" << response_.size();
1119
1120 pb::CdmUpdateSession* message = rpc->mutable_cdm_updatesession_rpc();
1121 message->set_session_id(session_id_);
1122 message->set_callback_handle(callback_handle_);
1123 message->set_response(&response_[0], response_.size());
1124 }
1125
1126 //==============================================================================
1127 CdmCloseSessionRpc::CdmCloseSessionRpc(int handle,
1128 const std::string& session_id,
1129 int callback_handle)
1130 : Rpc(handle), session_id_(session_id), callback_handle_(callback_handle) {}
1131
1132 CdmCloseSessionRpc::~CdmCloseSessionRpc() = default;
1133
1134 scoped_refptr<CdmCloseSessionRpc> CdmCloseSessionRpc::FromRpcMessage(
1135 const pb::RpcMessage* rpc) {
1136 DCHECK_EQ(RPC(RPC_CDM_CLOSESESSION), rpc->proc());
1137
1138 REQUIRED(rpc->has_cdm_closesession_rpc());
1139 const pb::CdmCloseSession rpc_message = rpc->cdm_closesession_rpc();
1140 std::string session_id = rpc_message.session_id();
1141 int callback_handle = rpc_message.callback_handle();
1142
1143 VLOG(2) << " session_id:" << session_id
1144 << " callback_handle:" << callback_handle;
1145 return new CdmCloseSessionRpc(rpc->handle(), session_id, callback_handle);
1146 }
1147
1148 pb::RpcProc CdmCloseSessionRpc::GetProc() const {
1149 return RPC(RPC_CDM_CLOSESESSION);
1150 }
1151
1152 void CdmCloseSessionRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
1153 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1154 << " callback_handle:" << callback_handle_;
1155
1156 pb::CdmCloseSession* message = rpc->mutable_cdm_closesession_rpc();
1157 message->set_session_id(session_id_);
1158 message->set_callback_handle(callback_handle_);
1159 }
1160
1161 //==============================================================================
1162 CdmRemoveSessionRpc::CdmRemoveSessionRpc(int handle,
1163 const std::string& session_id,
1164 int callback_handle)
1165 : Rpc(handle), session_id_(session_id), callback_handle_(callback_handle) {}
1166
1167 CdmRemoveSessionRpc::~CdmRemoveSessionRpc() = default;
1168
1169 scoped_refptr<CdmRemoveSessionRpc> CdmRemoveSessionRpc::FromRpcMessage(
1170 const pb::RpcMessage* rpc) {
1171 DCHECK_EQ(RPC(RPC_CDM_REMOVESESSION), rpc->proc());
1172
1173 REQUIRED(rpc->has_cdm_removesession_rpc());
1174 const pb::CdmRemoveSession rpc_message = rpc->cdm_removesession_rpc();
1175 std::string session_id = rpc_message.session_id();
1176 int callback_handle = rpc_message.callback_handle();
1177
1178 VLOG(2) << " session_id:" << session_id
1179 << " callback_handle:" << callback_handle;
1180 return new CdmRemoveSessionRpc(rpc->handle(), session_id, callback_handle);
1181 }
1182
1183 pb::RpcProc CdmRemoveSessionRpc::GetProc() const {
1184 return RPC(RPC_CDM_REMOVESESSION);
1185 }
1186
1187 void CdmRemoveSessionRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
1188 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1189 << " callback_handle:" << callback_handle_;
1190
1191 pb::CdmRemoveSession* message = rpc->mutable_cdm_removesession_rpc();
1192 message->set_session_id(session_id_);
1193 message->set_callback_handle(callback_handle_);
1194 }
1195
1196 //==============================================================================
1197 CdmPromiseResult::CdmPromiseResult()
1198 : CdmPromiseResult(::media::MediaKeys::UNKNOWN_ERROR, 0, "") {}
1199
1200 CdmPromiseResult::CdmPromiseResult(::media::MediaKeys::Exception exception,
1201 uint32_t system_code,
1202 std::string error_message)
1203 : success_(false),
1204 exception_(exception),
1205 system_code_(system_code),
1206 error_message_(error_message) {}
1207
1208 CdmPromiseResult::CdmPromiseResult(const CdmPromiseResult& other) = default;
1209
1210 CdmPromiseResult::~CdmPromiseResult() = default;
1211
1212 CdmPromiseResult CdmPromiseResult::SuccessResult() {
1213 CdmPromiseResult result(static_cast<::media::MediaKeys::Exception>(0), 0, "");
1214 result.success_ = true;
1215 return result;
1216 }
1217
1218 //==============================================================================
1219 CdmInitializeCallbackRpc::CdmInitializeCallbackRpc(
1220 int handle,
1221 const CdmPromiseResult& result,
1222 int cdm_id,
1223 int decryptor_handle)
1224 : CdmPromiseCallbackRpc(handle, result),
1225 cdm_id_(cdm_id),
1226 decryptor_handle_(decryptor_handle) {}
1227
1228 CdmInitializeCallbackRpc::~CdmInitializeCallbackRpc() = default;
1229
1230 scoped_refptr<CdmInitializeCallbackRpc>
1231 CdmInitializeCallbackRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
1232 DCHECK_EQ(RPC(RPC_CDM_INITIALIZE_CALLBACK), rpc->proc());
1233
1234 REQUIRED(rpc->has_cdm_promise_rpc());
1235 const pb::CdmPromise promise_message = rpc->cdm_promise_rpc();
1236 CdmPromiseResult result;
1237 REQUIRED(internal::CdmPromiseFromMessage(promise_message, &result, nullptr));
1238 int cdm_id = promise_message.cdm_id();
1239 int decryptor_handle = promise_message.decryptor_handle();
1240
1241 VLOG(2) << "cdm_id:" << cdm_id << " decryptor_handle:" << decryptor_handle;
1242 return new CdmInitializeCallbackRpc(rpc->handle(), result, cdm_id,
1243 decryptor_handle);
1244 }
1245
1246 void CdmInitializeCallbackRpc::ToMessageInternal(pb::RpcMessage* rpc) const {
1247 VLOG(2) << __FUNCTION__ << " cdm_id:" << cdm_id_
1248 << " decryptor_handle:" << decryptor_handle_;
1249
1250 CdmPromiseCallbackRpc<RPC(RPC_CDM_INITIALIZE_CALLBACK)>::ToMessageInternal(
1251 rpc);
1252 pb::CdmPromise* message = rpc->mutable_cdm_promise_rpc();
1253 message->set_cdm_id(cdm_id_);
1254 message->set_decryptor_handle(decryptor_handle_);
1255 }
1256
1257 //==============================================================================
1258 CdmClientOnSessionMessageRpc::CdmClientOnSessionMessageRpc(
1259 int handle,
1260 const std::string& session_id,
1261 ::media::MediaKeys::MessageType message_type,
1262 const uint8_t* message,
1263 size_t message_size)
1264 : Rpc(handle),
1265 session_id_(session_id),
1266 message_type_(message_type),
1267 message_(message, message + message_size) {}
1268
1269 CdmClientOnSessionMessageRpc::~CdmClientOnSessionMessageRpc() = default;
1270
1271 scoped_refptr<CdmClientOnSessionMessageRpc>
1272 CdmClientOnSessionMessageRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
1273 DCHECK_EQ(RPC(RPC_CDMC_ONSESSIONMESSAGE), rpc->proc());
1274
1275 REQUIRED(rpc->has_cdmclient_onsessionmessage_rpc());
1276 const pb::CdmClientOnSessionMessage onsession_message =
1277 rpc->cdmclient_onsessionmessage_rpc();
1278 std::string session_id = onsession_message.session_id();
1279 ::media::MediaKeys::MessageType message_type =
1280 static_cast<::media::MediaKeys::MessageType>(
1281 onsession_message.message_type());
1282 std::vector<uint8_t> message_data;
1283 message_data.assign(onsession_message.message().begin(),
1284 onsession_message.message().end());
1285
1286 return new CdmClientOnSessionMessageRpc(rpc->handle(), session_id,
1287 message_type, &message_data[0],
1288 message_data.size());
1289 }
1290
1291 pb::RpcProc CdmClientOnSessionMessageRpc::GetProc() const {
1292 return RPC(RPC_CDMC_ONSESSIONMESSAGE);
1293 }
1294
1295 void CdmClientOnSessionMessageRpc::ToMessageInternal(
1296 pb::RpcMessage* rpc) const {
1297 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1298 << " message_type:" << message_type_;
1299
1300 pb::CdmClientOnSessionMessage* message =
1301 rpc->mutable_cdmclient_onsessionmessage_rpc();
1302 message->set_session_id(session_id_);
1303 message->set_message_type(
1304 static_cast<pb::MediaKeysMessageType>(message_type_));
1305 message->set_message(&message_[0], message_.size());
1306 }
1307
1308 //==============================================================================
1309 CdmClientOnSessionKeysChangeRpc::CdmClientOnSessionKeysChangeRpc(
1310 int handle,
1311 const std::string& session_id,
1312 bool has_additional_usable_key,
1313 const ::media::CdmKeyInformation* key_information,
1314 size_t key_information_size)
1315 : Rpc(handle),
1316 session_id_(session_id),
1317 has_additional_usable_key_(has_additional_usable_key),
1318 key_information_(key_information,
1319 key_information + key_information_size) {}
1320
1321 CdmClientOnSessionKeysChangeRpc::~CdmClientOnSessionKeysChangeRpc() = default;
1322
1323 scoped_refptr<CdmClientOnSessionKeysChangeRpc>
1324 CdmClientOnSessionKeysChangeRpc::FromRpcMessage(const pb::RpcMessage* rpc) {
1325 DCHECK_EQ(RPC(RPC_CDMC_ONSESSIONKEYSCHANGE), rpc->proc());
1326
1327 REQUIRED(rpc->has_cdmclient_onsessionkeychange_rpc());
1328 const pb::CdmClientOnSessionKeysChange keychange_message =
1329 rpc->cdmclient_onsessionkeychange_rpc();
1330 std::string session_id = keychange_message.session_id();
1331 bool has_additional_usable_key =
1332 keychange_message.has_additional_usable_key();
1333 std::vector<::media::CdmKeyInformation> key_information;
1334 if (has_additional_usable_key) {
1335 REQUIRED(keychange_message.key_information_size());
1336 REQUIRED(DeserializeCdmKeyInformation(keychange_message, &key_information));
1337 }
1338
1339 return new CdmClientOnSessionKeysChangeRpc(
1340 rpc->handle(), session_id, has_additional_usable_key,
1341 key_information.data(), key_information.size());
1342 }
1343
1344 pb::RpcProc CdmClientOnSessionKeysChangeRpc::GetProc() const {
1345 return RPC(RPC_CDMC_ONSESSIONKEYSCHANGE);
1346 }
1347
1348 void CdmClientOnSessionKeysChangeRpc::ToMessageInternal(
1349 pb::RpcMessage* rpc) const {
1350 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1351 << " has_additional_usable_key:" << has_additional_usable_key_;
1352
1353 pb::CdmClientOnSessionKeysChange* message =
1354 rpc->mutable_cdmclient_onsessionkeychange_rpc();
1355 message->set_session_id(session_id_);
1356 message->set_has_additional_usable_key(has_additional_usable_key_);
1357 SerializeCdmKeyInformation(message, key_information_);
1358 }
1359
1360 //==============================================================================
1361 CdmClientOnSessionExpirationUpdateRpc::CdmClientOnSessionExpirationUpdateRpc(
1362 int handle,
1363 const std::string& session_id,
1364 double new_expiry_time_sec)
1365 : Rpc(handle),
1366 session_id_(session_id),
1367 new_expiry_time_sec_(new_expiry_time_sec) {}
1368
1369 CdmClientOnSessionExpirationUpdateRpc::
1370 ~CdmClientOnSessionExpirationUpdateRpc() = default;
1371
1372 scoped_refptr<CdmClientOnSessionExpirationUpdateRpc>
1373 CdmClientOnSessionExpirationUpdateRpc::FromRpcMessage(
1374 const pb::RpcMessage* rpc) {
1375 DCHECK_EQ(RPC(RPC_CDMC_ONSESSIONEXPIRATIONUPDATE), rpc->proc());
1376
1377 REQUIRED(rpc->has_cdmclient_onsessionexpirationupdate_rpc());
1378 const pb::CdmClientOnSessionExpirationUpdate expire_message =
1379 rpc->cdmclient_onsessionexpirationupdate_rpc();
1380 std::string session_id = expire_message.session_id();
1381 double new_expiry_time_sec = expire_message.new_expiry_time_sec();
1382
1383 return new CdmClientOnSessionExpirationUpdateRpc(rpc->handle(), session_id,
1384 new_expiry_time_sec);
1385 }
1386
1387 pb::RpcProc CdmClientOnSessionExpirationUpdateRpc::GetProc() const {
1388 return RPC(RPC_CDMC_ONSESSIONEXPIRATIONUPDATE);
1389 }
1390
1391 void CdmClientOnSessionExpirationUpdateRpc::ToMessageInternal(
1392 pb::RpcMessage* rpc) const {
1393 VLOG(2) << __FUNCTION__ << " session_id:" << session_id_
1394 << " new_expiry_time_sec_:" << new_expiry_time_sec_;
1395
1396 pb::CdmClientOnSessionExpirationUpdate* message =
1397 rpc->mutable_cdmclient_onsessionexpirationupdate_rpc();
1398 message->set_session_id(session_id_);
1399 message->set_new_expiry_time_sec(new_expiry_time_sec_);
1400 }
1401
1402 #undef REQUIRED
1403
1404 } // namespace remoting
1405 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698