Remove CodecInst pt.2
The following APIs on AudioCodingModule are deprecated with this CL:
static int NumberOfCodecs();
static int Codec(int, CodecInst*);
static int Codec(const char*, CodecInst*, int, size_t);
static int Codec(const char*, int, size_t);
absl::optional<CodecInst> SendCodec() const;
bool RegisterReceiveCodec(int, const SdpAudioFormat&);
int RegisterExternalReceiveCodec(int, AudioDecoder*, int, int, const std::string&);
int UnregisterReceiveCodec(uint8_t);
int32_t ReceiveCodec(CodecInst*);
absl::optional<SdpAudioFormat> ReceiveFormat();
As well as this method on RtpRtcp module:
int32_t RegisterSendPayload(const CodecInst&);
Bug: webrtc:7626
Change-Id: I1230732136f1fe9048cf74afdeab767ca57ac9ce
Reviewed-on: https://webrtc-review.googlesource.com/c/113816
Commit-Queue: Fredrik Solenberg <solenberg@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26025}
diff --git a/audio/BUILD.gn b/audio/BUILD.gn
index c045af6..3d53c27 100644
--- a/audio/BUILD.gn
+++ b/audio/BUILD.gn
@@ -61,7 +61,6 @@
"../logging:rtc_stream_config",
"../modules/audio_coding",
"../modules/audio_coding:audio_encoder_cng",
- "../modules/audio_coding:audio_format_conversion",
"../modules/audio_coding:audio_network_adaptor_config",
"../modules/audio_device",
"../modules/audio_processing",
diff --git a/audio/audio_receive_stream.cc b/audio/audio_receive_stream.cc
index 8d4afe0..143c6f7 100644
--- a/audio/audio_receive_stream.cc
+++ b/audio/audio_receive_stream.cc
@@ -175,8 +175,8 @@
channel_receive_->GetRTCPStatistics();
// TODO(solenberg): Don't return here if we can't get the codec - return the
// stats we *can* get.
- webrtc::CodecInst codec_inst = {0};
- if (!channel_receive_->GetRecCodec(&codec_inst)) {
+ auto receive_codec = channel_receive_->GetReceiveCodec();
+ if (!receive_codec) {
return stats;
}
@@ -185,13 +185,12 @@
stats.packets_lost = call_stats.cumulativeLost;
stats.fraction_lost = Q8ToFloat(call_stats.fractionLost);
stats.capture_start_ntp_time_ms = call_stats.capture_start_ntp_time_ms_;
- if (codec_inst.pltype != -1) {
- stats.codec_name = codec_inst.plname;
- stats.codec_payload_type = codec_inst.pltype;
- }
+ stats.codec_name = receive_codec->second.name;
+ stats.codec_payload_type = receive_codec->first;
stats.ext_seqnum = call_stats.extendedMax;
- if (codec_inst.plfreq / 1000 > 0) {
- stats.jitter_ms = call_stats.jitterSamples / (codec_inst.plfreq / 1000);
+ int clockrate_khz = receive_codec->second.clockrate_hz / 1000;
+ if (clockrate_khz > 0) {
+ stats.jitter_ms = call_stats.jitterSamples / clockrate_khz;
}
stats.delay_estimate_ms = channel_receive_->GetDelayEstimate();
stats.audio_level = channel_receive_->GetSpeechOutputLevelFullRange();
diff --git a/audio/audio_receive_stream_unittest.cc b/audio/audio_receive_stream_unittest.cc
index 7422810..25ca528 100644
--- a/audio/audio_receive_stream_unittest.cc
+++ b/audio/audio_receive_stream_unittest.cc
@@ -10,6 +10,7 @@
#include <map>
#include <string>
+#include <utility>
#include <vector>
#include "api/test/mock_audio_mixer.h"
@@ -63,7 +64,8 @@
const CallReceiveStatistics kCallStats = {345, 678, 901, 234,
-12, 567, 890, 123};
-const CodecInst kCodecInst = {123, "codec_name_recv", 96000, -187, 0, -103};
+const std::pair<int, SdpAudioFormat> kReceiveCodec =
+ {123, {"codec_name_recv", 96000, 0}};
const NetworkStatistics kNetworkStats = {
123, 456, false, 789012, 3456, 123, 456, 0, {}, 789, 12,
345, 678, 901, 0, -1, -1, -1, -1, -1, 0};
@@ -140,8 +142,8 @@
.WillOnce(Return(kNetworkStats));
EXPECT_CALL(*channel_receive_, GetDecodingCallStatistics())
.WillOnce(Return(kAudioDecodeStats));
- EXPECT_CALL(*channel_receive_, GetRecCodec(_))
- .WillOnce(DoAll(SetArgPointee<0>(kCodecInst), Return(true)));
+ EXPECT_CALL(*channel_receive_, GetReceiveCodec())
+ .WillOnce(Return(kReceiveCodec));
}
private:
@@ -267,10 +269,11 @@
stats.packets_rcvd);
EXPECT_EQ(kCallStats.cumulativeLost, stats.packets_lost);
EXPECT_EQ(Q8ToFloat(kCallStats.fractionLost), stats.fraction_lost);
- EXPECT_EQ(std::string(kCodecInst.plname), stats.codec_name);
+ EXPECT_EQ(kReceiveCodec.second.name, stats.codec_name);
EXPECT_EQ(kCallStats.extendedMax, stats.ext_seqnum);
- EXPECT_EQ(kCallStats.jitterSamples / (kCodecInst.plfreq / 1000),
- stats.jitter_ms);
+ EXPECT_EQ(
+ kCallStats.jitterSamples / (kReceiveCodec.second.clockrate_hz / 1000),
+ stats.jitter_ms);
EXPECT_EQ(kNetworkStats.currentBufferSize, stats.jitter_buffer_ms);
EXPECT_EQ(kNetworkStats.preferredBufferSize,
stats.jitter_buffer_preferred_ms);
diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc
index 75e6efb..8d23622 100644
--- a/audio/audio_send_stream.cc
+++ b/audio/audio_send_stream.cc
@@ -765,14 +765,8 @@
void AudioSendStream::RegisterCngPayloadType(int payload_type,
int clockrate_hz) {
- const CodecInst codec = {payload_type, "CN", clockrate_hz, 0, 1, 0};
- if (rtp_rtcp_module_->RegisterSendPayload(codec) != 0) {
- rtp_rtcp_module_->DeRegisterSendPayload(codec.pltype);
- if (rtp_rtcp_module_->RegisterSendPayload(codec) != 0) {
- RTC_DLOG(LS_ERROR) << "RegisterCngPayloadType() failed to register CN to "
- "RTP/RTCP module";
- }
- }
+ rtp_rtcp_module_->RegisterAudioSendPayload(payload_type, "CN", clockrate_hz,
+ 1, 0);
}
} // namespace internal
} // namespace webrtc
diff --git a/audio/audio_send_stream_unittest.cc b/audio/audio_send_stream_unittest.cc
index e400ada..82cc319 100644
--- a/audio/audio_send_stream_unittest.cc
+++ b/audio/audio_send_stream_unittest.cc
@@ -61,7 +61,6 @@
const int kTelephoneEventPayloadFrequency = 65432;
const int kTelephoneEventCode = 45;
const int kTelephoneEventDuration = 6789;
-const CodecInst kIsacCodec = {103, "isac", 16000, 320, 1, 32000};
constexpr int kIsacPayloadType = 103;
const SdpAudioFormat kIsacFormat = {"isac", 16000, 1};
const SdpAudioFormat kOpusFormat = {"opus", 48000, 2};
@@ -375,11 +374,11 @@
EXPECT_EQ(kCallStats.packetsSent, stats.packets_sent);
EXPECT_EQ(kReportBlock.cumulative_num_packets_lost, stats.packets_lost);
EXPECT_EQ(Q8ToFloat(kReportBlock.fraction_lost), stats.fraction_lost);
- EXPECT_EQ(std::string(kIsacCodec.plname), stats.codec_name);
+ EXPECT_EQ(kIsacFormat.name, stats.codec_name);
EXPECT_EQ(static_cast<int32_t>(kReportBlock.extended_highest_sequence_number),
stats.ext_seqnum);
EXPECT_EQ(static_cast<int32_t>(kReportBlock.interarrival_jitter /
- (kIsacCodec.plfreq / 1000)),
+ (kIsacFormat.clockrate_hz / 1000)),
stats.jitter_ms);
EXPECT_EQ(kCallStats.rttMs, stats.rtt_ms);
EXPECT_EQ(0, stats.audio_level);
diff --git a/audio/channel_receive.cc b/audio/channel_receive.cc
index f2d7c9d..7ae2e26 100644
--- a/audio/channel_receive.cc
+++ b/audio/channel_receive.cc
@@ -120,7 +120,8 @@
void StopPlayout() override;
// Codecs
- bool GetRecCodec(CodecInst* codec) const override;
+ absl::optional<std::pair<int, SdpAudioFormat>>
+ GetReceiveCodec() const override;
bool ReceivedRTCPPacket(const uint8_t* data, size_t length) override;
@@ -553,9 +554,10 @@
_outputAudioLevel.Clear();
}
-bool ChannelReceive::GetRecCodec(CodecInst* codec) const {
+absl::optional<std::pair<int, SdpAudioFormat>>
+ ChannelReceive::GetReceiveCodec() const {
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
- return (audio_coding_->ReceiveCodec(codec) == 0);
+ return audio_coding_->ReceiveCodec();
}
std::vector<webrtc::RtpSource> ChannelReceive::GetSources() const {
@@ -924,13 +926,13 @@
}
int ChannelReceive::GetRtpTimestampRateHz() const {
- const auto format = audio_coding_->ReceiveFormat();
+ const auto decoder = audio_coding_->ReceiveCodec();
// Default to the playout frequency if we've not gotten any packets yet.
// TODO(ossu): Zero clockrate can only happen if we've added an external
// decoder for a format we don't support internally. Remove once that way of
// adding decoders is gone!
- return (format && format->clockrate_hz != 0)
- ? format->clockrate_hz
+ return (decoder && decoder->second.clockrate_hz != 0)
+ ? decoder->second.clockrate_hz
: audio_coding_->PlayoutFrequency();
}
diff --git a/audio/channel_receive.h b/audio/channel_receive.h
index 9027623..6bbf990 100644
--- a/audio/channel_receive.h
+++ b/audio/channel_receive.h
@@ -13,6 +13,7 @@
#include <map>
#include <memory>
+#include <utility>
#include <vector>
#include "absl/types/optional.h"
@@ -79,7 +80,9 @@
virtual void StartPlayout() = 0;
virtual void StopPlayout() = 0;
- virtual bool GetRecCodec(CodecInst* codec) const = 0;
+ // Payload type and format of last received RTP packet, if any.
+ virtual absl::optional<std::pair<int, SdpAudioFormat>>
+ GetReceiveCodec() const = 0;
virtual bool ReceivedRTCPPacket(const uint8_t* data, size_t length) = 0;
diff --git a/audio/channel_send.cc b/audio/channel_send.cc
index c458fe4..7c7db79 100644
--- a/audio/channel_send.cc
+++ b/audio/channel_send.cc
@@ -854,33 +854,14 @@
RTC_DCHECK_RUN_ON(&worker_thread_checker_);
RTC_DCHECK_GE(payload_type, 0);
RTC_DCHECK_LE(payload_type, 127);
- // TODO(ossu): Make CodecInsts up, for now: one for the RTP/RTCP module and
- // one for for us to keep track of sample rate and number of channels, etc.
// 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.
- CodecInst rtp_codec;
- rtp_codec.pltype = payload_type;
- strncpy(rtp_codec.plname, "audio", sizeof(rtp_codec.plname));
- rtp_codec.plname[sizeof(rtp_codec.plname) - 1] = 0;
- // Seems unclear if it should be clock rate or sample rate. CodecInst
- // supposedly carries the sample rate, but only clock rate seems sensible to
- // send to the RTP/RTCP module.
- rtp_codec.plfreq = encoder->RtpTimestampRateHz();
- rtp_codec.pacsize = rtc::CheckedDivExact(
- static_cast<int>(encoder->Max10MsFramesInAPacket() * rtp_codec.plfreq),
- 100);
- rtp_codec.channels = encoder->NumChannels();
- rtp_codec.rate = 0;
-
- if (_rtpRtcpModule->RegisterSendPayload(rtp_codec) != 0) {
- _rtpRtcpModule->DeRegisterSendPayload(payload_type);
- if (_rtpRtcpModule->RegisterSendPayload(rtp_codec) != 0) {
- RTC_DLOG(LS_ERROR)
- << "SetEncoder() failed to register codec to RTP/RTCP module";
- return false;
- }
- }
+ _rtpRtcpModule->RegisterAudioSendPayload(payload_type,
+ "audio",
+ encoder->RtpTimestampRateHz(),
+ encoder->NumChannels(),
+ 0);
if (media_transport_) {
rtc::CritScope cs(&media_transport_lock_);
@@ -1017,19 +998,8 @@
RTC_DCHECK_RUN_ON(&worker_thread_checker_);
RTC_DCHECK_LE(0, payload_type);
RTC_DCHECK_GE(127, payload_type);
- CodecInst codec = {0};
- codec.pltype = payload_type;
- codec.plfreq = payload_frequency;
- memcpy(codec.plname, "telephone-event", 16);
- if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
- _rtpRtcpModule->DeRegisterSendPayload(codec.pltype);
- if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
- RTC_DLOG(LS_ERROR)
- << "SetSendTelephoneEventPayloadType() failed to register "
- "send payload type";
- return false;
- }
- }
+ _rtpRtcpModule->RegisterAudioSendPayload(payload_type, "telephone-event",
+ payload_frequency, 0, 0);
return true;
}
diff --git a/audio/mock_voe_channel_proxy.h b/audio/mock_voe_channel_proxy.h
index eee25c5..33b00f9 100644
--- a/audio/mock_voe_channel_proxy.h
+++ b/audio/mock_voe_channel_proxy.h
@@ -14,6 +14,7 @@
#include <map>
#include <memory>
#include <string>
+#include <utility>
#include <vector>
#include "api/test/mock_frame_encryptor.h"
@@ -52,7 +53,8 @@
MOCK_CONST_METHOD0(GetPlayoutTimestamp, uint32_t());
MOCK_CONST_METHOD0(GetSyncInfo, absl::optional<Syncable::Info>());
MOCK_METHOD1(SetMinimumPlayoutDelay, void(int delay_ms));
- MOCK_CONST_METHOD1(GetRecCodec, bool(CodecInst* codec_inst));
+ MOCK_CONST_METHOD0(GetReceiveCodec,
+ absl::optional<std::pair<int, SdpAudioFormat>>());
MOCK_METHOD1(SetReceiveCodecs,
void(const std::map<int, SdpAudioFormat>& codecs));
MOCK_CONST_METHOD0(GetSources, std::vector<RtpSource>());