* 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}
83 lines
2.9 KiB
C++
83 lines
2.9 KiB
C++
/*
|
|
* Copyright (c) 2022 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.
|
|
*/
|
|
|
|
#include "video/config/encoder_stream_factory.h"
|
|
|
|
#include "call/adaptation/video_source_restrictions.h"
|
|
#include "test/explicit_key_value_config.h"
|
|
#include "test/gtest.h"
|
|
|
|
namespace webrtc {
|
|
namespace {
|
|
|
|
using ::cricket::EncoderStreamFactory;
|
|
using test::ExplicitKeyValueConfig;
|
|
|
|
std::vector<Resolution> GetStreamResolutions(
|
|
const std::vector<VideoStream>& streams) {
|
|
std::vector<Resolution> res;
|
|
for (const auto& s : streams) {
|
|
if (s.active) {
|
|
res.push_back(
|
|
{rtc::checked_cast<int>(s.width), rtc::checked_cast<int>(s.height)});
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
|
|
VideoStream LayerWithRequestedResolution(Resolution res) {
|
|
VideoStream s;
|
|
s.requested_resolution = res;
|
|
return s;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
TEST(EncoderStreamFactory, SinglecastRequestedResolution) {
|
|
ExplicitKeyValueConfig field_trials("");
|
|
VideoEncoder::EncoderInfo encoder_info;
|
|
auto factory = rtc::make_ref_counted<EncoderStreamFactory>(encoder_info);
|
|
VideoEncoderConfig encoder_config;
|
|
encoder_config.number_of_streams = 1;
|
|
encoder_config.simulcast_layers.push_back(
|
|
LayerWithRequestedResolution({.width = 640, .height = 360}));
|
|
auto streams =
|
|
factory->CreateEncoderStreams(field_trials, 1280, 720, encoder_config);
|
|
EXPECT_EQ(streams[0].requested_resolution,
|
|
(Resolution{.width = 640, .height = 360}));
|
|
EXPECT_EQ(GetStreamResolutions(streams), (std::vector<Resolution>{
|
|
{.width = 640, .height = 360},
|
|
}));
|
|
}
|
|
|
|
TEST(EncoderStreamFactory, SinglecastRequestedResolutionWithAdaptation) {
|
|
ExplicitKeyValueConfig field_trials("");
|
|
VideoSourceRestrictions restrictions(
|
|
/* max_pixels_per_frame= */ (320 * 320),
|
|
/* target_pixels_per_frame= */ absl::nullopt,
|
|
/* max_frame_rate= */ absl::nullopt);
|
|
VideoEncoder::EncoderInfo encoder_info;
|
|
auto factory =
|
|
rtc::make_ref_counted<EncoderStreamFactory>(encoder_info, restrictions);
|
|
VideoEncoderConfig encoder_config;
|
|
encoder_config.number_of_streams = 1;
|
|
encoder_config.simulcast_layers.push_back(
|
|
LayerWithRequestedResolution({.width = 640, .height = 360}));
|
|
auto streams =
|
|
factory->CreateEncoderStreams(field_trials, 1280, 720, encoder_config);
|
|
EXPECT_EQ(streams[0].requested_resolution,
|
|
(Resolution{.width = 640, .height = 360}));
|
|
EXPECT_EQ(GetStreamResolutions(streams), (std::vector<Resolution>{
|
|
{.width = 320, .height = 180},
|
|
}));
|
|
}
|
|
|
|
} // namespace webrtc
|