mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 22:00:47 +01:00

This cl/ implements configuring of encode resolution in the video_stream_encoder (webrtc_video_engine) in a way that is independent of frame resolution (i.e not using scale_resolution_down_by). The cl/ reuses the VideoAdapter as is, and hence the output resolution will be the same as it is today. Anticipated further patches 3) Hook up resource adaptation 4) Let VideoSource do adaption if possible Bug: webrtc:14451 Change-Id: I881b031c5b23be26cacfe138730154f1cb1b66a8 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/276742 Reviewed-by: Artem Titov <titovartem@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Henrik Boström <hbos@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Reviewed-by: Rasmus Brandt <brandtr@webrtc.org> Commit-Queue: Jonas Oreland <jonaso@webrtc.org> Cr-Commit-Position: refs/heads/main@{#38245}
149 lines
5.5 KiB
C++
149 lines
5.5 KiB
C++
/*
|
|
* Copyright (c) 2014 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 "test/encoder_settings.h"
|
|
|
|
#include <algorithm>
|
|
|
|
#include "api/scoped_refptr.h"
|
|
#include "api/video_codecs/sdp_video_format.h"
|
|
#include "call/rtp_config.h"
|
|
#include "rtc_base/checks.h"
|
|
|
|
namespace webrtc {
|
|
namespace test {
|
|
|
|
const size_t DefaultVideoStreamFactory::kMaxNumberOfStreams;
|
|
const int DefaultVideoStreamFactory::kMaxBitratePerStream[] = {150000, 450000,
|
|
1500000};
|
|
const int DefaultVideoStreamFactory::kDefaultMinBitratePerStream[] = {
|
|
30000, 200000, 700000};
|
|
|
|
// static
|
|
std::vector<VideoStream> CreateVideoStreams(
|
|
int width,
|
|
int height,
|
|
const webrtc::VideoEncoderConfig& encoder_config) {
|
|
RTC_DCHECK(encoder_config.number_of_streams <=
|
|
DefaultVideoStreamFactory::kMaxNumberOfStreams);
|
|
|
|
std::vector<VideoStream> stream_settings(encoder_config.number_of_streams);
|
|
|
|
int bitrate_left_bps = 0;
|
|
if (encoder_config.max_bitrate_bps > 0) {
|
|
bitrate_left_bps = encoder_config.max_bitrate_bps;
|
|
} else {
|
|
for (size_t stream_num = 0; stream_num < encoder_config.number_of_streams;
|
|
++stream_num) {
|
|
bitrate_left_bps +=
|
|
DefaultVideoStreamFactory::kMaxBitratePerStream[stream_num];
|
|
}
|
|
}
|
|
|
|
for (size_t i = 0; i < encoder_config.number_of_streams; ++i) {
|
|
stream_settings[i].width =
|
|
(i + 1) * width / encoder_config.number_of_streams;
|
|
stream_settings[i].height =
|
|
(i + 1) * height / encoder_config.number_of_streams;
|
|
stream_settings[i].max_framerate = 30;
|
|
stream_settings[i].max_qp = 56;
|
|
stream_settings[i].min_bitrate_bps =
|
|
DefaultVideoStreamFactory::kDefaultMinBitratePerStream[i];
|
|
|
|
// Use configured values instead of default values if set.
|
|
const VideoStream stream = (i < encoder_config.simulcast_layers.size())
|
|
? encoder_config.simulcast_layers[i]
|
|
: VideoStream();
|
|
|
|
int max_bitrate_bps =
|
|
stream.max_bitrate_bps > 0
|
|
? stream.max_bitrate_bps
|
|
: DefaultVideoStreamFactory::kMaxBitratePerStream[i];
|
|
max_bitrate_bps = std::min(bitrate_left_bps, max_bitrate_bps);
|
|
|
|
int target_bitrate_bps = stream.target_bitrate_bps > 0
|
|
? stream.target_bitrate_bps
|
|
: max_bitrate_bps;
|
|
target_bitrate_bps = std::min(max_bitrate_bps, target_bitrate_bps);
|
|
|
|
if (stream.min_bitrate_bps > 0) {
|
|
RTC_DCHECK_LE(stream.min_bitrate_bps, target_bitrate_bps);
|
|
stream_settings[i].min_bitrate_bps = stream.min_bitrate_bps;
|
|
}
|
|
if (stream.max_framerate > 0) {
|
|
stream_settings[i].max_framerate = stream.max_framerate;
|
|
}
|
|
if (stream.num_temporal_layers) {
|
|
RTC_DCHECK_GE(*stream.num_temporal_layers, 1);
|
|
stream_settings[i].num_temporal_layers = stream.num_temporal_layers;
|
|
}
|
|
if (stream.scale_resolution_down_by >= 1.0) {
|
|
stream_settings[i].width = width / stream.scale_resolution_down_by;
|
|
stream_settings[i].height = height / stream.scale_resolution_down_by;
|
|
}
|
|
stream_settings[i].scalability_mode = stream.scalability_mode;
|
|
stream_settings[i].target_bitrate_bps = target_bitrate_bps;
|
|
stream_settings[i].max_bitrate_bps = max_bitrate_bps;
|
|
stream_settings[i].active =
|
|
encoder_config.number_of_streams == 1 || stream.active;
|
|
|
|
bitrate_left_bps -= stream_settings[i].target_bitrate_bps;
|
|
}
|
|
|
|
stream_settings[encoder_config.number_of_streams - 1].max_bitrate_bps +=
|
|
bitrate_left_bps;
|
|
stream_settings[0].bitrate_priority = encoder_config.bitrate_priority;
|
|
|
|
return stream_settings;
|
|
}
|
|
|
|
DefaultVideoStreamFactory::DefaultVideoStreamFactory() {}
|
|
|
|
std::vector<VideoStream> DefaultVideoStreamFactory::CreateEncoderStreams(
|
|
int frame_width,
|
|
int frame_height,
|
|
const webrtc::VideoEncoderConfig& encoder_config) {
|
|
return CreateVideoStreams(frame_width, frame_height, encoder_config);
|
|
}
|
|
|
|
void FillEncoderConfiguration(VideoCodecType codec_type,
|
|
size_t num_streams,
|
|
VideoEncoderConfig* configuration) {
|
|
RTC_DCHECK_LE(num_streams, DefaultVideoStreamFactory::kMaxNumberOfStreams);
|
|
|
|
configuration->codec_type = codec_type;
|
|
configuration->number_of_streams = num_streams;
|
|
configuration->video_stream_factory =
|
|
rtc::make_ref_counted<DefaultVideoStreamFactory>();
|
|
configuration->max_bitrate_bps = 0;
|
|
configuration->frame_drop_enabled = true;
|
|
configuration->simulcast_layers = std::vector<VideoStream>(num_streams);
|
|
for (size_t i = 0; i < num_streams; ++i) {
|
|
configuration->max_bitrate_bps +=
|
|
DefaultVideoStreamFactory::kMaxBitratePerStream[i];
|
|
}
|
|
}
|
|
|
|
VideoReceiveStreamInterface::Decoder CreateMatchingDecoder(
|
|
int payload_type,
|
|
const std::string& payload_name) {
|
|
VideoReceiveStreamInterface::Decoder decoder;
|
|
decoder.payload_type = payload_type;
|
|
decoder.video_format = SdpVideoFormat(payload_name);
|
|
return decoder;
|
|
}
|
|
|
|
VideoReceiveStreamInterface::Decoder CreateMatchingDecoder(
|
|
const VideoSendStream::Config& config) {
|
|
return CreateMatchingDecoder(config.rtp.payload_type,
|
|
config.rtp.payload_name);
|
|
}
|
|
|
|
} // namespace test
|
|
} // namespace webrtc
|