/*
 *  Copyright 2020 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 MODULES_VIDEO_CODING_CODECS_TEST_ENCODED_VIDEO_FRAME_PRODUCER_H_
#define MODULES_VIDEO_CODING_CODECS_TEST_ENCODED_VIDEO_FRAME_PRODUCER_H_

#include <stdint.h>

#include <vector>

#include "api/transport/rtp/dependency_descriptor.h"
#include "api/video/encoded_image.h"
#include "api/video_codecs/video_encoder.h"
#include "modules/video_coding/include/video_codec_interface.h"

namespace webrtc {

// Wrapper around VideoEncoder::Encode for convenient input (generates frames)
// and output (returns encoded frames instead of passing them to callback)
class EncodedVideoFrameProducer {
 public:
  struct EncodedFrame {
    EncodedImage encoded_image;
    CodecSpecificInfo codec_specific_info;
  };

  // `encoder` should be initialized, but shouldn't have `EncoderCallback` set.
  explicit EncodedVideoFrameProducer(VideoEncoder& encoder)
      : encoder_(encoder) {}
  EncodedVideoFrameProducer(const EncodedVideoFrameProducer&) = delete;
  EncodedVideoFrameProducer& operator=(const EncodedVideoFrameProducer&) =
      delete;

  // Number of the input frames to pass to the encoder.
  EncodedVideoFrameProducer& SetNumInputFrames(int value);
  // Encode next frame as key frame.
  EncodedVideoFrameProducer& ForceKeyFrame();
  // Resolution of the input frames.
  EncodedVideoFrameProducer& SetResolution(RenderResolution value);

  EncodedVideoFrameProducer& SetFramerateFps(int value);

  // Generates input video frames and encodes them with `encoder` provided in
  // the constructor. Returns frame passed to the `OnEncodedImage` by wraping
  // `EncodedImageCallback` underneath.
  std::vector<EncodedFrame> Encode();

 private:
  VideoEncoder& encoder_;

  uint32_t rtp_timestamp_ = 1000;
  int num_input_frames_ = 1;
  int framerate_fps_ = 30;
  RenderResolution resolution_ = {320, 180};
  std::vector<VideoFrameType> next_frame_type_ = {
      VideoFrameType::kVideoFrameKey};
};

inline EncodedVideoFrameProducer& EncodedVideoFrameProducer::SetNumInputFrames(
    int value) {
  RTC_DCHECK_GT(value, 0);
  num_input_frames_ = value;
  return *this;
}

inline EncodedVideoFrameProducer& EncodedVideoFrameProducer::ForceKeyFrame() {
  next_frame_type_ = {VideoFrameType::kVideoFrameKey};
  return *this;
}

inline EncodedVideoFrameProducer& EncodedVideoFrameProducer::SetResolution(
    RenderResolution value) {
  resolution_ = value;
  return *this;
}

inline EncodedVideoFrameProducer& EncodedVideoFrameProducer::SetFramerateFps(
    int value) {
  RTC_DCHECK_GT(value, 0);
  framerate_fps_ = value;
  return *this;
}

}  // namespace webrtc
#endif  // MODULES_VIDEO_CODING_CODECS_TEST_ENCODED_VIDEO_FRAME_PRODUCER_H_
