diff --git a/modules/audio_coding/neteq/tools/neteq_packet_source_input.cc b/modules/audio_coding/neteq/tools/neteq_packet_source_input.cc index 0741d7c88d..79a939da48 100644 --- a/modules/audio_coding/neteq/tools/neteq_packet_source_input.cc +++ b/modules/audio_coding/neteq/tools/neteq_packet_source_input.cc @@ -60,6 +60,12 @@ std::unique_ptr NetEqPacketSourceInput::PopPacket() { return packet_data; } +void NetEqPacketSourceInput::SelectSsrc(uint32_t ssrc) { + source()->SelectSsrc(ssrc); + if (packet_ && packet_->header().ssrc != ssrc) + LoadNextPacket(); +} + NetEqRtpDumpInput::NetEqRtpDumpInput(const std::string& file_name, const RtpHeaderExtensionMap& hdr_ext_map) : source_(RtpFileSource::Create(file_name)) { diff --git a/modules/audio_coding/neteq/tools/neteq_packet_source_input.h b/modules/audio_coding/neteq/tools/neteq_packet_source_input.h index b482556c5a..70fe1113a4 100644 --- a/modules/audio_coding/neteq/tools/neteq_packet_source_input.h +++ b/modules/audio_coding/neteq/tools/neteq_packet_source_input.h @@ -33,6 +33,7 @@ class NetEqPacketSourceInput : public NetEqInput { std::unique_ptr PopPacket() override; rtc::Optional NextHeader() const override; bool ended() const override { return !next_output_event_ms_; } + void SelectSsrc(uint32_t); protected: virtual PacketSource* source() = 0; diff --git a/modules/audio_coding/neteq/tools/neteq_rtpplay.cc b/modules/audio_coding/neteq/tools/neteq_rtpplay.cc index 47be82ff1a..4d3bd0f145 100644 --- a/modules/audio_coding/neteq/tools/neteq_rtpplay.cc +++ b/modules/audio_coding/neteq/tools/neteq_rtpplay.cc @@ -226,56 +226,6 @@ rtc::Optional CodecSampleRate(uint8_t payload_type) { return rtc::nullopt; } -// Class to let through only the packets with a given SSRC. Should be used as an -// outer layer on another NetEqInput object. -class FilterSsrcInput : public NetEqInput { - public: - FilterSsrcInput(std::unique_ptr source, uint32_t ssrc) - : source_(std::move(source)), ssrc_(ssrc) { - FindNextWithCorrectSsrc(); - RTC_CHECK(source_->NextHeader()) << "Found no packet with SSRC = 0x" - << std::hex << ssrc_; - } - - // All methods but PopPacket() simply relay to the |source_| object. - rtc::Optional NextPacketTime() const override { - return source_->NextPacketTime(); - } - rtc::Optional NextOutputEventTime() const override { - return source_->NextOutputEventTime(); - } - - // Returns the next packet, and throws away upcoming packets that do not match - // the desired SSRC. - std::unique_ptr PopPacket() override { - std::unique_ptr packet_to_return = source_->PopPacket(); - RTC_DCHECK(!packet_to_return || packet_to_return->header.ssrc == ssrc_); - // Pre-fetch the next packet with correct SSRC. Hence, |source_| will always - // be have a valid packet (or empty if no more packets are available) when - // this method returns. - FindNextWithCorrectSsrc(); - return packet_to_return; - } - - void AdvanceOutputEvent() override { source_->AdvanceOutputEvent(); } - - bool ended() const override { return source_->ended(); } - - rtc::Optional NextHeader() const override { - return source_->NextHeader(); - } - - private: - void FindNextWithCorrectSsrc() { - while (source_->NextHeader() && source_->NextHeader()->ssrc != ssrc_) { - source_->PopPacket(); - } - } - - std::unique_ptr source_; - uint32_t ssrc_; -}; - // A callback class which prints whenver the inserted packet stream changes // the SSRC. class SsrcSwitchDetector : public NetEqPostInsertPacket { @@ -386,14 +336,13 @@ int RunTest(int argc, char* argv[]) { if (strlen(FLAG_ssrc) > 0) { uint32_t ssrc; RTC_CHECK(ParseSsrc(FLAG_ssrc, &ssrc)) << "Flag verification has failed."; - input.reset(new FilterSsrcInput(std::move(input), ssrc)); + static_cast(input.get())->SelectSsrc(ssrc); } // Check the sample rate. rtc::Optional sample_rate_hz; std::set> discarded_pt_and_ssrc; - while (input->NextHeader()) { - rtc::Optional first_rtp_header = input->NextHeader(); + while (rtc::Optional first_rtp_header = input->NextHeader()) { RTC_DCHECK(first_rtp_header); sample_rate_hz = CodecSampleRate(first_rtp_header->payloadType); if (sample_rate_hz) { diff --git a/modules/audio_coding/neteq/tools/rtc_event_log_source.cc b/modules/audio_coding/neteq/tools/rtc_event_log_source.cc index b8532481f4..cf128917e9 100644 --- a/modules/audio_coding/neteq/tools/rtc_event_log_source.cc +++ b/modules/audio_coding/neteq/tools/rtc_event_log_source.cc @@ -87,8 +87,10 @@ int64_t RtcEventLogSource::NextAudioOutputEventMs() { ParsedRtcEventLogNew::AUDIO_PLAYOUT_EVENT) { LoggedAudioPlayoutEvent playout_event = parsed_stream_.GetAudioPlayout(audio_output_index_); - audio_output_index_++; - return playout_event.timestamp_us / 1000; + if (!(use_ssrc_filter_ && playout_event.ssrc != ssrc_)) { + audio_output_index_++; + return playout_event.timestamp_us / 1000; + } } audio_output_index_++; }