| /* |
| * 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 <map> |
| #include <memory> |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #include "absl/types/variant.h" |
| #include "api/units/time_delta.h" |
| #include "api/video/resolution.h" |
| #include "api/video/video_frame_buffer.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<Rational> scaling_factors; |
| |
| std::vector<FrameType> supported_frame_types; |
| } prediction_constraints; |
| |
| struct InputConstraints { |
| Resolution min; |
| Resolution max; |
| int pixel_alignment; |
| std::vector<VideoFrameBuffer::Type> input_formats; |
| } input_constraints; |
| |
| std::vector<EncodingFormat> encoding_formats; |
| |
| struct BitrateControl { |
| std::pair<int, int> qp_range; |
| std::vector<RateControlMode> rc_modes; |
| } rate_control; |
| |
| struct Performance { |
| bool encode_on_calling_thread; |
| std::pair<int, int> 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<Cqp, Cbr> 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<std::string, std::string> CodecSpecifics() const = 0; |
| |
| virtual Capabilities GetEncoderCapabilities() const = 0; |
| virtual std::unique_ptr<VideoEncoderInterface> CreateEncoder( |
| const StaticEncoderSettings& settings, |
| const std::map<std::string, std::string>& encoder_specific_settings) = 0; |
| }; |
| |
| } // namespace webrtc |
| #endif // API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_INTERFACE_H_ |