blob: 0cc9ce51aea74ce4cb4a6d6282d3528d95b77a95 [file] [log] [blame]
Stefan Holmer1acbd682017-09-01 15:29:28 +02001/*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
Niels Möller0a8f4352018-05-18 11:37:23 +020010#include "api/video_codecs/video_encoder_config.h"
Stefan Holmer1acbd682017-09-01 15:29:28 +020011
Stefan Holmer1acbd682017-09-01 15:29:28 +020012#include <string>
13
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "rtc_base/checks.h"
Jonas Olsson0a713b62018-04-04 15:49:32 +020015#include "rtc_base/strings/string_builder.h"
Stefan Holmer1acbd682017-09-01 15:29:28 +020016
17namespace webrtc {
18VideoStream::VideoStream()
19 : width(0),
20 height(0),
21 max_framerate(-1),
22 min_bitrate_bps(-1),
23 target_bitrate_bps(-1),
24 max_bitrate_bps(-1),
Florent Castellic1a0bcb2019-01-29 14:26:48 +010025 scale_resolution_down_by(-1.),
Seth Hampsondfe9ffc2018-01-08 11:41:14 -080026 max_qp(-1),
Rasmus Brandt43bfe0b2020-01-21 13:54:11 +010027 num_temporal_layers(absl::nullopt),
Seth Hampsondfe9ffc2018-01-08 11:41:14 -080028 active(true) {}
Seth Hampson36193c32017-12-14 11:41:18 -080029VideoStream::VideoStream(const VideoStream& other) = default;
Stefan Holmer1acbd682017-09-01 15:29:28 +020030
31VideoStream::~VideoStream() = default;
32
33std::string VideoStream::ToString() const {
Jonas Olsson0a713b62018-04-04 15:49:32 +020034 char buf[1024];
35 rtc::SimpleStringBuilder ss(buf);
Stefan Holmer1acbd682017-09-01 15:29:28 +020036 ss << "{width: " << width;
37 ss << ", height: " << height;
38 ss << ", max_framerate: " << max_framerate;
39 ss << ", min_bitrate_bps:" << min_bitrate_bps;
40 ss << ", target_bitrate_bps:" << target_bitrate_bps;
41 ss << ", max_bitrate_bps:" << max_bitrate_bps;
42 ss << ", max_qp: " << max_qp;
Rasmus Brandt43bfe0b2020-01-21 13:54:11 +010043 ss << ", num_temporal_layers: " << num_temporal_layers.value_or(1);
Sergey Silkina796a7e2018-03-01 15:11:29 +010044 ss << ", bitrate_priority: " << bitrate_priority.value_or(0);
Seth Hampsondfe9ffc2018-01-08 11:41:14 -080045 ss << ", active: " << active;
Åsa Perssonc5a74ff2020-09-20 17:50:00 +020046 ss << ", scale_down_by: " << scale_resolution_down_by;
Stefan Holmer1acbd682017-09-01 15:29:28 +020047
Stefan Holmer1acbd682017-09-01 15:29:28 +020048 return ss.str();
49}
50
51VideoEncoderConfig::VideoEncoderConfig()
Kári Tristan Helgason84ccb2d2018-08-16 14:35:26 +020052 : codec_type(kVideoCodecGeneric),
Niels Möller6dfc8d62018-04-17 12:51:59 +020053 video_format("Unset"),
Niels Möller24a842a2018-03-22 08:52:50 +010054 content_type(ContentType::kRealtimeVideo),
Niels Möller807328f2022-05-12 16:16:39 +020055 frame_drop_enabled(false),
Stefan Holmer1acbd682017-09-01 15:29:28 +020056 encoder_specific_settings(nullptr),
57 min_transmit_bitrate_bps(0),
58 max_bitrate_bps(0),
Seth Hampsonf32795e2017-12-19 11:37:41 -080059 bitrate_priority(1.0),
Florent Castellid3511012020-08-04 11:40:23 +020060 number_of_streams(0),
Sergey Silkind19e3b92021-03-16 10:05:30 +000061 legacy_conference_mode(false),
62 is_quality_scaling_allowed(false) {}
Stefan Holmer1acbd682017-09-01 15:29:28 +020063
64VideoEncoderConfig::VideoEncoderConfig(VideoEncoderConfig&&) = default;
65
66VideoEncoderConfig::~VideoEncoderConfig() = default;
67
68std::string VideoEncoderConfig::ToString() const {
Jonas Olsson0a713b62018-04-04 15:49:32 +020069 char buf[1024];
70 rtc::SimpleStringBuilder ss(buf);
Niels Möller24a842a2018-03-22 08:52:50 +010071 ss << "{codec_type: ";
72 ss << CodecTypeToPayloadString(codec_type);
73 ss << ", content_type: ";
Stefan Holmer1acbd682017-09-01 15:29:28 +020074 switch (content_type) {
75 case ContentType::kRealtimeVideo:
76 ss << "kRealtimeVideo";
77 break;
78 case ContentType::kScreen:
79 ss << "kScreenshare";
80 break;
81 }
Niels Möller807328f2022-05-12 16:16:39 +020082 ss << ", frame_drop_enabled: " << frame_drop_enabled;
Stefan Holmer1acbd682017-09-01 15:29:28 +020083 ss << ", encoder_specific_settings: ";
Niels Möllerdf209e72022-04-25 16:59:19 +020084 ss << (encoder_specific_settings != nullptr ? "(ptr)" : "NULL");
Stefan Holmer1acbd682017-09-01 15:29:28 +020085
86 ss << ", min_transmit_bitrate_bps: " << min_transmit_bitrate_bps;
87 ss << '}';
88 return ss.str();
89}
90
91VideoEncoderConfig::VideoEncoderConfig(const VideoEncoderConfig&) = default;
92
93void VideoEncoderConfig::EncoderSpecificSettings::FillEncoderSpecificSettings(
94 VideoCodec* codec) const {
95 if (codec->codecType == kVideoCodecH264) {
96 FillVideoCodecH264(codec->H264());
97 } else if (codec->codecType == kVideoCodecVP8) {
98 FillVideoCodecVp8(codec->VP8());
99 } else if (codec->codecType == kVideoCodecVP9) {
100 FillVideoCodecVp9(codec->VP9());
101 } else {
Artem Titovd3251962021-11-15 16:57:07 +0100102 RTC_DCHECK_NOTREACHED()
103 << "Encoder specifics set/used for unknown codec type.";
Stefan Holmer1acbd682017-09-01 15:29:28 +0200104 }
105}
106
107void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecH264(
108 VideoCodecH264* h264_settings) const {
Artem Titovd3251962021-11-15 16:57:07 +0100109 RTC_DCHECK_NOTREACHED();
Stefan Holmer1acbd682017-09-01 15:29:28 +0200110}
111
112void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecVp8(
113 VideoCodecVP8* vp8_settings) const {
Artem Titovd3251962021-11-15 16:57:07 +0100114 RTC_DCHECK_NOTREACHED();
Stefan Holmer1acbd682017-09-01 15:29:28 +0200115}
116
117void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecVp9(
118 VideoCodecVP9* vp9_settings) const {
Artem Titovd3251962021-11-15 16:57:07 +0100119 RTC_DCHECK_NOTREACHED();
Stefan Holmer1acbd682017-09-01 15:29:28 +0200120}
121
122VideoEncoderConfig::H264EncoderSpecificSettings::H264EncoderSpecificSettings(
123 const VideoCodecH264& specifics)
124 : specifics_(specifics) {}
125
126void VideoEncoderConfig::H264EncoderSpecificSettings::FillVideoCodecH264(
127 VideoCodecH264* h264_settings) const {
128 *h264_settings = specifics_;
129}
130
131VideoEncoderConfig::Vp8EncoderSpecificSettings::Vp8EncoderSpecificSettings(
132 const VideoCodecVP8& specifics)
133 : specifics_(specifics) {}
134
135void VideoEncoderConfig::Vp8EncoderSpecificSettings::FillVideoCodecVp8(
136 VideoCodecVP8* vp8_settings) const {
137 *vp8_settings = specifics_;
138}
139
140VideoEncoderConfig::Vp9EncoderSpecificSettings::Vp9EncoderSpecificSettings(
141 const VideoCodecVP9& specifics)
142 : specifics_(specifics) {}
143
144void VideoEncoderConfig::Vp9EncoderSpecificSettings::FillVideoCodecVp9(
145 VideoCodecVP9* vp9_settings) const {
146 *vp9_settings = specifics_;
147}
148
149} // namespace webrtc