// Copyright 2017 Google Inc. 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_MEDIA_TRANSFORM_H_
#define STARBOARD_SHARED_WIN32_MEDIA_TRANSFORM_H_

#include <mfapi.h>
#include <mferror.h>
#include <mfidl.h>
#include <wrl\client.h>

#include <vector>

#include "starboard/shared/starboard/thread_checker.h"

namespace starboard {
namespace shared {
namespace win32 {

// Wrapper class for IMFTransform with the following functionalities:
// 1. State management:
//    It supports a one way life cycle from "kCanAcceptInput/kCanProvideOutput"
//    to "kDraining" then to "kDrained".
// 2. Manages states like input/output types, various attributes, and sample
//    protection, etc.
// 3. Send message to the underlying transform.
// This simplifies the implementation of higher level decoder mechanism that
// may deal with two IMFTransforms: one decoder and one decryptor.
class MediaTransform {
 public:
  explicit MediaTransform(CLSID clsid);
  explicit MediaTransform(
      const Microsoft::WRL::ComPtr<IMFTransform>& transform);

  bool TryWrite(const Microsoft::WRL::ComPtr<IMFSample>& input);
  Microsoft::WRL::ComPtr<IMFSample> TryRead(
      Microsoft::WRL::ComPtr<IMFMediaType>* new_type);
  void Drain();
  bool draining() const;
  bool drained() const;
  // Once the transform is drained, this function can be called to allow the
  // transform to accept new input as a newly created transform.  This allows
  // the reuse of existing transform without re-negotiating all types and
  // attributes.
  void ResetFromDrained();

  Microsoft::WRL::ComPtr<IMFMediaType> GetCurrentInputType();
  void SetInputType(const Microsoft::WRL::ComPtr<IMFMediaType>& input_type);
  std::vector<Microsoft::WRL::ComPtr<IMFMediaType>> GetAvailableInputTypes();

  Microsoft::WRL::ComPtr<IMFMediaType> GetCurrentOutputType();
  void SetOutputType(const Microsoft::WRL::ComPtr<IMFMediaType>& input_type);
  std::vector<Microsoft::WRL::ComPtr<IMFMediaType>> GetAvailableOutputTypes();
  void SetOutputTypeBySubType(GUID subtype);

  Microsoft::WRL::ComPtr<IMFAttributes> GetAttributes();
  Microsoft::WRL::ComPtr<IMFAttributes> GetOutputStreamAttributes();

  Microsoft::WRL::ComPtr<IMFSampleProtection> GetSampleProtection();
  void GetStreamCount(DWORD* input_streamcount, DWORD* output_stream_count);

  void SendMessage(MFT_MESSAGE_TYPE msg, ULONG_PTR data = 0);

  // Reset the media transform to its original state.
  void Reset();

 private:
  enum State { kCanAcceptInput, kCanProvideOutput, kDraining, kDrained };

  void PrepareOutputDataBuffer(MFT_OUTPUT_DATA_BUFFER* output_data_buffer);
  HRESULT ProcessOutput(Microsoft::WRL::ComPtr<IMFSample>* sample);

  Microsoft::WRL::ComPtr<IMFTransform> transform_;

  ::starboard::shared::starboard::ThreadChecker thread_checker_;
  State state_;
  bool stream_begun_;
  bool discontinuity_;
};

}  // namespace win32
}  // namespace shared
}  // namespace starboard

#endif  // STARBOARD_SHARED_WIN32_MEDIA_TRANSFORM_H_
