/*
 *  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.
 */

#include "call/adaptation/encoder_settings.h"

#include <optional>
#include <utility>

#include "api/video/video_codec_type.h"
#include "api/video_codecs/video_codec.h"
#include "api/video_codecs/video_encoder.h"
#include "video/config/video_encoder_config.h"

namespace webrtc {

EncoderSettings::EncoderSettings(VideoEncoder::EncoderInfo encoder_info,
                                 VideoEncoderConfig encoder_config,
                                 VideoCodec video_codec)
    : encoder_info_(std::move(encoder_info)),
      encoder_config_(std::move(encoder_config)),
      video_codec_(std::move(video_codec)) {}

EncoderSettings::EncoderSettings(const EncoderSettings& other)
    : encoder_info_(other.encoder_info_),
      encoder_config_(other.encoder_config_.Copy()),
      video_codec_(other.video_codec_) {}

EncoderSettings& EncoderSettings::operator=(const EncoderSettings& other) {
  encoder_info_ = other.encoder_info_;
  encoder_config_ = other.encoder_config_.Copy();
  video_codec_ = other.video_codec_;
  return *this;
}

const VideoEncoder::EncoderInfo& EncoderSettings::encoder_info() const {
  return encoder_info_;
}

const VideoEncoderConfig& EncoderSettings::encoder_config() const {
  return encoder_config_;
}

const VideoCodec& EncoderSettings::video_codec() const {
  return video_codec_;
}

VideoCodecType GetVideoCodecTypeOrGeneric(
    const std::optional<EncoderSettings>& settings) {
  return settings.has_value() ? settings->encoder_config().codec_type
                              : kVideoCodecGeneric;
}

}  // namespace webrtc
