Clean up EncoderStreamFactory
* Simplified ctor. Get settings (max_qp, content_type, etc) from encoder_config passed to CreateEncoderStreams(). * Some tests assigned VideoEncoderConfig::video_stream_factory to EncoderStreamFactory they created. That's not really needed. VideoStreamEncoder creates the factory if video_stream_factory is not provided [1]. Removed video_stream_factory initialization in tests. [1] https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/video/video_stream_encoder.cc;l=1002;drc=1d7d0e6e2c5002815853be251ce43fe88779ac85 Bug: b/347150850, webrtc:42233936 Change-Id: Ie0322abb6c48e1a9bd10e9ed3879e3ed484fea5d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/355321 Reviewed-by: Erik Språng <sprang@webrtc.org> Reviewed-by: Björn Terelius <terelius@webrtc.org> Commit-Queue: Sergey Silkin <ssilkin@webrtc.org> Cr-Commit-Position: refs/heads/main@{#42608}
This commit is contained in:
parent
8ac4a464f0
commit
3172d16ea0
@ -259,11 +259,8 @@ void FakeVideoSendStream::OnFrame(const webrtc::VideoFrame& frame) {
|
|||||||
encoder_config_);
|
encoder_config_);
|
||||||
} else {
|
} else {
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
||||||
auto factory = rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
auto factory =
|
||||||
encoder_config_.video_format.name, encoder_config_.max_qp,
|
rtc::make_ref_counted<cricket::EncoderStreamFactory>(encoder_info);
|
||||||
encoder_config_.content_type ==
|
|
||||||
webrtc::VideoEncoderConfig::ContentType::kScreen,
|
|
||||||
encoder_config_.legacy_conference_mode, encoder_info);
|
|
||||||
|
|
||||||
video_streams_ = factory->CreateEncoderStreams(
|
video_streams_ = factory->CreateEncoderStreams(
|
||||||
env_.field_trials(), frame.width(), frame.height(), encoder_config_);
|
env_.field_trials(), frame.width(), frame.height(), encoder_config_);
|
||||||
@ -302,10 +299,8 @@ void FakeVideoSendStream::ReconfigureVideoEncoder(
|
|||||||
env_.field_trials(), width, height, config);
|
env_.field_trials(), width, height, config);
|
||||||
} else {
|
} else {
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
||||||
auto factory = rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
auto factory =
|
||||||
config.video_format.name, config.max_qp,
|
rtc::make_ref_counted<cricket::EncoderStreamFactory>(encoder_info);
|
||||||
config.content_type == webrtc::VideoEncoderConfig::ContentType::kScreen,
|
|
||||||
config.legacy_conference_mode, encoder_info);
|
|
||||||
|
|
||||||
video_streams_ = factory->CreateEncoderStreams(env_.field_trials(), width,
|
video_streams_ = factory->CreateEncoderStreams(env_.field_trials(), width,
|
||||||
height, config);
|
height, config);
|
||||||
|
|||||||
@ -2240,21 +2240,10 @@ WebRtcVideoSendChannel::WebRtcVideoSendStream::CreateVideoEncoderConfig(
|
|||||||
// Ensure frame dropping is always enabled.
|
// Ensure frame dropping is always enabled.
|
||||||
encoder_config.frame_drop_enabled = true;
|
encoder_config.frame_drop_enabled = true;
|
||||||
|
|
||||||
int max_qp;
|
int max_qp = -1;
|
||||||
switch (encoder_config.codec_type) {
|
if (codec.GetParam(kCodecParamMaxQuantization, &max_qp) && max_qp > 0) {
|
||||||
case webrtc::kVideoCodecH264:
|
|
||||||
case webrtc::kVideoCodecH265:
|
|
||||||
max_qp = kDefaultVideoMaxQpH26x;
|
|
||||||
break;
|
|
||||||
case webrtc::kVideoCodecVP8:
|
|
||||||
case webrtc::kVideoCodecVP9:
|
|
||||||
case webrtc::kVideoCodecAV1:
|
|
||||||
case webrtc::kVideoCodecGeneric:
|
|
||||||
max_qp = kDefaultVideoMaxQpVpx;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
codec.GetParam(kCodecParamMaxQuantization, &max_qp);
|
|
||||||
encoder_config.max_qp = max_qp;
|
encoder_config.max_qp = max_qp;
|
||||||
|
}
|
||||||
|
|
||||||
return encoder_config;
|
return encoder_config;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -442,6 +442,7 @@ rtc_library("video_coding_utility") {
|
|||||||
"../../rtc_base/system:file_wrapper",
|
"../../rtc_base/system:file_wrapper",
|
||||||
"../../rtc_base/system:no_unique_address",
|
"../../rtc_base/system:no_unique_address",
|
||||||
"../../rtc_base/task_utils:repeating_task",
|
"../../rtc_base/task_utils:repeating_task",
|
||||||
|
"../../video/config:encoder_config",
|
||||||
"../rtp_rtcp:rtp_rtcp_format",
|
"../rtp_rtcp:rtp_rtcp_format",
|
||||||
"svc:scalability_mode_util",
|
"svc:scalability_mode_util",
|
||||||
"//third_party/abseil-cpp/absl/numeric:bits",
|
"//third_party/abseil-cpp/absl/numeric:bits",
|
||||||
|
|||||||
@ -75,7 +75,18 @@ bool SimulcastUtility::ValidSimulcastParameters(const VideoCodec& codec,
|
|||||||
|
|
||||||
bool SimulcastUtility::IsConferenceModeScreenshare(const VideoCodec& codec) {
|
bool SimulcastUtility::IsConferenceModeScreenshare(const VideoCodec& codec) {
|
||||||
return codec.mode == VideoCodecMode::kScreensharing &&
|
return codec.mode == VideoCodecMode::kScreensharing &&
|
||||||
codec.legacy_conference_mode;
|
codec.legacy_conference_mode &&
|
||||||
|
(codec.codecType == kVideoCodecVP8 ||
|
||||||
|
codec.codecType == kVideoCodecH264);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SimulcastUtility::IsConferenceModeScreenshare(
|
||||||
|
const VideoEncoderConfig& encoder_config) {
|
||||||
|
return encoder_config.content_type ==
|
||||||
|
VideoEncoderConfig::ContentType::kScreen &&
|
||||||
|
encoder_config.legacy_conference_mode &&
|
||||||
|
(encoder_config.codec_type == webrtc::VideoCodecType::kVideoCodecVP8 ||
|
||||||
|
encoder_config.codec_type == webrtc::VideoCodecType::kVideoCodecH264);
|
||||||
}
|
}
|
||||||
|
|
||||||
int SimulcastUtility::NumberOfTemporalLayers(const VideoCodec& codec,
|
int SimulcastUtility::NumberOfTemporalLayers(const VideoCodec& codec,
|
||||||
|
|||||||
@ -14,6 +14,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "api/video_codecs/video_codec.h"
|
#include "api/video_codecs/video_codec.h"
|
||||||
|
#include "video/config/video_encoder_config.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
@ -26,6 +27,8 @@ class SimulcastUtility {
|
|||||||
static int NumberOfTemporalLayers(const VideoCodec& codec, int spatial_id);
|
static int NumberOfTemporalLayers(const VideoCodec& codec, int spatial_id);
|
||||||
// TODO(sprang): Remove this hack when ScreenshareLayers is gone.
|
// TODO(sprang): Remove this hack when ScreenshareLayers is gone.
|
||||||
static bool IsConferenceModeScreenshare(const VideoCodec& codec);
|
static bool IsConferenceModeScreenshare(const VideoCodec& codec);
|
||||||
|
static bool IsConferenceModeScreenshare(
|
||||||
|
const VideoEncoderConfig& encoder_config);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
@ -237,11 +237,6 @@ RtpGenerator::RtpGenerator(const RtpGeneratorOptions& options)
|
|||||||
encoder_config.simulcast_layers[i].max_framerate = send_config.video_fps;
|
encoder_config.simulcast_layers[i].max_framerate = send_config.video_fps;
|
||||||
}
|
}
|
||||||
|
|
||||||
encoder_config.video_stream_factory =
|
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
video_config.rtp.payload_name, /*max qp*/ 56, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
|
|
||||||
// Setup the fake video stream for this.
|
// Setup the fake video stream for this.
|
||||||
std::unique_ptr<test::FrameGeneratorCapturer> frame_generator =
|
std::unique_ptr<test::FrameGeneratorCapturer> frame_generator =
|
||||||
std::make_unique<test::FrameGeneratorCapturer>(
|
std::make_unique<test::FrameGeneratorCapturer>(
|
||||||
|
|||||||
@ -57,23 +57,7 @@ uint8_t CodecTypeToPayloadType(VideoCodecType codec_type) {
|
|||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
std::string CodecTypeToCodecName(VideoCodecType codec_type) {
|
|
||||||
switch (codec_type) {
|
|
||||||
case VideoCodecType::kVideoCodecGeneric:
|
|
||||||
return "";
|
|
||||||
case VideoCodecType::kVideoCodecVP8:
|
|
||||||
return cricket::kVp8CodecName;
|
|
||||||
case VideoCodecType::kVideoCodecVP9:
|
|
||||||
return cricket::kVp9CodecName;
|
|
||||||
case VideoCodecType::kVideoCodecH264:
|
|
||||||
return cricket::kH264CodecName;
|
|
||||||
case VideoCodecType::kVideoCodecH265:
|
|
||||||
return cricket::kH265CodecName;
|
|
||||||
default:
|
|
||||||
RTC_DCHECK_NOTREACHED();
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
VideoEncoderConfig::ContentType ConvertContentType(
|
VideoEncoderConfig::ContentType ConvertContentType(
|
||||||
VideoStreamConfig::Encoder::ContentType content_type) {
|
VideoStreamConfig::Encoder::ContentType content_type) {
|
||||||
switch (content_type) {
|
switch (content_type) {
|
||||||
@ -224,19 +208,6 @@ VideoEncoderConfig CreateVideoEncoderConfig(VideoStreamConfig config) {
|
|||||||
std::vector<VideoStream>(encoder_config.number_of_streams);
|
std::vector<VideoStream>(encoder_config.number_of_streams);
|
||||||
encoder_config.min_transmit_bitrate_bps = config.stream.pad_to_rate.bps();
|
encoder_config.min_transmit_bitrate_bps = config.stream.pad_to_rate.bps();
|
||||||
|
|
||||||
std::string cricket_codec = CodecTypeToCodecName(config.encoder.codec);
|
|
||||||
if (!cricket_codec.empty()) {
|
|
||||||
bool screenshare = config.encoder.content_type ==
|
|
||||||
VideoStreamConfig::Encoder::ContentType::kScreen;
|
|
||||||
encoder_config.video_stream_factory =
|
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
cricket_codec, cricket::kDefaultVideoMaxQpVpx, screenshare,
|
|
||||||
screenshare, encoder_info);
|
|
||||||
} else {
|
|
||||||
encoder_config.video_stream_factory =
|
|
||||||
rtc::make_ref_counted<DefaultVideoStreamFactory>();
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO(srte): Base this on encoder capabilities.
|
// TODO(srte): Base this on encoder capabilities.
|
||||||
encoder_config.max_bitrate_bps =
|
encoder_config.max_bitrate_bps =
|
||||||
config.encoder.max_data_rate.value_or(DataRate::KilobitsPerSec(10000))
|
config.encoder.max_data_rate.value_or(DataRate::KilobitsPerSec(10000))
|
||||||
|
|||||||
@ -22,6 +22,7 @@
|
|||||||
#include "media/base/media_constants.h"
|
#include "media/base/media_constants.h"
|
||||||
#include "media/base/video_adapter.h"
|
#include "media/base/video_adapter.h"
|
||||||
#include "modules/video_coding/codecs/vp9/svc_config.h"
|
#include "modules/video_coding/codecs/vp9/svc_config.h"
|
||||||
|
#include "modules/video_coding/utility/simulcast_utility.h"
|
||||||
#include "rtc_base/experiments/min_video_bitrate_experiment.h"
|
#include "rtc_base/experiments/min_video_bitrate_experiment.h"
|
||||||
#include "rtc_base/experiments/normalize_simulcast_size_experiment.h"
|
#include "rtc_base/experiments/normalize_simulcast_size_experiment.h"
|
||||||
#include "rtc_base/logging.h"
|
#include "rtc_base/logging.h"
|
||||||
@ -60,10 +61,10 @@ bool IsScaleFactorsPowerOfTwo(const webrtc::VideoEncoderConfig& config) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsTemporalLayersSupported(const std::string& codec_name) {
|
bool IsTemporalLayersSupported(webrtc::VideoCodecType codec_type) {
|
||||||
return absl::EqualsIgnoreCase(codec_name, kVp8CodecName) ||
|
return codec_type == webrtc::VideoCodecType::kVideoCodecVP8 ||
|
||||||
absl::EqualsIgnoreCase(codec_name, kVp9CodecName) ||
|
codec_type == webrtc::VideoCodecType::kVideoCodecVP9 ||
|
||||||
absl::EqualsIgnoreCase(codec_name, kAv1CodecName);
|
codec_type == webrtc::VideoCodecType::kVideoCodecAV1;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t FindRequiredActiveLayers(
|
size_t FindRequiredActiveLayers(
|
||||||
@ -97,23 +98,25 @@ static int GetMaxDefaultVideoBitrateKbps(int width,
|
|||||||
return max_bitrate;
|
return max_bitrate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GetDefaultMaxQp(webrtc::VideoCodecType codec_type) {
|
||||||
|
switch (codec_type) {
|
||||||
|
case webrtc::kVideoCodecH264:
|
||||||
|
case webrtc::kVideoCodecH265:
|
||||||
|
return kDefaultVideoMaxQpH26x;
|
||||||
|
case webrtc::kVideoCodecVP8:
|
||||||
|
case webrtc::kVideoCodecVP9:
|
||||||
|
case webrtc::kVideoCodecAV1:
|
||||||
|
case webrtc::kVideoCodecGeneric:
|
||||||
|
return kDefaultVideoMaxQpVpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
// TODO(bugs.webrtc.org/8785): Consider removing max_qp as member of
|
|
||||||
// EncoderStreamFactory and instead set this value individually for each stream
|
|
||||||
// in the VideoEncoderConfig.simulcast_layers.
|
|
||||||
EncoderStreamFactory::EncoderStreamFactory(
|
EncoderStreamFactory::EncoderStreamFactory(
|
||||||
std::string codec_name,
|
|
||||||
int max_qp,
|
|
||||||
bool is_screenshare,
|
|
||||||
bool conference_mode,
|
|
||||||
const webrtc::VideoEncoder::EncoderInfo& encoder_info,
|
const webrtc::VideoEncoder::EncoderInfo& encoder_info,
|
||||||
absl::optional<webrtc::VideoSourceRestrictions> restrictions)
|
absl::optional<webrtc::VideoSourceRestrictions> restrictions)
|
||||||
: codec_name_(codec_name),
|
: encoder_info_requested_resolution_alignment_(
|
||||||
max_qp_(max_qp),
|
|
||||||
is_screenshare_(is_screenshare),
|
|
||||||
conference_mode_(conference_mode),
|
|
||||||
encoder_info_requested_resolution_alignment_(
|
|
||||||
encoder_info.requested_resolution_alignment),
|
encoder_info.requested_resolution_alignment),
|
||||||
restrictions_(restrictions) {}
|
restrictions_(restrictions) {}
|
||||||
|
|
||||||
@ -146,9 +149,8 @@ std::vector<webrtc::VideoStream> EncoderStreamFactory::CreateEncoderStreams(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_simulcast || ((absl::EqualsIgnoreCase(codec_name_, kVp8CodecName) ||
|
if (is_simulcast ||
|
||||||
absl::EqualsIgnoreCase(codec_name_, kH264CodecName)) &&
|
webrtc::SimulcastUtility::IsConferenceModeScreenshare(encoder_config)) {
|
||||||
is_screenshare_ && conference_mode_)) {
|
|
||||||
return CreateSimulcastOrConferenceModeScreenshareStreams(
|
return CreateSimulcastOrConferenceModeScreenshareStreams(
|
||||||
trials, frame_width, frame_height, encoder_config,
|
trials, frame_width, frame_height, encoder_config,
|
||||||
experimental_min_bitrate);
|
experimental_min_bitrate);
|
||||||
@ -164,7 +166,8 @@ EncoderStreamFactory::CreateDefaultVideoStreams(
|
|||||||
int height,
|
int height,
|
||||||
const webrtc::VideoEncoderConfig& encoder_config,
|
const webrtc::VideoEncoderConfig& encoder_config,
|
||||||
const absl::optional<webrtc::DataRate>& experimental_min_bitrate) const {
|
const absl::optional<webrtc::DataRate>& experimental_min_bitrate) const {
|
||||||
std::vector<webrtc::VideoStream> layers;
|
bool is_screencast = encoder_config.content_type ==
|
||||||
|
webrtc::VideoEncoderConfig::ContentType::kScreen;
|
||||||
|
|
||||||
// The max bitrate specified by the API.
|
// The max bitrate specified by the API.
|
||||||
// - `encoder_config.simulcast_layers[0].max_bitrate_bps` comes from the first
|
// - `encoder_config.simulcast_layers[0].max_bitrate_bps` comes from the first
|
||||||
@ -187,8 +190,7 @@ EncoderStreamFactory::CreateDefaultVideoStreams(
|
|||||||
int max_bitrate_bps =
|
int max_bitrate_bps =
|
||||||
api_max_bitrate_bps.has_value()
|
api_max_bitrate_bps.has_value()
|
||||||
? *api_max_bitrate_bps
|
? *api_max_bitrate_bps
|
||||||
: GetMaxDefaultVideoBitrateKbps(width, height, is_screenshare_) *
|
: GetMaxDefaultVideoBitrateKbps(width, height, is_screencast) * 1000;
|
||||||
1000;
|
|
||||||
|
|
||||||
int min_bitrate_bps =
|
int min_bitrate_bps =
|
||||||
experimental_min_bitrate
|
experimental_min_bitrate
|
||||||
@ -234,7 +236,7 @@ EncoderStreamFactory::CreateDefaultVideoStreams(
|
|||||||
kMinLayerSize);
|
kMinLayerSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (absl::EqualsIgnoreCase(codec_name_, kVp9CodecName)) {
|
if (encoder_config.codec_type == webrtc::VideoCodecType::kVideoCodecVP9) {
|
||||||
RTC_DCHECK(encoder_config.encoder_specific_settings);
|
RTC_DCHECK(encoder_config.encoder_specific_settings);
|
||||||
// Use VP9 SVC layering from codec settings which might be initialized
|
// Use VP9 SVC layering from codec settings which might be initialized
|
||||||
// though field trial in ConfigureVideoEncoderSettings.
|
// though field trial in ConfigureVideoEncoderSettings.
|
||||||
@ -256,7 +258,7 @@ EncoderStreamFactory::CreateDefaultVideoStreams(
|
|||||||
std::vector<webrtc::SpatialLayer> svc_layers =
|
std::vector<webrtc::SpatialLayer> svc_layers =
|
||||||
webrtc::GetSvcConfig(width, height, max_framerate,
|
webrtc::GetSvcConfig(width, height, max_framerate,
|
||||||
/*first_active_layer=*/0, num_spatial_layers,
|
/*first_active_layer=*/0, num_spatial_layers,
|
||||||
*layer.num_temporal_layers, is_screenshare_);
|
*layer.num_temporal_layers, is_screencast);
|
||||||
int sum_max_bitrates_kbps = 0;
|
int sum_max_bitrates_kbps = 0;
|
||||||
for (const webrtc::SpatialLayer& spatial_layer : svc_layers) {
|
for (const webrtc::SpatialLayer& spatial_layer : svc_layers) {
|
||||||
sum_max_bitrates_kbps += spatial_layer.maxBitrate;
|
sum_max_bitrates_kbps += spatial_layer.maxBitrate;
|
||||||
@ -282,10 +284,15 @@ EncoderStreamFactory::CreateDefaultVideoStreams(
|
|||||||
encoder_config.simulcast_layers[0].target_bitrate_bps, max_bitrate_bps);
|
encoder_config.simulcast_layers[0].target_bitrate_bps, max_bitrate_bps);
|
||||||
}
|
}
|
||||||
layer.max_bitrate_bps = max_bitrate_bps;
|
layer.max_bitrate_bps = max_bitrate_bps;
|
||||||
layer.max_qp = max_qp_;
|
|
||||||
layer.bitrate_priority = encoder_config.bitrate_priority;
|
layer.bitrate_priority = encoder_config.bitrate_priority;
|
||||||
|
|
||||||
if (IsTemporalLayersSupported(codec_name_)) {
|
if (encoder_config.max_qp > 0) {
|
||||||
|
layer.max_qp = encoder_config.max_qp;
|
||||||
|
} else {
|
||||||
|
layer.max_qp = GetDefaultMaxQp(encoder_config.codec_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsTemporalLayersSupported(encoder_config.codec_type)) {
|
||||||
// Use configured number of temporal layers if set.
|
// Use configured number of temporal layers if set.
|
||||||
if (encoder_config.simulcast_layers[0].num_temporal_layers) {
|
if (encoder_config.simulcast_layers[0].num_temporal_layers) {
|
||||||
layer.num_temporal_layers =
|
layer.num_temporal_layers =
|
||||||
@ -293,8 +300,7 @@ EncoderStreamFactory::CreateDefaultVideoStreams(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
layer.scalability_mode = encoder_config.simulcast_layers[0].scalability_mode;
|
layer.scalability_mode = encoder_config.simulcast_layers[0].scalability_mode;
|
||||||
layers.push_back(layer);
|
return {layer};
|
||||||
return layers;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<webrtc::VideoStream>
|
std::vector<webrtc::VideoStream>
|
||||||
@ -304,17 +310,20 @@ EncoderStreamFactory::CreateSimulcastOrConferenceModeScreenshareStreams(
|
|||||||
int height,
|
int height,
|
||||||
const webrtc::VideoEncoderConfig& encoder_config,
|
const webrtc::VideoEncoderConfig& encoder_config,
|
||||||
const absl::optional<webrtc::DataRate>& experimental_min_bitrate) const {
|
const absl::optional<webrtc::DataRate>& experimental_min_bitrate) const {
|
||||||
|
bool is_screencast = encoder_config.content_type ==
|
||||||
|
webrtc::VideoEncoderConfig::ContentType::kScreen;
|
||||||
std::vector<webrtc::VideoStream> layers;
|
std::vector<webrtc::VideoStream> layers;
|
||||||
|
|
||||||
const bool temporal_layers_supported = IsTemporalLayersSupported(codec_name_);
|
const bool temporal_layers_supported =
|
||||||
|
IsTemporalLayersSupported(encoder_config.codec_type);
|
||||||
// Use legacy simulcast screenshare if conference mode is explicitly enabled
|
// Use legacy simulcast screenshare if conference mode is explicitly enabled
|
||||||
// or use the regular simulcast configuration path which is generic.
|
// or use the regular simulcast configuration path which is generic.
|
||||||
layers = GetSimulcastConfig(FindRequiredActiveLayers(encoder_config),
|
layers = GetSimulcastConfig(
|
||||||
|
FindRequiredActiveLayers(encoder_config),
|
||||||
encoder_config.number_of_streams, width, height,
|
encoder_config.number_of_streams, width, height,
|
||||||
encoder_config.bitrate_priority, max_qp_,
|
encoder_config.bitrate_priority, encoder_config.max_qp,
|
||||||
is_screenshare_ && conference_mode_,
|
webrtc::SimulcastUtility::IsConferenceModeScreenshare(encoder_config),
|
||||||
temporal_layers_supported, trials,
|
temporal_layers_supported, trials, encoder_config.codec_type);
|
||||||
encoder_config.codec_type);
|
|
||||||
// Allow an experiment to override the minimum bitrate for the lowest
|
// Allow an experiment to override the minimum bitrate for the lowest
|
||||||
// spatial layer. The experiment's configuration has the lowest priority.
|
// spatial layer. The experiment's configuration has the lowest priority.
|
||||||
if (experimental_min_bitrate) {
|
if (experimental_min_bitrate) {
|
||||||
@ -355,7 +364,7 @@ EncoderStreamFactory::CreateSimulcastOrConferenceModeScreenshareStreams(
|
|||||||
encoder_config.simulcast_layers[i].requested_resolution;
|
encoder_config.simulcast_layers[i].requested_resolution;
|
||||||
// Update with configured num temporal layers if supported by codec.
|
// Update with configured num temporal layers if supported by codec.
|
||||||
if (encoder_config.simulcast_layers[i].num_temporal_layers &&
|
if (encoder_config.simulcast_layers[i].num_temporal_layers &&
|
||||||
IsTemporalLayersSupported(codec_name_)) {
|
temporal_layers_supported) {
|
||||||
layers[i].num_temporal_layers =
|
layers[i].num_temporal_layers =
|
||||||
*encoder_config.simulcast_layers[i].num_temporal_layers;
|
*encoder_config.simulcast_layers[i].num_temporal_layers;
|
||||||
}
|
}
|
||||||
@ -419,12 +428,21 @@ EncoderStreamFactory::CreateSimulcastOrConferenceModeScreenshareStreams(
|
|||||||
std::min(layers[i].target_bitrate_bps, layers[i].max_bitrate_bps),
|
std::min(layers[i].target_bitrate_bps, layers[i].max_bitrate_bps),
|
||||||
layers[i].min_bitrate_bps);
|
layers[i].min_bitrate_bps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (encoder_config.simulcast_layers[i].max_qp > 0) {
|
||||||
|
layers[i].max_qp = encoder_config.simulcast_layers[i].max_qp;
|
||||||
|
} else if (encoder_config.max_qp > 0) {
|
||||||
|
layers[i].max_qp = encoder_config.max_qp;
|
||||||
|
} else {
|
||||||
|
layers[i].max_qp = GetDefaultMaxQp(encoder_config.codec_type);
|
||||||
|
}
|
||||||
|
|
||||||
if (i == layers.size() - 1) {
|
if (i == layers.size() - 1) {
|
||||||
is_highest_layer_max_bitrate_configured =
|
is_highest_layer_max_bitrate_configured =
|
||||||
encoder_config.simulcast_layers[i].max_bitrate_bps > 0;
|
encoder_config.simulcast_layers[i].max_bitrate_bps > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!is_screenshare_ && !is_highest_layer_max_bitrate_configured &&
|
if (!is_screencast && !is_highest_layer_max_bitrate_configured &&
|
||||||
encoder_config.max_bitrate_bps > 0) {
|
encoder_config.max_bitrate_bps > 0) {
|
||||||
// No application-configured maximum for the largest layer.
|
// No application-configured maximum for the largest layer.
|
||||||
// If there is bitrate leftover, give it to the largest layer.
|
// If there is bitrate leftover, give it to the largest layer.
|
||||||
|
|||||||
@ -24,11 +24,7 @@ namespace cricket {
|
|||||||
class EncoderStreamFactory
|
class EncoderStreamFactory
|
||||||
: public webrtc::VideoEncoderConfig::VideoStreamFactoryInterface {
|
: public webrtc::VideoEncoderConfig::VideoStreamFactoryInterface {
|
||||||
public:
|
public:
|
||||||
EncoderStreamFactory(std::string codec_name,
|
EncoderStreamFactory(const webrtc::VideoEncoder::EncoderInfo& encoder_info,
|
||||||
int max_qp,
|
|
||||||
bool is_screenshare,
|
|
||||||
bool conference_mode,
|
|
||||||
const webrtc::VideoEncoder::EncoderInfo& encoder_info,
|
|
||||||
absl::optional<webrtc::VideoSourceRestrictions>
|
absl::optional<webrtc::VideoSourceRestrictions>
|
||||||
restrictions = absl::nullopt);
|
restrictions = absl::nullopt);
|
||||||
|
|
||||||
@ -58,12 +54,6 @@ class EncoderStreamFactory
|
|||||||
int in_frame_height,
|
int in_frame_height,
|
||||||
webrtc::Resolution requested_resolution) const;
|
webrtc::Resolution requested_resolution) const;
|
||||||
|
|
||||||
const std::string codec_name_;
|
|
||||||
const int max_qp_;
|
|
||||||
const bool is_screenshare_;
|
|
||||||
// Allows a screenshare specific configuration, which enables temporal
|
|
||||||
// layering and various settings.
|
|
||||||
const bool conference_mode_;
|
|
||||||
const int encoder_info_requested_resolution_alignment_;
|
const int encoder_info_requested_resolution_alignment_;
|
||||||
const absl::optional<webrtc::VideoSourceRestrictions> restrictions_;
|
const absl::optional<webrtc::VideoSourceRestrictions> restrictions_;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -20,8 +20,6 @@ namespace {
|
|||||||
using ::cricket::EncoderStreamFactory;
|
using ::cricket::EncoderStreamFactory;
|
||||||
using test::ExplicitKeyValueConfig;
|
using test::ExplicitKeyValueConfig;
|
||||||
|
|
||||||
constexpr int kMaxQp = 48;
|
|
||||||
|
|
||||||
std::vector<Resolution> GetStreamResolutions(
|
std::vector<Resolution> GetStreamResolutions(
|
||||||
const std::vector<VideoStream>& streams) {
|
const std::vector<VideoStream>& streams) {
|
||||||
std::vector<Resolution> res;
|
std::vector<Resolution> res;
|
||||||
@ -45,10 +43,7 @@ VideoStream LayerWithRequestedResolution(Resolution res) {
|
|||||||
TEST(EncoderStreamFactory, SinglecastRequestedResolution) {
|
TEST(EncoderStreamFactory, SinglecastRequestedResolution) {
|
||||||
ExplicitKeyValueConfig field_trials("");
|
ExplicitKeyValueConfig field_trials("");
|
||||||
VideoEncoder::EncoderInfo encoder_info;
|
VideoEncoder::EncoderInfo encoder_info;
|
||||||
auto factory = rtc::make_ref_counted<EncoderStreamFactory>(
|
auto factory = rtc::make_ref_counted<EncoderStreamFactory>(encoder_info);
|
||||||
"VP8", kMaxQp,
|
|
||||||
/* is_screenshare= */ false,
|
|
||||||
/* conference_mode= */ false, encoder_info);
|
|
||||||
VideoEncoderConfig encoder_config;
|
VideoEncoderConfig encoder_config;
|
||||||
encoder_config.number_of_streams = 1;
|
encoder_config.number_of_streams = 1;
|
||||||
encoder_config.simulcast_layers.push_back(
|
encoder_config.simulcast_layers.push_back(
|
||||||
@ -69,10 +64,8 @@ TEST(EncoderStreamFactory, SinglecastRequestedResolutionWithAdaptation) {
|
|||||||
/* target_pixels_per_frame= */ absl::nullopt,
|
/* target_pixels_per_frame= */ absl::nullopt,
|
||||||
/* max_frame_rate= */ absl::nullopt);
|
/* max_frame_rate= */ absl::nullopt);
|
||||||
VideoEncoder::EncoderInfo encoder_info;
|
VideoEncoder::EncoderInfo encoder_info;
|
||||||
auto factory = rtc::make_ref_counted<EncoderStreamFactory>(
|
auto factory =
|
||||||
"VP8", kMaxQp,
|
rtc::make_ref_counted<EncoderStreamFactory>(encoder_info, restrictions);
|
||||||
/* is_screenshare= */ false,
|
|
||||||
/* conference_mode= */ false, encoder_info, restrictions);
|
|
||||||
VideoEncoderConfig encoder_config;
|
VideoEncoderConfig encoder_config;
|
||||||
encoder_config.number_of_streams = 1;
|
encoder_config.number_of_streams = 1;
|
||||||
encoder_config.simulcast_layers.push_back(
|
encoder_config.simulcast_layers.push_back(
|
||||||
|
|||||||
@ -59,7 +59,8 @@ VideoEncoderConfig::VideoEncoderConfig()
|
|||||||
bitrate_priority(1.0),
|
bitrate_priority(1.0),
|
||||||
number_of_streams(0),
|
number_of_streams(0),
|
||||||
legacy_conference_mode(false),
|
legacy_conference_mode(false),
|
||||||
is_quality_scaling_allowed(false) {}
|
is_quality_scaling_allowed(false),
|
||||||
|
max_qp(-1) {}
|
||||||
|
|
||||||
VideoEncoderConfig::VideoEncoderConfig(VideoEncoderConfig&&) = default;
|
VideoEncoderConfig::VideoEncoderConfig(VideoEncoderConfig&&) = default;
|
||||||
|
|
||||||
|
|||||||
@ -147,17 +147,13 @@ class InitEncodeTest : public test::EndToEndTest,
|
|||||||
VideoSendStream::Config* send_config,
|
VideoSendStream::Config* send_config,
|
||||||
std::vector<VideoReceiveStreamInterface::Config>* receive_configs,
|
std::vector<VideoReceiveStreamInterface::Config>* receive_configs,
|
||||||
VideoEncoderConfig* encoder_config) override {
|
VideoEncoderConfig* encoder_config) override {
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
send_config->encoder_settings.encoder_factory = &encoder_factory_;
|
send_config->encoder_settings.encoder_factory = &encoder_factory_;
|
||||||
send_config->rtp.payload_name = payload_name_;
|
send_config->rtp.payload_name = payload_name_;
|
||||||
send_config->rtp.payload_type =
|
send_config->rtp.payload_type =
|
||||||
test::VideoTestConstants::kVideoSendPayloadType;
|
test::VideoTestConstants::kVideoSendPayloadType;
|
||||||
const VideoCodecType codec_type = PayloadStringToCodecType(payload_name_);
|
const VideoCodecType codec_type = PayloadStringToCodecType(payload_name_);
|
||||||
encoder_config->codec_type = codec_type;
|
encoder_config->codec_type = codec_type;
|
||||||
encoder_config->video_stream_factory =
|
encoder_config->video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
payload_name_, /*max qp*/ 0, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
encoder_config->max_bitrate_bps = -1;
|
encoder_config->max_bitrate_bps = -1;
|
||||||
if (configs_.size() == 1 && configs_[0].bitrate.max)
|
if (configs_.size() == 1 && configs_[0].bitrate.max)
|
||||||
encoder_config->max_bitrate_bps = configs_[0].bitrate.max->bps();
|
encoder_config->max_bitrate_bps = configs_[0].bitrate.max->bps();
|
||||||
|
|||||||
@ -125,7 +125,6 @@ class ScalingObserver : public test::SendTest {
|
|||||||
VideoSendStream::Config* send_config,
|
VideoSendStream::Config* send_config,
|
||||||
std::vector<VideoReceiveStreamInterface::Config>* receive_configs,
|
std::vector<VideoReceiveStreamInterface::Config>* receive_configs,
|
||||||
VideoEncoderConfig* encoder_config) override {
|
VideoEncoderConfig* encoder_config) override {
|
||||||
VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
send_config->encoder_settings.encoder_factory = &encoder_factory_;
|
send_config->encoder_settings.encoder_factory = &encoder_factory_;
|
||||||
send_config->rtp.payload_name = payload_name_;
|
send_config->rtp.payload_name = payload_name_;
|
||||||
send_config->rtp.payload_type =
|
send_config->rtp.payload_type =
|
||||||
@ -133,10 +132,6 @@ class ScalingObserver : public test::SendTest {
|
|||||||
encoder_config->video_format.name = payload_name_;
|
encoder_config->video_format.name = payload_name_;
|
||||||
const VideoCodecType codec_type = PayloadStringToCodecType(payload_name_);
|
const VideoCodecType codec_type = PayloadStringToCodecType(payload_name_);
|
||||||
encoder_config->codec_type = codec_type;
|
encoder_config->codec_type = codec_type;
|
||||||
encoder_config->video_stream_factory =
|
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
payload_name_, /*max_qp=*/0, /*is_screenshare=*/false,
|
|
||||||
/*conference_mode=*/false, encoder_info);
|
|
||||||
encoder_config->max_bitrate_bps =
|
encoder_config->max_bitrate_bps =
|
||||||
std::max(start_bps_, encoder_config->max_bitrate_bps);
|
std::max(start_bps_, encoder_config->max_bitrate_bps);
|
||||||
if (payload_name_ == "VP9") {
|
if (payload_name_ == "VP9") {
|
||||||
|
|||||||
@ -617,9 +617,7 @@ void VideoQualityTest::FillScalabilitySettings(
|
|||||||
encoder_config.spatial_layers = params->ss[video_idx].spatial_layers;
|
encoder_config.spatial_layers = params->ss[video_idx].spatial_layers;
|
||||||
encoder_config.simulcast_layers = std::vector<VideoStream>(num_streams);
|
encoder_config.simulcast_layers = std::vector<VideoStream>(num_streams);
|
||||||
encoder_config.video_stream_factory =
|
encoder_config.video_stream_factory =
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
rtc::make_ref_counted<cricket::EncoderStreamFactory>(encoder_info);
|
||||||
params->video[video_idx].codec, cricket::kDefaultVideoMaxQpVpx,
|
|
||||||
params->screenshare[video_idx].enabled, true, encoder_info);
|
|
||||||
params->ss[video_idx].streams =
|
params->ss[video_idx].streams =
|
||||||
encoder_config.video_stream_factory->CreateEncoderStreams(
|
encoder_config.video_stream_factory->CreateEncoderStreams(
|
||||||
env().field_trials(), params->video[video_idx].width,
|
env().field_trials(), params->video[video_idx].width,
|
||||||
@ -799,11 +797,6 @@ void VideoQualityTest::SetupVideo(Transport* send_transport,
|
|||||||
video_encoder_configs_[video_idx].simulcast_layers =
|
video_encoder_configs_[video_idx].simulcast_layers =
|
||||||
params_.ss[video_idx].streams;
|
params_.ss[video_idx].streams;
|
||||||
}
|
}
|
||||||
video_encoder_configs_[video_idx].video_stream_factory =
|
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
params_.video[video_idx].codec,
|
|
||||||
params_.ss[video_idx].streams[0].max_qp,
|
|
||||||
params_.screenshare[video_idx].enabled, true, encoder_info);
|
|
||||||
|
|
||||||
video_encoder_configs_[video_idx].spatial_layers =
|
video_encoder_configs_[video_idx].spatial_layers =
|
||||||
params_.ss[video_idx].spatial_layers;
|
params_.ss[video_idx].spatial_layers;
|
||||||
@ -823,6 +816,7 @@ void VideoQualityTest::SetupVideo(Transport* send_transport,
|
|||||||
// Fill out codec settings.
|
// Fill out codec settings.
|
||||||
video_encoder_configs_[video_idx].content_type =
|
video_encoder_configs_[video_idx].content_type =
|
||||||
VideoEncoderConfig::ContentType::kScreen;
|
VideoEncoderConfig::ContentType::kScreen;
|
||||||
|
video_encoder_configs_[video_idx].legacy_conference_mode = true;
|
||||||
degradation_preference_ = DegradationPreference::MAINTAIN_RESOLUTION;
|
degradation_preference_ = DegradationPreference::MAINTAIN_RESOLUTION;
|
||||||
if (params_.video[video_idx].codec == "VP8") {
|
if (params_.video[video_idx].codec == "VP8") {
|
||||||
VideoCodecVP8 vp8_settings = VideoEncoder::GetDefaultVp8Settings();
|
VideoCodecVP8 vp8_settings = VideoEncoder::GetDefaultVp8Settings();
|
||||||
|
|||||||
@ -4077,10 +4077,6 @@ void VideoSendStreamTest::TestTemporalLayers(
|
|||||||
test::VideoTestConstants::kVideoSendPayloadType;
|
test::VideoTestConstants::kVideoSendPayloadType;
|
||||||
encoder_config->video_format.name = payload_name_;
|
encoder_config->video_format.name = payload_name_;
|
||||||
encoder_config->codec_type = PayloadStringToCodecType(payload_name_);
|
encoder_config->codec_type = PayloadStringToCodecType(payload_name_);
|
||||||
encoder_config->video_stream_factory =
|
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
payload_name_, /*max_qp=*/56, /*is_screenshare=*/false,
|
|
||||||
/*conference_mode=*/false, encoder_info);
|
|
||||||
encoder_config->max_bitrate_bps = kMaxBitrateBps;
|
encoder_config->max_bitrate_bps = kMaxBitrateBps;
|
||||||
if (absl::EqualsIgnoreCase(payload_name_, "VP9")) {
|
if (absl::EqualsIgnoreCase(payload_name_, "VP9")) {
|
||||||
encoder_config->encoder_specific_settings = rtc::make_ref_counted<
|
encoder_config->encoder_specific_settings = rtc::make_ref_counted<
|
||||||
|
|||||||
@ -996,11 +996,7 @@ void VideoStreamEncoder::ReconfigureEncoder() {
|
|||||||
encoder_config_);
|
encoder_config_);
|
||||||
} else {
|
} else {
|
||||||
auto factory = rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
auto factory = rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
||||||
encoder_config_.video_format.name, encoder_config_.max_qp,
|
encoder_->GetEncoderInfo(), latest_restrictions_);
|
||||||
encoder_config_.content_type ==
|
|
||||||
webrtc::VideoEncoderConfig::ContentType::kScreen,
|
|
||||||
encoder_config_.legacy_conference_mode, encoder_->GetEncoderInfo(),
|
|
||||||
latest_restrictions_);
|
|
||||||
|
|
||||||
streams = factory->CreateEncoderStreams(
|
streams = factory->CreateEncoderStreams(
|
||||||
env_.field_trials(), last_frame_info_->width, last_frame_info_->height,
|
env_.field_trials(), last_frame_info_->width, last_frame_info_->height,
|
||||||
|
|||||||
@ -2226,16 +2226,12 @@ TEST_F(VideoStreamEncoderTest,
|
|||||||
|
|
||||||
// Two streams, highest stream active.
|
// Two streams, highest stream active.
|
||||||
VideoEncoderConfig config;
|
VideoEncoderConfig config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
const int kNumStreams = 2;
|
const int kNumStreams = 2;
|
||||||
test::FillEncoderConfiguration(kVideoCodecVP8, kNumStreams, &config);
|
test::FillEncoderConfiguration(kVideoCodecVP8, kNumStreams, &config);
|
||||||
config.max_bitrate_bps = 0;
|
config.max_bitrate_bps = 0;
|
||||||
config.simulcast_layers[0].active = false;
|
config.simulcast_layers[0].active = false;
|
||||||
config.simulcast_layers[1].active = true;
|
config.simulcast_layers[1].active = true;
|
||||||
config.video_stream_factory =
|
config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
"VP8", /*max qp*/ 56, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
video_stream_encoder_->ConfigureEncoder(config.Copy(), kMaxPayloadLength);
|
video_stream_encoder_->ConfigureEncoder(config.Copy(), kMaxPayloadLength);
|
||||||
|
|
||||||
// The encoder bitrate limits for 270p should be used.
|
// The encoder bitrate limits for 270p should be used.
|
||||||
@ -2291,16 +2287,12 @@ TEST_F(VideoStreamEncoderTest,
|
|||||||
DefaultEncoderMaxAndMinBitratesUsedForTwoStreamsHighestActive) {
|
DefaultEncoderMaxAndMinBitratesUsedForTwoStreamsHighestActive) {
|
||||||
// Two streams, highest stream active.
|
// Two streams, highest stream active.
|
||||||
VideoEncoderConfig config;
|
VideoEncoderConfig config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
const int kNumStreams = 2;
|
const int kNumStreams = 2;
|
||||||
test::FillEncoderConfiguration(kVideoCodecVP8, kNumStreams, &config);
|
test::FillEncoderConfiguration(kVideoCodecVP8, kNumStreams, &config);
|
||||||
config.max_bitrate_bps = 0;
|
config.max_bitrate_bps = 0;
|
||||||
config.simulcast_layers[0].active = false;
|
config.simulcast_layers[0].active = false;
|
||||||
config.simulcast_layers[1].active = true;
|
config.simulcast_layers[1].active = true;
|
||||||
config.video_stream_factory =
|
config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
"VP8", /*max qp*/ 56, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
video_stream_encoder_->ConfigureEncoder(config.Copy(), kMaxPayloadLength);
|
video_stream_encoder_->ConfigureEncoder(config.Copy(), kMaxPayloadLength);
|
||||||
|
|
||||||
// Default bitrate limits for 270p should be used.
|
// Default bitrate limits for 270p should be used.
|
||||||
@ -2365,16 +2357,12 @@ TEST_F(VideoStreamEncoderTest,
|
|||||||
|
|
||||||
// Three streams, middle stream active.
|
// Three streams, middle stream active.
|
||||||
VideoEncoderConfig config;
|
VideoEncoderConfig config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
const int kNumStreams = 3;
|
const int kNumStreams = 3;
|
||||||
test::FillEncoderConfiguration(kVideoCodecVP8, kNumStreams, &config);
|
test::FillEncoderConfiguration(kVideoCodecVP8, kNumStreams, &config);
|
||||||
config.simulcast_layers[0].active = false;
|
config.simulcast_layers[0].active = false;
|
||||||
config.simulcast_layers[1].active = true;
|
config.simulcast_layers[1].active = true;
|
||||||
config.simulcast_layers[2].active = false;
|
config.simulcast_layers[2].active = false;
|
||||||
config.video_stream_factory =
|
config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
"VP8", /*max qp*/ 56, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
video_stream_encoder_->ConfigureEncoder(config.Copy(), kMaxPayloadLength);
|
video_stream_encoder_->ConfigureEncoder(config.Copy(), kMaxPayloadLength);
|
||||||
|
|
||||||
// The encoder bitrate limits for 360p should be used.
|
// The encoder bitrate limits for 360p should be used.
|
||||||
@ -2410,16 +2398,12 @@ TEST_F(VideoStreamEncoderTest,
|
|||||||
|
|
||||||
// Three streams, lowest stream active.
|
// Three streams, lowest stream active.
|
||||||
VideoEncoderConfig config;
|
VideoEncoderConfig config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
const int kNumStreams = 3;
|
const int kNumStreams = 3;
|
||||||
test::FillEncoderConfiguration(kVideoCodecVP8, kNumStreams, &config);
|
test::FillEncoderConfiguration(kVideoCodecVP8, kNumStreams, &config);
|
||||||
config.simulcast_layers[0].active = true;
|
config.simulcast_layers[0].active = true;
|
||||||
config.simulcast_layers[1].active = false;
|
config.simulcast_layers[1].active = false;
|
||||||
config.simulcast_layers[2].active = false;
|
config.simulcast_layers[2].active = false;
|
||||||
config.video_stream_factory =
|
config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
"VP8", /*max qp*/ 56, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
video_stream_encoder_->ConfigureEncoder(config.Copy(), kMaxPayloadLength);
|
video_stream_encoder_->ConfigureEncoder(config.Copy(), kMaxPayloadLength);
|
||||||
|
|
||||||
// Resolution on lowest stream lower than 270p. The encoder limits not applied
|
// Resolution on lowest stream lower than 270p. The encoder limits not applied
|
||||||
@ -2447,16 +2431,12 @@ TEST_F(VideoStreamEncoderTest,
|
|||||||
|
|
||||||
// Two streams, highest stream active.
|
// Two streams, highest stream active.
|
||||||
VideoEncoderConfig config;
|
VideoEncoderConfig config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
const int kNumStreams = 2;
|
const int kNumStreams = 2;
|
||||||
test::FillEncoderConfiguration(kVideoCodecVP8, kNumStreams, &config);
|
test::FillEncoderConfiguration(kVideoCodecVP8, kNumStreams, &config);
|
||||||
config.simulcast_layers[0].active = false;
|
config.simulcast_layers[0].active = false;
|
||||||
config.simulcast_layers[1].active = true;
|
config.simulcast_layers[1].active = true;
|
||||||
config.simulcast_layers[1].max_bitrate_bps = kMaxBitrateBps;
|
config.simulcast_layers[1].max_bitrate_bps = kMaxBitrateBps;
|
||||||
config.video_stream_factory =
|
config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
"VP8", /*max qp*/ 56, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
video_stream_encoder_->ConfigureEncoder(config.Copy(), kMaxPayloadLength);
|
video_stream_encoder_->ConfigureEncoder(config.Copy(), kMaxPayloadLength);
|
||||||
|
|
||||||
// The encoder bitrate limits for 270p should be used.
|
// The encoder bitrate limits for 270p should be used.
|
||||||
@ -2675,15 +2655,11 @@ TEST_P(ResolutionAlignmentTest, SinkWantsAlignmentApplied) {
|
|||||||
// Fill config with the scaling factor by which to reduce encoding size.
|
// Fill config with the scaling factor by which to reduce encoding size.
|
||||||
const int num_streams = scale_factors_.size();
|
const int num_streams = scale_factors_.size();
|
||||||
VideoEncoderConfig config;
|
VideoEncoderConfig config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
test::FillEncoderConfiguration(kVideoCodecVP8, num_streams, &config);
|
test::FillEncoderConfiguration(kVideoCodecVP8, num_streams, &config);
|
||||||
for (int i = 0; i < num_streams; ++i) {
|
for (int i = 0; i < num_streams; ++i) {
|
||||||
config.simulcast_layers[i].scale_resolution_down_by = scale_factors_[i];
|
config.simulcast_layers[i].scale_resolution_down_by = scale_factors_[i];
|
||||||
}
|
}
|
||||||
config.video_stream_factory =
|
config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
"VP8", /*max qp*/ 56, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
video_stream_encoder_->ConfigureEncoder(std::move(config), kMaxPayloadLength);
|
video_stream_encoder_->ConfigureEncoder(std::move(config), kMaxPayloadLength);
|
||||||
|
|
||||||
video_stream_encoder_->OnBitrateUpdatedAndWaitForManagedResources(
|
video_stream_encoder_->OnBitrateUpdatedAndWaitForManagedResources(
|
||||||
@ -5842,13 +5818,9 @@ TEST_F(VideoStreamEncoderTest,
|
|||||||
|
|
||||||
TEST_F(VideoStreamEncoderTest, InitialFrameDropAccountsForResolutionScaling) {
|
TEST_F(VideoStreamEncoderTest, InitialFrameDropAccountsForResolutionScaling) {
|
||||||
VideoEncoderConfig video_encoder_config;
|
VideoEncoderConfig video_encoder_config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
test::FillEncoderConfiguration(PayloadStringToCodecType("VP8"), 1,
|
test::FillEncoderConfiguration(PayloadStringToCodecType("VP8"), 1,
|
||||||
&video_encoder_config);
|
&video_encoder_config);
|
||||||
video_encoder_config.video_stream_factory =
|
video_encoder_config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
"VP8", /*max qp*/ 56, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
for (auto& layer : video_encoder_config.simulcast_layers) {
|
for (auto& layer : video_encoder_config.simulcast_layers) {
|
||||||
layer.num_temporal_layers = 1;
|
layer.num_temporal_layers = 1;
|
||||||
layer.max_framerate = kDefaultFramerate;
|
layer.max_framerate = kDefaultFramerate;
|
||||||
@ -5894,13 +5866,9 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenLayersChange) {
|
|||||||
// Trigger QVGA "singlecast"
|
// Trigger QVGA "singlecast"
|
||||||
// Update the config.
|
// Update the config.
|
||||||
VideoEncoderConfig video_encoder_config;
|
VideoEncoderConfig video_encoder_config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
test::FillEncoderConfiguration(PayloadStringToCodecType("VP8"), 3,
|
test::FillEncoderConfiguration(PayloadStringToCodecType("VP8"), 3,
|
||||||
&video_encoder_config);
|
&video_encoder_config);
|
||||||
video_encoder_config.video_stream_factory =
|
video_encoder_config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
"VP8", /*max qp*/ 56, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
for (auto& layer : video_encoder_config.simulcast_layers) {
|
for (auto& layer : video_encoder_config.simulcast_layers) {
|
||||||
layer.num_temporal_layers = 1;
|
layer.num_temporal_layers = 1;
|
||||||
layer.max_framerate = kDefaultFramerate;
|
layer.max_framerate = kDefaultFramerate;
|
||||||
@ -8099,16 +8067,12 @@ TEST_F(VideoStreamEncoderTest, EncoderResetAccordingToParameterChange) {
|
|||||||
const int number_layers =
|
const int number_layers =
|
||||||
sizeof(downscale_factors) / sizeof(downscale_factors[0]);
|
sizeof(downscale_factors) / sizeof(downscale_factors[0]);
|
||||||
VideoEncoderConfig config;
|
VideoEncoderConfig config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
test::FillEncoderConfiguration(kVideoCodecVP8, number_layers, &config);
|
test::FillEncoderConfiguration(kVideoCodecVP8, number_layers, &config);
|
||||||
for (int i = 0; i < number_layers; ++i) {
|
for (int i = 0; i < number_layers; ++i) {
|
||||||
config.simulcast_layers[i].scale_resolution_down_by = downscale_factors[i];
|
config.simulcast_layers[i].scale_resolution_down_by = downscale_factors[i];
|
||||||
config.simulcast_layers[i].active = true;
|
config.simulcast_layers[i].active = true;
|
||||||
}
|
}
|
||||||
config.video_stream_factory =
|
config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
"VP8", /*max qp*/ 56, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
video_stream_encoder_->OnBitrateUpdatedAndWaitForManagedResources(
|
video_stream_encoder_->OnBitrateUpdatedAndWaitForManagedResources(
|
||||||
kSimulcastTargetBitrate, kSimulcastTargetBitrate, kSimulcastTargetBitrate,
|
kSimulcastTargetBitrate, kSimulcastTargetBitrate, kSimulcastTargetBitrate,
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
@ -8225,16 +8189,12 @@ TEST_F(VideoStreamEncoderTest, EncoderResolutionsExposedInSimulcast) {
|
|||||||
kFrameWidth / kDownscaleFactors[2], kFrameHeight / kDownscaleFactors[2]);
|
kFrameWidth / kDownscaleFactors[2], kFrameHeight / kDownscaleFactors[2]);
|
||||||
|
|
||||||
VideoEncoderConfig config;
|
VideoEncoderConfig config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
test::FillEncoderConfiguration(kVideoCodecVP8, kNumSimulcastLayers, &config);
|
test::FillEncoderConfiguration(kVideoCodecVP8, kNumSimulcastLayers, &config);
|
||||||
for (size_t i = 0; i < kNumSimulcastLayers; ++i) {
|
for (size_t i = 0; i < kNumSimulcastLayers; ++i) {
|
||||||
config.simulcast_layers[i].scale_resolution_down_by = kDownscaleFactors[i];
|
config.simulcast_layers[i].scale_resolution_down_by = kDownscaleFactors[i];
|
||||||
config.simulcast_layers[i].active = true;
|
config.simulcast_layers[i].active = true;
|
||||||
}
|
}
|
||||||
config.video_stream_factory =
|
config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
"VP8", /*max qp*/ 56, /*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
video_stream_encoder_->OnBitrateUpdatedAndWaitForManagedResources(
|
video_stream_encoder_->OnBitrateUpdatedAndWaitForManagedResources(
|
||||||
kSimulcastTargetBitrate, kSimulcastTargetBitrate, kSimulcastTargetBitrate,
|
kSimulcastTargetBitrate, kSimulcastTargetBitrate, kSimulcastTargetBitrate,
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
@ -8998,7 +8958,6 @@ TEST_P(VideoStreamEncoderWithRealEncoderTest, HandlesLayerToggling) {
|
|||||||
kFrameWidth / kDownscaleFactors[2], kFrameHeight / kDownscaleFactors[2]);
|
kFrameWidth / kDownscaleFactors[2], kFrameHeight / kDownscaleFactors[2]);
|
||||||
|
|
||||||
VideoEncoderConfig config;
|
VideoEncoderConfig config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
if (codec_type_ == VideoCodecType::kVideoCodecVP9) {
|
if (codec_type_ == VideoCodecType::kVideoCodecVP9) {
|
||||||
test::FillEncoderConfiguration(codec_type_, 1, &config);
|
test::FillEncoderConfiguration(codec_type_, 1, &config);
|
||||||
config.max_bitrate_bps = kSimulcastTargetBitrate.bps();
|
config.max_bitrate_bps = kSimulcastTargetBitrate.bps();
|
||||||
@ -9048,11 +9007,7 @@ TEST_P(VideoStreamEncoderWithRealEncoderTest, HandlesLayerToggling) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
config.video_stream_factory =
|
config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
CodecTypeToPayloadString(codec_type_), /*max qp*/ 56,
|
|
||||||
/*screencast*/ false,
|
|
||||||
/*screenshare enabled*/ false, encoder_info);
|
|
||||||
video_stream_encoder_->OnBitrateUpdatedAndWaitForManagedResources(
|
video_stream_encoder_->OnBitrateUpdatedAndWaitForManagedResources(
|
||||||
kSimulcastTargetBitrate, kSimulcastTargetBitrate, kSimulcastTargetBitrate,
|
kSimulcastTargetBitrate, kSimulcastTargetBitrate, kSimulcastTargetBitrate,
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
@ -9169,15 +9124,10 @@ class ReconfigureEncoderTest : public VideoStreamEncoderTest {
|
|||||||
|
|
||||||
void ConfigureEncoder(const VideoStream& stream) {
|
void ConfigureEncoder(const VideoStream& stream) {
|
||||||
VideoEncoderConfig config;
|
VideoEncoderConfig config;
|
||||||
webrtc::VideoEncoder::EncoderInfo encoder_info;
|
|
||||||
|
|
||||||
test::FillEncoderConfiguration(kVideoCodecVP8, /*num_streams=*/1, &config);
|
test::FillEncoderConfiguration(kVideoCodecVP8, /*num_streams=*/1, &config);
|
||||||
config.max_bitrate_bps = stream.max_bitrate_bps;
|
config.max_bitrate_bps = stream.max_bitrate_bps;
|
||||||
config.simulcast_layers[0] = stream;
|
config.simulcast_layers[0] = stream;
|
||||||
config.video_stream_factory =
|
config.video_stream_factory = nullptr;
|
||||||
rtc::make_ref_counted<cricket::EncoderStreamFactory>(
|
|
||||||
/*codec_name=*/"VP8", /*max_qp=*/0, /*is_screenshare=*/false,
|
|
||||||
/*conference_mode=*/false, encoder_info);
|
|
||||||
video_stream_encoder_->ConfigureEncoder(std::move(config),
|
video_stream_encoder_->ConfigureEncoder(std::move(config),
|
||||||
kMaxPayloadLength);
|
kMaxPayloadLength);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user