Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 CDM_CONTENT_DECRYPTION_MODULE_H_ | 5 #ifndef CDM_CONTENT_DECRYPTION_MODULE_H_ |
| 6 #define CDM_CONTENT_DECRYPTION_MODULE_H_ | 6 #define CDM_CONTENT_DECRYPTION_MODULE_H_ |
| 7 | 7 |
| 8 #if defined(_MSC_VER) | 8 #if defined(_MSC_VER) |
| 9 typedef unsigned char uint8_t; | 9 typedef unsigned char uint8_t; |
| 10 typedef unsigned int uint32_t; | 10 typedef unsigned int uint32_t; |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 #define CDM_CLASS_API [[clang::lto_visibility_public]] | 30 #define CDM_CLASS_API [[clang::lto_visibility_public]] |
| 31 #else | 31 #else |
| 32 #define CDM_CLASS_API | 32 #define CDM_CLASS_API |
| 33 #endif | 33 #endif |
| 34 | 34 |
| 35 #if defined(CDM_IMPLEMENTATION) | 35 #if defined(CDM_IMPLEMENTATION) |
| 36 #define CDM_API __declspec(dllexport) | 36 #define CDM_API __declspec(dllexport) |
| 37 #else | 37 #else |
| 38 #define CDM_API __declspec(dllimport) | 38 #define CDM_API __declspec(dllimport) |
| 39 #endif // defined(CDM_IMPLEMENTATION) | 39 #endif // defined(CDM_IMPLEMENTATION) |
| 40 | 40 |
|
xhwang
2016/10/31 22:43:47
+ddorwin:
Continuing on the comment on
#include
jrummell
2016/11/02 20:10:03
export.h is back.
| |
| 41 #else // defined(WIN32) | 41 #else // defined(WIN32) |
| 42 #define CDM_API __attribute__((visibility("default"))) | 42 #define CDM_API __attribute__((visibility("default"))) |
| 43 #define CDM_CLASS_API __attribute__((visibility("default"))) | 43 #define CDM_CLASS_API __attribute__((visibility("default"))) |
| 44 #endif // defined(WIN32) | 44 #endif // defined(WIN32) |
| 45 | 45 |
| 46 // The version number must be rolled when the exported functions are updated! | 46 // The version number must be rolled when the exported functions are updated! |
| 47 // If the CDM and the adapter use different versions of these functions, the | 47 // If the CDM and the adapter use different versions of these functions, the |
| 48 // adapter will fail to load or crash! | 48 // adapter will fail to load or crash! |
| 49 #define CDM_MODULE_VERSION 4 | 49 #define CDM_MODULE_VERSION 4 |
| 50 | 50 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 82 CDM_API const char* GetCdmVersion(); | 82 CDM_API const char* GetCdmVersion(); |
| 83 } | 83 } |
| 84 | 84 |
| 85 namespace cdm { | 85 namespace cdm { |
| 86 | 86 |
| 87 class AudioFrames; | 87 class AudioFrames; |
| 88 class DecryptedBlock; | 88 class DecryptedBlock; |
| 89 class VideoFrame; | 89 class VideoFrame; |
| 90 | 90 |
| 91 class Host_8; | 91 class Host_8; |
| 92 class Host_9; | |
| 92 | 93 |
| 93 enum Status { | 94 enum Status { |
| 94 kSuccess = 0, | 95 kSuccess = 0, |
| 95 kNeedMoreData, // Decoder needs more data to produce a decoded frame/sample. | 96 kNeedMoreData, // Decoder needs more data to produce a decoded frame/sample. |
| 96 kNoKey, // The required decryption key is not available. | 97 kNoKey, // The required decryption key is not available. |
| 97 kSessionError, // Session management error. | 98 kInitializationError, // Initialization failed. |
| 98 kDecryptError, // Decryption failed. | 99 kDecryptError, // Decryption failed. |
| 99 kDecodeError, // Error decoding audio or video. | 100 kDecodeError, // Error decoding audio or video. |
| 100 kDeferredInitialization // Decoder is not ready for initialization. | 101 kDeferredInitialization // Decoder is not ready for initialization. |
| 101 }; | 102 }; |
| 102 | 103 |
| 103 // This must at least contain the exceptions defined in the spec: | 104 // This must at least contain the exceptions defined in the spec: |
| 104 // https://w3c.github.io/encrypted-media/#exceptions | 105 // https://w3c.github.io/encrypted-media/#exceptions |
| 105 // The following starts with the list of DOM4 exceptions from: | 106 enum RejectionReason { |
| 106 // http://www.w3.org/TR/dom/#domexception | 107 // The values used are the legacy code values from |
| 107 // Some DOM4 exceptions are not included as they are not expected to be used. | 108 // https://heycam.github.io/webidl/#idl-DOMException-error-names |
| 108 enum Error { | |
| 109 kNotSupportedError = 9, | 109 kNotSupportedError = 9, |
| 110 kInvalidStateError = 11, | 110 kInvalidStateError = 11, |
| 111 kInvalidAccessError = 15, | |
| 112 kQuotaExceededError = 22, | 111 kQuotaExceededError = 22, |
| 113 | 112 |
| 114 // Additional exceptions that do not have assigned codes. | 113 // Additional exceptions that do not have assigned legacy codes. |
| 115 // There are other non-EME-specific values, not included in this list. | 114 kTypeError = 50, |
|
xhwang
2016/10/31 22:43:47
OOC, where is 50 coming from? Is it just another a
jrummell
2016/11/02 20:10:03
A long time ago new specs would simply add their o
| |
| 116 kUnknownError = 30, | |
| 117 | 115 |
| 118 // Additional values from previous EME versions. They currently have no | 116 // Additional values from previous EME versions. They are deprecated and |
| 119 // matching DOMException. | 117 // should not be used. |
| 120 kClientError = 100, | 118 kDeprecatedInvalidAccessErrorWillBeTreatedAsTypeError = 15, |
| 121 kOutputError = 101 | 119 kDeprecatedUnknownError = 30, |
| 120 kDeprecatedClientErrorWillBeTreatedAsUnknownError = 100, | |
| 121 kDeprecatedOutputErrorWillBeTreatedAsUnknownError = 101 | |
| 122 }; | 122 }; |
| 123 | 123 |
| 124 // Time is defined as the number of seconds since the | 124 // Time is defined as the number of seconds since the |
| 125 // Epoch (00:00:00 UTC, January 1, 1970). | 125 // Epoch (00:00:00 UTC, January 1, 1970). |
| 126 typedef double Time; | 126 typedef double Time; |
| 127 | 127 |
| 128 // An input buffer can be split into several continuous subsamples. | 128 // An input buffer can be split into several continuous subsamples. |
| 129 // A SubsampleEntry specifies the number of clear and cipher bytes in each | 129 // A SubsampleEntry specifies the number of clear and cipher bytes in each |
| 130 // subsample. For example, the following buffer has three subsamples: | 130 // subsample. For example, the following buffer has three subsamples: |
| 131 // | 131 // |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 217 kAudioFormatS16, // Interleaved signed 16-bit. | 217 kAudioFormatS16, // Interleaved signed 16-bit. |
| 218 kAudioFormatS32, // Interleaved signed 32-bit. | 218 kAudioFormatS32, // Interleaved signed 32-bit. |
| 219 kAudioFormatF32, // Interleaved float 32-bit. | 219 kAudioFormatF32, // Interleaved float 32-bit. |
| 220 kAudioFormatPlanarS16, // Signed 16-bit planar. | 220 kAudioFormatPlanarS16, // Signed 16-bit planar. |
| 221 kAudioFormatPlanarF32, // Float 32-bit planar. | 221 kAudioFormatPlanarF32, // Float 32-bit planar. |
| 222 }; | 222 }; |
| 223 | 223 |
| 224 // Surface formats based on FOURCC labels, see: http://www.fourcc.org/yuv.php | 224 // Surface formats based on FOURCC labels, see: http://www.fourcc.org/yuv.php |
| 225 enum VideoFormat { | 225 enum VideoFormat { |
| 226 kUnknownVideoFormat = 0, // Unknown format value. Used for error reporting. | 226 kUnknownVideoFormat = 0, // Unknown format value. Used for error reporting. |
| 227 kYv12, // 12bpp YVU planar 1x1 Y, 2x2 VU samples. | 227 kYv12, // 12bpp YVU planar 1x1 Y, 2x2 VU samples. |
| 228 kI420 // 12bpp YVU planar 1x1 Y, 2x2 UV samples. | 228 kI420 // 12bpp YUV planar 1x1 Y, 2x2 UV samples. |
| 229 }; | 229 }; |
| 230 | 230 |
| 231 struct Size { | 231 struct Size { |
| 232 Size() : width(0), height(0) {} | 232 Size() : width(0), height(0) {} |
| 233 Size(int32_t width, int32_t height) : width(width), height(height) {} | 233 Size(int32_t width, int32_t height) : width(width), height(height) {} |
| 234 | 234 |
| 235 int32_t width; | 235 int32_t width; |
| 236 int32_t height; | 236 int32_t height; |
| 237 }; | 237 }; |
| 238 | 238 |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 556 // If the return value is not kSuccess, |decrypted_buffer| should be ignored | 556 // If the return value is not kSuccess, |decrypted_buffer| should be ignored |
| 557 // by the caller. | 557 // by the caller. |
| 558 virtual Status Decrypt(const InputBuffer& encrypted_buffer, | 558 virtual Status Decrypt(const InputBuffer& encrypted_buffer, |
| 559 DecryptedBlock* decrypted_buffer) = 0; | 559 DecryptedBlock* decrypted_buffer) = 0; |
| 560 | 560 |
| 561 // Initializes the CDM audio decoder with |audio_decoder_config|. This | 561 // Initializes the CDM audio decoder with |audio_decoder_config|. This |
| 562 // function must be called before DecryptAndDecodeSamples() is called. | 562 // function must be called before DecryptAndDecodeSamples() is called. |
| 563 // | 563 // |
| 564 // Returns kSuccess if the |audio_decoder_config| is supported and the CDM | 564 // Returns kSuccess if the |audio_decoder_config| is supported and the CDM |
| 565 // audio decoder is successfully initialized. | 565 // audio decoder is successfully initialized. |
| 566 // Returns kSessionError if |audio_decoder_config| is not supported. The CDM | 566 // Returns kInitializationError if |audio_decoder_config| is not supported. |
| 567 // may still be able to do Decrypt(). | 567 // The CDM may still be able to do Decrypt(). |
| 568 // Returns kDeferredInitialization if the CDM is not ready to initialize the | 568 // Returns kDeferredInitialization if the CDM is not ready to initialize the |
| 569 // decoder at this time. Must call Host::OnDeferredInitializationDone() once | 569 // decoder at this time. Must call Host::OnDeferredInitializationDone() once |
| 570 // initialization is complete. | 570 // initialization is complete. |
| 571 virtual Status InitializeAudioDecoder( | 571 virtual Status InitializeAudioDecoder( |
| 572 const AudioDecoderConfig& audio_decoder_config) = 0; | 572 const AudioDecoderConfig& audio_decoder_config) = 0; |
| 573 | 573 |
| 574 // Initializes the CDM video decoder with |video_decoder_config|. This | 574 // Initializes the CDM video decoder with |video_decoder_config|. This |
| 575 // function must be called before DecryptAndDecodeFrame() is called. | 575 // function must be called before DecryptAndDecodeFrame() is called. |
| 576 // | 576 // |
| 577 // Returns kSuccess if the |video_decoder_config| is supported and the CDM | 577 // Returns kSuccess if the |video_decoder_config| is supported and the CDM |
| 578 // video decoder is successfully initialized. | 578 // video decoder is successfully initialized. |
| 579 // Returns kSessionError if |video_decoder_config| is not supported. The CDM | 579 // Returns kInitializationError if |video_decoder_config| is not supported. |
| 580 // may still be able to do Decrypt(). | 580 // The CDM may still be able to do Decrypt(). |
| 581 // Returns kDeferredInitialization if the CDM is not ready to initialize the | 581 // Returns kDeferredInitialization if the CDM is not ready to initialize the |
| 582 // decoder at this time. Must call Host::OnDeferredInitializationDone() once | 582 // decoder at this time. Must call Host::OnDeferredInitializationDone() once |
| 583 // initialization is complete. | 583 // initialization is complete. |
| 584 virtual Status InitializeVideoDecoder( | 584 virtual Status InitializeVideoDecoder( |
| 585 const VideoDecoderConfig& video_decoder_config) = 0; | 585 const VideoDecoderConfig& video_decoder_config) = 0; |
| 586 | 586 |
| 587 // De-initializes the CDM decoder and sets it to an uninitialized state. The | 587 // De-initializes the CDM decoder and sets it to an uninitialized state. The |
| 588 // caller can initialize the decoder again after this call to re-initialize | 588 // caller can initialize the decoder again after this call to re-initialize |
| 589 // it. This can be used to reconfigure the decoder if the configuration | 589 // it. This can be used to reconfigure the decoder if the configuration |
| 590 // changes. | 590 // changes. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 648 uint32_t output_protection_mask) = 0; | 648 uint32_t output_protection_mask) = 0; |
| 649 | 649 |
| 650 // Destroys the object in the same context as it was created. | 650 // Destroys the object in the same context as it was created. |
| 651 virtual void Destroy() = 0; | 651 virtual void Destroy() = 0; |
| 652 | 652 |
| 653 protected: | 653 protected: |
| 654 ContentDecryptionModule_8() {} | 654 ContentDecryptionModule_8() {} |
| 655 virtual ~ContentDecryptionModule_8() {} | 655 virtual ~ContentDecryptionModule_8() {} |
| 656 }; | 656 }; |
| 657 | 657 |
| 658 typedef ContentDecryptionModule_8 ContentDecryptionModule; | 658 // ContentDecryptionModule interface that all CDMs need to implement. |
| 659 // The interface is versioned for backward compatibility. | |
| 660 // Note: ContentDecryptionModule implementations must use the allocator | |
| 661 // provided in CreateCdmInstance() to allocate any Buffer that needs to | |
| 662 // be passed back to the caller. Implementations must call Buffer::Destroy() | |
| 663 // when a Buffer is created that will never be returned to the caller. | |
| 664 class CDM_CLASS_API ContentDecryptionModule_9 { | |
| 665 public: | |
| 666 static const int kVersion = 9; | |
| 667 typedef Host_9 Host; | |
| 668 | |
| 669 // Initializes the CDM instance, providing information about permitted | |
| 670 // functionalities. | |
| 671 // If |allow_distinctive_identifier| is false, messages from the CDM, | |
| 672 // such as message events, must not contain a Distinctive Identifier, | |
| 673 // even in an encrypted form. | |
| 674 // If |allow_persistent_state| is false, the CDM must not attempt to | |
| 675 // persist state. Calls to CreateFileIO() will fail. | |
| 676 virtual void Initialize(bool allow_distinctive_identifier, | |
| 677 bool allow_persistent_state) = 0; | |
| 678 | |
| 679 // SetServerCertificate(), CreateSessionAndGenerateRequest(), LoadSession(), | |
| 680 // UpdateSession(), CloseSession(), and RemoveSession() all accept a | |
| 681 // |promise_id|, which must be passed to the completion Host method | |
| 682 // (e.g. Host::OnResolveNewSessionPromise()). | |
| 683 | |
| 684 // Provides a server certificate to be used to encrypt messages to the | |
| 685 // license server. The CDM must respond by calling either | |
| 686 // Host::OnResolvePromise() or Host::OnRejectPromise(). | |
| 687 virtual void SetServerCertificate(uint32_t promise_id, | |
| 688 const uint8_t* server_certificate_data, | |
| 689 uint32_t server_certificate_data_size) = 0; | |
| 690 | |
| 691 // Creates a session given |session_type|, |init_data_type|, and |init_data|. | |
| 692 // The CDM must respond by calling either Host::OnResolveNewSessionPromise() | |
| 693 // or Host::OnRejectPromise(). | |
| 694 virtual void CreateSessionAndGenerateRequest(uint32_t promise_id, | |
| 695 SessionType session_type, | |
| 696 InitDataType init_data_type, | |
| 697 const uint8_t* init_data, | |
| 698 uint32_t init_data_size) = 0; | |
| 699 | |
| 700 // Loads the session of type |session_type| specified by |session_id|. | |
| 701 // The CDM must respond by calling either Host::OnResolveNewSessionPromise() | |
| 702 // or Host::OnRejectPromise(). If the session is not found, call | |
| 703 // Host::OnResolveNewSessionPromise() with session_id = NULL. | |
| 704 virtual void LoadSession(uint32_t promise_id, | |
| 705 SessionType session_type, | |
| 706 const char* session_id, | |
| 707 uint32_t session_id_size) = 0; | |
| 708 | |
| 709 // Updates the session with |response|. The CDM must respond by calling | |
| 710 // either Host::OnResolvePromise() or Host::OnRejectPromise(). | |
| 711 virtual void UpdateSession(uint32_t promise_id, | |
| 712 const char* session_id, | |
| 713 uint32_t session_id_size, | |
| 714 const uint8_t* response, | |
| 715 uint32_t response_size) = 0; | |
| 716 | |
| 717 // Requests that the CDM close the session. The CDM must respond by calling | |
| 718 // either Host::OnResolvePromise() or Host::OnRejectPromise() when the request | |
| 719 // has been processed. This may be before the session is closed. Once the | |
| 720 // session is closed, Host::OnSessionClosed() must also be called. | |
| 721 virtual void CloseSession(uint32_t promise_id, | |
| 722 const char* session_id, | |
| 723 uint32_t session_id_size) = 0; | |
| 724 | |
| 725 // Removes any stored session data associated with this session. Will only be | |
| 726 // called for persistent sessions. The CDM must respond by calling either | |
| 727 // Host::OnResolvePromise() or Host::OnRejectPromise() when the request has | |
| 728 // been processed. | |
| 729 virtual void RemoveSession(uint32_t promise_id, | |
| 730 const char* session_id, | |
| 731 uint32_t session_id_size) = 0; | |
| 732 | |
| 733 // Performs scheduled operation with |context| when the timer fires. | |
| 734 virtual void TimerExpired(void* context) = 0; | |
| 735 | |
| 736 // Decrypts the |encrypted_buffer|. | |
| 737 // | |
| 738 // Returns kSuccess if decryption succeeded, in which case the callee | |
| 739 // should have filled the |decrypted_buffer| and passed the ownership of | |
| 740 // |data| in |decrypted_buffer| to the caller. | |
| 741 // Returns kNoKey if the CDM did not have the necessary decryption key | |
| 742 // to decrypt. | |
| 743 // Returns kDecryptError if any other error happened. | |
| 744 // If the return value is not kSuccess, |decrypted_buffer| should be ignored | |
| 745 // by the caller. | |
| 746 virtual Status Decrypt(const InputBuffer& encrypted_buffer, | |
| 747 DecryptedBlock* decrypted_buffer) = 0; | |
| 748 | |
| 749 // Initializes the CDM audio decoder with |audio_decoder_config|. This | |
| 750 // function must be called before DecryptAndDecodeSamples() is called. | |
| 751 // | |
| 752 // Returns kSuccess if the |audio_decoder_config| is supported and the CDM | |
| 753 // audio decoder is successfully initialized. | |
| 754 // Returns kInitializationError if |audio_decoder_config| is not supported. | |
| 755 // The CDM may still be able to do Decrypt(). | |
| 756 // Returns kDeferredInitialization if the CDM is not ready to initialize the | |
| 757 // decoder at this time. Must call Host::OnDeferredInitializationDone() once | |
| 758 // initialization is complete. | |
| 759 virtual Status InitializeAudioDecoder( | |
| 760 const AudioDecoderConfig& audio_decoder_config) = 0; | |
| 761 | |
| 762 // Initializes the CDM video decoder with |video_decoder_config|. This | |
| 763 // function must be called before DecryptAndDecodeVideo() is called. | |
| 764 // | |
| 765 // Returns kSuccess if the |video_decoder_config| is supported and the CDM | |
| 766 // video decoder is successfully initialized. | |
| 767 // Returns kInitializationError if |video_decoder_config| is not supported. | |
| 768 // The CDM may still be able to do Decrypt(). | |
| 769 // Returns kDeferredInitialization if the CDM is not ready to initialize the | |
| 770 // decoder at this time. Must call Host::OnDeferredInitializationDone() once | |
| 771 // initialization is complete. | |
| 772 virtual Status InitializeVideoDecoder( | |
| 773 const VideoDecoderConfig& video_decoder_config) = 0; | |
| 774 | |
| 775 // De-initializes the CDM decoder and sets it to an uninitialized state. The | |
| 776 // caller can initialize the decoder again after this call to re-initialize | |
| 777 // it. This can be used to reconfigure the decoder if the configuration | |
| 778 // changes. | |
| 779 virtual void DeinitializeDecoder(StreamType decoder_type) = 0; | |
| 780 | |
| 781 // Resets the CDM decoder to an initialized clean state. All internal buffers | |
| 782 // MUST be flushed. | |
| 783 virtual void ResetDecoder(StreamType decoder_type) = 0; | |
| 784 | |
| 785 // Decrypts the |encrypted_buffer| and decodes the decrypted buffer into a | |
| 786 // |video_frame|. Upon end-of-stream, the caller should call this function | |
| 787 // repeatedly with empty |encrypted_buffer| (|data| == NULL) until only empty | |
| 788 // |video_frame| (|format| == kEmptyVideoFrame) is produced. | |
| 789 // | |
| 790 // Returns kSuccess if decryption and decoding both succeeded, in which case | |
| 791 // the callee will have filled the |video_frame| and passed the ownership of | |
| 792 // |frame_buffer| in |video_frame| to the caller. | |
| 793 // Returns kNoKey if the CDM did not have the necessary decryption key | |
| 794 // to decrypt. | |
| 795 // Returns kNeedMoreData if more data was needed by the decoder to generate | |
| 796 // a decoded frame (e.g. during initialization and end-of-stream). | |
| 797 // Returns kDecryptError if any decryption error happened. | |
| 798 // Returns kDecodeError if any decoding error happened. | |
| 799 // If the return value is not kSuccess, |video_frame| should be ignored by | |
| 800 // the caller. | |
| 801 virtual Status DecryptAndDecodeVideo(const InputBuffer& encrypted_buffer, | |
| 802 VideoFrame* video_frame) = 0; | |
| 803 | |
| 804 // Decrypts the |encrypted_buffer| and decodes the decrypted buffer into | |
| 805 // |audio_frames|. Upon end-of-stream, the caller should call this function | |
| 806 // repeatedly with empty |encrypted_buffer| (|data| == NULL) until only empty | |
| 807 // |audio_frames| is produced. | |
| 808 // | |
| 809 // Returns kSuccess if decryption and decoding both succeeded, in which case | |
| 810 // the callee will have filled |audio_frames| and passed the ownership of | |
| 811 // |data| in |audio_frames| to the caller. | |
| 812 // Returns kNoKey if the CDM did not have the necessary decryption key | |
| 813 // to decrypt. | |
| 814 // Returns kNeedMoreData if more data was needed by the decoder to generate | |
| 815 // audio samples (e.g. during initialization and end-of-stream). | |
| 816 // Returns kDecryptError if any decryption error happened. | |
| 817 // Returns kDecodeError if any decoding error happened. | |
| 818 // If the return value is not kSuccess, |audio_frames| should be ignored by | |
| 819 // the caller. | |
| 820 virtual Status DecryptAndDecodeAudio(const InputBuffer& encrypted_buffer, | |
| 821 AudioFrames* audio_frames) = 0; | |
| 822 | |
| 823 // Called by the host after a platform challenge was initiated via | |
| 824 // Host::SendPlatformChallenge(). | |
| 825 virtual void OnPlatformChallengeResponse( | |
| 826 const PlatformChallengeResponse& response) = 0; | |
| 827 | |
| 828 // Called by the host after a call to Host::SendHostChallenge(). This | |
| 829 // provides |response| as returned from the broker CDM challenge. | |
| 830 virtual void OnHostChallengeResponse(const uint8_t* response, | |
| 831 uint32_t response_size) = 0; | |
| 832 | |
| 833 // Called by the host after a call to Host::QueryOutputProtectionStatus(). The | |
| 834 // |link_mask| is a bit mask of OutputLinkTypes and |output_protection_mask| | |
| 835 // is a bit mask of OutputProtectionMethods. If |result| is kQueryFailed, | |
| 836 // then |link_mask| and |output_protection_mask| are undefined and should | |
| 837 // be ignored. | |
| 838 virtual void OnQueryOutputProtectionStatus( | |
| 839 QueryResult result, | |
| 840 uint32_t link_mask, | |
| 841 uint32_t output_protection_mask) = 0; | |
| 842 | |
| 843 // Destroys the object in the same context as it was created. | |
| 844 virtual void Destroy() = 0; | |
| 845 | |
| 846 protected: | |
| 847 ContentDecryptionModule_9() {} | |
| 848 virtual ~ContentDecryptionModule_9() {} | |
| 849 }; | |
| 850 | |
| 851 typedef ContentDecryptionModule_9 ContentDecryptionModule; | |
| 659 | 852 |
| 660 // Represents a buffer created by Allocator implementations. | 853 // Represents a buffer created by Allocator implementations. |
| 661 class CDM_CLASS_API Buffer { | 854 class CDM_CLASS_API Buffer { |
| 662 public: | 855 public: |
| 663 // Destroys the buffer in the same context as it was created. | 856 // Destroys the buffer in the same context as it was created. |
| 664 virtual void Destroy() = 0; | 857 virtual void Destroy() = 0; |
| 665 | 858 |
| 666 virtual uint32_t Capacity() const = 0; | 859 virtual uint32_t Capacity() const = 0; |
| 667 virtual uint8_t* Data() = 0; | 860 virtual uint8_t* Data() = 0; |
| 668 virtual void SetSize(uint32_t size) = 0; | 861 virtual void SetSize(uint32_t size) = 0; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 704 // session could not be loaded. | 897 // session could not be loaded. |
| 705 virtual void OnResolveNewSessionPromise(uint32_t promise_id, | 898 virtual void OnResolveNewSessionPromise(uint32_t promise_id, |
| 706 const char* session_id, | 899 const char* session_id, |
| 707 uint32_t session_id_size) = 0; | 900 uint32_t session_id_size) = 0; |
| 708 | 901 |
| 709 // Called by the CDM when a session is updated or released. | 902 // Called by the CDM when a session is updated or released. |
| 710 virtual void OnResolvePromise(uint32_t promise_id) = 0; | 903 virtual void OnResolvePromise(uint32_t promise_id) = 0; |
| 711 | 904 |
| 712 // Called by the CDM when an error occurs as a result of one of the | 905 // Called by the CDM when an error occurs as a result of one of the |
| 713 // ContentDecryptionModule calls that accept a |promise_id|. | 906 // ContentDecryptionModule calls that accept a |promise_id|. |
| 714 // |error| must be specified, |error_message| and |system_code| | 907 // |reason| must be specified, |error_message| and |system_code| |
| 715 // are optional. |error_message_size| should not include null termination. | 908 // are optional. |error_message_size| should not include null termination. |
| 716 virtual void OnRejectPromise(uint32_t promise_id, | 909 virtual void OnRejectPromise(uint32_t promise_id, |
| 717 Error error, | 910 RejectionReason reason, |
| 718 uint32_t system_code, | 911 uint32_t system_code, |
| 719 const char* error_message, | 912 const char* error_message, |
| 720 uint32_t error_message_size) = 0; | 913 uint32_t error_message_size) = 0; |
| 721 | 914 |
| 722 // Called by the CDM when it has a message for session |session_id|. | 915 // Called by the CDM when it has a message for session |session_id|. |
| 723 // Size parameters should not include null termination. | 916 // Size parameters should not include null termination. |
| 724 // |legacy_destination_url| is only for supporting the prefixed EME API and | 917 // |legacy_destination_url| is only for supporting the prefixed EME API and |
| 725 // is ignored by unprefixed EME. It should only be non-null if |message_type| | 918 // is ignored by unprefixed EME. It should only be non-null if |message_type| |
| 726 // is kLicenseRenewal. | 919 // is kLicenseRenewal. |
| 727 virtual void OnSessionMessage(const char* session_id, | 920 virtual void OnSessionMessage(const char* session_id, |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 755 uint32_t session_id_size, | 948 uint32_t session_id_size, |
| 756 Time new_expiry_time) = 0; | 949 Time new_expiry_time) = 0; |
| 757 | 950 |
| 758 // Called by the CDM when session |session_id| is closed. Size | 951 // Called by the CDM when session |session_id| is closed. Size |
| 759 // parameter should not include null termination. | 952 // parameter should not include null termination. |
| 760 virtual void OnSessionClosed(const char* session_id, | 953 virtual void OnSessionClosed(const char* session_id, |
| 761 uint32_t session_id_size) = 0; | 954 uint32_t session_id_size) = 0; |
| 762 | 955 |
| 763 // Called by the CDM when an error occurs in session |session_id| | 956 // Called by the CDM when an error occurs in session |session_id| |
| 764 // unrelated to one of the ContentDecryptionModule calls that accept a | 957 // unrelated to one of the ContentDecryptionModule calls that accept a |
| 765 // |promise_id|. |error| must be specified, |error_message| and | 958 // |promise_id|. |reason| must be specified, |error_message| and |
| 766 // |system_code| are optional. Length parameters should not include null | 959 // |system_code| are optional. Length parameters should not include null |
| 767 // termination. | 960 // termination. |
| 768 // Note: | 961 // Note: |
| 769 // - This method is only for supporting prefixed EME API. | 962 // - This method is only for supporting prefixed EME API. |
| 770 // - This method will be ignored by unprefixed EME. All errors reported | 963 // - This method will be ignored by unprefixed EME. All errors reported |
| 771 // in this method should probably also be reported by one of other methods. | 964 // in this method should probably also be reported by one of other methods. |
| 772 virtual void OnLegacySessionError( | 965 virtual void OnLegacySessionError(const char* session_id, |
| 773 const char* session_id, uint32_t session_id_length, | 966 uint32_t session_id_length, |
| 774 Error error, | 967 RejectionReason reason, |
| 775 uint32_t system_code, | 968 uint32_t system_code, |
| 776 const char* error_message, uint32_t error_message_length) = 0; | 969 const char* error_message, |
| 970 uint32_t error_message_length) = 0; | |
| 777 | 971 |
| 778 // The following are optional methods that may not be implemented on all | 972 // The following are optional methods that may not be implemented on all |
| 779 // platforms. | 973 // platforms. |
| 780 | 974 |
| 781 // Sends a platform challenge for the given |service_id|. |challenge| is at | 975 // Sends a platform challenge for the given |service_id|. |challenge| is at |
| 782 // most 256 bits of data to be signed. Once the challenge has been completed, | 976 // most 256 bits of data to be signed. Once the challenge has been completed, |
| 783 // the host will call ContentDecryptionModule::OnPlatformChallengeResponse() | 977 // the host will call ContentDecryptionModule::OnPlatformChallengeResponse() |
| 784 // with the signed challenge response and platform certificate. Size | 978 // with the signed challenge response and platform certificate. Size |
| 785 // parameters should not include null termination. | 979 // parameters should not include null termination. |
| 786 virtual void SendPlatformChallenge(const char* service_id, | 980 virtual void SendPlatformChallenge(const char* service_id, |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 807 // if a FileIO object cannot be obtained. Once a valid FileIO object is | 1001 // if a FileIO object cannot be obtained. Once a valid FileIO object is |
| 808 // returned, |client| must be valid until FileIO::Close() is called. The | 1002 // returned, |client| must be valid until FileIO::Close() is called. The |
| 809 // CDM can call this method multiple times to operate on different files. | 1003 // CDM can call this method multiple times to operate on different files. |
| 810 virtual FileIO* CreateFileIO(FileIOClient* client) = 0; | 1004 virtual FileIO* CreateFileIO(FileIOClient* client) = 0; |
| 811 | 1005 |
| 812 protected: | 1006 protected: |
| 813 Host_8() {} | 1007 Host_8() {} |
| 814 virtual ~Host_8() {} | 1008 virtual ~Host_8() {} |
| 815 }; | 1009 }; |
| 816 | 1010 |
| 1011 class CDM_CLASS_API Host_9 { | |
| 1012 public: | |
| 1013 static const int kVersion = 9; | |
| 1014 | |
| 1015 // Returns a Buffer* containing non-zero members upon success, or NULL on | |
| 1016 // failure. The caller owns the Buffer* after this call. The buffer is not | |
| 1017 // guaranteed to be zero initialized. The capacity of the allocated Buffer | |
| 1018 // is guaranteed to be not less than |capacity|. | |
| 1019 virtual Buffer* Allocate(uint32_t capacity) = 0; | |
| 1020 | |
| 1021 // Requests the host to call ContentDecryptionModule::TimerFired() |delay_ms| | |
| 1022 // from now with |context|. | |
| 1023 virtual void SetTimer(int64_t delay_ms, void* context) = 0; | |
| 1024 | |
| 1025 // Returns the current wall time in seconds. | |
| 1026 virtual Time GetCurrentWallTime() = 0; | |
| 1027 | |
| 1028 // Called by the CDM when a session is created or loaded and the value for the | |
| 1029 // MediaKeySession's sessionId attribute is available (|session_id|). | |
| 1030 // This must be called before OnSessionMessage() or | |
| 1031 // OnSessionKeysChange() is called for the same session. |session_id_size| | |
| 1032 // should not include null termination. | |
| 1033 // When called in response to LoadSession(), the |session_id| must be the | |
| 1034 // same as the |session_id| passed in LoadSession(), or NULL if the | |
| 1035 // session could not be loaded. | |
| 1036 virtual void OnResolveNewSessionPromise(uint32_t promise_id, | |
| 1037 const char* session_id, | |
| 1038 uint32_t session_id_size) = 0; | |
| 1039 | |
| 1040 // Called by the CDM when a session is updated or released. | |
| 1041 virtual void OnResolvePromise(uint32_t promise_id) = 0; | |
| 1042 | |
| 1043 // Called by the CDM when an error occurs as a result of one of the | |
| 1044 // ContentDecryptionModule calls that accept a |promise_id|. | |
| 1045 // |reason| must be specified, |error_message| and |system_code| | |
| 1046 // are optional. |error_message_size| should not include null termination. | |
| 1047 virtual void OnRejectPromise(uint32_t promise_id, | |
| 1048 RejectionReason reason, | |
| 1049 uint32_t system_code, | |
| 1050 const char* error_message, | |
| 1051 uint32_t error_message_size) = 0; | |
| 1052 | |
| 1053 // Called by the CDM when it has a message for session |session_id|. | |
| 1054 // Size parameters should not include null termination. | |
| 1055 virtual void OnSessionMessage(const char* session_id, | |
| 1056 uint32_t session_id_size, | |
| 1057 MessageType message_type, | |
| 1058 const char* message, | |
| 1059 uint32_t message_size) = 0; | |
| 1060 | |
| 1061 // Called by the CDM when there has been a change in keys or their status for | |
| 1062 // session |session_id|. |has_additional_usable_key| should be set if a | |
| 1063 // key is newly usable (e.g. new key available, previously expired key has | |
| 1064 // been renewed, etc.) and the browser should attempt to resume playback. | |
| 1065 // |key_ids| is the list of key ids for this session along with their | |
| 1066 // current status. |key_ids_count| is the number of entries in |key_ids|. | |
| 1067 // Size parameter for |session_id| should not include null termination. | |
| 1068 virtual void OnSessionKeysChange(const char* session_id, | |
| 1069 uint32_t session_id_size, | |
| 1070 bool has_additional_usable_key, | |
| 1071 const KeyInformation* keys_info, | |
| 1072 uint32_t keys_info_count) = 0; | |
| 1073 | |
| 1074 // Called by the CDM when there has been a change in the expiration time for | |
| 1075 // session |session_id|. This can happen as the result of an Update() call | |
| 1076 // or some other event. If this happens as a result of a call to Update(), | |
| 1077 // it must be called before resolving the Update() promise. |new_expiry_time| | |
| 1078 // can be 0 to represent "undefined". Size parameter should not include | |
| 1079 // null termination. | |
| 1080 virtual void OnExpirationChange(const char* session_id, | |
| 1081 uint32_t session_id_size, | |
| 1082 Time new_expiry_time) = 0; | |
| 1083 | |
| 1084 // Called by the CDM when session |session_id| is closed. Size | |
| 1085 // parameter should not include null termination. | |
| 1086 virtual void OnSessionClosed(const char* session_id, | |
| 1087 uint32_t session_id_size) = 0; | |
| 1088 | |
| 1089 // The following are optional methods that may not be implemented on all | |
| 1090 // platforms. | |
| 1091 | |
| 1092 // Sends a platform challenge for the given |service_id|. |challenge| is at | |
| 1093 // most 256 bits of data to be signed. Once the challenge has been completed, | |
| 1094 // the host will call ContentDecryptionModule::OnPlatformChallengeResponse() | |
| 1095 // with the signed challenge response and platform certificate. Size | |
| 1096 // parameters should not include null termination. | |
| 1097 virtual void SendPlatformChallenge(const char* service_id, | |
| 1098 uint32_t service_id_size, | |
| 1099 const char* challenge, | |
| 1100 uint32_t challenge_size) = 0; | |
| 1101 | |
| 1102 // Initiate the host challenge. If supported, sends the |challenge| data to | |
| 1103 // the host, and returns true. The actual response from the host will be | |
| 1104 // provided via OnHostChallengeResponse(). If not supported, this method | |
| 1105 // should return false. | |
| 1106 virtual bool SendHostChallenge(const uint8_t* challenge, | |
| 1107 uint32_t challenge_size) = 0; | |
| 1108 | |
| 1109 // Attempts to enable output protection (e.g. HDCP) on the display link. The | |
| 1110 // |desired_protection_mask| is a bit mask of OutputProtectionMethods. No | |
| 1111 // status callback is issued, the CDM must call QueryOutputProtectionStatus() | |
| 1112 // periodically to ensure the desired protections are applied. | |
| 1113 virtual void EnableOutputProtection(uint32_t desired_protection_mask) = 0; | |
| 1114 | |
| 1115 // Requests the current output protection status. Once the host has the status | |
| 1116 // it will call ContentDecryptionModule::OnQueryOutputProtectionStatus(). | |
| 1117 virtual void QueryOutputProtectionStatus() = 0; | |
| 1118 | |
| 1119 // Must be called by the CDM if it returned kDeferredInitialization during | |
| 1120 // InitializeAudioDecoder() or InitializeVideoDecoder(). | |
| 1121 virtual void OnDeferredInitializationDone(StreamType stream_type, | |
| 1122 Status decoder_status) = 0; | |
| 1123 | |
| 1124 // Creates a FileIO object from the host to do file IO operation. Returns NULL | |
| 1125 // if a FileIO object cannot be obtained. Once a valid FileIO object is | |
| 1126 // returned, |client| must be valid until FileIO::Close() is called. The | |
| 1127 // CDM can call this method multiple times to operate on different files. | |
| 1128 virtual FileIO* CreateFileIO(FileIOClient* client) = 0; | |
| 1129 | |
| 1130 protected: | |
| 1131 Host_9() {} | |
| 1132 virtual ~Host_9() {} | |
| 1133 }; | |
| 1134 | |
| 817 // Represents a decrypted block that has not been decoded. | 1135 // Represents a decrypted block that has not been decoded. |
| 818 class CDM_CLASS_API DecryptedBlock { | 1136 class CDM_CLASS_API DecryptedBlock { |
| 819 public: | 1137 public: |
| 820 virtual void SetDecryptedBuffer(Buffer* buffer) = 0; | 1138 virtual void SetDecryptedBuffer(Buffer* buffer) = 0; |
| 821 virtual Buffer* DecryptedBuffer() = 0; | 1139 virtual Buffer* DecryptedBuffer() = 0; |
| 822 | 1140 |
| 823 // TODO(tomfinegan): Figure out if timestamp is really needed. If it is not, | 1141 // TODO(tomfinegan): Figure out if timestamp is really needed. If it is not, |
| 824 // we can just pass Buffer pointers around. | 1142 // we can just pass Buffer pointers around. |
| 825 virtual void SetTimestamp(int64_t timestamp) = 0; | 1143 virtual void SetTimestamp(int64_t timestamp) = 0; |
| 826 virtual int64_t Timestamp() const = 0; | 1144 virtual int64_t Timestamp() const = 0; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 884 virtual void SetFormat(AudioFormat format) = 0; | 1202 virtual void SetFormat(AudioFormat format) = 0; |
| 885 virtual AudioFormat Format() const = 0; | 1203 virtual AudioFormat Format() const = 0; |
| 886 | 1204 |
| 887 protected: | 1205 protected: |
| 888 AudioFrames() {} | 1206 AudioFrames() {} |
| 889 virtual ~AudioFrames() {} | 1207 virtual ~AudioFrames() {} |
| 890 }; | 1208 }; |
| 891 | 1209 |
| 892 } // namespace cdm | 1210 } // namespace cdm |
| 893 | 1211 |
| 1212 #undef CDM_API | |
| 1213 #undef CDM_CLASS_API | |
| 1214 | |
| 894 #endif // CDM_CONTENT_DECRYPTION_MODULE_H_ | 1215 #endif // CDM_CONTENT_DECRYPTION_MODULE_H_ |
| OLD | NEW |