Move video send/receive stream headers to webrtc/call.
Moved the headers video_receive_stream.h and video_send_stream.h from
webrtc/ into webrtc/call/ as part of the Slim and Modular work.
The GN target webrtc:video_stream_api has moved to
webrtc/call:video_stream_api.
There are headers left in webrtc/ with the same name including the
moved headers in webrtc/call/ for not breaking external projects
depending on WebRTC.
At the same time, some minor cleanup is done: Non-pure-virtual functions declared in the two affected headers now have definitions in the same target. After making this change, our 'chromium-style' plugin detected some style violations that have now been fixed: non-inlined constructors and destructors have been added to a number of classes, both inside the GN target of the two affected headers, and in other targets.
BUG=webrtc:8107
Review-Url: https://codereview.webrtc.org/3000253002
Cr-Commit-Position: refs/heads/master@{#19448}
diff --git a/webrtc/BUILD.gn b/webrtc/BUILD.gn
index 6d2c0e4..1f7f37f 100644
--- a/webrtc/BUILD.gn
+++ b/webrtc/BUILD.gn
@@ -26,6 +26,7 @@
if (build_with_mozilla) {
defines += [ "WEBRTC_MOZILLA_BUILD" ]
}
+
# Some tests need to declare their own trace event handlers. If this define is
# not set, the first time TRACE_EVENT_* is called it will store the return
# value for the current handler in an static variable, so that subsequent
@@ -235,19 +236,6 @@
libs = [ "Foundation.framework" ]
}
-rtc_source_set("video_stream_api") {
- sources = [
- "video_receive_stream.h",
- "video_send_stream.h",
- ]
- deps = [
- ":webrtc_common",
- "api:transport_api",
- "common_video:common_video",
- "rtc_base:rtc_base_approved",
- ]
-}
-
if (!build_with_chromium) {
# Target to build all the WebRTC production code.
rtc_static_library("webrtc") {
diff --git a/webrtc/DEPS b/webrtc/DEPS
index 0e986a2..9ba34f0 100644
--- a/webrtc/DEPS
+++ b/webrtc/DEPS
@@ -29,11 +29,9 @@
# The below rules will be removed when webrtc:4243 is fixed.
specific_include_rules = {
"video_receive_stream\.h": [
- "+webrtc/common_video/include",
- "+webrtc/media/base",
+ "+webrtc/call/video_receive_stream.h",
],
"video_send_stream\.h": [
- "+webrtc/common_video/include",
- "+webrtc/media/base",
+ "+webrtc/call/video_send_stream.h",
],
}
diff --git a/webrtc/call/BUILD.gn b/webrtc/call/BUILD.gn
index afbc822..62bcff3 100644
--- a/webrtc/call/BUILD.gn
+++ b/webrtc/call/BUILD.gn
@@ -22,7 +22,7 @@
]
deps = [
":rtp_interfaces",
- "..:video_stream_api",
+ ":video_stream_api",
"..:webrtc_common",
"../api:audio_mixer_api",
"../api:libjingle_peerconnection_api",
@@ -124,6 +124,21 @@
]
}
+rtc_source_set("video_stream_api") {
+ sources = [
+ "video_receive_stream.cc",
+ "video_receive_stream.h",
+ "video_send_stream.cc",
+ "video_send_stream.h",
+ ]
+ deps = [
+ "../:webrtc_common",
+ "../api:transport_api",
+ "../common_video:common_video",
+ "../rtc_base:rtc_base_approved",
+ ]
+}
+
if (rtc_include_tests) {
rtc_source_set("call_tests") {
testonly = true
diff --git a/webrtc/call/DEPS b/webrtc/call/DEPS
index 2ef22fc..65026b0 100644
--- a/webrtc/call/DEPS
+++ b/webrtc/call/DEPS
@@ -15,3 +15,14 @@
"+webrtc/voice_engine",
"+webrtc/video",
]
+
+specific_include_rules = {
+ "video_receive_stream\.h": [
+ "+webrtc/common_video/include",
+ "+webrtc/media/base",
+ ],
+ "video_send_stream\.h": [
+ "+webrtc/common_video/include",
+ "+webrtc/media/base",
+ ],
+}
diff --git a/webrtc/call/call.h b/webrtc/call/call.h
index 86142f0..74ea2eb 100644
--- a/webrtc/call/call.h
+++ b/webrtc/call/call.h
@@ -21,12 +21,12 @@
#include "webrtc/call/audio_state.h"
#include "webrtc/call/flexfec_receive_stream.h"
#include "webrtc/call/rtp_transport_controller_send_interface.h"
+#include "webrtc/call/video_receive_stream.h"
+#include "webrtc/call/video_send_stream.h"
#include "webrtc/common_types.h"
#include "webrtc/rtc_base/networkroute.h"
#include "webrtc/rtc_base/platform_file.h"
#include "webrtc/rtc_base/socket.h"
-#include "webrtc/video_receive_stream.h"
-#include "webrtc/video_send_stream.h"
namespace webrtc {
diff --git a/webrtc/call/video_receive_stream.cc b/webrtc/call/video_receive_stream.cc
new file mode 100644
index 0000000..bc65869
--- /dev/null
+++ b/webrtc/call/video_receive_stream.cc
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2017 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 "webrtc/call/video_receive_stream.h"
+
+namespace webrtc {
+
+VideoReceiveStream::Decoder::Decoder() = default;
+VideoReceiveStream::Decoder::Decoder(const Decoder&) = default;
+VideoReceiveStream::Decoder::~Decoder() = default;
+
+std::string VideoReceiveStream::Decoder::ToString() const {
+ std::stringstream ss;
+ ss << "{decoder: " << (decoder ? "(VideoDecoder)" : "nullptr");
+ ss << ", payload_type: " << payload_type;
+ ss << ", payload_name: " << payload_name;
+ ss << ", codec_params: {";
+ for (const auto& it : codec_params)
+ ss << it.first << ": " << it.second;
+ ss << '}';
+ ss << '}';
+
+ return ss.str();
+}
+
+VideoReceiveStream::Stats::Stats() = default;
+VideoReceiveStream::Stats::~Stats() = default;
+
+std::string VideoReceiveStream::Stats::ToString(int64_t time_ms) const {
+ std::stringstream ss;
+ ss << "VideoReceiveStream stats: " << time_ms << ", {ssrc: " << ssrc << ", ";
+ ss << "total_bps: " << total_bitrate_bps << ", ";
+ ss << "width: " << width << ", ";
+ ss << "height: " << height << ", ";
+ ss << "key: " << frame_counts.key_frames << ", ";
+ ss << "delta: " << frame_counts.delta_frames << ", ";
+ ss << "network_fps: " << network_frame_rate << ", ";
+ ss << "decode_fps: " << decode_frame_rate << ", ";
+ ss << "render_fps: " << render_frame_rate << ", ";
+ ss << "decode_ms: " << decode_ms << ", ";
+ ss << "max_decode_ms: " << max_decode_ms << ", ";
+ ss << "cur_delay_ms: " << current_delay_ms << ", ";
+ ss << "targ_delay_ms: " << target_delay_ms << ", ";
+ ss << "jb_delay_ms: " << jitter_buffer_ms << ", ";
+ ss << "min_playout_delay_ms: " << min_playout_delay_ms << ", ";
+ ss << "discarded: " << discarded_packets << ", ";
+ ss << "sync_offset_ms: " << sync_offset_ms << ", ";
+ ss << "cum_loss: " << rtcp_stats.packets_lost << ", ";
+ ss << "max_ext_seq: " << rtcp_stats.extended_highest_sequence_number << ", ";
+ ss << "nack: " << rtcp_packet_type_counts.nack_packets << ", ";
+ ss << "fir: " << rtcp_packet_type_counts.fir_packets << ", ";
+ ss << "pli: " << rtcp_packet_type_counts.pli_packets;
+ ss << '}';
+ return ss.str();
+}
+
+VideoReceiveStream::Config::Config(const Config&) = default;
+VideoReceiveStream::Config::Config(Config&&) = default;
+VideoReceiveStream::Config::Config(Transport* rtcp_send_transport)
+ : rtcp_send_transport(rtcp_send_transport) {}
+
+VideoReceiveStream::Config& VideoReceiveStream::Config::operator=(Config&&) =
+ default;
+VideoReceiveStream::Config::Config::~Config() = default;
+
+std::string VideoReceiveStream::Config::ToString() const {
+ std::stringstream ss;
+ ss << "{decoders: [";
+ for (size_t i = 0; i < decoders.size(); ++i) {
+ ss << decoders[i].ToString();
+ if (i != decoders.size() - 1)
+ ss << ", ";
+ }
+ ss << ']';
+ ss << ", rtp: " << rtp.ToString();
+ ss << ", renderer: " << (renderer ? "(renderer)" : "nullptr");
+ ss << ", render_delay_ms: " << render_delay_ms;
+ if (!sync_group.empty())
+ ss << ", sync_group: " << sync_group;
+ ss << ", pre_decode_callback: "
+ << (pre_decode_callback ? "(EncodedFrameObserver)" : "nullptr");
+ ss << ", target_delay_ms: " << target_delay_ms;
+ ss << '}';
+
+ return ss.str();
+}
+
+VideoReceiveStream::Config::Rtp::Rtp() = default;
+VideoReceiveStream::Config::Rtp::Rtp(const Rtp&) = default;
+VideoReceiveStream::Config::Rtp::~Rtp() = default;
+
+std::string VideoReceiveStream::Config::Rtp::ToString() const {
+ std::stringstream ss;
+ ss << "{remote_ssrc: " << remote_ssrc;
+ ss << ", local_ssrc: " << local_ssrc;
+ ss << ", rtcp_mode: "
+ << (rtcp_mode == RtcpMode::kCompound ? "RtcpMode::kCompound"
+ : "RtcpMode::kReducedSize");
+ ss << ", rtcp_xr: ";
+ ss << "{receiver_reference_time_report: "
+ << (rtcp_xr.receiver_reference_time_report ? "on" : "off");
+ ss << '}';
+ ss << ", remb: " << (remb ? "on" : "off");
+ ss << ", transport_cc: " << (transport_cc ? "on" : "off");
+ ss << ", nack: {rtp_history_ms: " << nack.rtp_history_ms << '}';
+ ss << ", ulpfec: " << ulpfec.ToString();
+ ss << ", rtx_ssrc: " << rtx_ssrc;
+ ss << ", rtx_payload_types: {";
+ for (auto& kv : rtx_payload_types) {
+ ss << kv.first << " (apt) -> " << kv.second << " (pt), ";
+ }
+ ss << '}';
+ ss << ", extensions: [";
+ for (size_t i = 0; i < extensions.size(); ++i) {
+ ss << extensions[i].ToString();
+ if (i != extensions.size() - 1)
+ ss << ", ";
+ }
+ ss << ']';
+ ss << '}';
+ return ss.str();
+}
+
+} // namespace webrtc
diff --git a/webrtc/call/video_receive_stream.h b/webrtc/call/video_receive_stream.h
new file mode 100644
index 0000000..b1536f2
--- /dev/null
+++ b/webrtc/call/video_receive_stream.h
@@ -0,0 +1,245 @@
+/*
+ * Copyright (c) 2013 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.
+ */
+
+#ifndef WEBRTC_CALL_VIDEO_RECEIVE_STREAM_H_
+#define WEBRTC_CALL_VIDEO_RECEIVE_STREAM_H_
+
+#include <limits>
+#include <map>
+#include <string>
+#include <vector>
+
+#include "webrtc/api/call/transport.h"
+#include "webrtc/common_types.h"
+#include "webrtc/common_video/include/frame_callback.h"
+#include "webrtc/config.h"
+#include "webrtc/media/base/videosinkinterface.h"
+#include "webrtc/rtc_base/platform_file.h"
+
+namespace webrtc {
+
+class RtpPacketSinkInterface;
+class VideoDecoder;
+
+class VideoReceiveStream {
+ public:
+ // TODO(mflodman) Move all these settings to VideoDecoder and move the
+ // declaration to common_types.h.
+ struct Decoder {
+ Decoder();
+ Decoder(const Decoder&);
+ ~Decoder();
+ std::string ToString() const;
+
+ // The actual decoder instance.
+ VideoDecoder* decoder = nullptr;
+
+ // Received RTP packets with this payload type will be sent to this decoder
+ // instance.
+ int payload_type = 0;
+
+ // Name of the decoded payload (such as VP8). Maps back to the depacketizer
+ // used to unpack incoming packets.
+ std::string payload_name;
+
+ // This map contains the codec specific parameters from SDP, i.e. the "fmtp"
+ // parameters. It is the same as cricket::CodecParameterMap used in
+ // cricket::VideoCodec.
+ std::map<std::string, std::string> codec_params;
+ };
+
+ struct Stats {
+ Stats();
+ ~Stats();
+ std::string ToString(int64_t time_ms) const;
+
+ int network_frame_rate = 0;
+ int decode_frame_rate = 0;
+ int render_frame_rate = 0;
+ uint32_t frames_rendered = 0;
+
+ // Decoder stats.
+ std::string decoder_implementation_name = "unknown";
+ FrameCounts frame_counts;
+ int decode_ms = 0;
+ int max_decode_ms = 0;
+ int current_delay_ms = 0;
+ int target_delay_ms = 0;
+ int jitter_buffer_ms = 0;
+ int min_playout_delay_ms = 0;
+ int render_delay_ms = 10;
+ uint64_t interframe_delay_sum_ms = 0;
+ uint32_t frames_decoded = 0;
+ rtc::Optional<uint64_t> qp_sum;
+
+ int current_payload_type = -1;
+
+ int total_bitrate_bps = 0;
+ int discarded_packets = 0;
+
+ int width = 0;
+ int height = 0;
+
+ int sync_offset_ms = std::numeric_limits<int>::max();
+
+ uint32_t ssrc = 0;
+ std::string c_name;
+ StreamDataCounters rtp_stats;
+ RtcpPacketTypeCounter rtcp_packet_type_counts;
+ RtcpStatistics rtcp_stats;
+ };
+
+ struct Config {
+ private:
+ // Access to the copy constructor is private to force use of the Copy()
+ // method for those exceptional cases where we do use it.
+ Config(const Config&);
+
+ public:
+ Config() = delete;
+ Config(Config&&);
+ explicit Config(Transport* rtcp_send_transport);
+ Config& operator=(Config&&);
+ Config& operator=(const Config&) = delete;
+ ~Config();
+
+ // Mostly used by tests. Avoid creating copies if you can.
+ Config Copy() const { return Config(*this); }
+
+ std::string ToString() const;
+
+ // Decoders for every payload that we can receive.
+ std::vector<Decoder> decoders;
+
+ // Receive-stream specific RTP settings.
+ struct Rtp {
+ Rtp();
+ Rtp(const Rtp&);
+ ~Rtp();
+ std::string ToString() const;
+
+ // Synchronization source (stream identifier) to be received.
+ uint32_t remote_ssrc = 0;
+
+ // Sender SSRC used for sending RTCP (such as receiver reports).
+ uint32_t local_ssrc = 0;
+
+ // See RtcpMode for description.
+ RtcpMode rtcp_mode = RtcpMode::kCompound;
+
+ // Extended RTCP settings.
+ struct RtcpXr {
+ // True if RTCP Receiver Reference Time Report Block extension
+ // (RFC 3611) should be enabled.
+ bool receiver_reference_time_report = false;
+ } rtcp_xr;
+
+ // TODO(nisse): This remb setting is currently set but never
+ // applied. REMB logic is now the responsibility of
+ // PacketRouter, and it will generate REMB feedback if
+ // OnReceiveBitrateChanged is used, which depends on how the
+ // estimators belonging to the ReceiveSideCongestionController
+ // are configured. Decide if this setting should be deleted, and
+ // if it needs to be replaced by a setting in PacketRouter to
+ // disable REMB feedback.
+
+ // See draft-alvestrand-rmcat-remb for information.
+ bool remb = false;
+
+ // See draft-holmer-rmcat-transport-wide-cc-extensions for details.
+ bool transport_cc = false;
+
+ // See NackConfig for description.
+ NackConfig nack;
+
+ // See UlpfecConfig for description.
+ UlpfecConfig ulpfec;
+
+ // SSRC for retransmissions.
+ uint32_t rtx_ssrc = 0;
+
+ // Set if the stream is protected using FlexFEC.
+ bool protected_by_flexfec = false;
+
+ // Map from video payload type (apt) -> RTX payload type (pt).
+ // For RTX to be enabled, both an SSRC and this mapping are needed.
+ std::map<int, int> rtx_payload_types;
+
+ // RTP header extensions used for the received stream.
+ std::vector<RtpExtension> extensions;
+ } rtp;
+
+ // Transport for outgoing packets (RTCP).
+ Transport* rtcp_send_transport = nullptr;
+
+ // Must not be 'nullptr' when the stream is started.
+ rtc::VideoSinkInterface<VideoFrame>* renderer = nullptr;
+
+ // Expected delay needed by the renderer, i.e. the frame will be delivered
+ // this many milliseconds, if possible, earlier than the ideal render time.
+ // Only valid if 'renderer' is set.
+ int render_delay_ms = 10;
+
+ // If set, pass frames on to the renderer as soon as they are
+ // available.
+ bool disable_prerenderer_smoothing = false;
+
+ // Identifier for an A/V synchronization group. Empty string to disable.
+ // TODO(pbos): Synchronize streams in a sync group, not just video streams
+ // to one of the audio streams.
+ std::string sync_group;
+
+ // Called for each incoming video frame, i.e. in encoded state. E.g. used
+ // when
+ // saving the stream to a file. 'nullptr' disables the callback.
+ EncodedFrameObserver* pre_decode_callback = nullptr;
+
+ // Target delay in milliseconds. A positive value indicates this stream is
+ // used for streaming instead of a real-time call.
+ int target_delay_ms = 0;
+ };
+
+ // Starts stream activity.
+ // When a stream is active, it can receive, process and deliver packets.
+ virtual void Start() = 0;
+ // Stops stream activity.
+ // When a stream is stopped, it can't receive, process or deliver packets.
+ virtual void Stop() = 0;
+
+ // TODO(pbos): Add info on currently-received codec to Stats.
+ virtual Stats GetStats() const = 0;
+
+ virtual rtc::Optional<TimingFrameInfo> GetAndResetTimingFrameInfo() = 0;
+
+ // Takes ownership of the file, is responsible for closing it later.
+ // Calling this method will close and finalize any current log.
+ // Giving rtc::kInvalidPlatformFileValue disables logging.
+ // If a frame to be written would make the log too large the write fails and
+ // the log is closed and finalized. A |byte_limit| of 0 means no limit.
+ virtual void EnableEncodedFrameRecording(rtc::PlatformFile file,
+ size_t byte_limit) = 0;
+ inline void DisableEncodedFrameRecording() {
+ EnableEncodedFrameRecording(rtc::kInvalidPlatformFileValue, 0);
+ }
+
+ // RtpDemuxer only forwards a given RTP packet to one sink. However, some
+ // sinks, such as FlexFEC, might wish to be informed of all of the packets
+ // a given sink receives (or any set of sinks). They may do so by registering
+ // themselves as secondary sinks.
+ virtual void AddSecondarySink(RtpPacketSinkInterface* sink) = 0;
+ virtual void RemoveSecondarySink(const RtpPacketSinkInterface* sink) = 0;
+
+ protected:
+ virtual ~VideoReceiveStream() {}
+};
+
+} // namespace webrtc
+
+#endif // WEBRTC_CALL_VIDEO_RECEIVE_STREAM_H_
diff --git a/webrtc/call/video_send_stream.cc b/webrtc/call/video_send_stream.cc
new file mode 100644
index 0000000..f6ea13f
--- /dev/null
+++ b/webrtc/call/video_send_stream.cc
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2017 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 "webrtc/call/video_send_stream.h"
+
+namespace webrtc {
+
+VideoSendStream::StreamStats::StreamStats() = default;
+VideoSendStream::StreamStats::~StreamStats() = default;
+
+std::string VideoSendStream::StreamStats::ToString() const {
+ std::stringstream ss;
+ ss << "width: " << width << ", ";
+ ss << "height: " << height << ", ";
+ ss << "key: " << frame_counts.key_frames << ", ";
+ ss << "delta: " << frame_counts.delta_frames << ", ";
+ ss << "total_bps: " << total_bitrate_bps << ", ";
+ ss << "retransmit_bps: " << retransmit_bitrate_bps << ", ";
+ ss << "avg_delay_ms: " << avg_delay_ms << ", ";
+ ss << "max_delay_ms: " << max_delay_ms << ", ";
+ ss << "cum_loss: " << rtcp_stats.packets_lost << ", ";
+ ss << "max_ext_seq: " << rtcp_stats.extended_highest_sequence_number << ", ";
+ ss << "nack: " << rtcp_packet_type_counts.nack_packets << ", ";
+ ss << "fir: " << rtcp_packet_type_counts.fir_packets << ", ";
+ ss << "pli: " << rtcp_packet_type_counts.pli_packets;
+ return ss.str();
+}
+
+VideoSendStream::Stats::Stats() = default;
+VideoSendStream::Stats::~Stats() = default;
+
+std::string VideoSendStream::Stats::ToString(int64_t time_ms) const {
+ std::stringstream ss;
+ ss << "VideoSendStream stats: " << time_ms << ", {";
+ ss << "input_fps: " << input_frame_rate << ", ";
+ ss << "encode_fps: " << encode_frame_rate << ", ";
+ ss << "encode_ms: " << avg_encode_time_ms << ", ";
+ ss << "encode_usage_perc: " << encode_usage_percent << ", ";
+ ss << "target_bps: " << target_media_bitrate_bps << ", ";
+ ss << "media_bps: " << media_bitrate_bps << ", ";
+ ss << "preferred_media_bitrate_bps: " << preferred_media_bitrate_bps << ", ";
+ ss << "suspended: " << (suspended ? "true" : "false") << ", ";
+ ss << "bw_adapted: " << (bw_limited_resolution ? "true" : "false");
+ ss << '}';
+ for (const auto& substream : substreams) {
+ if (!substream.second.is_rtx && !substream.second.is_flexfec) {
+ ss << " {ssrc: " << substream.first << ", ";
+ ss << substream.second.ToString();
+ ss << '}';
+ }
+ }
+ return ss.str();
+}
+
+VideoSendStream::Config::Config(const Config&) = default;
+VideoSendStream::Config::Config(Config&&) = default;
+VideoSendStream::Config::Config(Transport* send_transport)
+ : send_transport(send_transport) {}
+
+VideoSendStream::Config& VideoSendStream::Config::operator=(Config&&) = default;
+VideoSendStream::Config::Config::~Config() = default;
+
+std::string VideoSendStream::Config::ToString() const {
+ std::stringstream ss;
+ ss << "{encoder_settings: " << encoder_settings.ToString();
+ ss << ", rtp: " << rtp.ToString();
+ ss << ", pre_encode_callback: "
+ << (pre_encode_callback ? "(VideoSinkInterface)" : "nullptr");
+ ss << ", post_encode_callback: "
+ << (post_encode_callback ? "(EncodedFrameObserver)" : "nullptr");
+ ss << ", render_delay_ms: " << render_delay_ms;
+ ss << ", target_delay_ms: " << target_delay_ms;
+ ss << ", suspend_below_min_bitrate: "
+ << (suspend_below_min_bitrate ? "on" : "off");
+ ss << '}';
+ return ss.str();
+}
+
+std::string VideoSendStream::Config::EncoderSettings::ToString() const {
+ std::stringstream ss;
+ ss << "{payload_name: " << payload_name;
+ ss << ", payload_type: " << payload_type;
+ ss << ", encoder: " << (encoder ? "(VideoEncoder)" : "nullptr");
+ ss << '}';
+ return ss.str();
+}
+
+VideoSendStream::Config::Rtp::Rtp() = default;
+VideoSendStream::Config::Rtp::Rtp(const Rtp&) = default;
+VideoSendStream::Config::Rtp::~Rtp() = default;
+
+VideoSendStream::Config::Rtp::Flexfec::Flexfec() = default;
+VideoSendStream::Config::Rtp::Flexfec::Flexfec(const Flexfec&) = default;
+VideoSendStream::Config::Rtp::Flexfec::~Flexfec() = default;
+
+std::string VideoSendStream::Config::Rtp::ToString() const {
+ std::stringstream ss;
+ ss << "{ssrcs: [";
+ for (size_t i = 0; i < ssrcs.size(); ++i) {
+ ss << ssrcs[i];
+ if (i != ssrcs.size() - 1)
+ ss << ", ";
+ }
+ ss << ']';
+ ss << ", rtcp_mode: "
+ << (rtcp_mode == RtcpMode::kCompound ? "RtcpMode::kCompound"
+ : "RtcpMode::kReducedSize");
+ ss << ", max_packet_size: " << max_packet_size;
+ ss << ", extensions: [";
+ for (size_t i = 0; i < extensions.size(); ++i) {
+ ss << extensions[i].ToString();
+ if (i != extensions.size() - 1)
+ ss << ", ";
+ }
+ ss << ']';
+
+ ss << ", nack: {rtp_history_ms: " << nack.rtp_history_ms << '}';
+ ss << ", ulpfec: " << ulpfec.ToString();
+
+ ss << ", flexfec: {payload_type: " << flexfec.payload_type;
+ ss << ", ssrc: " << flexfec.ssrc;
+ ss << ", protected_media_ssrcs: [";
+ for (size_t i = 0; i < flexfec.protected_media_ssrcs.size(); ++i) {
+ ss << flexfec.protected_media_ssrcs[i];
+ if (i != flexfec.protected_media_ssrcs.size() - 1)
+ ss << ", ";
+ }
+ ss << "]}";
+
+ ss << ", rtx: " << rtx.ToString();
+ ss << ", c_name: " << c_name;
+ ss << '}';
+ return ss.str();
+}
+
+VideoSendStream::Config::Rtp::Rtx::Rtx() = default;
+VideoSendStream::Config::Rtp::Rtx::Rtx(const Rtx&) = default;
+VideoSendStream::Config::Rtp::Rtx::~Rtx() = default;
+
+std::string VideoSendStream::Config::Rtp::Rtx::ToString() const {
+ std::stringstream ss;
+ ss << "{ssrcs: [";
+ for (size_t i = 0; i < ssrcs.size(); ++i) {
+ ss << ssrcs[i];
+ if (i != ssrcs.size() - 1)
+ ss << ", ";
+ }
+ ss << ']';
+
+ ss << ", payload_type: " << payload_type;
+ ss << '}';
+ return ss.str();
+}
+
+} // namespace webrtc
diff --git a/webrtc/call/video_send_stream.h b/webrtc/call/video_send_stream.h
new file mode 100644
index 0000000..a176709
--- /dev/null
+++ b/webrtc/call/video_send_stream.h
@@ -0,0 +1,282 @@
+/*
+ * Copyright (c) 2013 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.
+ */
+
+#ifndef WEBRTC_CALL_VIDEO_SEND_STREAM_H_
+#define WEBRTC_CALL_VIDEO_SEND_STREAM_H_
+
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "webrtc/api/call/transport.h"
+#include "webrtc/common_types.h"
+#include "webrtc/common_video/include/frame_callback.h"
+#include "webrtc/config.h"
+#include "webrtc/media/base/videosinkinterface.h"
+#include "webrtc/media/base/videosourceinterface.h"
+#include "webrtc/rtc_base/platform_file.h"
+
+namespace webrtc {
+
+class VideoEncoder;
+
+class VideoSendStream {
+ public:
+ struct StreamStats {
+ StreamStats();
+ ~StreamStats();
+
+ std::string ToString() const;
+
+ FrameCounts frame_counts;
+ bool is_rtx = false;
+ bool is_flexfec = false;
+ int width = 0;
+ int height = 0;
+ // TODO(holmer): Move bitrate_bps out to the webrtc::Call layer.
+ int total_bitrate_bps = 0;
+ int retransmit_bitrate_bps = 0;
+ int avg_delay_ms = 0;
+ int max_delay_ms = 0;
+ StreamDataCounters rtp_stats;
+ RtcpPacketTypeCounter rtcp_packet_type_counts;
+ RtcpStatistics rtcp_stats;
+ };
+
+ struct Stats {
+ Stats();
+ ~Stats();
+ std::string ToString(int64_t time_ms) const;
+ std::string encoder_implementation_name = "unknown";
+ int input_frame_rate = 0;
+ int encode_frame_rate = 0;
+ int avg_encode_time_ms = 0;
+ int encode_usage_percent = 0;
+ uint32_t frames_encoded = 0;
+ rtc::Optional<uint64_t> qp_sum;
+ // Bitrate the encoder is currently configured to use due to bandwidth
+ // limitations.
+ int target_media_bitrate_bps = 0;
+ // Bitrate the encoder is actually producing.
+ int media_bitrate_bps = 0;
+ // Media bitrate this VideoSendStream is configured to prefer if there are
+ // no bandwidth limitations.
+ int preferred_media_bitrate_bps = 0;
+ bool suspended = false;
+ bool bw_limited_resolution = false;
+ bool cpu_limited_resolution = false;
+ bool bw_limited_framerate = false;
+ bool cpu_limited_framerate = false;
+ // Total number of times resolution as been requested to be changed due to
+ // CPU/quality adaptation.
+ int number_of_cpu_adapt_changes = 0;
+ int number_of_quality_adapt_changes = 0;
+ std::map<uint32_t, StreamStats> substreams;
+ };
+
+ struct Config {
+ public:
+ Config() = delete;
+ Config(Config&&);
+ explicit Config(Transport* send_transport);
+
+ Config& operator=(Config&&);
+ Config& operator=(const Config&) = delete;
+
+ ~Config();
+
+ // Mostly used by tests. Avoid creating copies if you can.
+ Config Copy() const { return Config(*this); }
+
+ std::string ToString() const;
+
+ struct EncoderSettings {
+ EncoderSettings() = default;
+ EncoderSettings(std::string payload_name,
+ int payload_type,
+ VideoEncoder* encoder)
+ : payload_name(std::move(payload_name)),
+ payload_type(payload_type),
+ encoder(encoder) {}
+ std::string ToString() const;
+
+ std::string payload_name;
+ int payload_type = -1;
+
+ // TODO(sophiechang): Delete this field when no one is using internal
+ // sources anymore.
+ bool internal_source = false;
+
+ // Allow 100% encoder utilization. Used for HW encoders where CPU isn't
+ // expected to be the limiting factor, but a chip could be running at
+ // 30fps (for example) exactly.
+ bool full_overuse_time = false;
+
+ // Uninitialized VideoEncoder instance to be used for encoding. Will be
+ // initialized from inside the VideoSendStream.
+ VideoEncoder* encoder = nullptr;
+ } encoder_settings;
+
+ static const size_t kDefaultMaxPacketSize = 1500 - 40; // TCP over IPv4.
+ struct Rtp {
+ Rtp();
+ Rtp(const Rtp&);
+ ~Rtp();
+ std::string ToString() const;
+
+ std::vector<uint32_t> ssrcs;
+
+ // See RtcpMode for description.
+ RtcpMode rtcp_mode = RtcpMode::kCompound;
+
+ // Max RTP packet size delivered to send transport from VideoEngine.
+ size_t max_packet_size = kDefaultMaxPacketSize;
+
+ // RTP header extensions to use for this send stream.
+ std::vector<RtpExtension> extensions;
+
+ // See NackConfig for description.
+ NackConfig nack;
+
+ // See UlpfecConfig for description.
+ UlpfecConfig ulpfec;
+
+ struct Flexfec {
+ Flexfec();
+ Flexfec(const Flexfec&);
+ ~Flexfec();
+ // Payload type of FlexFEC. Set to -1 to disable sending FlexFEC.
+ int payload_type = -1;
+
+ // SSRC of FlexFEC stream.
+ uint32_t ssrc = 0;
+
+ // Vector containing a single element, corresponding to the SSRC of the
+ // media stream being protected by this FlexFEC stream.
+ // The vector MUST have size 1.
+ //
+ // TODO(brandtr): Update comment above when we support
+ // multistream protection.
+ std::vector<uint32_t> protected_media_ssrcs;
+ } flexfec;
+
+ // Settings for RTP retransmission payload format, see RFC 4588 for
+ // details.
+ struct Rtx {
+ Rtx();
+ Rtx(const Rtx&);
+ ~Rtx();
+ std::string ToString() const;
+ // SSRCs to use for the RTX streams.
+ std::vector<uint32_t> ssrcs;
+
+ // Payload type to use for the RTX stream.
+ int payload_type = -1;
+ } rtx;
+
+ // RTCP CNAME, see RFC 3550.
+ std::string c_name;
+ } rtp;
+
+ // Transport for outgoing packets.
+ Transport* send_transport = nullptr;
+
+ // Called for each I420 frame before encoding the frame. Can be used for
+ // effects, snapshots etc. 'nullptr' disables the callback.
+ rtc::VideoSinkInterface<VideoFrame>* pre_encode_callback = nullptr;
+
+ // Called for each encoded frame, e.g. used for file storage. 'nullptr'
+ // disables the callback. Also measures timing and passes the time
+ // spent on encoding. This timing will not fire if encoding takes longer
+ // than the measuring window, since the sample data will have been dropped.
+ EncodedFrameObserver* post_encode_callback = nullptr;
+
+ // Expected delay needed by the renderer, i.e. the frame will be delivered
+ // this many milliseconds, if possible, earlier than expected render time.
+ // Only valid if |local_renderer| is set.
+ int render_delay_ms = 0;
+
+ // Target delay in milliseconds. A positive value indicates this stream is
+ // used for streaming instead of a real-time call.
+ int target_delay_ms = 0;
+
+ // True if the stream should be suspended when the available bitrate fall
+ // below the minimum configured bitrate. If this variable is false, the
+ // stream may send at a rate higher than the estimated available bitrate.
+ bool suspend_below_min_bitrate = false;
+
+ // Enables periodic bandwidth probing in application-limited region.
+ bool periodic_alr_bandwidth_probing = false;
+
+ private:
+ // Access to the copy constructor is private to force use of the Copy()
+ // method for those exceptional cases where we do use it.
+ Config(const Config&);
+ };
+
+ // Starts stream activity.
+ // When a stream is active, it can receive, process and deliver packets.
+ virtual void Start() = 0;
+ // Stops stream activity.
+ // When a stream is stopped, it can't receive, process or deliver packets.
+ virtual void Stop() = 0;
+
+ // Based on the spec in
+ // https://w3c.github.io/webrtc-pc/#idl-def-rtcdegradationpreference.
+ // These options are enforced on a best-effort basis. For instance, all of
+ // these options may suffer some frame drops in order to avoid queuing.
+ // TODO(sprang): Look into possibility of more strictly enforcing the
+ // maintain-framerate option.
+ enum class DegradationPreference {
+ // Don't take any actions based on over-utilization signals.
+ kDegradationDisabled,
+ // On over-use, request lower frame rate, possibly causing frame drops.
+ kMaintainResolution,
+ // On over-use, request lower resolution, possibly causing down-scaling.
+ kMaintainFramerate,
+ // Try to strike a "pleasing" balance between frame rate or resolution.
+ kBalanced,
+ };
+
+ virtual void SetSource(
+ rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
+ const DegradationPreference& degradation_preference) = 0;
+
+ // Set which streams to send. Must have at least as many SSRCs as configured
+ // in the config. Encoder settings are passed on to the encoder instance along
+ // with the VideoStream settings.
+ virtual void ReconfigureVideoEncoder(VideoEncoderConfig config) = 0;
+
+ virtual Stats GetStats() = 0;
+
+ // Takes ownership of each file, is responsible for closing them later.
+ // Calling this method will close and finalize any current logs.
+ // Some codecs produce multiple streams (VP8 only at present), each of these
+ // streams will log to a separate file. kMaxSimulcastStreams in common_types.h
+ // gives the max number of such streams. If there is no file for a stream, or
+ // the file is rtc::kInvalidPlatformFileValue, frames from that stream will
+ // not be logged.
+ // If a frame to be written would make the log too large the write fails and
+ // the log is closed and finalized. A |byte_limit| of 0 means no limit.
+ virtual void EnableEncodedFrameRecording(
+ const std::vector<rtc::PlatformFile>& files,
+ size_t byte_limit) = 0;
+ inline void DisableEncodedFrameRecording() {
+ EnableEncodedFrameRecording(std::vector<rtc::PlatformFile>(), 0);
+ }
+
+ protected:
+ virtual ~VideoSendStream() {}
+};
+
+} // namespace webrtc
+
+#endif // WEBRTC_CALL_VIDEO_SEND_STREAM_H_
diff --git a/webrtc/logging/BUILD.gn b/webrtc/logging/BUILD.gn
index 6c006c5..b8d1757 100644
--- a/webrtc/logging/BUILD.gn
+++ b/webrtc/logging/BUILD.gn
@@ -28,8 +28,8 @@
"rtc_event_log/rtc_event_log_factory_interface.h",
]
deps = [
- "..:video_stream_api",
"..:webrtc_common",
+ "../call:video_stream_api",
"../rtc_base:rtc_base_approved",
]
}
@@ -95,7 +95,7 @@
suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
}
deps = [
- "..:video_stream_api",
+ "../call:video_stream_api",
"../rtc_base:protobuf_utils",
"../rtc_base:rtc_base_approved",
]
diff --git a/webrtc/logging/rtc_event_log/rtc_event_log_parser.h b/webrtc/logging/rtc_event_log/rtc_event_log_parser.h
index cf2f22e..1c2390b 100644
--- a/webrtc/logging/rtc_event_log/rtc_event_log_parser.h
+++ b/webrtc/logging/rtc_event_log/rtc_event_log_parser.h
@@ -15,12 +15,12 @@
#include <utility> // pair
#include <vector>
+#include "webrtc/call/video_receive_stream.h"
+#include "webrtc/call/video_send_stream.h"
#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/video_receive_stream.h"
-#include "webrtc/video_send_stream.h"
// Files generated at build-time by the protobuf compiler.
RTC_PUSH_IGNORING_WUNDEF()
diff --git a/webrtc/media/BUILD.gn b/webrtc/media/BUILD.gn
index be75f6f..dcb5247 100644
--- a/webrtc/media/BUILD.gn
+++ b/webrtc/media/BUILD.gn
@@ -93,6 +93,11 @@
"base/videocommon.h",
"base/videosourcebase.cc",
"base/videosourcebase.h",
+
+ # TODO(aleloi): add "base/videosinkinterface.h"
+ "base/videosourceinterface.cc",
+
+ # TODO(aleloi): add "base/videosourceinterface.h"
]
if (!build_with_chromium && is_clang) {
@@ -217,7 +222,6 @@
}
deps += [
":rtc_media_base",
- "..:video_stream_api",
"..:webrtc_common",
"../api:call_api",
"../api:libjingle_peerconnection_api",
@@ -228,6 +232,7 @@
"../api/audio_codecs:builtin_audio_encoder_factory",
"../api/video_codecs:video_codecs_api",
"../call",
+ "../call:video_stream_api",
"../common_video:common_video",
"../modules/audio_coding:rent_a_codec",
"../modules/audio_device:audio_device",
@@ -322,7 +327,7 @@
include_dirs = []
public_deps = []
deps = [
- "..:video_stream_api",
+ "../call:video_stream_api",
"../modules/audio_coding:rent_a_codec",
"../modules/audio_processing:audio_processing",
"../modules/rtp_rtcp:rtp_rtcp",
diff --git a/webrtc/media/base/videosourceinterface.cc b/webrtc/media/base/videosourceinterface.cc
new file mode 100644
index 0000000..2c69da3
--- /dev/null
+++ b/webrtc/media/base/videosourceinterface.cc
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2017 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 "webrtc/media/base/videosourceinterface.h"
+namespace rtc {
+
+VideoSinkWants::VideoSinkWants() = default;
+VideoSinkWants::~VideoSinkWants() = default;
+
+} // namespace rtc
diff --git a/webrtc/media/base/videosourceinterface.h b/webrtc/media/base/videosourceinterface.h
index 6ebff33..24b3bed 100644
--- a/webrtc/media/base/videosourceinterface.h
+++ b/webrtc/media/base/videosourceinterface.h
@@ -19,6 +19,8 @@
// VideoSinkWants is used for notifying the source of properties a video frame
// should have when it is delivered to a certain sink.
struct VideoSinkWants {
+ VideoSinkWants();
+ ~VideoSinkWants();
// Tells the source whether the sink wants frames with rotation applied.
// By default, any rotation must be applied by the sink.
bool rotation_applied = false;
diff --git a/webrtc/media/engine/webrtcvideoengine.h b/webrtc/media/engine/webrtcvideoengine.h
index 6e02e7d..64581dc 100644
--- a/webrtc/media/engine/webrtcvideoengine.h
+++ b/webrtc/media/engine/webrtcvideoengine.h
@@ -21,6 +21,8 @@
#include "webrtc/api/video/video_frame.h"
#include "webrtc/call/call.h"
#include "webrtc/call/flexfec_receive_stream.h"
+#include "webrtc/call/video_receive_stream.h"
+#include "webrtc/call/video_send_stream.h"
#include "webrtc/media/base/mediaengine.h"
#include "webrtc/media/base/videosinkinterface.h"
#include "webrtc/media/base/videosourceinterface.h"
@@ -32,8 +34,6 @@
#include "webrtc/rtc_base/optional.h"
#include "webrtc/rtc_base/thread_annotations.h"
#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/video_receive_stream.h"
-#include "webrtc/video_send_stream.h"
namespace webrtc {
class VideoDecoder;
diff --git a/webrtc/modules/video_coding/BUILD.gn b/webrtc/modules/video_coding/BUILD.gn
index 7362a03..71f4c2f 100644
--- a/webrtc/modules/video_coding/BUILD.gn
+++ b/webrtc/modules/video_coding/BUILD.gn
@@ -95,8 +95,8 @@
":webrtc_vp8",
":webrtc_vp9",
"..:module_api",
- "../..:video_stream_api",
"../..:webrtc_common",
+ "../../call:video_stream_api",
"../../common_video",
"../../rtc_base:rtc_base",
"../../rtc_base:rtc_base_approved",
diff --git a/webrtc/rtc_tools/BUILD.gn b/webrtc/rtc_tools/BUILD.gn
index dde557e..efe82d1 100644
--- a/webrtc/rtc_tools/BUILD.gn
+++ b/webrtc/rtc_tools/BUILD.gn
@@ -205,8 +205,8 @@
}
defines = [ "ENABLE_RTC_EVENT_LOG" ]
deps = [
- "..:video_stream_api",
"../call:call_interfaces",
+ "../call:video_stream_api",
"../logging:rtc_event_log_impl",
"../logging:rtc_event_log_parser",
"../modules:module_api",
diff --git a/webrtc/rtc_tools/event_log_visualizer/analyzer.cc b/webrtc/rtc_tools/event_log_visualizer/analyzer.cc
index c7b26c6..49be16d 100644
--- a/webrtc/rtc_tools/event_log_visualizer/analyzer.cc
+++ b/webrtc/rtc_tools/event_log_visualizer/analyzer.cc
@@ -20,6 +20,8 @@
#include "webrtc/call/audio_receive_stream.h"
#include "webrtc/call/audio_send_stream.h"
#include "webrtc/call/call.h"
+#include "webrtc/call/video_receive_stream.h"
+#include "webrtc/call/video_send_stream.h"
#include "webrtc/common_types.h"
#include "webrtc/modules/audio_coding/neteq/tools/audio_sink.h"
#include "webrtc/modules/audio_coding/neteq/tools/fake_decode_from_file.h"
@@ -43,8 +45,6 @@
#include "webrtc/rtc_base/logging.h"
#include "webrtc/rtc_base/ptr_util.h"
#include "webrtc/rtc_base/rate_statistics.h"
-#include "webrtc/video_receive_stream.h"
-#include "webrtc/video_send_stream.h"
namespace webrtc {
namespace plotting {
diff --git a/webrtc/test/BUILD.gn b/webrtc/test/BUILD.gn
index f6baa27..199fd63 100644
--- a/webrtc/test/BUILD.gn
+++ b/webrtc/test/BUILD.gn
@@ -59,9 +59,9 @@
}
deps = [
- "..:video_stream_api",
"..:webrtc_common",
"../api/video_codecs:video_codecs_api",
+ "../call:video_stream_api",
"../common_video",
"../media:rtc_media_base",
"../modules/video_capture:video_capture_module",
@@ -488,7 +488,6 @@
":rtp_test_utils",
":test_support",
":video_test_common",
- "..:video_stream_api",
"..:webrtc_common",
"../api:transport_api",
"../api:video_frame_api",
@@ -498,6 +497,7 @@
"../audio",
"../call",
"../call:rtp_sender",
+ "../call:video_stream_api",
"../common_video",
"../logging:rtc_event_log_api",
"../modules/audio_device:mock_audio_device",
diff --git a/webrtc/test/encoder_settings.h b/webrtc/test/encoder_settings.h
index 82d8c5f..4c4fa4e 100644
--- a/webrtc/test/encoder_settings.h
+++ b/webrtc/test/encoder_settings.h
@@ -12,8 +12,8 @@
#include <vector>
-#include "webrtc/video_receive_stream.h"
-#include "webrtc/video_send_stream.h"
+#include "webrtc/call/video_receive_stream.h"
+#include "webrtc/call/video_send_stream.h"
namespace webrtc {
namespace test {
diff --git a/webrtc/video/BUILD.gn b/webrtc/video/BUILD.gn
index 08abe68..6ad7fd1 100644
--- a/webrtc/video/BUILD.gn
+++ b/webrtc/video/BUILD.gn
@@ -54,12 +54,12 @@
}
deps = [
- "..:video_stream_api",
"..:webrtc_common",
"../api:transport_api",
"../api/video_codecs:video_codecs_api",
"../call:call_interfaces",
"../call:rtp_interfaces",
+ "../call:video_stream_api",
"../common_video",
"../logging:rtc_event_log_api",
"../media:rtc_media_base",
@@ -261,13 +261,13 @@
]
deps = [
":video",
- "..:video_stream_api",
"../api:video_frame_api",
"../api/video_codecs:video_codecs_api",
"../call:call_interfaces",
"../call:mock_rtp_interfaces",
"../call:rtp_receiver",
"../call:rtp_sender",
+ "../call:video_stream_api",
"../common_video",
"../logging:rtc_event_log_api",
"../media:rtc_media",
diff --git a/webrtc/video/receive_statistics_proxy.h b/webrtc/video/receive_statistics_proxy.h
index 8aff1a2..0cd0b52 100644
--- a/webrtc/video/receive_statistics_proxy.h
+++ b/webrtc/video/receive_statistics_proxy.h
@@ -14,6 +14,7 @@
#include <map>
#include <string>
+#include "webrtc/call/video_receive_stream.h"
#include "webrtc/common_types.h"
#include "webrtc/common_video/include/frame_callback.h"
#include "webrtc/modules/video_coding/include/video_coding_defines.h"
@@ -25,7 +26,6 @@
#include "webrtc/video/report_block_stats.h"
#include "webrtc/video/stats_counter.h"
#include "webrtc/video/video_stream_decoder.h"
-#include "webrtc/video_receive_stream.h"
namespace webrtc {
diff --git a/webrtc/video/rtp_video_stream_receiver.h b/webrtc/video/rtp_video_stream_receiver.h
index a28816a..4d63d76 100644
--- a/webrtc/video/rtp_video_stream_receiver.h
+++ b/webrtc/video/rtp_video_stream_receiver.h
@@ -18,6 +18,7 @@
#include <vector>
#include "webrtc/call/rtp_packet_sink_interface.h"
+#include "webrtc/call/video_receive_stream.h"
#include "webrtc/modules/include/module_common_types.h"
#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
#include "webrtc/modules/rtp_rtcp/include/remote_ntp_time_estimator.h"
@@ -33,7 +34,6 @@
#include "webrtc/rtc_base/criticalsection.h"
#include "webrtc/rtc_base/thread_checker.h"
#include "webrtc/typedefs.h"
-#include "webrtc/video_receive_stream.h"
namespace webrtc {
diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc
index 59d1933..f702742 100644
--- a/webrtc/video/video_receive_stream.cc
+++ b/webrtc/video/video_receive_stream.cc
@@ -37,106 +37,9 @@
#include "webrtc/system_wrappers/include/field_trial.h"
#include "webrtc/video/call_stats.h"
#include "webrtc/video/receive_statistics_proxy.h"
-#include "webrtc/video_receive_stream.h"
namespace webrtc {
-std::string VideoReceiveStream::Decoder::ToString() const {
- std::stringstream ss;
- ss << "{decoder: " << (decoder ? "(VideoDecoder)" : "nullptr");
- ss << ", payload_type: " << payload_type;
- ss << ", payload_name: " << payload_name;
- ss << ", codec_params: {";
- for (const auto& it : codec_params)
- ss << it.first << ": " << it.second;
- ss << '}';
- ss << '}';
-
- return ss.str();
-}
-
-std::string VideoReceiveStream::Config::ToString() const {
- std::stringstream ss;
- ss << "{decoders: [";
- for (size_t i = 0; i < decoders.size(); ++i) {
- ss << decoders[i].ToString();
- if (i != decoders.size() - 1)
- ss << ", ";
- }
- ss << ']';
- ss << ", rtp: " << rtp.ToString();
- ss << ", renderer: " << (renderer ? "(renderer)" : "nullptr");
- ss << ", render_delay_ms: " << render_delay_ms;
- if (!sync_group.empty())
- ss << ", sync_group: " << sync_group;
- ss << ", pre_decode_callback: "
- << (pre_decode_callback ? "(EncodedFrameObserver)" : "nullptr");
- ss << ", target_delay_ms: " << target_delay_ms;
- ss << '}';
-
- return ss.str();
-}
-
-std::string VideoReceiveStream::Config::Rtp::ToString() const {
- std::stringstream ss;
- ss << "{remote_ssrc: " << remote_ssrc;
- ss << ", local_ssrc: " << local_ssrc;
- ss << ", rtcp_mode: "
- << (rtcp_mode == RtcpMode::kCompound ? "RtcpMode::kCompound"
- : "RtcpMode::kReducedSize");
- ss << ", rtcp_xr: ";
- ss << "{receiver_reference_time_report: "
- << (rtcp_xr.receiver_reference_time_report ? "on" : "off");
- ss << '}';
- ss << ", remb: " << (remb ? "on" : "off");
- ss << ", transport_cc: " << (transport_cc ? "on" : "off");
- ss << ", nack: {rtp_history_ms: " << nack.rtp_history_ms << '}';
- ss << ", ulpfec: " << ulpfec.ToString();
- ss << ", rtx_ssrc: " << rtx_ssrc;
- ss << ", rtx_payload_types: {";
- for (auto& kv : rtx_payload_types) {
- ss << kv.first << " (apt) -> " << kv.second << " (pt), ";
- }
- ss << '}';
- ss << ", extensions: [";
- for (size_t i = 0; i < extensions.size(); ++i) {
- ss << extensions[i].ToString();
- if (i != extensions.size() - 1)
- ss << ", ";
- }
- ss << ']';
- ss << '}';
- return ss.str();
-}
-
-std::string VideoReceiveStream::Stats::ToString(int64_t time_ms) const {
- std::stringstream ss;
- ss << "VideoReceiveStream stats: " << time_ms << ", {ssrc: " << ssrc << ", ";
- ss << "total_bps: " << total_bitrate_bps << ", ";
- ss << "width: " << width << ", ";
- ss << "height: " << height << ", ";
- ss << "key: " << frame_counts.key_frames << ", ";
- ss << "delta: " << frame_counts.delta_frames << ", ";
- ss << "network_fps: " << network_frame_rate << ", ";
- ss << "decode_fps: " << decode_frame_rate << ", ";
- ss << "render_fps: " << render_frame_rate << ", ";
- ss << "decode_ms: " << decode_ms << ", ";
- ss << "max_decode_ms: " << max_decode_ms << ", ";
- ss << "cur_delay_ms: " << current_delay_ms << ", ";
- ss << "targ_delay_ms: " << target_delay_ms << ", ";
- ss << "jb_delay_ms: " << jitter_buffer_ms << ", ";
- ss << "min_playout_delay_ms: " << min_playout_delay_ms << ", ";
- ss << "discarded: " << discarded_packets << ", ";
- ss << "sync_offset_ms: " << sync_offset_ms << ", ";
- ss << "cum_loss: " << rtcp_stats.packets_lost << ", ";
- ss << "max_ext_seq: " << rtcp_stats.extended_highest_sequence_number << ", ";
- ss << "nack: " << rtcp_packet_type_counts.nack_packets << ", ";
- ss << "fir: " << rtcp_packet_type_counts.fir_packets << ", ";
- ss << "pli: " << rtcp_packet_type_counts.pli_packets;
- ss << '}';
- return ss.str();
-}
-
namespace {
VideoCodec CreateDecoderVideoCodec(const VideoReceiveStream::Decoder& decoder) {
VideoCodec codec;
diff --git a/webrtc/video/video_receive_stream.h b/webrtc/video/video_receive_stream.h
index bd70d1e..ba340ea 100644
--- a/webrtc/video/video_receive_stream.h
+++ b/webrtc/video/video_receive_stream.h
@@ -16,6 +16,7 @@
#include "webrtc/call/rtp_packet_sink_interface.h"
#include "webrtc/call/syncable.h"
+#include "webrtc/call/video_receive_stream.h"
#include "webrtc/common_video/include/incoming_video_stream.h"
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h"
@@ -28,7 +29,6 @@
#include "webrtc/video/rtp_video_stream_receiver.h"
#include "webrtc/video/transport_adapter.h"
#include "webrtc/video/video_stream_decoder.h"
-#include "webrtc/video_receive_stream.h"
namespace webrtc {
diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
index 3fc4976..253d11c 100644
--- a/webrtc/video/video_send_stream.cc
+++ b/webrtc/video/video_send_stream.cc
@@ -145,129 +145,6 @@
} // namespace
-std::string
-VideoSendStream::Config::EncoderSettings::ToString() const {
- std::stringstream ss;
- ss << "{payload_name: " << payload_name;
- ss << ", payload_type: " << payload_type;
- ss << ", encoder: " << (encoder ? "(VideoEncoder)" : "nullptr");
- ss << '}';
- return ss.str();
-}
-
-std::string VideoSendStream::Config::Rtp::Rtx::ToString()
- const {
- std::stringstream ss;
- ss << "{ssrcs: [";
- for (size_t i = 0; i < ssrcs.size(); ++i) {
- ss << ssrcs[i];
- if (i != ssrcs.size() - 1)
- ss << ", ";
- }
- ss << ']';
-
- ss << ", payload_type: " << payload_type;
- ss << '}';
- return ss.str();
-}
-
-std::string VideoSendStream::Config::Rtp::ToString() const {
- std::stringstream ss;
- ss << "{ssrcs: [";
- for (size_t i = 0; i < ssrcs.size(); ++i) {
- ss << ssrcs[i];
- if (i != ssrcs.size() - 1)
- ss << ", ";
- }
- ss << ']';
- ss << ", rtcp_mode: "
- << (rtcp_mode == RtcpMode::kCompound ? "RtcpMode::kCompound"
- : "RtcpMode::kReducedSize");
- ss << ", max_packet_size: " << max_packet_size;
- ss << ", extensions: [";
- for (size_t i = 0; i < extensions.size(); ++i) {
- ss << extensions[i].ToString();
- if (i != extensions.size() - 1)
- ss << ", ";
- }
- ss << ']';
-
- ss << ", nack: {rtp_history_ms: " << nack.rtp_history_ms << '}';
- ss << ", ulpfec: " << ulpfec.ToString();
-
- ss << ", flexfec: {payload_type: " << flexfec.payload_type;
- ss << ", ssrc: " << flexfec.ssrc;
- ss << ", protected_media_ssrcs: [";
- for (size_t i = 0; i < flexfec.protected_media_ssrcs.size(); ++i) {
- ss << flexfec.protected_media_ssrcs[i];
- if (i != flexfec.protected_media_ssrcs.size() - 1)
- ss << ", ";
- }
- ss << "]}";
-
- ss << ", rtx: " << rtx.ToString();
- ss << ", c_name: " << c_name;
- ss << '}';
- return ss.str();
-}
-
-std::string VideoSendStream::Config::ToString() const {
- std::stringstream ss;
- ss << "{encoder_settings: " << encoder_settings.ToString();
- ss << ", rtp: " << rtp.ToString();
- ss << ", pre_encode_callback: "
- << (pre_encode_callback ? "(VideoSinkInterface)" : "nullptr");
- ss << ", post_encode_callback: "
- << (post_encode_callback ? "(EncodedFrameObserver)" : "nullptr");
- ss << ", render_delay_ms: " << render_delay_ms;
- ss << ", target_delay_ms: " << target_delay_ms;
- ss << ", suspend_below_min_bitrate: " << (suspend_below_min_bitrate ? "on"
- : "off");
- ss << '}';
- return ss.str();
-}
-
-std::string VideoSendStream::Stats::ToString(int64_t time_ms) const {
- std::stringstream ss;
- ss << "VideoSendStream stats: " << time_ms << ", {";
- ss << "input_fps: " << input_frame_rate << ", ";
- ss << "encode_fps: " << encode_frame_rate << ", ";
- ss << "encode_ms: " << avg_encode_time_ms << ", ";
- ss << "encode_usage_perc: " << encode_usage_percent << ", ";
- ss << "target_bps: " << target_media_bitrate_bps << ", ";
- ss << "media_bps: " << media_bitrate_bps << ", ";
- ss << "preferred_media_bitrate_bps: " << preferred_media_bitrate_bps << ", ";
- ss << "suspended: " << (suspended ? "true" : "false") << ", ";
- ss << "bw_adapted: " << (bw_limited_resolution ? "true" : "false");
- ss << '}';
- for (const auto& substream : substreams) {
- if (!substream.second.is_rtx && !substream.second.is_flexfec) {
- ss << " {ssrc: " << substream.first << ", ";
- ss << substream.second.ToString();
- ss << '}';
- }
- }
- return ss.str();
-}
-
-std::string VideoSendStream::StreamStats::ToString() const {
- std::stringstream ss;
- ss << "width: " << width << ", ";
- ss << "height: " << height << ", ";
- ss << "key: " << frame_counts.key_frames << ", ";
- ss << "delta: " << frame_counts.delta_frames << ", ";
- ss << "total_bps: " << total_bitrate_bps << ", ";
- ss << "retransmit_bps: " << retransmit_bitrate_bps << ", ";
- ss << "avg_delay_ms: " << avg_delay_ms << ", ";
- ss << "max_delay_ms: " << max_delay_ms << ", ";
- ss << "cum_loss: " << rtcp_stats.packets_lost << ", ";
- ss << "max_ext_seq: " << rtcp_stats.extended_highest_sequence_number << ", ";
- ss << "nack: " << rtcp_packet_type_counts.nack_packets << ", ";
- ss << "fir: " << rtcp_packet_type_counts.fir_packets << ", ";
- ss << "pli: " << rtcp_packet_type_counts.pli_packets;
- return ss.str();
-}
-
namespace {
bool PayloadTypeSupportsSkippingFecPackets(const std::string& payload_name) {
diff --git a/webrtc/video/video_send_stream.h b/webrtc/video/video_send_stream.h
index e105d70..06fbb36 100644
--- a/webrtc/video/video_send_stream.h
+++ b/webrtc/video/video_send_stream.h
@@ -16,6 +16,8 @@
#include <vector>
#include "webrtc/call/bitrate_allocator.h"
+#include "webrtc/call/video_receive_stream.h"
+#include "webrtc/call/video_send_stream.h"
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
#include "webrtc/modules/video_coding/protection_bitrate_calculator.h"
#include "webrtc/rtc_base/criticalsection.h"
@@ -25,8 +27,6 @@
#include "webrtc/video/send_delay_stats.h"
#include "webrtc/video/send_statistics_proxy.h"
#include "webrtc/video/video_stream_encoder.h"
-#include "webrtc/video_receive_stream.h"
-#include "webrtc/video_send_stream.h"
namespace webrtc {
diff --git a/webrtc/video_receive_stream.h b/webrtc/video_receive_stream.h
index 48d16a8..86d71d3 100644
--- a/webrtc/video_receive_stream.h
+++ b/webrtc/video_receive_stream.h
@@ -11,228 +11,8 @@
#ifndef WEBRTC_VIDEO_RECEIVE_STREAM_H_
#define WEBRTC_VIDEO_RECEIVE_STREAM_H_
-#include <limits>
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/frame_callback.h"
-#include "webrtc/config.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/rtc_base/platform_file.h"
-
-namespace webrtc {
-
-class RtpPacketSinkInterface;
-class VideoDecoder;
-
-class VideoReceiveStream {
- public:
- // TODO(mflodman) Move all these settings to VideoDecoder and move the
- // declaration to common_types.h.
- struct Decoder {
- std::string ToString() const;
-
- // The actual decoder instance.
- VideoDecoder* decoder = nullptr;
-
- // Received RTP packets with this payload type will be sent to this decoder
- // instance.
- int payload_type = 0;
-
- // Name of the decoded payload (such as VP8). Maps back to the depacketizer
- // used to unpack incoming packets.
- std::string payload_name;
-
- // This map contains the codec specific parameters from SDP, i.e. the "fmtp"
- // parameters. It is the same as cricket::CodecParameterMap used in
- // cricket::VideoCodec.
- std::map<std::string, std::string> codec_params;
- };
-
- struct Stats {
- std::string ToString(int64_t time_ms) const;
-
- int network_frame_rate = 0;
- int decode_frame_rate = 0;
- int render_frame_rate = 0;
- uint32_t frames_rendered = 0;
-
- // Decoder stats.
- std::string decoder_implementation_name = "unknown";
- FrameCounts frame_counts;
- int decode_ms = 0;
- int max_decode_ms = 0;
- int current_delay_ms = 0;
- int target_delay_ms = 0;
- int jitter_buffer_ms = 0;
- int min_playout_delay_ms = 0;
- int render_delay_ms = 10;
- uint64_t interframe_delay_sum_ms = 0;
- uint32_t frames_decoded = 0;
- rtc::Optional<uint64_t> qp_sum;
-
- int current_payload_type = -1;
-
- int total_bitrate_bps = 0;
- int discarded_packets = 0;
-
- int width = 0;
- int height = 0;
-
- int sync_offset_ms = std::numeric_limits<int>::max();
-
- uint32_t ssrc = 0;
- std::string c_name;
- StreamDataCounters rtp_stats;
- RtcpPacketTypeCounter rtcp_packet_type_counts;
- RtcpStatistics rtcp_stats;
- };
-
- struct Config {
- private:
- // Access to the copy constructor is private to force use of the Copy()
- // method for those exceptional cases where we do use it.
- Config(const Config&) = default;
-
- public:
- Config() = delete;
- Config(Config&&) = default;
- explicit Config(Transport* rtcp_send_transport)
- : rtcp_send_transport(rtcp_send_transport) {}
-
- Config& operator=(Config&&) = default;
- Config& operator=(const Config&) = delete;
-
- // Mostly used by tests. Avoid creating copies if you can.
- Config Copy() const { return Config(*this); }
-
- std::string ToString() const;
-
- // Decoders for every payload that we can receive.
- std::vector<Decoder> decoders;
-
- // Receive-stream specific RTP settings.
- struct Rtp {
- std::string ToString() const;
-
- // Synchronization source (stream identifier) to be received.
- uint32_t remote_ssrc = 0;
-
- // Sender SSRC used for sending RTCP (such as receiver reports).
- uint32_t local_ssrc = 0;
-
- // See RtcpMode for description.
- RtcpMode rtcp_mode = RtcpMode::kCompound;
-
- // Extended RTCP settings.
- struct RtcpXr {
- // True if RTCP Receiver Reference Time Report Block extension
- // (RFC 3611) should be enabled.
- bool receiver_reference_time_report = false;
- } rtcp_xr;
-
- // TODO(nisse): This remb setting is currently set but never
- // applied. REMB logic is now the responsibility of
- // PacketRouter, and it will generate REMB feedback if
- // OnReceiveBitrateChanged is used, which depends on how the
- // estimators belonging to the ReceiveSideCongestionController
- // are configured. Decide if this setting should be deleted, and
- // if it needs to be replaced by a setting in PacketRouter to
- // disable REMB feedback.
-
- // See draft-alvestrand-rmcat-remb for information.
- bool remb = false;
-
- // See draft-holmer-rmcat-transport-wide-cc-extensions for details.
- bool transport_cc = false;
-
- // See NackConfig for description.
- NackConfig nack;
-
- // See UlpfecConfig for description.
- UlpfecConfig ulpfec;
-
- // SSRC for retransmissions.
- uint32_t rtx_ssrc = 0;
-
- // Set if the stream is protected using FlexFEC.
- bool protected_by_flexfec = false;
-
- // Map from video payload type (apt) -> RTX payload type (pt).
- // For RTX to be enabled, both an SSRC and this mapping are needed.
- std::map<int, int> rtx_payload_types;
-
- // RTP header extensions used for the received stream.
- std::vector<RtpExtension> extensions;
- } rtp;
-
- // Transport for outgoing packets (RTCP).
- Transport* rtcp_send_transport = nullptr;
-
- // Must not be 'nullptr' when the stream is started.
- rtc::VideoSinkInterface<VideoFrame>* renderer = nullptr;
-
- // Expected delay needed by the renderer, i.e. the frame will be delivered
- // this many milliseconds, if possible, earlier than the ideal render time.
- // Only valid if 'renderer' is set.
- int render_delay_ms = 10;
-
- // If set, pass frames on to the renderer as soon as they are
- // available.
- bool disable_prerenderer_smoothing = false;
-
- // Identifier for an A/V synchronization group. Empty string to disable.
- // TODO(pbos): Synchronize streams in a sync group, not just video streams
- // to one of the audio streams.
- std::string sync_group;
-
- // Called for each incoming video frame, i.e. in encoded state. E.g. used
- // when
- // saving the stream to a file. 'nullptr' disables the callback.
- EncodedFrameObserver* pre_decode_callback = nullptr;
-
- // Target delay in milliseconds. A positive value indicates this stream is
- // used for streaming instead of a real-time call.
- int target_delay_ms = 0;
- };
-
- // Starts stream activity.
- // When a stream is active, it can receive, process and deliver packets.
- virtual void Start() = 0;
- // Stops stream activity.
- // When a stream is stopped, it can't receive, process or deliver packets.
- virtual void Stop() = 0;
-
- // TODO(pbos): Add info on currently-received codec to Stats.
- virtual Stats GetStats() const = 0;
-
- virtual rtc::Optional<TimingFrameInfo> GetAndResetTimingFrameInfo() = 0;
-
- // Takes ownership of the file, is responsible for closing it later.
- // Calling this method will close and finalize any current log.
- // Giving rtc::kInvalidPlatformFileValue disables logging.
- // If a frame to be written would make the log too large the write fails and
- // the log is closed and finalized. A |byte_limit| of 0 means no limit.
- virtual void EnableEncodedFrameRecording(rtc::PlatformFile file,
- size_t byte_limit) = 0;
- inline void DisableEncodedFrameRecording() {
- EnableEncodedFrameRecording(rtc::kInvalidPlatformFileValue, 0);
- }
-
- // RtpDemuxer only forwards a given RTP packet to one sink. However, some
- // sinks, such as FlexFEC, might wish to be informed of all of the packets
- // a given sink receives (or any set of sinks). They may do so by registering
- // themselves as secondary sinks.
- virtual void AddSecondarySink(RtpPacketSinkInterface* sink) = 0;
- virtual void RemoveSecondarySink(const RtpPacketSinkInterface* sink) = 0;
-
- protected:
- virtual ~VideoReceiveStream() {}
-};
-
-} // namespace webrtc
+#include "webrtc/call/video_receive_stream.h"
+// The contents header have moved to webrtc/call/video_receive_stream.h. This
+// file is deprecated. See http://bugs.webrtc.org/8107.
#endif // WEBRTC_VIDEO_RECEIVE_STREAM_H_
diff --git a/webrtc/video_send_stream.h b/webrtc/video_send_stream.h
index c5a1f9b..74be574 100644
--- a/webrtc/video_send_stream.h
+++ b/webrtc/video_send_stream.h
@@ -11,258 +11,8 @@
#ifndef WEBRTC_VIDEO_SEND_STREAM_H_
#define WEBRTC_VIDEO_SEND_STREAM_H_
-#include <map>
-#include <string>
-#include <utility>
-#include <vector>
-#include <utility>
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/frame_callback.h"
-#include "webrtc/config.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/media/base/videosourceinterface.h"
-#include "webrtc/rtc_base/platform_file.h"
-
-namespace webrtc {
-
-class VideoEncoder;
-
-class VideoSendStream {
- public:
- struct StreamStats {
- std::string ToString() const;
-
- FrameCounts frame_counts;
- bool is_rtx = false;
- bool is_flexfec = false;
- int width = 0;
- int height = 0;
- // TODO(holmer): Move bitrate_bps out to the webrtc::Call layer.
- int total_bitrate_bps = 0;
- int retransmit_bitrate_bps = 0;
- int avg_delay_ms = 0;
- int max_delay_ms = 0;
- StreamDataCounters rtp_stats;
- RtcpPacketTypeCounter rtcp_packet_type_counts;
- RtcpStatistics rtcp_stats;
- };
-
- struct Stats {
- std::string ToString(int64_t time_ms) const;
- std::string encoder_implementation_name = "unknown";
- int input_frame_rate = 0;
- int encode_frame_rate = 0;
- int avg_encode_time_ms = 0;
- int encode_usage_percent = 0;
- uint32_t frames_encoded = 0;
- rtc::Optional<uint64_t> qp_sum;
- // Bitrate the encoder is currently configured to use due to bandwidth
- // limitations.
- int target_media_bitrate_bps = 0;
- // Bitrate the encoder is actually producing.
- int media_bitrate_bps = 0;
- // Media bitrate this VideoSendStream is configured to prefer if there are
- // no bandwidth limitations.
- int preferred_media_bitrate_bps = 0;
- bool suspended = false;
- bool bw_limited_resolution = false;
- bool cpu_limited_resolution = false;
- bool bw_limited_framerate = false;
- bool cpu_limited_framerate = false;
- // Total number of times resolution as been requested to be changed due to
- // CPU/quality adaptation.
- int number_of_cpu_adapt_changes = 0;
- int number_of_quality_adapt_changes = 0;
- std::map<uint32_t, StreamStats> substreams;
- };
-
- struct Config {
- public:
- Config() = delete;
- Config(Config&&) = default;
- explicit Config(Transport* send_transport)
- : send_transport(send_transport) {}
-
- Config& operator=(Config&&) = default;
- Config& operator=(const Config&) = delete;
-
- // Mostly used by tests. Avoid creating copies if you can.
- Config Copy() const { return Config(*this); }
-
- std::string ToString() const;
-
- struct EncoderSettings {
- EncoderSettings() = default;
- EncoderSettings(std::string payload_name,
- int payload_type,
- VideoEncoder* encoder)
- : payload_name(std::move(payload_name)),
- payload_type(payload_type),
- encoder(encoder) {}
- std::string ToString() const;
-
- std::string payload_name;
- int payload_type = -1;
-
- // TODO(sophiechang): Delete this field when no one is using internal
- // sources anymore.
- bool internal_source = false;
-
- // Allow 100% encoder utilization. Used for HW encoders where CPU isn't
- // expected to be the limiting factor, but a chip could be running at
- // 30fps (for example) exactly.
- bool full_overuse_time = false;
-
- // Uninitialized VideoEncoder instance to be used for encoding. Will be
- // initialized from inside the VideoSendStream.
- VideoEncoder* encoder = nullptr;
- } encoder_settings;
-
- static const size_t kDefaultMaxPacketSize = 1500 - 40; // TCP over IPv4.
- struct Rtp {
- std::string ToString() const;
-
- std::vector<uint32_t> ssrcs;
-
- // See RtcpMode for description.
- RtcpMode rtcp_mode = RtcpMode::kCompound;
-
- // Max RTP packet size delivered to send transport from VideoEngine.
- size_t max_packet_size = kDefaultMaxPacketSize;
-
- // RTP header extensions to use for this send stream.
- std::vector<RtpExtension> extensions;
-
- // See NackConfig for description.
- NackConfig nack;
-
- // See UlpfecConfig for description.
- UlpfecConfig ulpfec;
-
- struct Flexfec {
- // Payload type of FlexFEC. Set to -1 to disable sending FlexFEC.
- int payload_type = -1;
-
- // SSRC of FlexFEC stream.
- uint32_t ssrc = 0;
-
- // Vector containing a single element, corresponding to the SSRC of the
- // media stream being protected by this FlexFEC stream.
- // The vector MUST have size 1.
- //
- // TODO(brandtr): Update comment above when we support
- // multistream protection.
- std::vector<uint32_t> protected_media_ssrcs;
- } flexfec;
-
- // Settings for RTP retransmission payload format, see RFC 4588 for
- // details.
- struct Rtx {
- std::string ToString() const;
- // SSRCs to use for the RTX streams.
- std::vector<uint32_t> ssrcs;
-
- // Payload type to use for the RTX stream.
- int payload_type = -1;
- } rtx;
-
- // RTCP CNAME, see RFC 3550.
- std::string c_name;
- } rtp;
-
- // Transport for outgoing packets.
- Transport* send_transport = nullptr;
-
- // Called for each I420 frame before encoding the frame. Can be used for
- // effects, snapshots etc. 'nullptr' disables the callback.
- rtc::VideoSinkInterface<VideoFrame>* pre_encode_callback = nullptr;
-
- // Called for each encoded frame, e.g. used for file storage. 'nullptr'
- // disables the callback. Also measures timing and passes the time
- // spent on encoding. This timing will not fire if encoding takes longer
- // than the measuring window, since the sample data will have been dropped.
- EncodedFrameObserver* post_encode_callback = nullptr;
-
- // Expected delay needed by the renderer, i.e. the frame will be delivered
- // this many milliseconds, if possible, earlier than expected render time.
- // Only valid if |local_renderer| is set.
- int render_delay_ms = 0;
-
- // Target delay in milliseconds. A positive value indicates this stream is
- // used for streaming instead of a real-time call.
- int target_delay_ms = 0;
-
- // True if the stream should be suspended when the available bitrate fall
- // below the minimum configured bitrate. If this variable is false, the
- // stream may send at a rate higher than the estimated available bitrate.
- bool suspend_below_min_bitrate = false;
-
- // Enables periodic bandwidth probing in application-limited region.
- bool periodic_alr_bandwidth_probing = false;
-
- private:
- // Access to the copy constructor is private to force use of the Copy()
- // method for those exceptional cases where we do use it.
- Config(const Config&) = default;
- };
-
- // Starts stream activity.
- // When a stream is active, it can receive, process and deliver packets.
- virtual void Start() = 0;
- // Stops stream activity.
- // When a stream is stopped, it can't receive, process or deliver packets.
- virtual void Stop() = 0;
-
- // Based on the spec in
- // https://w3c.github.io/webrtc-pc/#idl-def-rtcdegradationpreference.
- // These options are enforced on a best-effort basis. For instance, all of
- // these options may suffer some frame drops in order to avoid queuing.
- // TODO(sprang): Look into possibility of more strictly enforcing the
- // maintain-framerate option.
- enum class DegradationPreference {
- // Don't take any actions based on over-utilization signals.
- kDegradationDisabled,
- // On over-use, request lower frame rate, possibly causing frame drops.
- kMaintainResolution,
- // On over-use, request lower resolution, possibly causing down-scaling.
- kMaintainFramerate,
- // Try to strike a "pleasing" balance between frame rate or resolution.
- kBalanced,
- };
-
- virtual void SetSource(
- rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
- const DegradationPreference& degradation_preference) = 0;
-
- // Set which streams to send. Must have at least as many SSRCs as configured
- // in the config. Encoder settings are passed on to the encoder instance along
- // with the VideoStream settings.
- virtual void ReconfigureVideoEncoder(VideoEncoderConfig config) = 0;
-
- virtual Stats GetStats() = 0;
-
- // Takes ownership of each file, is responsible for closing them later.
- // Calling this method will close and finalize any current logs.
- // Some codecs produce multiple streams (VP8 only at present), each of these
- // streams will log to a separate file. kMaxSimulcastStreams in common_types.h
- // gives the max number of such streams. If there is no file for a stream, or
- // the file is rtc::kInvalidPlatformFileValue, frames from that stream will
- // not be logged.
- // If a frame to be written would make the log too large the write fails and
- // the log is closed and finalized. A |byte_limit| of 0 means no limit.
- virtual void EnableEncodedFrameRecording(
- const std::vector<rtc::PlatformFile>& files,
- size_t byte_limit) = 0;
- inline void DisableEncodedFrameRecording() {
- EnableEncodedFrameRecording(std::vector<rtc::PlatformFile>(), 0);
- }
-
- protected:
- virtual ~VideoSendStream() {}
-};
-
-} // namespace webrtc
+#include "webrtc/call/video_send_stream.h"
+// The contents header have moved to webrtc/call/video_send_stream.h. This
+// file is deprecated. See http://bugs.webrtc.org/8107.
#endif // WEBRTC_VIDEO_SEND_STREAM_H_