Move simple RtpRtcp calls to VideoSendStream.
Moves RtpRtcp module pointers into VideoSendStream and uses them for
simple calls that were only forwarded by ViEChannel.
BUG=webrtc:5494
R=stefan@webrtc.org
Review URL: https://codereview.webrtc.org/1693553002 .
Cr-Commit-Position: refs/heads/master@{#11709}
diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc
index 1ed047b..4cfce34 100644
--- a/webrtc/video/video_receive_stream.cc
+++ b/webrtc/video/video_receive_stream.cc
@@ -179,7 +179,7 @@
false),
vie_receiver_(vie_channel_.vie_receiver()),
vie_sync_(vcm_.get()),
- rtp_rtcp_(vie_channel_.rtp_rtcp()) {
+ rtp_rtcp_(vie_channel_.rtp_rtcp().front()) {
LOG(LS_INFO) << "VideoReceiveStream: " << config_.ToString();
RTC_DCHECK(process_thread_);
diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
index db00adf..d3dde5a 100644
--- a/webrtc/video/video_send_stream.cc
+++ b/webrtc/video/video_send_stream.cc
@@ -197,6 +197,7 @@
&payload_router_,
bitrate_allocator),
vcm_(vie_encoder_.vcm()),
+ rtp_rtcp_modules_(vie_channel_.rtp_rtcp()),
input_(&vie_encoder_,
config_.local_renderer,
&stats_proxy_,
@@ -236,9 +237,8 @@
}
}
- RtpRtcp* rtp_module = vie_channel_.rtp_rtcp();
- remb_->AddRembSender(rtp_module);
- rtp_module->SetREMBStatus(true);
+ remb_->AddRembSender(rtp_rtcp_modules_[0]);
+ rtp_rtcp_modules_[0]->SetREMBStatus(true);
// Enable NACK, FEC or both.
const bool enable_protection_nack = config_.rtp.nack.rtp_history_ms > 0;
@@ -257,18 +257,25 @@
}
// TODO(changbin): Should set RTX for RED mapping in RTP sender in future.
vie_channel_.SetProtectionMode(enable_protection_nack, enable_protection_fec,
- config_.rtp.fec.red_payload_type,
- config_.rtp.fec.ulpfec_payload_type);
+ config_.rtp.fec.red_payload_type,
+ config_.rtp.fec.ulpfec_payload_type);
vie_encoder_.SetProtectionMethod(enable_protection_nack,
- enable_protection_fec);
+ enable_protection_fec);
ConfigureSsrcs();
- vie_channel_.SetRTCPCName(config_.rtp.c_name.c_str());
-
+ // TODO(pbos): Should we set CNAME on all RTP modules?
+ rtp_rtcp_modules_.front()->SetCNAME(config_.rtp.c_name.c_str());
// 28 to match packet overhead in ModuleRtpRtcpImpl.
- RTC_DCHECK_LE(config_.rtp.max_packet_size, static_cast<size_t>(0xFFFF - 28));
- vie_channel_.SetMTU(static_cast<uint16_t>(config_.rtp.max_packet_size + 28));
+ static const size_t kRtpPacketSizeOverhead = 28;
+ RTC_DCHECK_LE(config_.rtp.max_packet_size, 0xFFFFu + kRtpPacketSizeOverhead);
+ const uint16_t mtu = static_cast<uint16_t>(config_.rtp.max_packet_size +
+ kRtpPacketSizeOverhead);
+ for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
+ rtp_rtcp->RegisterRtcpStatisticsCallback(&stats_proxy_);
+ rtp_rtcp->RegisterSendChannelRtpStatisticsCallback(&stats_proxy_);
+ rtp_rtcp->SetMaxTransferUnit(mtu);
+ }
RTC_DCHECK(config.encoder_settings.encoder != nullptr);
RTC_DCHECK_GE(config.encoder_settings.payload_type, 0);
@@ -288,8 +295,6 @@
if (config_.suspend_below_min_bitrate)
vie_encoder_.SuspendBelowMinBitrate();
- vie_channel_.RegisterSendChannelRtcpStatisticsCallback(&stats_proxy_);
- vie_channel_.RegisterSendChannelRtpStatisticsCallback(&stats_proxy_);
vie_channel_.RegisterRtcpPacketTypeCounterObserver(&stats_proxy_);
vie_channel_.RegisterSendBitrateObserver(&stats_proxy_);
vie_channel_.RegisterSendFrameCountObserver(&stats_proxy_);
@@ -305,17 +310,12 @@
vie_channel_.RegisterSendFrameCountObserver(nullptr);
vie_channel_.RegisterSendBitrateObserver(nullptr);
vie_channel_.RegisterRtcpPacketTypeCounterObserver(nullptr);
- vie_channel_.RegisterSendChannelRtpStatisticsCallback(nullptr);
- vie_channel_.RegisterSendChannelRtcpStatisticsCallback(nullptr);
- vie_encoder_.DeRegisterExternalEncoder(
- config_.encoder_settings.payload_type);
+ vie_encoder_.DeRegisterExternalEncoder(config_.encoder_settings.payload_type);
call_stats_->DeregisterStatsObserver(vie_channel_.GetStatsObserver());
-
- RtpRtcp* rtp_module = vie_channel_.rtp_rtcp();
- rtp_module->SetREMBStatus(false);
- remb_->RemoveRembSender(rtp_module);
+ rtp_rtcp_modules_[0]->SetREMBStatus(false);
+ remb_->RemoveRembSender(rtp_rtcp_modules_[0]);
// ViEChannel outlives ViEEncoder so remove encoder from feedback before
// destruction.
@@ -509,38 +509,46 @@
}
void VideoSendStream::ConfigureSsrcs() {
- vie_channel_.SetSSRC(config_.rtp.ssrcs.front(), kViEStreamTypeNormal, 0);
+ // Configure regular SSRCs.
for (size_t i = 0; i < config_.rtp.ssrcs.size(); ++i) {
uint32_t ssrc = config_.rtp.ssrcs[i];
- vie_channel_.SetSSRC(ssrc, kViEStreamTypeNormal,
- static_cast<unsigned char>(i));
+ RtpRtcp* const rtp_rtcp = rtp_rtcp_modules_[i];
+ rtp_rtcp->SetSSRC(ssrc);
+
+ // Restore RTP state if previous existed.
RtpStateMap::iterator it = suspended_ssrcs_.find(ssrc);
if (it != suspended_ssrcs_.end())
- vie_channel_.SetRtpStateForSsrc(ssrc, it->second);
+ rtp_rtcp->SetRtpStateForSsrc(ssrc, it->second);
}
- if (config_.rtp.rtx.ssrcs.empty()) {
+ // Set up RTX if available.
+ if (config_.rtp.rtx.ssrcs.empty())
return;
- }
- // Set up RTX.
+ // Configure RTX SSRCs.
RTC_DCHECK_EQ(config_.rtp.rtx.ssrcs.size(), config_.rtp.ssrcs.size());
for (size_t i = 0; i < config_.rtp.rtx.ssrcs.size(); ++i) {
uint32_t ssrc = config_.rtp.rtx.ssrcs[i];
- vie_channel_.SetSSRC(config_.rtp.rtx.ssrcs[i], kViEStreamTypeRtx,
- static_cast<unsigned char>(i));
+ RtpRtcp* const rtp_rtcp = rtp_rtcp_modules_[i];
+ rtp_rtcp->SetRtxSsrc(ssrc);
RtpStateMap::iterator it = suspended_ssrcs_.find(ssrc);
if (it != suspended_ssrcs_.end())
- vie_channel_.SetRtpStateForSsrc(ssrc, it->second);
+ rtp_rtcp->SetRtpStateForSsrc(ssrc, it->second);
}
+ // Configure RTX payload types.
RTC_DCHECK_GE(config_.rtp.rtx.payload_type, 0);
- vie_channel_.SetRtxSendPayloadType(config_.rtp.rtx.payload_type,
- config_.encoder_settings.payload_type);
+ for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
+ rtp_rtcp->SetRtxSendPayloadType(config_.rtp.rtx.payload_type,
+ config_.encoder_settings.payload_type);
+ rtp_rtcp->SetRtxSendStatus(kRtxRetransmitted | kRtxRedundantPayloads);
+ }
if (config_.rtp.fec.red_payload_type != -1 &&
config_.rtp.fec.red_rtx_payload_type != -1) {
- vie_channel_.SetRtxSendPayloadType(config_.rtp.fec.red_rtx_payload_type,
- config_.rtp.fec.red_payload_type);
+ for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
+ rtp_rtcp->SetRtxSendPayloadType(config_.rtp.fec.red_rtx_payload_type,
+ config_.rtp.fec.red_payload_type);
+ }
}
}
@@ -563,11 +571,15 @@
// When network goes up, enable RTCP status before setting transmission state.
// When it goes down, disable RTCP afterwards. This ensures that any packets
// sent due to the network state changed will not be dropped.
- if (state == kNetworkUp)
- vie_channel_.SetRTCPMode(config_.rtp.rtcp_mode);
+ if (state == kNetworkUp) {
+ for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
+ rtp_rtcp->SetRTCPStatus(config_.rtp.rtcp_mode);
+ }
vie_encoder_.SetNetworkTransmissionState(state == kNetworkUp);
- if (state == kNetworkDown)
- vie_channel_.SetRTCPMode(RtcpMode::kOff);
+ if (state == kNetworkDown) {
+ for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
+ rtp_rtcp->SetRTCPStatus(RtcpMode::kOff);
+ }
}
int VideoSendStream::GetPaddingNeededBps() const {
diff --git a/webrtc/video/video_send_stream.h b/webrtc/video/video_send_stream.h
index 2a5df87..a220695 100644
--- a/webrtc/video/video_send_stream.h
+++ b/webrtc/video/video_send_stream.h
@@ -16,7 +16,6 @@
#include "webrtc/call.h"
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "webrtc/video/encoded_frame_callback_adapter.h"
#include "webrtc/video/encoder_state_feedback.h"
#include "webrtc/video/payload_router.h"
@@ -33,6 +32,7 @@
class CallStats;
class CongestionController;
class ProcessThread;
+class RtpRtcp;
class ViEChannel;
class ViEEncoder;
class VieRemb;
@@ -96,6 +96,10 @@
ViEReceiver* const vie_receiver_;
ViEEncoder vie_encoder_;
VideoCodingModule* const vcm_;
+ // TODO(pbos): Move RtpRtcp ownership to VideoSendStream.
+ // RtpRtcp modules, currently owned by ViEChannel but ownership should
+ // eventually move here.
+ const std::vector<RtpRtcp*> rtp_rtcp_modules_;
VideoCaptureInput input_;
};
} // namespace internal
diff --git a/webrtc/video/vie_channel.cc b/webrtc/video/vie_channel.cc
index 19132b8..5d4b100 100644
--- a/webrtc/video/vie_channel.cc
+++ b/webrtc/video/vie_channel.cc
@@ -378,12 +378,6 @@
return 0;
}
-void ViEChannel::SetRTCPMode(const RtcpMode rtcp_mode) {
- RTC_DCHECK(sender_);
- for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
- rtp_rtcp->SetRTCPStatus(rtcp_mode);
-}
-
void ViEChannel::SetProtectionMode(bool enable_nack,
bool enable_fec,
int payload_type_red,
@@ -453,19 +447,6 @@
}
}
-bool ViEChannel::IsSendingFecEnabled() {
- bool fec_enabled = false;
- uint8_t pltype_red = 0;
- uint8_t pltype_fec = 0;
-
- for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
- rtp_rtcp->GenericFECStatus(&fec_enabled, &pltype_red, &pltype_fec);
- if (fec_enabled)
- return true;
- }
- return false;
-}
-
int ViEChannel::GetRequiredNackListSize(int target_delay_ms) {
// The max size of the nack list should be large enough to accommodate the
// the number of packets (frames) resulting from the increased delay.
@@ -538,49 +519,6 @@
return error;
}
-int32_t ViEChannel::SetSSRC(const uint32_t SSRC,
- const StreamType usage,
- const uint8_t simulcast_idx) {
- RTC_DCHECK(sender_);
- RtpRtcp* rtp_rtcp = rtp_rtcp_modules_[simulcast_idx];
- if (usage == kViEStreamTypeRtx) {
- rtp_rtcp->SetRtxSsrc(SSRC);
- } else {
- rtp_rtcp->SetSSRC(SSRC);
- }
- return 0;
-}
-
-int32_t ViEChannel::GetLocalSSRC(uint8_t idx, unsigned int* ssrc) {
- RTC_DCHECK_LE(idx, rtp_rtcp_modules_.size());
- *ssrc = rtp_rtcp_modules_[idx]->SSRC();
- return 0;
-}
-
-int ViEChannel::SetRtxSendPayloadType(int payload_type,
- int associated_payload_type) {
- RTC_DCHECK(sender_);
- for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
- rtp_rtcp->SetRtxSendPayloadType(payload_type, associated_payload_type);
- SetRtxSendStatus(true);
- return 0;
-}
-
-void ViEChannel::SetRtxSendStatus(bool enable) {
- int rtx_settings =
- enable ? kRtxRetransmitted | kRtxRedundantPayloads : kRtxOff;
- for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
- rtp_rtcp->SetRtxSendStatus(rtx_settings);
-}
-
-void ViEChannel::SetRtpStateForSsrc(uint32_t ssrc, const RtpState& rtp_state) {
- RTC_DCHECK(!rtp_rtcp_modules_[0]->Sending());
- for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
- if (rtp_rtcp->SetRtpStateForSsrc(ssrc, rtp_state))
- return;
- }
-}
-
RtpState ViEChannel::GetRtpStateForSsrc(uint32_t ssrc) const {
RTC_DCHECK(!rtp_rtcp_modules_[0]->Sending());
RtpState rtp_state;
@@ -592,23 +530,6 @@
return rtp_state;
}
-// TODO(pbos): Set CNAME on all modules.
-int32_t ViEChannel::SetRTCPCName(const char* rtcp_cname) {
- RTC_DCHECK(!rtp_rtcp_modules_[0]->Sending());
- return rtp_rtcp_modules_[0]->SetCNAME(rtcp_cname);
-}
-
-int32_t ViEChannel::GetRemoteRTCPCName(char rtcp_cname[]) {
- uint32_t remoteSSRC = vie_receiver_.GetRemoteSsrc();
- return rtp_rtcp_modules_[0]->RemoteCNAME(remoteSSRC, rtcp_cname);
-}
-
-void ViEChannel::RegisterSendChannelRtcpStatisticsCallback(
- RtcpStatisticsCallback* callback) {
- for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
- rtp_rtcp->RegisterRtcpStatisticsCallback(callback);
-}
-
void ViEChannel::RegisterRtcpPacketTypeCounterObserver(
RtcpPacketTypeCounterObserver* observer) {
rtcp_packet_type_counter_observer_.Set(observer);
@@ -646,12 +567,6 @@
}
}
-void ViEChannel::RegisterSendChannelRtpStatisticsCallback(
- StreamDataCountersCallback* callback) {
- for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
- rtp_rtcp->RegisterSendChannelRtpStatisticsCallback(callback);
-}
-
void ViEChannel::GetSendRtcpPacketTypeCounter(
RtcpPacketTypeCounter* packet_counter) const {
std::map<uint32_t, RtcpPacketTypeCounter> counter_map =
@@ -717,15 +632,8 @@
return 0;
}
-int32_t ViEChannel::SetMTU(uint16_t mtu) {
- RTC_DCHECK(sender_);
- for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
- rtp_rtcp->SetMaxTransferUnit(mtu);
- return 0;
-}
-
-RtpRtcp* ViEChannel::rtp_rtcp() {
- return rtp_rtcp_modules_[0];
+const std::vector<RtpRtcp*>& ViEChannel::rtp_rtcp() const {
+ return rtp_rtcp_modules_;
}
ViEReceiver* ViEChannel::vie_receiver() {
diff --git a/webrtc/video/vie_channel.h b/webrtc/video/vie_channel.h
index 228b50e..850c974 100644
--- a/webrtc/video/vie_channel.h
+++ b/webrtc/video/vie_channel.h
@@ -84,40 +84,17 @@
// type has changed and we should start a new RTP stream.
int32_t SetSendCodec(const VideoCodec& video_codec, bool new_stream = true);
- void SetRTCPMode(const RtcpMode rtcp_mode);
void SetProtectionMode(bool enable_nack,
bool enable_fec,
int payload_type_red,
int payload_type_fec);
- bool IsSendingFecEnabled();
int SetSendTimestampOffsetStatus(bool enable, int id);
int SetSendAbsoluteSendTimeStatus(bool enable, int id);
int SetSendVideoRotationStatus(bool enable, int id);
int SetSendTransportSequenceNumber(bool enable, int id);
- // Sets SSRC for outgoing stream.
- int32_t SetSSRC(const uint32_t SSRC,
- const StreamType usage,
- const unsigned char simulcast_idx);
-
- // Gets SSRC for outgoing stream number |idx|.
- int32_t GetLocalSSRC(uint8_t idx, unsigned int* ssrc);
-
- int SetRtxSendPayloadType(int payload_type, int associated_payload_type);
-
- void SetRtpStateForSsrc(uint32_t ssrc, const RtpState& rtp_state);
RtpState GetRtpStateForSsrc(uint32_t ssrc) const;
- // Sets the CName for the outgoing stream on the channel.
- int32_t SetRTCPCName(const char* rtcp_cname);
-
- // Gets the CName of the incoming stream.
- int32_t GetRemoteRTCPCName(char rtcp_cname[]);
-
- // Called on receipt of RTCP report block from remote side.
- void RegisterSendChannelRtcpStatisticsCallback(
- RtcpStatisticsCallback* callback);
-
// Gets send statistics for the rtp and rtx stream.
void GetSendStreamDataCounters(StreamDataCounters* rtp_counters,
StreamDataCounters* rtx_counters) const;
@@ -126,10 +103,6 @@
void GetReceiveStreamDataCounters(StreamDataCounters* rtp_counters,
StreamDataCounters* rtx_counters) const;
- // Called on update of RTP statistics.
- void RegisterSendChannelRtpStatisticsCallback(
- StreamDataCountersCallback* callback);
-
void GetSendRtcpPacketTypeCounter(
RtcpPacketTypeCounter* packet_counter) const;
@@ -153,12 +126,8 @@
int32_t StartSend();
int32_t StopSend();
- // Sets the maximum transfer unit size for the network link, i.e. including
- // IP, UDP and RTP headers.
- int32_t SetMTU(uint16_t mtu);
-
// Gets the modules used by the channel.
- RtpRtcp* rtp_rtcp();
+ const std::vector<RtpRtcp*>& rtp_rtcp() const;
ViEReceiver* vie_receiver();
VCMProtectionCallback* vcm_protection_callback();
@@ -244,7 +213,6 @@
void ProcessNACKRequest(const bool enable);
// Compute NACK list parameters for the buffering mode.
int GetRequiredNackListSize(int target_delay_ms);
- void SetRtxSendStatus(bool enable);
void UpdateHistograms();