diff options
author | Edward Hervey <edward@centricular.com> | 2017-11-23 07:59:07 +0100 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2017-12-01 10:18:09 +0100 |
commit | 3e1deb609421919869f75aa3eafdca8f10126934 (patch) | |
tree | 4c72832d3c9ff8d62e71c1466bc115c89b369632 | |
parent | 1547ea59fe4511aa71faa8fcfa3b33e9d35ad847 (diff) | |
download | gstreamer-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.c | 10 |
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; } |