/*
 *  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 CALL_ADAPTATION_VIDEO_STREAM_INPUT_STATE_H_
#define CALL_ADAPTATION_VIDEO_STREAM_INPUT_STATE_H_

#include "absl/types/optional.h"
#include "api/video/video_codec_type.h"

namespace webrtc {

// The source resolution, frame rate and other properties of a
// VideoStreamEncoder.
class VideoStreamInputState {
 public:
  VideoStreamInputState();

  void set_has_input(bool has_input);
  void set_frame_size_pixels(absl::optional<int> frame_size_pixels);
  void set_frames_per_second(absl::optional<int> frames_per_second);
  void set_video_codec_type(VideoCodecType video_codec_type);
  void set_min_pixels_per_frame(int min_pixels_per_frame);

  bool has_input() const;
  absl::optional<int> frame_size_pixels() const;
  absl::optional<int> frames_per_second() const;
  VideoCodecType video_codec_type() const;
  int min_pixels_per_frame() const;

  bool HasInputFrameSizeAndFramesPerSecond() const;

 private:
  bool has_input_;
  absl::optional<int> frame_size_pixels_;
  absl::optional<int> frames_per_second_;
  VideoCodecType video_codec_type_;
  int min_pixels_per_frame_;
};

}  // namespace webrtc

#endif  // CALL_ADAPTATION_VIDEO_STREAM_INPUT_STATE_H_
