mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 06:10:40 +01:00

This reverts commitfab3460a82
. Reason for revert: fix downstream instead Original change's description: > Revert "Reland "Add plumbing of RtpPacketInfos to each AudioFrame as input for SourceTracker."" > > This reverts commit9973933d2e
. > > Reason for revert: breaking downstream projects and not reviewed by direct owners > > Original change's description: > > Reland "Add plumbing of RtpPacketInfos to each AudioFrame as input for SourceTracker." > > > > This reverts commit24192c267a
. > > > > Reason for revert: Analyzed the performance regression in more detail. > > > > Most of the regression comes from the extra RtpPacketInfos-related memory allocations in every `NetEq::GetAudio()` call. Commit1796a820f6
has removed roughly 2/3rds of the extra allocations from the impacted perf tests. Remaining perf impact is expected to be about "8 microseconds of CPU time per second" on the Linux benchmarking machines and "15 us per second" on Windows/Mac. > > > > There are options to optimize further but they are unlikely worth doing. Note for example that `NetEqPerformanceTest` uses the PCM codec while the real-world use cases would likely use the much heavier Opus codec. The numbers from `OpusSpeedTest` and `NetEqPerformanceTest` suggest that Opus decoding is about 10x as expensive as NetEq overall. > > > > Original change's description: > > > Revert "Add plumbing of RtpPacketInfos to each AudioFrame as input for SourceTracker." > > > > > > This reverts commit3e8ef940fe
. > > > > > > Reason for revert: This CL causes a performance regression in NetEq, see https://bugs.chromium.org/p/chromium/issues/detail?id=982260. > > > > > > Original change's description: > > > > Add plumbing of RtpPacketInfos to each AudioFrame as input for SourceTracker. > > > > > > > > This change adds the plumbing of RtpPacketInfo from ChannelReceive::OnRtpPacket() to ChannelReceive::GetAudioFrameWithInfo() for audio. It is a step towards replacing the non-spec compliant ContributingSources that updates itself at packet-receive time, with the spec-compliant SourceTracker that will update itself at frame-delivery-to-track time. > > > > > > > > Bug: webrtc:10668 > > > > Change-Id: I03385d6865bbc7bfbef7634f88de820a934f787a > > > > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/139890 > > > > Reviewed-by: Stefan Holmer <stefan@webrtc.org> > > > > Reviewed-by: Minyue Li <minyue@webrtc.org> > > > > Commit-Queue: Chen Xing <chxg@google.com> > > > > Cr-Commit-Position: refs/heads/master@{#28434} > > > > > > TBR=kwiberg@webrtc.org,stefan@webrtc.org,minyue@webrtc.org,chxg@google.com > > > > > > Bug: webrtc:10668, chromium:982260 > > > Change-Id: I5e2cfde78c59d1123e21869564d76ed3f6193a5c > > > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/145339 > > > Reviewed-by: Ivo Creusen <ivoc@webrtc.org> > > > Commit-Queue: Ivo Creusen <ivoc@webrtc.org> > > > Cr-Commit-Position: refs/heads/master@{#28561} > > > > TBR=kwiberg@webrtc.org,stefan@webrtc.org,ivoc@webrtc.org,minyue@webrtc.org,chxg@google.com > > > > # Not skipping CQ checks because original CL landed > 1 day ago. > > > > Bug: webrtc:10668, chromium:982260 > > Change-Id: Ie375a0b327ee368317bf3a04b2f1415c3a974470 > > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/146707 > > Reviewed-by: Stefan Holmer <stefan@webrtc.org> > > Commit-Queue: Chen Xing <chxg@google.com> > > Cr-Commit-Position: refs/heads/master@{#28664} > > TBR=kwiberg@webrtc.org,stefan@webrtc.org,ivoc@webrtc.org,minyue@webrtc.org,chxg@google.com > > Change-Id: I652cb0814d83b514d3bee34e65ca3bb693099b22 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: webrtc:10668, chromium:982260 > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/146712 > Reviewed-by: Alessio Bazzica <alessiob@webrtc.org> > Commit-Queue: Alessio Bazzica <alessiob@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#28671} TBR=alessiob@webrtc.org,kwiberg@webrtc.org,stefan@webrtc.org,ivoc@webrtc.org,minyue@webrtc.org,chxg@google.com Change-Id: Id43b7b3da79b4f48004b41767482bae1c1fa1e16 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: webrtc:10668, chromium:982260 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/146713 Reviewed-by: Alessio Bazzica <alessiob@webrtc.org> Commit-Queue: Alessio Bazzica <alessiob@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28672}
129 lines
4.6 KiB
C++
129 lines
4.6 KiB
C++
/*
|
|
* Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "modules/audio_coding/neteq/tools/neteq_performance_test.h"
|
|
|
|
#include "api/audio/audio_frame.h"
|
|
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
|
|
#include "modules/audio_coding/codecs/pcm16b/pcm16b.h"
|
|
#include "modules/audio_coding/neteq/include/neteq.h"
|
|
#include "modules/audio_coding/neteq/tools/audio_loop.h"
|
|
#include "modules/audio_coding/neteq/tools/rtp_generator.h"
|
|
#include "rtc_base/checks.h"
|
|
#include "system_wrappers/include/clock.h"
|
|
#include "test/testsupport/file_utils.h"
|
|
|
|
using webrtc::NetEq;
|
|
using webrtc::test::AudioLoop;
|
|
using webrtc::test::RtpGenerator;
|
|
|
|
namespace webrtc {
|
|
namespace test {
|
|
|
|
int64_t NetEqPerformanceTest::Run(int runtime_ms,
|
|
int lossrate,
|
|
double drift_factor) {
|
|
const std::string kInputFileName =
|
|
webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
|
|
const int kSampRateHz = 32000;
|
|
const std::string kDecoderName = "pcm16-swb32";
|
|
const int kPayloadType = 95;
|
|
|
|
// Initialize NetEq instance.
|
|
NetEq::Config config;
|
|
config.sample_rate_hz = kSampRateHz;
|
|
webrtc::Clock* clock = webrtc::Clock::GetRealTimeClock();
|
|
NetEq* neteq =
|
|
NetEq::Create(config, clock, CreateBuiltinAudioDecoderFactory());
|
|
// Register decoder in |neteq|.
|
|
if (!neteq->RegisterPayloadType(kPayloadType,
|
|
SdpAudioFormat("l16", kSampRateHz, 1)))
|
|
return -1;
|
|
|
|
// Set up AudioLoop object.
|
|
AudioLoop audio_loop;
|
|
const size_t kMaxLoopLengthSamples = kSampRateHz * 10; // 10 second loop.
|
|
const size_t kInputBlockSizeSamples = 60 * kSampRateHz / 1000; // 60 ms.
|
|
if (!audio_loop.Init(kInputFileName, kMaxLoopLengthSamples,
|
|
kInputBlockSizeSamples))
|
|
return -1;
|
|
|
|
int32_t time_now_ms = 0;
|
|
|
|
// Get first input packet.
|
|
RTPHeader rtp_header;
|
|
RtpGenerator rtp_gen(kSampRateHz / 1000);
|
|
// Start with positive drift first half of simulation.
|
|
rtp_gen.set_drift_factor(drift_factor);
|
|
bool drift_flipped = false;
|
|
int32_t packet_input_time_ms =
|
|
rtp_gen.GetRtpHeader(kPayloadType, kInputBlockSizeSamples, &rtp_header);
|
|
auto input_samples = audio_loop.GetNextBlock();
|
|
if (input_samples.empty())
|
|
exit(1);
|
|
uint8_t input_payload[kInputBlockSizeSamples * sizeof(int16_t)];
|
|
size_t payload_len = WebRtcPcm16b_Encode(input_samples.data(),
|
|
input_samples.size(), input_payload);
|
|
RTC_CHECK_EQ(sizeof(input_payload), payload_len);
|
|
|
|
// Main loop.
|
|
int64_t start_time_ms = clock->TimeInMilliseconds();
|
|
AudioFrame out_frame;
|
|
while (time_now_ms < runtime_ms) {
|
|
while (packet_input_time_ms <= time_now_ms) {
|
|
// Drop every N packets, where N = FLAG_lossrate.
|
|
bool lost = false;
|
|
if (lossrate > 0) {
|
|
lost = ((rtp_header.sequenceNumber - 1) % lossrate) == 0;
|
|
}
|
|
if (!lost) {
|
|
// Insert packet.
|
|
int error =
|
|
neteq->InsertPacket(rtp_header, input_payload,
|
|
packet_input_time_ms * kSampRateHz / 1000);
|
|
if (error != NetEq::kOK)
|
|
return -1;
|
|
}
|
|
|
|
// Get next packet.
|
|
packet_input_time_ms = rtp_gen.GetRtpHeader(
|
|
kPayloadType, kInputBlockSizeSamples, &rtp_header);
|
|
input_samples = audio_loop.GetNextBlock();
|
|
if (input_samples.empty())
|
|
return -1;
|
|
payload_len = WebRtcPcm16b_Encode(input_samples.data(),
|
|
input_samples.size(), input_payload);
|
|
RTC_DCHECK_EQ(payload_len, kInputBlockSizeSamples * sizeof(int16_t));
|
|
}
|
|
|
|
// Get output audio, but don't do anything with it.
|
|
bool muted;
|
|
int error = neteq->GetAudio(&out_frame, &muted);
|
|
RTC_CHECK(!muted);
|
|
if (error != NetEq::kOK)
|
|
return -1;
|
|
|
|
RTC_DCHECK_EQ(out_frame.samples_per_channel_, (kSampRateHz * 10) / 1000);
|
|
|
|
static const int kOutputBlockSizeMs = 10;
|
|
time_now_ms += kOutputBlockSizeMs;
|
|
if (time_now_ms >= runtime_ms / 2 && !drift_flipped) {
|
|
// Apply negative drift second half of simulation.
|
|
rtp_gen.set_drift_factor(-drift_factor);
|
|
drift_flipped = true;
|
|
}
|
|
}
|
|
int64_t end_time_ms = clock->TimeInMilliseconds();
|
|
delete neteq;
|
|
return end_time_ms - start_time_ms;
|
|
}
|
|
|
|
} // namespace test
|
|
} // namespace webrtc
|