| // Copyright 2017 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef STARBOARD_SHARED_WIN32_DECRYPTING_DECODER_H_ |
| #define STARBOARD_SHARED_WIN32_DECRYPTING_DECODER_H_ |
| |
| #include <D3D11.h> |
| #include <mfapi.h> |
| #include <mferror.h> |
| #include <mfidl.h> |
| #include <wrl\client.h> |
| |
| #include <string> |
| #include <vector> |
| |
| #include "starboard/common/ref_counted.h" |
| #include "starboard/common/scoped_ptr.h" |
| #include "starboard/drm.h" |
| #include "starboard/media.h" |
| #include "starboard/shared/win32/drm_system_playready.h" |
| #include "starboard/shared/win32/media_common.h" |
| #include "starboard/shared/win32/media_transform.h" |
| #include "starboard/types.h" |
| |
| namespace starboard { |
| namespace shared { |
| namespace win32 { |
| |
| // This class maintains a MediaTransform based decoding stream. When the |
| // stream is encrypted, it also contains a MediaTransform based decryptor and |
| // manages the interaction between the decryptor and the decoder. |
| class DecryptingDecoder { |
| public: |
| DecryptingDecoder(const std::string& type, |
| scoped_ptr<MediaTransform> decoder, |
| SbDrmSystem drm_system); |
| ~DecryptingDecoder(); |
| |
| MediaTransform* GetDecoder() { return decoder_.get(); } |
| |
| bool TryWriteInputBuffer(const scoped_refptr<InputBuffer>& input_buffer, |
| int bytes_to_skip_in_sample); |
| |
| // Return true if there is any internal actions succeeded, this implies that |
| // the caller can call this function again to process further. |
| // |output| contains the decrypted and decoded output if there is any. |
| // |new_type| contains the new output type in case the output type of the |
| // decoding stream is changed. |
| bool ProcessAndRead(ComPtr<IMFSample>* output, |
| ComPtr<IMFMediaType>* new_type, |
| bool* has_error); |
| void Drain(); |
| void Reset(); |
| |
| private: |
| bool ActivateDecryptor(); |
| |
| // TODO: Clarify the thread pattern of this class. |
| const std::string type_; // For debugging purpose. |
| DrmSystemPlayready* drm_system_; |
| |
| scoped_ptr<MediaTransform> decryptor_; |
| scoped_ptr<MediaTransform> decoder_; |
| |
| scoped_refptr<InputBuffer> last_input_buffer_; |
| ComPtr<IMFSample> last_input_sample_; |
| |
| ComPtr<IMFSample> pending_decryptor_output_; |
| }; |
| |
| } // namespace win32 |
| } // namespace shared |
| } // namespace starboard |
| |
| #endif // STARBOARD_SHARED_WIN32_DECRYPTING_DECODER_H_ |