summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <edward@centricular.com>2017-11-23 07:59:07 +0100
committerEdward Hervey <bilboed@bilboed.com>2017-12-01 10:18:09 +0100
commit3e1deb609421919869f75aa3eafdca8f10126934 (patch)
tree4c72832d3c9ff8d62e71c1466bc115c89b369632
parent1547ea59fe4511aa71faa8fcfa3b33e9d35ad847 (diff)
downloadgstreamer-plugins-good-3e1deb609421919869f75aa3eafdca8f10126934.tar.gz
rganalysis: Fix left shift of signed values
left shifting signed values is undefined. Instead of doing "x << offs" which is undefined, do the equivalent "x * (1 << offs)" which is well defined
-rw-r--r--gst/replaygain/rganalysis.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/gst/replaygain/rganalysis.c b/gst/replaygain/rganalysis.c
index 25535363e..304037699 100644
--- a/gst/replaygain/rganalysis.c
+++ b/gst/replaygain/rganalysis.c
@@ -575,7 +575,7 @@ rg_analysis_analyze_mono_int16 (RgAnalysisCtx * ctx, gconstpointer data,
gint32 peak_sample = 0;
const gint16 *samples = (gint16 *) data;
guint n_samples = size / sizeof (gint16);
- gint shift = sizeof (gint16) * 8 - depth;
+ gint shift = 1 << (sizeof (gint16) * 8 - depth);
gint i;
g_return_if_fail (depth <= (sizeof (gint16) * 8));
@@ -586,7 +586,7 @@ rg_analysis_analyze_mono_int16 (RgAnalysisCtx * ctx, gconstpointer data,
n_samples -= n;
for (i = 0; i < n; i++) {
- gint16 old_sample = samples[i] << shift;
+ gint16 old_sample = samples[i] * shift;
peak_sample = MAX (peak_sample, ABS ((gint32) old_sample));
conv_samples[i] = (gfloat) old_sample;
@@ -607,7 +607,7 @@ rg_analysis_analyze_stereo_int16 (RgAnalysisCtx * ctx, gconstpointer data,
gint32 peak_sample = 0;
const gint16 *samples = (gint16 *) data;
guint n_frames = size / (sizeof (gint16) * 2);
- gint shift = sizeof (gint16) * 8 - depth;
+ gint shift = 1 << (sizeof (gint16) * 8 - depth);
gint i;
g_return_if_fail (depth <= (sizeof (gint16) * 8));
@@ -620,11 +620,11 @@ rg_analysis_analyze_stereo_int16 (RgAnalysisCtx * ctx, gconstpointer data,
for (i = 0; i < n; i++) {
gint16 old_sample;
- old_sample = samples[2 * i] << shift;
+ old_sample = samples[2 * i] * shift;
peak_sample = MAX (peak_sample, ABS ((gint32) old_sample));
conv_samples_l[i] = (gfloat) old_sample;
- old_sample = samples[2 * i + 1] << shift;
+ old_sample = samples[2 * i + 1] * shift;
peak_sample = MAX (peak_sample, ABS ((gint32) old_sample));
conv_samples_r[i] = (gfloat) old_sample;
}