diff --git a/webrtc/modules/audio_coding/neteq/tools/neteq_packet_source_input.cc b/webrtc/modules/audio_coding/neteq/tools/neteq_packet_source_input.cc index 9af20898fd..5fa60dc993 100644 --- a/webrtc/modules/audio_coding/neteq/tools/neteq_packet_source_input.cc +++ b/webrtc/modules/audio_coding/neteq/tools/neteq_packet_source_input.cc @@ -60,8 +60,12 @@ std::unique_ptr NetEqPacketSourceInput::PopPacket() { return packet_data; } -NetEqRtpDumpInput::NetEqRtpDumpInput(const std::string& file_name) +NetEqRtpDumpInput::NetEqRtpDumpInput(const std::string& file_name, + const RtpHeaderExtensionMap& hdr_ext_map) : source_(RtpFileSource::Create(file_name)) { + for (const auto& ext_pair : hdr_ext_map) { + source_->RegisterRtpHeaderExtension(ext_pair.second, ext_pair.first); + } LoadNextPacket(); } @@ -82,8 +86,12 @@ PacketSource* NetEqRtpDumpInput::source() { return source_.get(); } -NetEqEventLogInput::NetEqEventLogInput(const std::string& file_name) +NetEqEventLogInput::NetEqEventLogInput(const std::string& file_name, + const RtpHeaderExtensionMap& hdr_ext_map) : source_(RtcEventLogSource::Create(file_name)) { + for (const auto& ext_pair : hdr_ext_map) { + source_->RegisterRtpHeaderExtension(ext_pair.second, ext_pair.first); + } LoadNextPacket(); AdvanceOutputEvent(); } diff --git a/webrtc/modules/audio_coding/neteq/tools/neteq_packet_source_input.h b/webrtc/modules/audio_coding/neteq/tools/neteq_packet_source_input.h index 4e350a6799..35b54fa41f 100644 --- a/webrtc/modules/audio_coding/neteq/tools/neteq_packet_source_input.h +++ b/webrtc/modules/audio_coding/neteq/tools/neteq_packet_source_input.h @@ -11,9 +11,11 @@ #ifndef WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_PACKET_SOURCE_INPUT_H_ #define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_PACKET_SOURCE_INPUT_H_ +#include #include #include "webrtc/modules/audio_coding/neteq/tools/neteq_input.h" +#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" namespace webrtc { namespace test { @@ -24,6 +26,8 @@ class RtcEventLogSource; // An adapter class to dress up a PacketSource object as a NetEqInput. class NetEqPacketSourceInput : public NetEqInput { public: + using RtpHeaderExtensionMap = std::map; + NetEqPacketSourceInput(); rtc::Optional NextPacketTime() const override; std::unique_ptr PopPacket() override; @@ -43,7 +47,8 @@ class NetEqPacketSourceInput : public NetEqInput { // Implementation of NetEqPacketSourceInput to be used with an RtpFileSource. class NetEqRtpDumpInput final : public NetEqPacketSourceInput { public: - explicit NetEqRtpDumpInput(const std::string& file_name); + NetEqRtpDumpInput(const std::string& file_name, + const RtpHeaderExtensionMap& hdr_ext_map); rtc::Optional NextOutputEventTime() const override; void AdvanceOutputEvent() override; @@ -61,7 +66,8 @@ class NetEqRtpDumpInput final : public NetEqPacketSourceInput { // RtcEventLogSource. class NetEqEventLogInput final : public NetEqPacketSourceInput { public: - explicit NetEqEventLogInput(const std::string& file_name); + NetEqEventLogInput(const std::string& file_name, + const RtpHeaderExtensionMap& hdr_ext_map); rtc::Optional NextOutputEventTime() const override; void AdvanceOutputEvent() override; diff --git a/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc b/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc index 9e3119b246..ff4b68bfb5 100644 --- a/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc +++ b/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc @@ -74,6 +74,13 @@ bool ValidateSsrcValue(const char* flagname, const std::string& str) { return ParseSsrc(str, &dummy_ssrc); } +static bool ValidateExtensionId(const char* flagname, int32_t value) { + if (value > 0 && value <= 255) // Value is ok. + return true; + printf("Invalid value for --%s: %d\n", flagname, static_cast(value)); + return false; +} + // Define command line flags. DEFINE_int32(pcmu, 0, "RTP payload type for PCM-u"); const bool pcmu_dummy = @@ -136,6 +143,12 @@ DEFINE_string(ssrc, "starting with 0x)"); const bool hex_ssrc_dummy = google::RegisterFlagValidator(&FLAGS_ssrc, &ValidateSsrcValue); +DEFINE_int32(audio_level, 1, "Extension ID for audio level (RFC 6464)"); +const bool audio_level_dummy = + google::RegisterFlagValidator(&FLAGS_audio_level, &ValidateExtensionId); +DEFINE_int32(abs_send_time, 3, "Extension ID for absolute sender time"); +const bool abs_send_time_dummy = + google::RegisterFlagValidator(&FLAGS_abs_send_time, &ValidateExtensionId); // Maps a codec type to a printable name string. std::string CodecName(NetEqDecoder codec) { @@ -297,13 +310,18 @@ int RunTest(int argc, char* argv[]) { return 0; } + // Gather RTP header extensions in a map. + NetEqPacketSourceInput::RtpHeaderExtensionMap rtp_ext_map = { + {FLAGS_audio_level, kRtpExtensionAudioLevel}, + {FLAGS_abs_send_time, kRtpExtensionAbsoluteSendTime}}; + const std::string input_file_name = argv[1]; std::unique_ptr input; if (RtpFileSource::ValidRtpDump(input_file_name) || RtpFileSource::ValidPcap(input_file_name)) { - input.reset(new NetEqRtpDumpInput(input_file_name)); + input.reset(new NetEqRtpDumpInput(input_file_name, rtp_ext_map)); } else { - input.reset(new NetEqEventLogInput(input_file_name)); + input.reset(new NetEqEventLogInput(input_file_name, rtp_ext_map)); } std::cout << "Input file: " << input_file_name << std::endl;