Reland "Inform VideoEncoder of negotiated capabilities"
This is a reland of 11dfff0878c949f2e19d95a0ddc209cdad94b3b4 Now that I am sure that WebRTC code is not calling the obsolete versions, I will just remove the NOT_REACHED and call the new version from the old ones, so as not to trip up downstream projects. Original change's description: > Inform VideoEncoder of negotiated capabilities > > After this CL lands, an announcement will be made to > discuss-webrtc about the deprecation of one version > of InitEncode(). > > Bug: webrtc:10720 > Change-Id: Ib992af0272bbb16ae16ef7e69491f365702d179e > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/140884 > Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> > Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> > Reviewed-by: Erik Språng <sprang@webrtc.org> > Commit-Queue: Elad Alon <eladalon@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#28224} TBR=sakal@webrtc.org,kwiberg@webrtc.org,sprang@webrtc.org Bug: webrtc:10720 Change-Id: I46c69e45c190805c07f7e51acbe277d7eebd1600 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/141412 Commit-Queue: Elad Alon <eladalon@webrtc.org> Reviewed-by: Elad Alon <eladalon@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28236}
This commit is contained in:
@ -21,6 +21,7 @@
|
||||
#include "api/video/video_bitrate_allocation.h"
|
||||
#include "api/video/video_frame.h"
|
||||
#include "api/video_codecs/video_codec.h"
|
||||
#include "api/video_codecs/video_encoder.h"
|
||||
#include "modules/video_coding/include/video_error_codes.h"
|
||||
#include "rtc_base/checks.h"
|
||||
#include "rtc_base/logging.h"
|
||||
@ -79,8 +80,7 @@ class VideoEncoderSoftwareFallbackWrapper final : public VideoEncoder {
|
||||
~VideoEncoderSoftwareFallbackWrapper() override;
|
||||
|
||||
int32_t InitEncode(const VideoCodec* codec_settings,
|
||||
int32_t number_of_cores,
|
||||
size_t max_payload_size) override;
|
||||
const VideoEncoder::Settings& settings) override;
|
||||
|
||||
int32_t RegisterEncodeCompleteCallback(
|
||||
EncodedImageCallback* callback) override;
|
||||
@ -118,8 +118,7 @@ class VideoEncoderSoftwareFallbackWrapper final : public VideoEncoder {
|
||||
// Settings used in the last InitEncode call and used if a dynamic fallback to
|
||||
// software is required.
|
||||
VideoCodec codec_settings_;
|
||||
int32_t number_of_cores_;
|
||||
size_t max_payload_size_;
|
||||
absl::optional<VideoEncoder::Settings> encoder_settings_;
|
||||
|
||||
// The last rate control settings, if set.
|
||||
absl::optional<RateControlParameters> rate_control_parameters_;
|
||||
@ -142,9 +141,7 @@ class VideoEncoderSoftwareFallbackWrapper final : public VideoEncoder {
|
||||
VideoEncoderSoftwareFallbackWrapper::VideoEncoderSoftwareFallbackWrapper(
|
||||
std::unique_ptr<webrtc::VideoEncoder> sw_encoder,
|
||||
std::unique_ptr<webrtc::VideoEncoder> hw_encoder)
|
||||
: number_of_cores_(0),
|
||||
max_payload_size_(0),
|
||||
channel_parameters_set_(false),
|
||||
: channel_parameters_set_(false),
|
||||
packet_loss_(0),
|
||||
rtt_(0),
|
||||
use_fallback_encoder_(false),
|
||||
@ -165,8 +162,9 @@ VideoEncoderSoftwareFallbackWrapper::~VideoEncoderSoftwareFallbackWrapper() =
|
||||
bool VideoEncoderSoftwareFallbackWrapper::InitFallbackEncoder() {
|
||||
RTC_LOG(LS_WARNING) << "Encoder falling back to software encoding.";
|
||||
|
||||
const int ret = fallback_encoder_->InitEncode(
|
||||
&codec_settings_, number_of_cores_, max_payload_size_);
|
||||
RTC_DCHECK(encoder_settings_.has_value());
|
||||
const int ret = fallback_encoder_->InitEncode(&codec_settings_,
|
||||
encoder_settings_.value());
|
||||
use_fallback_encoder_ = (ret == WEBRTC_VIDEO_CODEC_OK);
|
||||
if (!use_fallback_encoder_) {
|
||||
RTC_LOG(LS_ERROR) << "Failed to initialize software-encoder fallback.";
|
||||
@ -188,13 +186,11 @@ bool VideoEncoderSoftwareFallbackWrapper::InitFallbackEncoder() {
|
||||
|
||||
int32_t VideoEncoderSoftwareFallbackWrapper::InitEncode(
|
||||
const VideoCodec* codec_settings,
|
||||
int32_t number_of_cores,
|
||||
size_t max_payload_size) {
|
||||
const VideoEncoder::Settings& settings) {
|
||||
// Store settings, in case we need to dynamically switch to the fallback
|
||||
// encoder after a failed Encode call.
|
||||
codec_settings_ = *codec_settings;
|
||||
number_of_cores_ = number_of_cores;
|
||||
max_payload_size_ = max_payload_size;
|
||||
encoder_settings_ = settings;
|
||||
// Clear stored rate/channel parameters.
|
||||
rate_control_parameters_ = absl::nullopt;
|
||||
ValidateSettingsForForcedFallback();
|
||||
@ -209,8 +205,7 @@ int32_t VideoEncoderSoftwareFallbackWrapper::InitEncode(
|
||||
}
|
||||
forced_fallback_.active_ = false;
|
||||
|
||||
int32_t ret =
|
||||
encoder_->InitEncode(codec_settings, number_of_cores, max_payload_size);
|
||||
int32_t ret = encoder_->InitEncode(codec_settings, settings);
|
||||
if (ret == WEBRTC_VIDEO_CODEC_OK) {
|
||||
if (use_fallback_encoder_) {
|
||||
RTC_LOG(LS_WARNING)
|
||||
@ -319,14 +314,17 @@ bool VideoEncoderSoftwareFallbackWrapper::TryReInitForcedFallbackEncoder() {
|
||||
if (!IsForcedFallbackActive()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Forced fallback active.
|
||||
if (!forced_fallback_.IsValid(codec_settings_)) {
|
||||
RTC_LOG(LS_INFO) << "Stop forced SW encoder fallback, max pixels exceeded.";
|
||||
return false;
|
||||
}
|
||||
|
||||
// Settings valid, reinitialize the forced fallback encoder.
|
||||
if (fallback_encoder_->InitEncode(&codec_settings_, number_of_cores_,
|
||||
max_payload_size_) !=
|
||||
RTC_DCHECK(encoder_settings_.has_value());
|
||||
if (fallback_encoder_->InitEncode(&codec_settings_,
|
||||
encoder_settings_.value()) !=
|
||||
WEBRTC_VIDEO_CODEC_OK) {
|
||||
RTC_LOG(LS_ERROR) << "Failed to init forced SW encoder fallback.";
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user