From 02739d9149c3b131703cc3df31c349afb9b097a5 Mon Sep 17 00:00:00 2001 From: "henrik.lundin" Date: Thu, 4 May 2017 06:09:06 -0700 Subject: [PATCH] NetEqTest: Extend the callback structure This change allows more callbacks to be registered to the test object. The callbacks are used to give the user of the test object the ability to instrument the test object. This CL specifically adds instrumentation points just after a packet is inserted into NetEq, and just after audio is pulled out of NetEq. BUG=webrtc:7467 Review-Url: https://codereview.webrtc.org/2851383004 Cr-Commit-Position: refs/heads/master@{#18014} --- .../audio_coding/neteq/tools/neteq_rtpplay.cc | 4 +-- .../audio_coding/neteq/tools/neteq_test.cc | 24 ++++++++++++----- .../audio_coding/neteq/tools/neteq_test.h | 27 +++++++++++++++++-- webrtc/test/fuzzers/neteq_rtp_fuzzer.cc | 4 +-- 4 files changed, 47 insertions(+), 12 deletions(-) diff --git a/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc b/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc index 2266cd4de4..e998fa9204 100644 --- a/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc +++ b/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc @@ -445,11 +445,11 @@ int RunTest(int argc, char* argv[]) { ext_codecs[replacement_pt] = ext_dec_info; } - DefaultNetEqTestErrorCallback error_cb; + NetEqTest::Callbacks callbacks; NetEq::Config config; config.sample_rate_hz = sample_rate_hz; NetEqTest test(config, codecs, ext_codecs, std::move(input), - std::move(output), &error_cb); + std::move(output), callbacks); int64_t test_duration_ms = test.Run(); NetEqNetworkStatistics stats = test.SimulationStats(); diff --git a/webrtc/modules/audio_coding/neteq/tools/neteq_test.cc b/webrtc/modules/audio_coding/neteq/tools/neteq_test.cc index 7cca0fed8a..6ff46bcd90 100644 --- a/webrtc/modules/audio_coding/neteq/tools/neteq_test.cc +++ b/webrtc/modules/audio_coding/neteq/tools/neteq_test.cc @@ -41,11 +41,11 @@ NetEqTest::NetEqTest(const NetEq::Config& config, const ExtDecoderMap& ext_codecs, std::unique_ptr input, std::unique_ptr output, - NetEqTestErrorCallback* error_callback) + Callbacks callbacks) : neteq_(NetEq::Create(config, CreateBuiltinAudioDecoderFactory())), input_(std::move(input)), output_(std::move(output)), - error_callback_(error_callback), + callbacks_(callbacks), sample_rate_hz_(config.sample_rate_hz) { RTC_CHECK(!config.enable_muted_state) << "The code does not handle enable_muted_state"; @@ -69,25 +69,37 @@ int64_t NetEqTest::Run() { packet_data->header, rtc::ArrayView(packet_data->payload), static_cast(packet_data->time_ms * sample_rate_hz_ / 1000)); - if (error != NetEq::kOK && error_callback_) { - error_callback_->OnInsertPacketError(neteq_->LastError(), *packet_data); + if (error != NetEq::kOK && callbacks_.error_callback) { + callbacks_.error_callback->OnInsertPacketError(neteq_->LastError(), + *packet_data); + } + if (callbacks_.post_insert_packet) { + callbacks_.post_insert_packet->AfterInsertPacket(*packet_data, + neteq_.get()); } } // Check if it is time to get output audio. if (input_->NextOutputEventTime() && time_now_ms >= *input_->NextOutputEventTime()) { + if (callbacks_.get_audio_callback) { + callbacks_.get_audio_callback->BeforeGetAudio(neteq_.get()); + } AudioFrame out_frame; bool muted; int error = neteq_->GetAudio(&out_frame, &muted); RTC_CHECK(!muted) << "The code does not handle enable_muted_state"; if (error != NetEq::kOK) { - if (error_callback_) { - error_callback_->OnGetAudioError(neteq_->LastError()); + if (callbacks_.error_callback) { + callbacks_.error_callback->OnGetAudioError(neteq_->LastError()); } } else { sample_rate_hz_ = out_frame.sample_rate_hz_; } + if (callbacks_.get_audio_callback) { + callbacks_.get_audio_callback->AfterGetAudio(time_now_ms, out_frame, + muted, neteq_.get()); + } if (output_) { RTC_CHECK(output_->WriteArray( diff --git a/webrtc/modules/audio_coding/neteq/tools/neteq_test.h b/webrtc/modules/audio_coding/neteq/tools/neteq_test.h index 619626cf14..e4d3996e90 100644 --- a/webrtc/modules/audio_coding/neteq/tools/neteq_test.h +++ b/webrtc/modules/audio_coding/neteq/tools/neteq_test.h @@ -37,6 +37,23 @@ class DefaultNetEqTestErrorCallback : public NetEqTestErrorCallback { void OnGetAudioError(int error_code) override; }; +class NetEqPostInsertPacket { + public: + virtual ~NetEqPostInsertPacket() = default; + virtual void AfterInsertPacket(const NetEqInput::PacketData& packet, + NetEq* neteq) = 0; +}; + +class NetEqGetAudioCallback { + public: + virtual ~NetEqGetAudioCallback() = default; + virtual void BeforeGetAudio(NetEq* neteq) = 0; + virtual void AfterGetAudio(int64_t time_now_ms, + const AudioFrame& audio_frame, + bool muted, + NetEq* neteq) = 0; +}; + // Class that provides an input--output test for NetEq. The input (both packets // and output events) is provided by a NetEqInput object, while the output is // directed to an AudioSink object. @@ -52,6 +69,12 @@ class NetEqTest { using ExtDecoderMap = std::map; + struct Callbacks { + NetEqTestErrorCallback* error_callback = nullptr; + NetEqPostInsertPacket* post_insert_packet = nullptr; + NetEqGetAudioCallback* get_audio_callback = nullptr; + }; + // Sets up the test with given configuration, codec mappings, input, ouput, // and callback objects for error reporting. NetEqTest(const NetEq::Config& config, @@ -59,7 +82,7 @@ class NetEqTest { const ExtDecoderMap& ext_codecs, std::unique_ptr input, std::unique_ptr output, - NetEqTestErrorCallback* error_callback); + Callbacks callbacks); ~NetEqTest() = default; @@ -76,7 +99,7 @@ class NetEqTest { std::unique_ptr neteq_; std::unique_ptr input_; std::unique_ptr output_; - NetEqTestErrorCallback* error_callback_ = nullptr; + Callbacks callbacks_; int sample_rate_hz_; }; diff --git a/webrtc/test/fuzzers/neteq_rtp_fuzzer.cc b/webrtc/test/fuzzers/neteq_rtp_fuzzer.cc index f6271206fd..a5a1cdecc4 100644 --- a/webrtc/test/fuzzers/neteq_rtp_fuzzer.cc +++ b/webrtc/test/fuzzers/neteq_rtp_fuzzer.cc @@ -127,7 +127,7 @@ void FuzzOneInputTest(const uint8_t* data, size_t size) { std::unique_ptr input( new FuzzRtpInput(rtc::ArrayView(data, size))); std::unique_ptr output(new AudioChecksum); - NetEqTestErrorCallback dummy_callback; // Does nothing with error callbacks. + NetEqTest::Callbacks callbacks; NetEq::Config config; NetEqTest::DecoderMap codecs; codecs[0] = std::make_pair(NetEqDecoder::kDecoderPCMu, "pcmu"); @@ -155,7 +155,7 @@ void FuzzOneInputTest(const uint8_t* data, size_t size) { NetEqTest::ExtDecoderMap ext_codecs; NetEqTest test(config, codecs, ext_codecs, std::move(input), - std::move(output), &dummy_callback); + std::move(output), callbacks); test.Run(); }