blob: ec4aad7a9e0350752cab261fac363e0770d25e38 [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
12#include <algorithm>
Stefan Holmer1acbd682017-09-01 15:29:28 +020013#include <string>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "rtc_base/checks.h"
Jonas Olsson0a713b62018-04-04 15:49:32 +020016#include "rtc_base/strings/string_builder.h"
Stefan Holmer1acbd682017-09-01 15:29:28 +020017
18namespace webrtc {
19VideoStream::VideoStream()
20 : width(0),
21 height(0),
22 max_framerate(-1),
23 min_bitrate_bps(-1),
24 target_bitrate_bps(-1),
25 max_bitrate_bps(-1),
Seth Hampsondfe9ffc2018-01-08 11:41:14 -080026 max_qp(-1),
27 active(true) {}
Seth Hampson36193c32017-12-14 11:41:18 -080028VideoStream::VideoStream(const VideoStream& other) = default;
Stefan Holmer1acbd682017-09-01 15:29:28 +020029
30VideoStream::~VideoStream() = default;
31
32std::string VideoStream::ToString() const {
Jonas Olsson0a713b62018-04-04 15:49:32 +020033 char buf[1024];
34 rtc::SimpleStringBuilder ss(buf);
Stefan Holmer1acbd682017-09-01 15:29:28 +020035 ss << "{width: " << width;
36 ss << ", height: " << height;
37 ss << ", max_framerate: " << max_framerate;
38 ss << ", min_bitrate_bps:" << min_bitrate_bps;
39 ss << ", target_bitrate_bps:" << target_bitrate_bps;
40 ss << ", max_bitrate_bps:" << max_bitrate_bps;
41 ss << ", max_qp: " << max_qp;
Sergey Silkina796a7e2018-03-01 15:11:29 +010042 ss << ", num_temporal_layers: " << num_temporal_layers.value_or(0);
43 ss << ", bitrate_priority: " << bitrate_priority.value_or(0);
Seth Hampsondfe9ffc2018-01-08 11:41:14 -080044 ss << ", active: " << active;
Stefan Holmer1acbd682017-09-01 15:29:28 +020045
Stefan Holmer1acbd682017-09-01 15:29:28 +020046 return ss.str();
47}
48
49VideoEncoderConfig::VideoEncoderConfig()
Niels Möller24a842a2018-03-22 08:52:50 +010050 : codec_type(kVideoCodecUnknown),
Niels Möller6dfc8d62018-04-17 12:51:59 +020051 video_format("Unset"),
Niels Möller24a842a2018-03-22 08:52:50 +010052 content_type(ContentType::kRealtimeVideo),
Stefan Holmer1acbd682017-09-01 15:29:28 +020053 encoder_specific_settings(nullptr),
54 min_transmit_bitrate_bps(0),
55 max_bitrate_bps(0),
Seth Hampsonf32795e2017-12-19 11:37:41 -080056 bitrate_priority(1.0),
Stefan Holmer1acbd682017-09-01 15:29:28 +020057 number_of_streams(0) {}
58
59VideoEncoderConfig::VideoEncoderConfig(VideoEncoderConfig&&) = default;
60
61VideoEncoderConfig::~VideoEncoderConfig() = default;
62
63std::string VideoEncoderConfig::ToString() const {
Jonas Olsson0a713b62018-04-04 15:49:32 +020064 char buf[1024];
65 rtc::SimpleStringBuilder ss(buf);
Niels Möller24a842a2018-03-22 08:52:50 +010066 ss << "{codec_type: ";
67 ss << CodecTypeToPayloadString(codec_type);
68 ss << ", content_type: ";
Stefan Holmer1acbd682017-09-01 15:29:28 +020069 switch (content_type) {
70 case ContentType::kRealtimeVideo:
71 ss << "kRealtimeVideo";
72 break;
73 case ContentType::kScreen:
74 ss << "kScreenshare";
75 break;
76 }
77 ss << ", encoder_specific_settings: ";
78 ss << (encoder_specific_settings != NULL ? "(ptr)" : "NULL");
79
80 ss << ", min_transmit_bitrate_bps: " << min_transmit_bitrate_bps;
81 ss << '}';
82 return ss.str();
83}
84
85VideoEncoderConfig::VideoEncoderConfig(const VideoEncoderConfig&) = default;
86
87void VideoEncoderConfig::EncoderSpecificSettings::FillEncoderSpecificSettings(
88 VideoCodec* codec) const {
89 if (codec->codecType == kVideoCodecH264) {
90 FillVideoCodecH264(codec->H264());
91 } else if (codec->codecType == kVideoCodecVP8) {
92 FillVideoCodecVp8(codec->VP8());
93 } else if (codec->codecType == kVideoCodecVP9) {
94 FillVideoCodecVp9(codec->VP9());
95 } else {
96 RTC_NOTREACHED() << "Encoder specifics set/used for unknown codec type.";
97 }
98}
99
100void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecH264(
101 VideoCodecH264* h264_settings) const {
102 RTC_NOTREACHED();
103}
104
105void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecVp8(
106 VideoCodecVP8* vp8_settings) const {
107 RTC_NOTREACHED();
108}
109
110void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecVp9(
111 VideoCodecVP9* vp9_settings) const {
112 RTC_NOTREACHED();
113}
114
115VideoEncoderConfig::H264EncoderSpecificSettings::H264EncoderSpecificSettings(
116 const VideoCodecH264& specifics)
117 : specifics_(specifics) {}
118
119void VideoEncoderConfig::H264EncoderSpecificSettings::FillVideoCodecH264(
120 VideoCodecH264* h264_settings) const {
121 *h264_settings = specifics_;
122}
123
124VideoEncoderConfig::Vp8EncoderSpecificSettings::Vp8EncoderSpecificSettings(
125 const VideoCodecVP8& specifics)
126 : specifics_(specifics) {}
127
128void VideoEncoderConfig::Vp8EncoderSpecificSettings::FillVideoCodecVp8(
129 VideoCodecVP8* vp8_settings) const {
130 *vp8_settings = specifics_;
131}
132
133VideoEncoderConfig::Vp9EncoderSpecificSettings::Vp9EncoderSpecificSettings(
134 const VideoCodecVP9& specifics)
135 : specifics_(specifics) {}
136
137void VideoEncoderConfig::Vp9EncoderSpecificSettings::FillVideoCodecVp9(
138 VideoCodecVP9* vp9_settings) const {
139 *vp9_settings = specifics_;
140}
141
142} // namespace webrtc