// Copyright 2019 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_FILTERS_GAV1_VIDEO_DECODER_H_
#define MEDIA_FILTERS_GAV1_VIDEO_DECODER_H_

#include <memory>
#include <queue>
#include <vector>

#include "base/containers/queue.h"
#include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "media/base/media_export.h"
#include "media/base/supported_video_decoder_config.h"
#include "media/base/video_aspect_ratio.h"
#include "media/base/video_decoder_config.h"
#include "media/base/video_frame_pool.h"
#include "media/filters/offloading_video_decoder.h"

namespace libgav1 {
class Decoder;
}  // namespace libgav1

namespace media {
class MediaLog;

class MEDIA_EXPORT Gav1VideoDecoder : public OffloadableVideoDecoder {
 public:
  static SupportedVideoDecoderConfigs SupportedConfigs();

  explicit Gav1VideoDecoder(MediaLog* media_log,
                            OffloadState offload_state = OffloadState::kNormal);
  ~Gav1VideoDecoder() override;
  Gav1VideoDecoder(const Gav1VideoDecoder&) = delete;
  Gav1VideoDecoder& operator=(const Gav1VideoDecoder&) = delete;

  // VideoDecoder implementation.
  VideoDecoderType GetDecoderType() const override;
  void Initialize(const VideoDecoderConfig& config,
                  bool low_delay,
                  CdmContext* cdm_context,
                  InitCB init_cb,
                  const OutputCB& output_cb,
                  const WaitingCB& waiting_cb) override;
  void Decode(scoped_refptr<DecoderBuffer> buffer, DecodeCB decode_cb) override;
  void Reset(base::OnceClosure reset_cb) override;
  bool IsOptimizedForRTC() const override;

  // OffloadableVideoDecoder implementation.
  void Detach() override;

  scoped_refptr<VideoFrame> CreateVideoFrame(VideoPixelFormat format,
                                             const gfx::Size& coded_size,
                                             const gfx::Rect& visible_rect);

 private:
  enum class DecoderState {
    kUninitialized,
    kDecoding,
    kError,
  };

  void CloseDecoder();

  // Invokes the decoder and calls |output_cb_| for any returned frames.
  bool DecodeBuffer(scoped_refptr<DecoderBuffer> buffer);

  // Used to report error messages to the client.
  MediaLog* const media_log_;
  const bool bind_callbacks_;

  // Info configured in Initialize(). These are used in outputting frames.
  VideoColorSpace color_space_;
  VideoAspectRatio aspect_ratio_;

  DecoderState state_ = DecoderState::kUninitialized;

  // A decoded buffer used in libgav1 is allocated and managed by
  // |frame_pool_|. The buffer can be reused only if libgav1's decoder doesn't
  // use the buffer and rendering the frame is complete.
  VideoFramePool frame_pool_;

  OutputCB output_cb_;
  std::unique_ptr<libgav1::Decoder> libgav1_decoder_;

  SEQUENCE_CHECKER(sequence_checker_);
};

// Helper class for creating a Gav1VideoDecoder which will offload all AV1
// content from the media thread.
class OffloadingGav1VideoDecoder : public OffloadingVideoDecoder {
 public:
  explicit OffloadingGav1VideoDecoder(MediaLog* media_log)
      : OffloadingVideoDecoder(
            0,
            std::vector<VideoCodec>(1, VideoCodec::kAV1),
            std::make_unique<Gav1VideoDecoder>(
                media_log,
                OffloadableVideoDecoder::OffloadState::kOffloaded)) {}
};
}  // namespace media
#endif  // MEDIA_FILTERS_GAV1_VIDEO_DECODER_H_
