/*
 *  Copyright (c) 2018 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_ENCODER_DATABASE_H_
#define MODULES_VIDEO_CODING_ENCODER_DATABASE_H_

#include <stddef.h>
#include <memory>

#include "api/video_codecs/video_codec.h"
#include "api/video_codecs/video_encoder.h"
#include "modules/video_coding/generic_encoder.h"

namespace webrtc {

class VCMEncoderDataBase {
 public:
  explicit VCMEncoderDataBase(VCMEncodedFrameCallback* encoded_frame_callback);
  ~VCMEncoderDataBase();

  // Sets the sender side codec and initiates the desired codec given the
  // VideoCodec struct.
  // Returns true if the codec was successfully registered, false otherwise.
  bool SetSendCodec(const VideoCodec* send_codec,
                    int number_of_cores,
                    size_t max_payload_size);

  // Registers and initializes an external encoder object.
  // |internal_source| should be set to true if the codec has an internal
  // video source and doesn't need the user to provide it with frames via
  // the Encode() method.
  void RegisterExternalEncoder(VideoEncoder* external_encoder,
                               bool internal_source);

  // Deregisters any external encoder.
  void DeregisterExternalEncoder();

  VCMGenericEncoder* GetEncoder();

  bool MatchesCurrentResolution(int width, int height) const;

 private:
  // Determines whether a new codec has to be created or not.
  // Checks every setting apart from maxFramerate and startBitrate.
  bool RequiresEncoderReset(const VideoCodec& send_codec);

  void DeleteEncoder();

  int number_of_cores_;
  size_t max_payload_size_;
  bool pending_encoder_reset_;
  VideoCodec send_codec_;
  VideoEncoder* external_encoder_;
  bool internal_source_;
  VCMEncodedFrameCallback* const encoded_frame_callback_;
  std::unique_ptr<VCMGenericEncoder> ptr_encoder_;
};

}  // namespace webrtc

#endif  // MODULES_VIDEO_CODING_ENCODER_DATABASE_H_
