OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MEDIA_CDM_PPAPI_CDM_WRAPPER_H_ | 5 #ifndef MEDIA_CDM_PPAPI_CDM_WRAPPER_H_ |
6 #define MEDIA_CDM_PPAPI_CDM_WRAPPER_H_ | 6 #define MEDIA_CDM_PPAPI_CDM_WRAPPER_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <queue> | 9 #include <queue> |
10 #include <string> | 10 #include <string> |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 const char* web_session_id, | 120 const char* web_session_id, |
121 uint32_t web_session_id_size) = 0; | 121 uint32_t web_session_id_size) = 0; |
122 | 122 |
123 // cdm::Host_6 introduces InputBuffer_2 (aka InputBuffer). cdm::Host_4 and | 123 // cdm::Host_6 introduces InputBuffer_2 (aka InputBuffer). cdm::Host_4 and |
124 // cdm::Host_5 methods still use InputBuffer_1, so this helper function | 124 // cdm::Host_5 methods still use InputBuffer_1, so this helper function |
125 // converts InputBuffer_2 to InputBuffer_1. | 125 // converts InputBuffer_2 to InputBuffer_1. |
126 // TODO(jrummell): Remove these once Host_4 and Host_5 interfaces are removed. | 126 // TODO(jrummell): Remove these once Host_4 and Host_5 interfaces are removed. |
127 virtual void ConvertInputBuffer(const cdm::InputBuffer& v2, | 127 virtual void ConvertInputBuffer(const cdm::InputBuffer& v2, |
128 cdm::InputBuffer_1* v1) = 0; | 128 cdm::InputBuffer_1* v1) = 0; |
129 | 129 |
| 130 // Prior to CDM_6, |init_data_type| was a content type. This helper convererts |
| 131 // an |init_data_type| to a content type. |
| 132 // TODO(sandersd): Remove once Host_4 and Host_5 interfaces are removed. |
| 133 virtual const char* ConvertInitDataTypeToContentType( |
| 134 const char* init_data_type) const = 0; |
| 135 |
130 protected: | 136 protected: |
131 CdmWrapper() {} | 137 CdmWrapper() {} |
132 | 138 |
133 private: | 139 private: |
134 DISALLOW_COPY_AND_ASSIGN(CdmWrapper); | 140 DISALLOW_COPY_AND_ASSIGN(CdmWrapper); |
135 }; | 141 }; |
136 | 142 |
137 // Template class that does the CdmWrapper -> CdmInterface conversion. Default | 143 // Template class that does the CdmWrapper -> CdmInterface conversion. Default |
138 // implementations are provided. Any methods that need special treatment should | 144 // implementations are provided. Any methods that need special treatment should |
139 // be specialized. | 145 // be specialized. |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 v1->data_offset = 0; | 338 v1->data_offset = 0; |
333 v1->key_id = v2.key_id; | 339 v1->key_id = v2.key_id; |
334 v1->key_id_size = v2.key_id_size; | 340 v1->key_id_size = v2.key_id_size; |
335 v1->iv = v2.iv; | 341 v1->iv = v2.iv; |
336 v1->iv_size = v2.iv_size; | 342 v1->iv_size = v2.iv_size; |
337 v1->subsamples = v2.subsamples; | 343 v1->subsamples = v2.subsamples; |
338 v1->num_subsamples = v2.num_subsamples; | 344 v1->num_subsamples = v2.num_subsamples; |
339 v1->timestamp = v2.timestamp; | 345 v1->timestamp = v2.timestamp; |
340 } | 346 } |
341 | 347 |
| 348 virtual const char* ConvertInitDataTypeToContentType( |
| 349 const char* init_data_type) const { |
| 350 if (!strcmp(init_data_type, "cenc")) |
| 351 return "video/mp4"; |
| 352 if (!strcmp(init_data_type, "webm")) |
| 353 return "video/webm"; |
| 354 return init_data_type; |
| 355 } |
| 356 |
342 private: | 357 private: |
343 CdmWrapperImpl(CdmInterface* cdm) : cdm_(cdm), next_session_id_(100) { | 358 CdmWrapperImpl(CdmInterface* cdm) : cdm_(cdm), next_session_id_(100) { |
344 PP_DCHECK(cdm_); | 359 PP_DCHECK(cdm_); |
345 } | 360 } |
346 | 361 |
347 CdmInterface* cdm_; | 362 CdmInterface* cdm_; |
348 | 363 |
349 std::map<uint32_t, uint32_t> promise_to_session_id_map_; | 364 std::map<uint32_t, uint32_t> promise_to_session_id_map_; |
350 uint32_t next_session_id_; | 365 uint32_t next_session_id_; |
351 std::map<std::string, uint32_t> web_session_to_session_id_map_; | 366 std::map<std::string, uint32_t> web_session_to_session_id_map_; |
352 | 367 |
353 std::map<uint32_t, std::string> promises_needing_usable_keys_event_; | 368 std::map<uint32_t, std::string> promises_needing_usable_keys_event_; |
354 | 369 |
355 DISALLOW_COPY_AND_ASSIGN(CdmWrapperImpl); | 370 DISALLOW_COPY_AND_ASSIGN(CdmWrapperImpl); |
356 }; | 371 }; |
357 | 372 |
358 // Overrides for the cdm::Host_4 methods. Calls to CreateSession(), | 373 // Overrides for the cdm::Host_4 methods. Calls to CreateSession(), |
359 // LoadSession(), UpdateSession(), and ReleaseSession() pass in promise ids, | 374 // LoadSession(), UpdateSession(), and ReleaseSession() pass in promise ids, |
360 // but the CDM interface needs session ids. For create and load, we need to | 375 // but the CDM interface needs session ids. For create and load, we need to |
361 // create a new session_id to pass to the CDM. For update and release, we need | 376 // create a new session_id to pass to the CDM. For update and release, we need |
362 // to look up |web_session_id| and convert it into the existing |session_id|. | 377 // to look up |web_session_id| and convert it into the existing |session_id|. |
363 // Since the callbacks don't come through this interface, cdm_adapter needs to | 378 // Since the callbacks don't come through this interface, cdm_adapter needs to |
364 // create the mapping (and delete it on release). | 379 // create the mapping (and delete it on release). Finally, for create, we need |
| 380 // to translate |init_data_type| to a MIME type. |
365 // TODO(jrummell): Remove these once Host_4 interface is removed. | 381 // TODO(jrummell): Remove these once Host_4 interface is removed. |
366 | 382 |
367 template <> | 383 template <> |
368 void CdmWrapperImpl<cdm::ContentDecryptionModule_4>::CreateSession( | 384 void CdmWrapperImpl<cdm::ContentDecryptionModule_4>::CreateSession( |
369 uint32_t promise_id, | 385 uint32_t promise_id, |
370 const char* init_data_type, | 386 const char* init_data_type, |
371 uint32_t init_data_type_size, | 387 uint32_t init_data_type_size, |
372 const uint8_t* init_data, | 388 const uint8_t* init_data, |
373 uint32_t init_data_size, | 389 uint32_t init_data_size, |
374 cdm::SessionType session_type) { | 390 cdm::SessionType session_type) { |
375 uint32_t session_id = CreateSessionId(); | 391 uint32_t session_id = CreateSessionId(); |
376 RegisterPromise(session_id, promise_id); | 392 RegisterPromise(session_id, promise_id); |
377 cdm_->CreateSession(session_id, | 393 cdm_->CreateSession(session_id, |
378 init_data_type, | 394 ConvertInitDataTypeToContentType(init_data_type), |
379 init_data_type_size, | 395 init_data_type_size, |
380 init_data, | 396 init_data, |
381 init_data_size); | 397 init_data_size); |
382 } | 398 } |
383 | 399 |
384 template <> | 400 template <> |
385 void CdmWrapperImpl<cdm::ContentDecryptionModule_4>::LoadSession( | 401 void CdmWrapperImpl<cdm::ContentDecryptionModule_4>::LoadSession( |
386 uint32_t promise_id, | 402 uint32_t promise_id, |
387 const char* web_session_id, | 403 const char* web_session_id, |
388 uint32_t web_session_id_size) { | 404 uint32_t web_session_id_size) { |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 cdm::AudioFrames* audio_frames) { | 481 cdm::AudioFrames* audio_frames) { |
466 cdm::InputBuffer_1 buffer; | 482 cdm::InputBuffer_1 buffer; |
467 ConvertInputBuffer(encrypted_buffer, &buffer); | 483 ConvertInputBuffer(encrypted_buffer, &buffer); |
468 return cdm_->DecryptAndDecodeSamples(buffer, audio_frames); | 484 return cdm_->DecryptAndDecodeSamples(buffer, audio_frames); |
469 } | 485 } |
470 | 486 |
471 // Overrides for the cdm::Host_5 methods. | 487 // Overrides for the cdm::Host_5 methods. |
472 // TODO(jrummell): Remove these once Host_5 interface is removed. | 488 // TODO(jrummell): Remove these once Host_5 interface is removed. |
473 | 489 |
474 template <> | 490 template <> |
| 491 void CdmWrapperImpl<cdm::ContentDecryptionModule_5>::CreateSession( |
| 492 uint32_t promise_id, |
| 493 const char* init_data_type, |
| 494 uint32_t init_data_type_size, |
| 495 const uint8_t* init_data, |
| 496 uint32_t init_data_size, |
| 497 cdm::SessionType session_type) { |
| 498 cdm_->CreateSession(promise_id, |
| 499 ConvertInitDataTypeToContentType(init_data_type), |
| 500 init_data_type_size, |
| 501 init_data, |
| 502 init_data_size, |
| 503 session_type); |
| 504 } |
| 505 |
| 506 template <> |
475 void CdmWrapperImpl<cdm::ContentDecryptionModule_5>::LoadSession( | 507 void CdmWrapperImpl<cdm::ContentDecryptionModule_5>::LoadSession( |
476 uint32_t promise_id, | 508 uint32_t promise_id, |
477 const char* web_session_id, | 509 const char* web_session_id, |
478 uint32_t web_session_id_size) { | 510 uint32_t web_session_id_size) { |
479 // As CDM_5 doesn't support OnSessionUsableKeysChange(), make sure to generate | 511 // As CDM_5 doesn't support OnSessionUsableKeysChange(), make sure to generate |
480 // one when the promise is resolved. This may be overly aggressive. | 512 // one when the promise is resolved. This may be overly aggressive. |
481 SetSessionUsableKeysEventNeeded( | 513 SetSessionUsableKeysEventNeeded( |
482 promise_id, web_session_id, web_session_id_size); | 514 promise_id, web_session_id, web_session_id_size); |
483 cdm_->LoadSession(promise_id, web_session_id, web_session_id_size); | 515 cdm_->LoadSession(promise_id, web_session_id, web_session_id_size); |
484 } | 516 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 // stub implementations for new or modified methods that the older CDM interface | 627 // stub implementations for new or modified methods that the older CDM interface |
596 // does not have. | 628 // does not have. |
597 // Also update supported_cdm_versions.h. | 629 // Also update supported_cdm_versions.h. |
598 COMPILE_ASSERT(cdm::ContentDecryptionModule::kVersion == | 630 COMPILE_ASSERT(cdm::ContentDecryptionModule::kVersion == |
599 cdm::ContentDecryptionModule_6::kVersion, | 631 cdm::ContentDecryptionModule_6::kVersion, |
600 ensure_cdm_wrapper_templates_have_old_version_support); | 632 ensure_cdm_wrapper_templates_have_old_version_support); |
601 | 633 |
602 } // namespace media | 634 } // namespace media |
603 | 635 |
604 #endif // MEDIA_CDM_PPAPI_CDM_WRAPPER_H_ | 636 #endif // MEDIA_CDM_PPAPI_CDM_WRAPPER_H_ |
OLD | NEW |