/* * Copyright (c) 2024 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_INTERFACE_H_ #define API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_INTERFACE_H_ #include #include #include #include #include #include #include "absl/types/optional.h" #include "absl/types/variant.h" #include "api/units/time_delta.h" #include "api/video/resolution.h" #include "api/video_codecs/video_encoder_interface.h" #include "api/video_codecs/video_encoding_general.h" #include "rtc_base/numerics/rational.h" namespace webrtc { using FrameType = VideoEncoderInterface::FrameType; // NOTE: This class is still under development and may change without notice. class VideoEncoderFactoryInterface { public: enum class RateControlMode { kCqp, kCbr }; struct Capabilities { struct PredictionConstraints { enum class BufferSpaceType { kMultiInstance, // multiple independent sets of buffers kMultiKeyframe, // single set of buffers, but can store multiple // keyframes simultaneously. kSingleKeyframe // single set of buffers, can only store one keyframe // at a time. }; int num_buffers; int max_references; int max_temporal_layers; BufferSpaceType buffer_space_type; int max_spatial_layers; std::vector scaling_factors; std::vector supported_frame_types; } prediction_constraints; struct InputConstraints { Resolution min; Resolution max; int pixel_alignment; std::vector input_formats; } input_constraints; std::vector encoding_formats; struct BitrateControl { std::pair qp_range; std::vector rc_modes; } rate_control; struct Performance { std::pair min_max_effort_level; } performance; }; struct StaticEncoderSettings { struct Cqp {}; struct Cbr { // TD: Should there be an intial buffer size? TimeDelta max_buffer_size; TimeDelta target_buffer_size; }; Resolution max_encode_dimensions; EncodingFormat encoding_format; absl::variant rc_mode; int max_number_of_threads; }; virtual ~VideoEncoderFactoryInterface() = default; virtual std::string CodecName() const = 0; virtual std::string ImplementationName() const = 0; virtual std::map CodecSpecifics() const = 0; virtual Capabilities GetEncoderCapabilities() const = 0; virtual std::unique_ptr CreateEncoder( const StaticEncoderSettings& settings, const std::map& encoder_specific_settings) = 0; }; } // namespace webrtc #endif // API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_INTERFACE_H_