// Copyright 2018 The Fuchsia 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 SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_MPEG12_DECODER_H_
#define SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_MPEG12_DECODER_H_

#include <lib/ddk/platform-defs.h>

#include <string_view>
#include <thread>
#include <vector>

#include "registers.h"
#include "video_decoder.h"

namespace amlogic_decoder {

class Mpeg12Decoder : public VideoDecoder {
 public:
  explicit Mpeg12Decoder(Owner* owner, Client* client)
      : VideoDecoder(
            // Unspecified because we don't need metrics from this decoder.
            media_metrics::StreamProcessorEvents2MigratedMetricDimensionImplementation_Unspecified,
            owner, client,
            /*is_secure=*/false) {
    power_ref_ = std::make_unique<PowerReference>(owner_->core());
  }

  void ForceStopDuringRemoveLocked() override;
  ~Mpeg12Decoder() override;

  zx_status_t Initialize() override;
  void HandleInterrupt() override;
  void ReturnFrame(std::shared_ptr<VideoFrame> video_frame) override;
  void InitializedFrames(std::vector<CodecFrame> frames, uint32_t width, uint32_t height,
                         uint32_t stride) override;
  void CallErrorHandler() override { exit(-1); }

 private:
  struct ReferenceFrame {
    std::shared_ptr<VideoFrame> frame;
    std::unique_ptr<CanvasEntry> y_canvas;
    std::unique_ptr<CanvasEntry> uv_canvas;
  };
  zx_status_t InitializeVideoBuffers();
  void ResetHardware();
  void TryReturnFrames();
  std::unique_ptr<PowerReference> power_ref_;

  std::vector<ReferenceFrame> video_frames_;
  std::vector<std::shared_ptr<VideoFrame>> returned_frames_;
  io_buffer_t workspace_buffer_ = {};
};

}  // namespace amlogic_decoder

#endif  // SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_MPEG12_DECODER_H_
