Move ownership of RTPSenderAudio to ChannelSend.
This change takes out responsibility for packetization from the
RtpRtcp class, and deletes the method RtpRtcp::SendOutgoingData.
Video packetization was similarly moved in cl
https://webrtc-review.googlesource.com/c/src/+/123187
Bug: webrtc:7135
Change-Id: I0953125a5ca22a2ce51761b83693e0bb8ea74cd8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/125721
Commit-Queue: Niels Moller <nisse@webrtc.org>
Reviewed-by: Fredrik Solenberg <solenberg@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27000}
diff --git a/audio/channel_send.cc b/audio/channel_send.cc
index 705827d..196911a 100644
--- a/audio/channel_send.cc
+++ b/audio/channel_send.cc
@@ -129,6 +129,8 @@
// Used by AudioSendStream.
RtpRtcp* GetRtpRtcp() const override;
+ void RegisterCngPayloadType(int payload_type, int payload_frequency) override;
+
// DTMF.
bool SendTelephoneEventOutband(int event, int duration_ms) override;
void SetSendTelephoneEventPayloadType(int payload_type,
@@ -236,6 +238,7 @@
RtcEventLog* const event_log_;
std::unique_ptr<RtpRtcp> _rtpRtcpModule;
+ std::unique_ptr<RTPSenderAudio> rtp_sender_audio_;
std::unique_ptr<AudioCodingModule> audio_coding_;
uint32_t _timeStamp RTC_GUARDED_BY(encoder_queue_);
@@ -520,10 +523,10 @@
const RTPFragmentationHeader* fragmentation) {
RTC_DCHECK_RUN_ON(encoder_queue_);
if (_includeAudioLevelIndication) {
- // Store current audio level in the RTP/RTCP module.
+ // Store current audio level in the RTP sender.
// The level will be used in combination with voice-activity state
// (frameType) to add an RTP header extension
- _rtpRtcpModule->SetAudioLevel(rms_level_.Average());
+ rtp_sender_audio_->SetAudioLevel(rms_level_.Average());
}
// E2EE Custom Audio Frame Encryption (This is optional).
@@ -559,14 +562,24 @@
// Push data from ACM to RTP/RTCP-module to deliver audio frame for
// packetization.
+ if (!_rtpRtcpModule->OnSendingRtpFrame(timeStamp,
+ // Leaving the time when this frame was
+ // received from the capture device as
+ // undefined for voice for now.
+ -1, payloadType,
+ /*force_sender_report=*/false)) {
+ return false;
+ }
+
+ // RTCPSender has it's own copy of the timestamp offset, added in
+ // RTCPSender::BuildSR, hence we must not add the in the offset for the above
+ // call.
+ // TODO(nisse): Delete RTCPSender:timestamp_offset_, and see if we can confine
+ // knowledge of the offset to a single place.
+ const uint32_t rtp_timestamp = timeStamp + _rtpRtcpModule->StartTimestamp();
// This call will trigger Transport::SendPacket() from the RTP/RTCP module.
- if (!_rtpRtcpModule->SendOutgoingData((FrameType&)frameType, payloadType,
- timeStamp,
- // Leaving the time when this frame was
- // received from the capture device as
- // undefined for voice for now.
- -1, payload.data(), payload.size(),
- fragmentation, nullptr, nullptr)) {
+ if (!rtp_sender_audio_->SendAudio(frameType, payloadType, rtp_timestamp,
+ payload.data(), payload.size())) {
RTC_DLOG(LS_ERROR)
<< "ChannelSend::SendData() failed to send data to RTP/RTCP module";
return -1;
@@ -687,6 +700,7 @@
configuration.clock = clock;
configuration.audio = true;
+ configuration.clock = Clock::GetRealTimeClock();
configuration.outgoing_transport = rtp_transport;
configuration.paced_sender = rtp_packet_sender_proxy_.get();
@@ -703,6 +717,9 @@
_rtpRtcpModule = RtpRtcp::Create(configuration);
_rtpRtcpModule->SetSendingMediaStatus(false);
+ rtp_sender_audio_ = absl::make_unique<RTPSenderAudio>(
+ configuration.clock, _rtpRtcpModule->RtpSender());
+
// We want to invoke the 'TargetRateObserver' and |OnOverheadChanged|
// callbacks after the audio_coding_ is fully initialized.
if (media_transport_) {
@@ -797,11 +814,11 @@
// The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
// as well as some other things, so we collect this info and send it along.
- _rtpRtcpModule->RegisterAudioSendPayload(payload_type,
- "audio",
- encoder->RtpTimestampRateHz(),
- encoder->NumChannels(),
- 0);
+ _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type,
+ encoder->RtpTimestampRateHz());
+ rtp_sender_audio_->RegisterAudioPayload("audio", payload_type,
+ encoder->RtpTimestampRateHz(),
+ encoder->NumChannels(), 0);
if (media_transport_) {
rtc::CritScope cs(&media_transport_lock_);
@@ -926,21 +943,29 @@
if (!sending_) {
return false;
}
- if (_rtpRtcpModule->SendTelephoneEventOutband(
+ if (rtp_sender_audio_->SendTelephoneEvent(
event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
- RTC_DLOG(LS_ERROR) << "SendTelephoneEventOutband() failed to send event";
+ RTC_DLOG(LS_ERROR) << "SendTelephoneEvent() failed to send event";
return false;
}
return true;
}
+void ChannelSend::RegisterCngPayloadType(int payload_type,
+ int payload_frequency) {
+ _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type, payload_frequency);
+ rtp_sender_audio_->RegisterAudioPayload("CN", payload_type, payload_frequency,
+ 1, 0);
+}
+
void ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
int payload_frequency) {
RTC_DCHECK_RUN_ON(&worker_thread_checker_);
RTC_DCHECK_LE(0, payload_type);
RTC_DCHECK_GE(127, payload_type);
- _rtpRtcpModule->RegisterAudioSendPayload(payload_type, "telephone-event",
- payload_frequency, 0, 0);
+ _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type, payload_frequency);
+ rtp_sender_audio_->RegisterAudioPayload("telephone-event", payload_type,
+ payload_frequency, 0, 0);
}
void ChannelSend::SetLocalSSRC(uint32_t ssrc) {