blob: cb6dcb24a162c1c78025a4174673e99a8a04ec1a [file] [log] [blame]
pbos@webrtc.org7e686932014-05-15 09:35:061/*
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 */
10#include "webrtc/config.h"
11
12#include <sstream>
13#include <string>
14
kthelgason4cc4a8d2016-09-27 10:52:0215#include "webrtc/base/checks.h"
16
pbos@webrtc.org7e686932014-05-15 09:35:0617namespace webrtc {
solenberg5a37e3e2016-06-14 17:02:4118std::string NackConfig::ToString() const {
19 std::stringstream ss;
20 ss << "{rtp_history_ms: " << rtp_history_ms;
21 ss << '}';
22 return ss.str();
23}
24
brandtrd984c572016-10-05 06:28:3925std::string UlpfecConfig::ToString() const {
pbos@webrtc.org7e686932014-05-15 09:35:0626 std::stringstream ss;
27 ss << "{ulpfec_payload_type: " << ulpfec_payload_type;
28 ss << ", red_payload_type: " << red_payload_type;
Stefan Holmer75851e02016-02-03 12:29:5929 ss << ", red_rtx_payload_type: " << red_rtx_payload_type;
pbos@webrtc.org7e686932014-05-15 09:35:0630 ss << '}';
31 return ss.str();
32}
33
brandtr056bdda2016-11-22 10:16:4734bool UlpfecConfig::operator==(const UlpfecConfig& other) const {
35 return ulpfec_payload_type == other.ulpfec_payload_type &&
36 red_payload_type == other.red_payload_type &&
37 red_rtx_payload_type == other.red_rtx_payload_type;
38}
39
solenberg91c6f342016-10-25 18:19:0740FlexfecConfig::FlexfecConfig()
41 : flexfec_payload_type(-1), flexfec_ssrc(0), protected_media_ssrcs() {}
42
43FlexfecConfig::~FlexfecConfig() = default;
44
brandtr4e974392016-10-20 11:54:4845std::string FlexfecConfig::ToString() const {
46 std::stringstream ss;
47 ss << "{flexfec_payload_type: " << flexfec_payload_type;
48 ss << ", flexfec_ssrc: " << flexfec_ssrc;
49 ss << ", protected_media_ssrcs: [";
50 size_t i = 0;
51 for (; i + 1 < protected_media_ssrcs.size(); ++i)
52 ss << protected_media_ssrcs[i] << ", ";
53 if (!protected_media_ssrcs.empty())
54 ss << protected_media_ssrcs[i];
55 ss << "]}";
56 return ss.str();
57}
58
brandtr056bdda2016-11-22 10:16:4759bool FlexfecConfig::IsCompleteAndEnabled() const {
60 // Check if FlexFEC is enabled.
61 if (flexfec_payload_type < 0)
62 return false;
63 // Do we have the necessary SSRC information?
64 if (flexfec_ssrc == 0)
65 return false;
66 // TODO(brandtr): Update this check when we support multistream protection.
67 if (protected_media_ssrcs.size() != 1u)
68 return false;
69 return true;
70}
71
72bool FlexfecConfig::operator==(const FlexfecConfig& other) const {
73 return flexfec_payload_type == other.flexfec_payload_type &&
74 flexfec_ssrc == other.flexfec_ssrc &&
75 protected_media_ssrcs == other.protected_media_ssrcs;
76}
77
pbos@webrtc.org7e686932014-05-15 09:35:0678std::string RtpExtension::ToString() const {
79 std::stringstream ss;
isheriffc4921f42016-05-26 18:24:5580 ss << "{uri: " << uri;
pbos@webrtc.org7e686932014-05-15 09:35:0681 ss << ", id: " << id;
82 ss << '}';
83 return ss.str();
84}
85
isheriffc4921f42016-05-26 18:24:5586const char* RtpExtension::kAudioLevelUri =
Fredrik Solenbergad867862015-04-29 13:24:0187 "urn:ietf:params:rtp-hdrext:ssrc-audio-level";
isheriffc4921f42016-05-26 18:24:5588const int RtpExtension::kAudioLevelDefaultId = 1;
Fredrik Solenbergad867862015-04-29 13:24:0189
isheriffc4921f42016-05-26 18:24:5590const char* RtpExtension::kTimestampOffsetUri =
91 "urn:ietf:params:rtp-hdrext:toffset";
92const int RtpExtension::kTimestampOffsetDefaultId = 2;
93
94const char* RtpExtension::kAbsSendTimeUri =
95 "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time";
96const int RtpExtension::kAbsSendTimeDefaultId = 3;
97
98const char* RtpExtension::kVideoRotationUri = "urn:3gpp:video-orientation";
99const int RtpExtension::kVideoRotationDefaultId = 4;
100
101const char* RtpExtension::kTransportSequenceNumberUri =
102 "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01";
103const int RtpExtension::kTransportSequenceNumberDefaultId = 5;
104
isheriff00cc0452016-06-08 07:24:21105// This extension allows applications to adaptively limit the playout delay
106// on frames as per the current needs. For example, a gaming application
107// has very different needs on end-to-end delay compared to a video-conference
108// application.
109const char* RtpExtension::kPlayoutDelayUri =
110 "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay";
111const int RtpExtension::kPlayoutDelayDefaultId = 6;
112
isheriffc4921f42016-05-26 18:24:55113bool RtpExtension::IsSupportedForAudio(const std::string& uri) {
solenbergac14ca22016-11-17 14:26:52114 return uri == webrtc::RtpExtension::kAudioLevelUri ||
isheriffc4921f42016-05-26 18:24:55115 uri == webrtc::RtpExtension::kTransportSequenceNumberUri;
Fredrik Solenbergad867862015-04-29 13:24:01116}
117
isheriffc4921f42016-05-26 18:24:55118bool RtpExtension::IsSupportedForVideo(const std::string& uri) {
119 return uri == webrtc::RtpExtension::kTimestampOffsetUri ||
120 uri == webrtc::RtpExtension::kAbsSendTimeUri ||
121 uri == webrtc::RtpExtension::kVideoRotationUri ||
isheriff00cc0452016-06-08 07:24:21122 uri == webrtc::RtpExtension::kTransportSequenceNumberUri ||
123 uri == webrtc::RtpExtension::kPlayoutDelayUri;
Fredrik Solenbergad867862015-04-29 13:24:01124}
125
kwiberg@webrtc.orgc4e2cd02015-02-26 13:59:22126VideoStream::VideoStream()
127 : width(0),
128 height(0),
129 max_framerate(-1),
130 min_bitrate_bps(-1),
131 target_bitrate_bps(-1),
132 max_bitrate_bps(-1),
133 max_qp(-1) {}
134
135VideoStream::~VideoStream() = default;
136
pbos@webrtc.org7e686932014-05-15 09:35:06137std::string VideoStream::ToString() const {
138 std::stringstream ss;
139 ss << "{width: " << width;
140 ss << ", height: " << height;
141 ss << ", max_framerate: " << max_framerate;
142 ss << ", min_bitrate_bps:" << min_bitrate_bps;
143 ss << ", target_bitrate_bps:" << target_bitrate_bps;
144 ss << ", max_bitrate_bps:" << max_bitrate_bps;
145 ss << ", max_qp: " << max_qp;
146
pbos@webrtc.org98dd0b82014-11-06 09:35:08147 ss << ", temporal_layer_thresholds_bps: [";
pbos@webrtc.orgddb84aa2014-10-31 13:08:10148 for (size_t i = 0; i < temporal_layer_thresholds_bps.size(); ++i) {
149 ss << temporal_layer_thresholds_bps[i];
150 if (i != temporal_layer_thresholds_bps.size() - 1)
pbos@webrtc.org98dd0b82014-11-06 09:35:08151 ss << ", ";
pbos@webrtc.org7e686932014-05-15 09:35:06152 }
pbos@webrtc.org98dd0b82014-11-06 09:35:08153 ss << ']';
pbos@webrtc.org7e686932014-05-15 09:35:06154
155 ss << '}';
156 return ss.str();
157}
pbos@webrtc.org23668752014-10-24 09:23:21158
kwiberg@webrtc.orgc4e2cd02015-02-26 13:59:22159VideoEncoderConfig::VideoEncoderConfig()
Erik Språngfc398fe2015-04-28 08:01:41160 : content_type(ContentType::kRealtimeVideo),
kthelgason4cc4a8d2016-09-27 10:52:02161 encoder_specific_settings(nullptr),
skvlad48be0542016-06-16 19:08:03162 min_transmit_bitrate_bps(0),
perkj730a9e72016-10-03 06:45:26163 max_bitrate_bps(0),
164 number_of_streams(0) {}
kwiberg@webrtc.orgc4e2cd02015-02-26 13:59:22165
solenberg91c6f342016-10-25 18:19:07166VideoEncoderConfig::VideoEncoderConfig(VideoEncoderConfig&&) = default;
167
kwiberg@webrtc.orgc4e2cd02015-02-26 13:59:22168VideoEncoderConfig::~VideoEncoderConfig() = default;
169
pbos@webrtc.org23668752014-10-24 09:23:21170std::string VideoEncoderConfig::ToString() const {
171 std::stringstream ss;
perkj730a9e72016-10-03 06:45:26172 ss << "{content_type: ";
pbos@webrtc.org23668752014-10-24 09:23:21173 switch (content_type) {
Erik Språngfc398fe2015-04-28 08:01:41174 case ContentType::kRealtimeVideo:
pbos@webrtc.org23668752014-10-24 09:23:21175 ss << "kRealtimeVideo";
176 break;
Erik Språngfc398fe2015-04-28 08:01:41177 case ContentType::kScreen:
pbos@webrtc.org23668752014-10-24 09:23:21178 ss << "kScreenshare";
179 break;
180 }
181 ss << ", encoder_specific_settings: ";
182 ss << (encoder_specific_settings != NULL ? "(ptr)" : "NULL");
183
184 ss << ", min_transmit_bitrate_bps: " << min_transmit_bitrate_bps;
185 ss << '}';
186 return ss.str();
187}
188
solenberg91c6f342016-10-25 18:19:07189VideoEncoderConfig::VideoEncoderConfig(const VideoEncoderConfig&) = default;
190
kthelgason4cc4a8d2016-09-27 10:52:02191void VideoEncoderConfig::EncoderSpecificSettings::FillEncoderSpecificSettings(
192 VideoCodec* codec) const {
193 if (codec->codecType == kVideoCodecH264) {
hta8ee78142016-11-17 07:23:04194 FillVideoCodecH264(codec->H264());
kthelgason4cc4a8d2016-09-27 10:52:02195 } else if (codec->codecType == kVideoCodecVP8) {
hta8ee78142016-11-17 07:23:04196 FillVideoCodecVp8(codec->VP8());
kthelgason4cc4a8d2016-09-27 10:52:02197 } else if (codec->codecType == kVideoCodecVP9) {
hta8ee78142016-11-17 07:23:04198 FillVideoCodecVp9(codec->VP9());
kthelgason4cc4a8d2016-09-27 10:52:02199 } else {
200 RTC_NOTREACHED() << "Encoder specifics set/used for unknown codec type.";
201 }
202}
203
204void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecH264(
205 VideoCodecH264* h264_settings) const {
206 RTC_NOTREACHED();
207}
208
209void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecVp8(
210 VideoCodecVP8* vp8_settings) const {
211 RTC_NOTREACHED();
212}
213
214void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecVp9(
215 VideoCodecVP9* vp9_settings) const {
216 RTC_NOTREACHED();
217}
218
219VideoEncoderConfig::H264EncoderSpecificSettings::H264EncoderSpecificSettings(
220 const VideoCodecH264& specifics)
221 : specifics_(specifics) {}
222
223void VideoEncoderConfig::H264EncoderSpecificSettings::FillVideoCodecH264(
224 VideoCodecH264* h264_settings) const {
225 *h264_settings = specifics_;
226}
227
228VideoEncoderConfig::Vp8EncoderSpecificSettings::Vp8EncoderSpecificSettings(
229 const VideoCodecVP8& specifics)
230 : specifics_(specifics) {}
231
232void VideoEncoderConfig::Vp8EncoderSpecificSettings::FillVideoCodecVp8(
233 VideoCodecVP8* vp8_settings) const {
234 *vp8_settings = specifics_;
235}
236
237VideoEncoderConfig::Vp9EncoderSpecificSettings::Vp9EncoderSpecificSettings(
238 const VideoCodecVP9& specifics)
239 : specifics_(specifics) {}
240
241void VideoEncoderConfig::Vp9EncoderSpecificSettings::FillVideoCodecVp9(
242 VideoCodecVP9* vp9_settings) const {
243 *vp9_settings = specifics_;
244}
245
pbos@webrtc.org7e686932014-05-15 09:35:06246} // namespace webrtc