/*
 *  Copyright (c) 2017 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_VIDEO_ENCODER_FACTORY_H_
#define API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_H_

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

#include "api/environment/environment.h"
#include "api/ref_counted_base.h"
#include "api/units/data_rate.h"
#include "api/video/render_resolution.h"
#include "api/video/resolution.h"
#include "api/video_codecs/sdp_video_format.h"
#include "api/video_codecs/video_encoder.h"
#include "rtc_base/system/rtc_export.h"

namespace webrtc {

// A factory that creates VideoEncoders.
// NOTE: This class is still under development and may change without notice.
class RTC_EXPORT VideoEncoderFactory {
 public:
  struct CodecSupport {
    bool is_supported = false;
    bool is_power_efficient = false;
  };

  // An injectable class that is continuously updated with encoding conditions
  // and selects the best encoder given those conditions. An implementation is
  // typically stateful to avoid toggling between different encoders, which is
  // costly due to recreation of objects, a new codec will always start with a
  // key-frame.
  // A note about threading: This interface is used on a dedicated encoder
  // queue. But creation and deletion may happen on another thread.
  class EncoderSelectorInterface : public RefCountedBase {
   public:
    // TODO: bugs.webrtc.org/42224373 - make destructor protected once all
    // implementations use reference counting.
    virtual ~EncoderSelectorInterface() = default;

    // Informs the encoder selector about which encoder that is currently being
    // used.
    virtual void OnCurrentEncoder(const SdpVideoFormat& format) = 0;

    // Called every time the available bitrate is updated. Should return a
    // non-empty if an encoder switch should be performed.
    virtual std::optional<SdpVideoFormat> OnAvailableBitrate(
        const DataRate& rate) = 0;

    // Called every time the encoder input resolution change. Should return a
    // non-empty if an encoder switch should be performed.
    virtual std::optional<SdpVideoFormat> OnResolutionChange(
        const RenderResolution& /* resolution */) {
      return std::nullopt;
    }

    // Called if the currently used encoder reports itself as broken. Should
    // return a non-empty if an encoder switch should be performed.
    virtual std::optional<SdpVideoFormat> OnEncoderBroken() = 0;
  };

  // Returns a list of supported video formats in order of preference, to use
  // for signaling etc.
  virtual std::vector<SdpVideoFormat> GetSupportedFormats() const = 0;

  // Returns a list of supported video formats in order of preference, that can
  // also be tagged with additional information to allow the VideoEncoderFactory
  // to separate between different implementations when CreateVideoEncoder is
  // called.
  virtual std::vector<SdpVideoFormat> GetImplementations() const {
    return GetSupportedFormats();
  }

  [[deprecated("Use the 3-parameter version instead")]]
  virtual CodecSupport QueryCodecSupport(
      const SdpVideoFormat& format,
      std::optional<std::string> scalability_mode) const {
    return QueryCodecSupport(format, scalability_mode, std::nullopt);
  }

  // Query whether the specifed format is supported or not and if it will be
  // power efficient, which is currently interpreted as if there is support for
  // hardware acceleration.
  // See https://w3c.github.io/webrtc-svc/#scalabilitymodes* for a specification
  // of valid values for `scalability_mode`.
  // The parameter `resolution` may optionally be provided to require the format
  // has encoding support up to the provided resolution to mark it as supported.
  //
  // NOTE: QueryCodecSupport is currently an experimental feature that is
  // subject to change without notice.
  virtual CodecSupport QueryCodecSupport(
      const SdpVideoFormat& format,
      std::optional<std::string> scalability_mode,
      std::optional<Resolution> resolution) const;

  // Creates a VideoEncoder for the specified format.
  virtual std::unique_ptr<VideoEncoder> Create(
      const Environment& env,
      const SdpVideoFormat& format) = 0;

  // This method creates a EncoderSelector to use for a VideoSendStream.
  // (and hence should probably been called CreateEncoderSelector()).
  //
  // Note: This method is unsuitable if encoding several streams that
  // are using same VideoEncoderFactory (either by several streams in one
  // PeerConnection or streams with different PeerConnection but same
  // PeerConnectionFactory). This is due to the fact that the method is not
  // given any stream identifier, nor is the EncoderSelectorInterface given any
  // stream identifiers, i.e one does not know which stream is being encoded
  // with help of the selector.
  //
  // In such scenario, the `RtpSenderInterface::SetEncoderSelector` is
  // recommended.
  //
  // TODO(bugs.webrtc.org:14122): Deprecate and remove in favor of
  // `RtpSenderInterface::SetEncoderSelector` using ref count.
  virtual std::unique_ptr<EncoderSelectorInterface> GetEncoderSelector() const {
    return nullptr;
  }

  virtual ~VideoEncoderFactory() {}
};

}  // namespace webrtc

#endif  // API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_H_
