diff options
author | andrew@webrtc.org <andrew@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-09-06 21:15:55 +0000 |
---|---|---|
committer | andrew@webrtc.org <andrew@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-09-06 21:15:55 +0000 |
commit | 11a8868e8e4803e6375eb1bd2002351786f55ebc (patch) | |
tree | 499c8b0126d25f66b646b54fb2d295c1a6d8d631 /common_audio/include | |
parent | ca20f3d4c2d6823908e3b7e23119aeebb2ba7de1 (diff) | |
download | webrtc-11a8868e8e4803e6375eb1bd2002351786f55ebc.tar.gz |
Reduce cost of PushSincResampler::Resample().
Ideally, PushSincResampler would have very little overhead on
SincResampler. This gets closer to that ideal.
Replace std::min/max and floor with inline functions. Add a benchmark
test to verify the improvement.
On a MacBook Retina, this results in PushSincResampler::Resample()
accounting for ~1% of CPU usage on voe_cmd_test vs the earlier ~2%
(with ISAC16 and 48 kHz audio devices).
Using the new benchmark, this results in a performance improvement of:
16 -> 44.1 : 1.7x
16 -> 48 : 1.9x
32 -> 44.1 : 1.6x
32 -> 48 : 1.7x
44.1 -> 16 : 1.5x
44.1 -> 32 : 1.7x
44.1 -> 48 : 1.7x
48 -> 16 : 1.5x
48 -> 32 : 1.5x
48 -> 44.1 : 1.8x
R=turaj@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/2157005
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@4695 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'common_audio/include')
-rw-r--r-- | common_audio/include/audio_util.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/common_audio/include/audio_util.h b/common_audio/include/audio_util.h index 2196fc34..5e86c1f0 100644 --- a/common_audio/include/audio_util.h +++ b/common_audio/include/audio_util.h @@ -15,6 +15,20 @@ namespace webrtc { +// Clamp the floating |value| to the range representable by an int16_t. +static inline float ClampInt16(float value) { + const float kMaxInt16 = 32767.f; + const float kMinInt16 = -32768.f; + return value < kMinInt16 ? kMinInt16 : + (value > kMaxInt16 ? kMaxInt16 : value); +} + +// Return a rounded int16_t of the floating |value|. Doesn't handle overflow; +// use ClampInt16 if necessary. +static inline int16_t RoundToInt16(float value) { + return static_cast<int16_t>(value < 0.f ? value - 0.5f : value + 0.5f); +} + // Deinterleave audio from |interleaved| to the channel buffers pointed to // by |deinterleaved|. There must be sufficient space allocated in the // |deinterleaved| buffers (|num_channel| buffers with |samples_per_channel| |