blob: 674e54c1a526bb1a857150ca0cd60b896dbc27d3 [file] [log] [blame]
// 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_