/*
 *  Copyright (c) 2024 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef API_VIDEO_CODECS_SIMPLE_ENCODER_WRAPPER_H_
#define API_VIDEO_CODECS_SIMPLE_ENCODER_WRAPPER_H_

#include <cstdint>
#include <functional>
#include <memory>
#include <optional>
#include <string>
#include <vector>

#include "absl/strings/string_view.h"
#include "api/scoped_refptr.h"
#include "api/transport/rtp/dependency_descriptor.h"
#include "api/units/timestamp.h"
#include "api/video/resolution.h"
#include "api/video/video_frame_buffer.h"
#include "api/video_codecs/video_encoder_factory_interface.h"
#include "api/video_codecs/video_encoder_interface.h"
#include "common_video/generic_frame_descriptor/generic_frame_info.h"
#include "modules/video_coding/svc/scalable_video_controller.h"

namespace webrtc {
class SimpleEncoderWrapper {
 public:
  struct EncodeResult {
    bool oh_no = false;
    std::vector<uint8_t> bitstream_data;
    FrameType frame_type;
    GenericFrameInfo generic_frame_info;
    std::optional<FrameDependencyStructure> dependency_structure;
  };

  using EncodeResultCallback = std::function<void(const EncodeResult& result)>;

  static std::vector<std::string> SupportedWebrtcSvcModes(
      const VideoEncoderFactoryInterface::Capabilities::PredictionConstraints&
          prediction_constraints);

  static std::unique_ptr<SimpleEncoderWrapper> Create(
      std::unique_ptr<VideoEncoderInterface> encoder,
      absl::string_view scalability_mode);

  // Should be private, use the Create function instead.
  SimpleEncoderWrapper(std::unique_ptr<VideoEncoderInterface> encoder,
                       std::unique_ptr<ScalableVideoController> svc_controller);

  // We should really only support CBR, but then we have to think about layer
  // allocations... eh... For this PoC just use CQP.
  void SetEncodeQp(int qp);

  void SetEncodeFps(int fps);

  void Encode(scoped_refptr<VideoFrameBuffer> frame_buffer,
              bool force_keyframe,
              EncodeResultCallback callback);

 private:
  Resolution ScaleResolutionForSpatialLayer(Resolution resolution,
                                            int layer_index) const;

  std::unique_ptr<VideoEncoderInterface> encoder_;
  std::unique_ptr<ScalableVideoController> svc_controller_;
  ScalableVideoController::StreamLayersConfig layer_configs_;
  int target_qp_ = 0;
  int fps_ = 0;
  Timestamp presentation_timestamp_ = Timestamp::Zero();
};

}  // namespace webrtc
#endif  // API_VIDEO_CODECS_SIMPLE_ENCODER_WRAPPER_H_
