|
From: <sl...@ke...> - 2009-01-16 13:02:07
|
CVS Root: /cvs/gstreamer
Module: gst-plugins-base
Changes by: slomo
Date: Fri Jan 16 2009 11:44:19 UTC
Log message:
* gst-libs/gst/fft/_kiss_fft_guts_f32.h:
* gst-libs/gst/fft/_kiss_fft_guts_f64.h:
* gst-libs/gst/fft/_kiss_fft_guts_s16.h:
* gst-libs/gst/fft/_kiss_fft_guts_s32.h:
* gst-libs/gst/fft/kiss_fftr_f32.c: (kiss_fftr_f32_alloc):
* gst-libs/gst/fft/kiss_fftr_f64.c: (kiss_fftr_f64_alloc):
* gst-libs/gst/fft/kiss_fftr_s16.c: (kiss_fftr_s16_alloc):
* gst-libs/gst/fft/kiss_fftr_s32.c: (kiss_fftr_s32_alloc):
Use correct struct alignment everywhere to prevent unaligned
memory accesses, resulting in SIGBUS on sparc and probably others.
Fixes bug #500833.
Modified files:
. : ChangeLog
gst-libs/gst/fft: _kiss_fft_guts_f32.h _kiss_fft_guts_f64.h
_kiss_fft_guts_s16.h _kiss_fft_guts_s32.h
kiss_fftr_f32.c kiss_fftr_f64.c kiss_fftr_s16.c
kiss_fftr_s32.c
Links:
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.4291&r2=1.4292
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/fft/_kiss_fft_guts_f32.h.diff?r1=1.1&r2=1.2
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/fft/_kiss_fft_guts_f64.h.diff?r1=1.1&r2=1.2
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/fft/_kiss_fft_guts_s16.h.diff?r1=1.1&r2=1.2
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/fft/_kiss_fft_guts_s32.h.diff?r1=1.1&r2=1.2
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/fft/kiss_fftr_f32.c.diff?r1=1.1&r2=1.2
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/fft/kiss_fftr_f64.c.diff?r1=1.1&r2=1.2
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/fft/kiss_fftr_s16.c.diff?r1=1.1&r2=1.2
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/fft/kiss_fftr_s32.c.diff?r1=1.1&r2=1.2
====Begin Diffs====
Index: ChangeLog
===================================================================
RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v
retrieving revision 1.4291
retrieving revision 1.4292
diff -u -d -r1.4291 -r1.4292
--- ChangeLog 16 Jan 2009 11:40:00 -0000 1.4291
+++ ChangeLog 16 Jan 2009 11:44:01 -0000 1.4292
@@ -1,5 +1,19 @@
2009-01-16 Sebastian Dröge <seb...@co...>
+ * gst-libs/gst/fft/_kiss_fft_guts_f32.h:
+ * gst-libs/gst/fft/_kiss_fft_guts_f64.h:
+ * gst-libs/gst/fft/_kiss_fft_guts_s16.h:
+ * gst-libs/gst/fft/_kiss_fft_guts_s32.h:
+ * gst-libs/gst/fft/kiss_fftr_f32.c: (kiss_fftr_f32_alloc):
+ * gst-libs/gst/fft/kiss_fftr_f64.c: (kiss_fftr_f64_alloc):
+ * gst-libs/gst/fft/kiss_fftr_s16.c: (kiss_fftr_s16_alloc):
+ * gst-libs/gst/fft/kiss_fftr_s32.c: (kiss_fftr_s32_alloc):
+ Use correct struct alignment everywhere to prevent unaligned
+ memory accesses, resulting in SIGBUS on sparc and probably others.
+ Fixes bug #500833.
+
+2009-01-16 Sebastian Dröge <seb...@co...>
* gst-libs/gst/tag/gsttagdemux.c: (gst_tag_demux_srcpad_event):
Forward unknown events upstream to allow latency configuration.
Fixes bug #567960.
Index: _kiss_fft_guts_f32.h
RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/fft/_kiss_fft_guts_f32.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- _kiss_fft_guts_f32.h 6 Sep 2007 07:00:27 -0000 1.1
+++ _kiss_fft_guts_f32.h 16 Jan 2009 11:44:03 -0000 1.2
@@ -19,6 +19,20 @@
#include "kiss_fft_f32.h"
#include <limits.h>
+/* The 2*sizeof(size_t) alignment here is borrowed from
+ * GNU libc, so it should be good most everywhere.
+ * It is more conservative than is needed on some 64-bit
+ * platforms, but ia64 does require a 16-byte alignment.
+ * The SIMD extensions for x86 and ppc32 would want a
+ * larger alignment than this, but we don't need to
+ * do better than malloc.
+ *
+ * Borrowed from GLib's gobject/gtype.c
+ */
+#define STRUCT_ALIGNMENT (2 * sizeof (size_t))
+#define ALIGN_STRUCT(offset) \
+ ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
#define MAXFACTORS 32
/* e.g. an fft of length 128 has 4 factors
as far as kissfft is concerned
Index: _kiss_fft_guts_f64.h
RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/fft/_kiss_fft_guts_f64.h,v
--- _kiss_fft_guts_f64.h 6 Sep 2007 07:00:27 -0000 1.1
+++ _kiss_fft_guts_f64.h 16 Jan 2009 11:44:03 -0000 1.2
#include "kiss_fft_f64.h"
Index: _kiss_fft_guts_s16.h
RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/fft/_kiss_fft_guts_s16.h,v
--- _kiss_fft_guts_s16.h 6 Sep 2007 07:00:27 -0000 1.1
+++ _kiss_fft_guts_s16.h 16 Jan 2009 11:44:03 -0000 1.2
#include "kiss_fft_s16.h"
Index: _kiss_fft_guts_s32.h
RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/fft/_kiss_fft_guts_s32.h,v
--- _kiss_fft_guts_s32.h 6 Sep 2007 07:00:28 -0000 1.1
+++ _kiss_fft_guts_s32.h 16 Jan 2009 11:44:03 -0000 1.2
#include "kiss_fft_s32.h"
Index: kiss_fftr_f32.c
RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/fft/kiss_fftr_f32.c,v
--- kiss_fftr_f32.c 6 Sep 2007 07:00:32 -0000 1.1
+++ kiss_fftr_f32.c 16 Jan 2009 11:44:03 -0000 1.2
@@ -39,9 +39,8 @@
nfft >>= 1;
kiss_fft_f32_alloc (nfft, inverse_fft, NULL, &subsize);
- memneeded =
- sizeof (struct kiss_fftr_f32_state) + subsize +
- sizeof (kiss_fft_f32_cpx) * (nfft * 2);
+ memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_f32_state))
+ + ALIGN_STRUCT (subsize) + sizeof (kiss_fft_f32_cpx) * (nfft * 2);
if (lenmem == NULL) {
st = (kiss_fftr_f32_cfg) KISS_FFT_F32_MALLOC (memneeded);
@@ -53,8 +52,9 @@
if (!st)
return NULL;
- st->substate = (kiss_fft_f32_cfg) (st + 1); /*just beyond kiss_fftr_f32_state struct */
- st->tmpbuf = (kiss_fft_f32_cpx *) (((char *) st->substate) + subsize);
+ st->substate = (kiss_fft_f32_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_f32_state))); /*just beyond kiss_fftr_f32_state struct */
+ st->tmpbuf =
+ (kiss_fft_f32_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
st->super_twiddles = st->tmpbuf + nfft;
kiss_fft_f32_alloc (nfft, inverse_fft, st->substate, &subsize);
Index: kiss_fftr_f64.c
RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/fft/kiss_fftr_f64.c,v
--- kiss_fftr_f64.c 6 Sep 2007 07:00:33 -0000 1.1
+++ kiss_fftr_f64.c 16 Jan 2009 11:44:03 -0000 1.2
@@ -39,9 +39,9 @@
kiss_fft_f64_alloc (nfft, inverse_fft, NULL, &subsize);
- sizeof (struct kiss_fftr_f64_state) + subsize +
- sizeof (kiss_fft_f64_cpx) * (nfft * 2);
+ memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_f64_state))
+ + ALIGN_STRUCT (subsize)
+ + sizeof (kiss_fft_f64_cpx) * (nfft * 2);
st = (kiss_fftr_f64_cfg) KISS_FFT_F64_MALLOC (memneeded);
@@ -53,8 +53,9 @@
- st->substate = (kiss_fft_f64_cfg) (st + 1); /*just beyond kiss_fftr_f64_state struct */
- st->tmpbuf = (kiss_fft_f64_cpx *) (((char *) st->substate) + subsize);
+ st->substate = (kiss_fft_f64_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_f64_state))); /*just beyond kiss_fftr_f64_state struct */
+ (kiss_fft_f64_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
kiss_fft_f64_alloc (nfft, inverse_fft, st->substate, &subsize);
Index: kiss_fftr_s16.c
RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/fft/kiss_fftr_s16.c,v
--- kiss_fftr_s16.c 6 Sep 2007 07:00:33 -0000 1.1
+++ kiss_fftr_s16.c 16 Jan 2009 11:44:03 -0000 1.2
kiss_fft_s16_alloc (nfft, inverse_fft, NULL, &subsize);
- sizeof (struct kiss_fftr_s16_state) + subsize +
- sizeof (kiss_fft_s16_cpx) * (nfft * 2);
+ memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_s16_state))
+ + sizeof (kiss_fft_s16_cpx) * (nfft * 2);
st = (kiss_fftr_s16_cfg) KISS_FFT_S16_MALLOC (memneeded);
- st->substate = (kiss_fft_s16_cfg) (st + 1); /*just beyond kiss_fftr_s16_state struct */
- st->tmpbuf = (kiss_fft_s16_cpx *) (((char *) st->substate) + subsize);
+ st->substate = (kiss_fft_s16_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_s16_state))); /*just beyond kiss_fftr_s16_state struct */
+ (kiss_fft_s16_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
kiss_fft_s16_alloc (nfft, inverse_fft, st->substate, &subsize);
Index: kiss_fftr_s32.c
RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/fft/kiss_fftr_s32.c,v
--- kiss_fftr_s32.c 6 Sep 2007 07:00:34 -0000 1.1
+++ kiss_fftr_s32.c 16 Jan 2009 11:44:04 -0000 1.2
kiss_fft_s32_alloc (nfft, inverse_fft, NULL, &subsize);
- sizeof (struct kiss_fftr_s32_state) + subsize +
- sizeof (kiss_fft_s32_cpx) * (nfft * 2);
+ memneeded = ALIGN_STRUCT (sizeof (struct kiss_fftr_s32_state))
+ + sizeof (kiss_fft_s32_cpx) * (nfft * 2);
st = (kiss_fftr_s32_cfg) KISS_FFT_S32_MALLOC (memneeded);
- st->substate = (kiss_fft_s32_cfg) (st + 1); /*just beyond kiss_fftr_s32_state struct */
- st->tmpbuf = (kiss_fft_s32_cpx *) (((char *) st->substate) + subsize);
+ st->substate = (kiss_fft_s32_cfg) (((char *) st) + ALIGN_STRUCT (sizeof (struct kiss_fftr_s32_state))); /*just beyond kiss_fftr_s32_state struct */
+ (kiss_fft_s32_cpx *) (((char *) st->substate) + ALIGN_STRUCT (subsize));
kiss_fft_s32_alloc (nfft, inverse_fft, st->substate, &subsize);
|