blob: 162622e5f55124029947c585242fede1efbfbd3d [file] [log] [blame]
aleloi440b6d92017-08-22 05:43:23 -07001/*
2 * Copyright (c) 2013 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef CALL_VIDEO_SEND_STREAM_H_
12#define CALL_VIDEO_SEND_STREAM_H_
aleloi440b6d92017-08-22 05:43:23 -070013
Yves Gerey988cc082018-10-23 12:03:01 +020014#include <stdint.h>
aleloi440b6d92017-08-22 05:43:23 -070015#include <map>
16#include <string>
aleloi440b6d92017-08-22 05:43:23 -070017#include <vector>
18
Yves Gerey988cc082018-10-23 12:03:01 +020019#include "absl/types/optional.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "api/call/transport.h"
Benjamin Wright192eeec2018-10-17 17:27:25 -070021#include "api/crypto/cryptooptions.h"
Yves Gerey988cc082018-10-23 12:03:01 +020022#include "api/rtpparameters.h"
23#include "api/video/video_content_type.h"
Niels Möller88be9722018-10-10 10:58:52 +020024#include "api/video/video_frame.h"
Niels Möllerc6ce9c52018-05-11 11:15:30 +020025#include "api/video/video_sink_interface.h"
Niels Möller0327c2d2018-05-21 14:09:31 +020026#include "api/video/video_source_interface.h"
Niels Möller213618e2018-07-24 09:29:58 +020027#include "api/video/video_stream_encoder_settings.h"
Niels Möller0a8f4352018-05-18 11:37:23 +020028#include "api/video_codecs/video_encoder_config.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "call/rtp_config.h"
Mirko Bonadei71207422017-09-15 13:58:09 +020030#include "common_types.h" // NOLINT(build/include)
Patrik Höglund3e113432017-12-15 14:40:10 +010031#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
aleloi440b6d92017-08-22 05:43:23 -070032
33namespace webrtc {
34
Benjamin Wright192eeec2018-10-17 17:27:25 -070035class FrameEncryptorInterface;
36
aleloi440b6d92017-08-22 05:43:23 -070037class VideoSendStream {
38 public:
39 struct StreamStats {
40 StreamStats();
41 ~StreamStats();
42
43 std::string ToString() const;
44
45 FrameCounts frame_counts;
46 bool is_rtx = false;
47 bool is_flexfec = false;
48 int width = 0;
49 int height = 0;
50 // TODO(holmer): Move bitrate_bps out to the webrtc::Call layer.
51 int total_bitrate_bps = 0;
52 int retransmit_bitrate_bps = 0;
53 int avg_delay_ms = 0;
54 int max_delay_ms = 0;
55 StreamDataCounters rtp_stats;
56 RtcpPacketTypeCounter rtcp_packet_type_counts;
57 RtcpStatistics rtcp_stats;
58 };
59
60 struct Stats {
61 Stats();
62 ~Stats();
63 std::string ToString(int64_t time_ms) const;
64 std::string encoder_implementation_name = "unknown";
65 int input_frame_rate = 0;
66 int encode_frame_rate = 0;
67 int avg_encode_time_ms = 0;
68 int encode_usage_percent = 0;
69 uint32_t frames_encoded = 0;
Ilya Nikolaevskiyd79314f2017-10-23 10:45:37 +020070 uint32_t frames_dropped_by_capturer = 0;
71 uint32_t frames_dropped_by_encoder_queue = 0;
72 uint32_t frames_dropped_by_rate_limiter = 0;
73 uint32_t frames_dropped_by_encoder = 0;
Danil Chapovalovb9b146c2018-06-15 12:28:07 +020074 absl::optional<uint64_t> qp_sum;
aleloi440b6d92017-08-22 05:43:23 -070075 // Bitrate the encoder is currently configured to use due to bandwidth
76 // limitations.
77 int target_media_bitrate_bps = 0;
78 // Bitrate the encoder is actually producing.
79 int media_bitrate_bps = 0;
aleloi440b6d92017-08-22 05:43:23 -070080 bool suspended = false;
81 bool bw_limited_resolution = false;
82 bool cpu_limited_resolution = false;
83 bool bw_limited_framerate = false;
84 bool cpu_limited_framerate = false;
85 // Total number of times resolution as been requested to be changed due to
86 // CPU/quality adaptation.
87 int number_of_cpu_adapt_changes = 0;
88 int number_of_quality_adapt_changes = 0;
Åsa Perssonc3ed6302017-11-16 14:04:52 +010089 bool has_entered_low_resolution = false;
aleloi440b6d92017-08-22 05:43:23 -070090 std::map<uint32_t, StreamStats> substreams;
ilnik50864a82017-09-06 12:32:35 -070091 webrtc::VideoContentType content_type =
92 webrtc::VideoContentType::UNSPECIFIED;
Ilya Nikolaevskiy70473fc2018-02-28 16:35:03 +010093 uint32_t huge_frames_sent = 0;
aleloi440b6d92017-08-22 05:43:23 -070094 };
95
96 struct Config {
97 public:
98 Config() = delete;
99 Config(Config&&);
100 explicit Config(Transport* send_transport);
101
102 Config& operator=(Config&&);
103 Config& operator=(const Config&) = delete;
104
105 ~Config();
106
107 // Mostly used by tests. Avoid creating copies if you can.
108 Config Copy() const { return Config(*this); }
109
110 std::string ToString() const;
111
Niels Möller213618e2018-07-24 09:29:58 +0200112 VideoStreamEncoderSettings encoder_settings;
aleloi440b6d92017-08-22 05:43:23 -0700113
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200114 RtpConfig rtp;
aleloi440b6d92017-08-22 05:43:23 -0700115
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200116 RtcpConfig rtcp;
Jiawei Ou3587b832018-01-31 22:08:26 -0800117
aleloi440b6d92017-08-22 05:43:23 -0700118 // Transport for outgoing packets.
119 Transport* send_transport = nullptr;
120
121 // Called for each I420 frame before encoding the frame. Can be used for
122 // effects, snapshots etc. 'nullptr' disables the callback.
123 rtc::VideoSinkInterface<VideoFrame>* pre_encode_callback = nullptr;
124
aleloi440b6d92017-08-22 05:43:23 -0700125 // Expected delay needed by the renderer, i.e. the frame will be delivered
126 // this many milliseconds, if possible, earlier than expected render time.
127 // Only valid if |local_renderer| is set.
128 int render_delay_ms = 0;
129
130 // Target delay in milliseconds. A positive value indicates this stream is
131 // used for streaming instead of a real-time call.
132 int target_delay_ms = 0;
133
134 // True if the stream should be suspended when the available bitrate fall
135 // below the minimum configured bitrate. If this variable is false, the
136 // stream may send at a rate higher than the estimated available bitrate.
137 bool suspend_below_min_bitrate = false;
138
139 // Enables periodic bandwidth probing in application-limited region.
140 bool periodic_alr_bandwidth_probing = false;
141
Alex Narestb3944f02017-10-13 14:56:18 +0200142 // Track ID as specified during track creation.
143 std::string track_id;
144
Benjamin Wright192eeec2018-10-17 17:27:25 -0700145 // An optional custom frame encryptor that allows the entire frame to be
146 // encrypted in whatever way the caller chooses. This is not required by
147 // default.
148 rtc::scoped_refptr<webrtc::FrameEncryptorInterface> frame_encryptor;
149
150 // Per PeerConnection cryptography options.
151 CryptoOptions crypto_options;
152
aleloi440b6d92017-08-22 05:43:23 -0700153 private:
154 // Access to the copy constructor is private to force use of the Copy()
155 // method for those exceptional cases where we do use it.
156 Config(const Config&);
157 };
158
Seth Hampsoncc7125f2018-02-02 08:46:16 -0800159 // Updates the sending state for all simulcast layers that the video send
160 // stream owns. This can mean updating the activity one or for multiple
161 // layers. The ordering of active layers is the order in which the
162 // rtp modules are stored in the VideoSendStream.
163 // Note: This starts stream activity if it is inactive and one of the layers
164 // is active. This stops stream activity if it is active and all layers are
165 // inactive.
166 virtual void UpdateActiveSimulcastLayers(
167 const std::vector<bool> active_layers) = 0;
168
aleloi440b6d92017-08-22 05:43:23 -0700169 // Starts stream activity.
170 // When a stream is active, it can receive, process and deliver packets.
171 virtual void Start() = 0;
172 // Stops stream activity.
173 // When a stream is stopped, it can't receive, process or deliver packets.
174 virtual void Stop() = 0;
175
aleloi440b6d92017-08-22 05:43:23 -0700176 virtual void SetSource(
177 rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
178 const DegradationPreference& degradation_preference) = 0;
179
180 // Set which streams to send. Must have at least as many SSRCs as configured
181 // in the config. Encoder settings are passed on to the encoder instance along
182 // with the VideoStream settings.
183 virtual void ReconfigureVideoEncoder(VideoEncoderConfig config) = 0;
184
185 virtual Stats GetStats() = 0;
186
aleloi440b6d92017-08-22 05:43:23 -0700187 protected:
188 virtual ~VideoSendStream() {}
189};
190
191} // namespace webrtc
192
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200193#endif // CALL_VIDEO_SEND_STREAM_H_