// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_GPU_WINDOWS_D3D11_VIDEO_CONTEXT_WRAPPER_H_
#define MEDIA_GPU_WINDOWS_D3D11_VIDEO_CONTEXT_WRAPPER_H_

#include <d3d11_1.h>
#include <wrl/client.h>
#include <memory>

#include "base/macros.h"
#include "media/gpu/media_gpu_export.h"
#include "media/gpu/windows/d3d11_com_defs.h"

namespace media {

class MEDIA_GPU_EXPORT VideoContextWrapper {
 public:
  VideoContextWrapper() = default;

  VideoContextWrapper(const VideoContextWrapper&) = delete;
  VideoContextWrapper& operator=(const VideoContextWrapper&) = delete;

  virtual ~VideoContextWrapper();
  // D3D11_VIDEO_DECODER_BUFFER_DESC1 and D3D11_VIDEO_DECODER_BUFFER_DESC
  // have radically different sets of member variables, which means that in
  // order to have a converter class, we need to support all fields. They are
  // also in different orders, which prevents using a simple memcpy.
  // It seems we don't currently use any of the D3D11_VIDEO_DECODER_BUFFER_DESC
  // specific fields right now.
  // Fields are named as they appear in the D3D11 Structs.
  struct VideoBufferWrapper {
    // Shared Fields
    D3D11_VIDEO_DECODER_BUFFER_TYPE BufferType;
    UINT DataOffset;
    UINT DataSize;
    void* pIV;
    UINT IVSize;

    // DESC1-specific fields
    D3D11_VIDEO_DECODER_SUB_SAMPLE_MAPPING_BLOCK* pSubSampleMappingBlock;
    UINT SubSampleMappingCount;
  };

  static std::unique_ptr<VideoContextWrapper> CreateWrapper(
      D3D_FEATURE_LEVEL supported_d3d11_version,
      ComD3D11DeviceContext device_context,
      HRESULT* status);

  // This method signiture is defined to match exactly that of
  // |ID3D11VideoContext::DecoderBeginFrame|.
  virtual HRESULT DecoderBeginFrame(ID3D11VideoDecoder* video_decoder,
                                    ID3D11VideoDecoderOutputView* output_view,
                                    UINT content_key_size,
                                    const void* content_key) = 0;

  // This method signiture is defined to match exactly that of
  // |ID3D11VideoContext::GetDecoderBuffer|.
  virtual HRESULT GetDecoderBuffer(ID3D11VideoDecoder* video_decoder,
                                   D3D11_VIDEO_DECODER_BUFFER_TYPE type,
                                   UINT* buffer_size,
                                   void** buffer) = 0;

  // This method signiture is defined to match exactly that of
  // |ID3D11VideoContext::ReleaseDecoderBuffer|.
  virtual HRESULT ReleaseDecoderBuffer(
      ID3D11VideoDecoder* video_decoder,
      D3D11_VIDEO_DECODER_BUFFER_TYPE type) = 0;

  // This method signiture is defined to match exactly that of
  // |ID3D11VideoContext::DecoderEndFrame|.
  virtual HRESULT DecoderEndFrame(ID3D11VideoDecoder* video_decoder) = 0;

  // This method signiture is defined to match exactly that of
  // |ID3D11VideoContext::SubmitDecoderBuffers|.
  virtual HRESULT SubmitDecoderBuffers(ID3D11VideoDecoder* video_decoder,
                                       UINT num_buffers,
                                       const VideoBufferWrapper* buffers) = 0;
};  // VideoContextWrapper

}  // namespace media

#endif  // MEDIA_GPU_WINDOWS_D3D11_VIDEO_CONTEXT_WRAPPER_H_
