| /* |
| * 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_SIMPLE_ENCODER_WRAPPER_H_ |
| #define API_VIDEO_CODECS_SIMPLE_ENCODER_WRAPPER_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "absl/functional/any_invocable.h" |
| #include "api/units/data_rate.h" |
| #include "api/video_codecs/video_encoder_factory_interface.h" |
| #include "api/video_codecs/video_encoder_interface.h" |
| #include "common_video/generic_frame_descriptor/generic_frame_info.h" |
| #include "modules/video_coding/svc/create_scalability_structure.h" |
| |
| namespace webrtc { |
| class SimpleEncoderWrapper { |
| public: |
| struct EncodeResult { |
| bool oh_no = false; |
| rtc::scoped_refptr<EncodedImageBufferInterface> bitstream_data; |
| FrameType frame_type; |
| GenericFrameInfo generic_frame_info; |
| absl::optional<FrameDependencyStructure> dependency_structure; |
| }; |
| |
| using EncodeResultCallback = |
| absl::AnyInvocable<void(const EncodeResult& result)>; |
| |
| static std::vector<std::string> SupportedWebrtcSvcModes( |
| const VideoEncoderFactoryInterface::Capabilities::PredictionConstraints& |
| prediction_constraints); |
| |
| static std::unique_ptr<SimpleEncoderWrapper> Create( |
| std::unique_ptr<VideoEncoderInterface> encoder, |
| absl::string_view scalability_mode); |
| |
| // Should be private, use the Create function instead. |
| SimpleEncoderWrapper(std::unique_ptr<VideoEncoderInterface> encoder, |
| std::unique_ptr<ScalableVideoController> svc_controller); |
| |
| // We should really only support CBR, but then we have to think about layer |
| // allocations... eh... For this PoC just use CQP. |
| void SetEncodeQp(int qp); |
| |
| void SetEncodeFps(int fps); |
| |
| void Encode(rtc::scoped_refptr<webrtc::VideoFrameBuffer> frame_buffer, |
| bool force_keyframe, |
| EncodeResultCallback callback); |
| |
| private: |
| std::unique_ptr<VideoEncoderInterface> encoder_; |
| std::unique_ptr<ScalableVideoController> svc_controller_; |
| ScalableVideoController::StreamLayersConfig layer_configs_; |
| int target_qp_ = 0; |
| int fps_ = 0; |
| Timestamp presentation_timestamp_ = Timestamp::Zero(); |
| }; |
| |
| } // namespace webrtc |
| #endif // API_VIDEO_CODECS_SIMPLE_ENCODER_WRAPPER_H_ |