Bug#789250: bs1770gain: Fail to build on archs with strict alignment requirements

Petter Reinholdtsen pere at hungry.com
Wed Jun 24 10:41:47 UTC 2015


[Peter Belkner]
> BS1770GAIN doesn't make any assumption on buffer alignment itself
> (i.e.  it relies on FFmpeg), and so myself. Are there any hints that
> FFmpeg is broken on the systems in question?

I do not know.  But I am more worried about other alignment problems
being hidden if the warning is disabled.

> You may use SoX to generate test files.

Thank you.  I'll try to figure out how to use sox for this.  In the mean
time, I tested on mips if I could find a way to tell the compiler that
the pointer is expected to have the correct alignment, and this patch
solve the build problem related to AVFrame.data:

--- bs1770gain-0.4.3.orig/libffsox-2/ffsox_frame_convert.c
+++ bs1770gain-0.4.3/libffsox-2/ffsox_frame_convert.c
@@ -140,10 +140,10 @@ static int convert_##r##i##_##w##i(conve
   R *rp; \
   W *wp,*mp; \
  \
-  rp=(R *)p->fr->frame->data[0]; \
+  rp=(R *)(void*)p->fr->frame->data[0]; \
   rp+=channels*p->fr->nb_samples.frame; \
  \
-  wp=(W *)p->fw->frame->data[0]; \
+  wp=(W *)(void*)p->fw->frame->data[0]; \
   wp+=channels*p->fw->nb_samples.frame; \
   mp=wp+channels*p->nb_samples; \
  \
@@ -281,11 +281,11 @@ static int convert_##r##p##_##w##i(conve
   W *wp,*mp; \
  \
   for (ch=0;ch<channels;++ch) { \
-    rp[ch]=(R *)p->fr->frame->data[ch]; \
+    rp[ch]=(R *)(void*)p->fr->frame->data[ch]; \
     rp[ch]+=p->fr->nb_samples.frame; \
   } \
  \
-  wp=(W *)p->fw->frame->data[0]; \
+  wp=(W *)(void*)p->fw->frame->data[0]; \
   wp+=channels*p->fw->nb_samples.frame; \
   mp=wp+channels*p->nb_samples; \
  \
--- bs1770gain-0.4.3.orig/libffsox-2/ffsox_frame_convert_sox.c
+++ bs1770gain-0.4.3/libffsox-2/ffsox_frame_convert_sox.c
@@ -98,10 +98,10 @@ static void convert_##sfx##i(convert_t *
  \
   (void)ch; \
  \
-  rp=(T *)p->fr->frame->data[0]; \
+  rp=(T *)(void*)p->fr->frame->data[0]; \
   rp+=channels*p->fr->nb_samples.frame; \
  \
-  wp=(sox_sample_t *)p->fw->frame->data[0]; \
+  wp=(sox_sample_t *)(void*)p->fw->frame->data[0]; \
   wp+=channels*p->fw->nb_samples.frame; \
   mp=wp+channels*p->nb_samples; \
  \
@@ -184,11 +184,11 @@ static void convert_##sfx##p(convert_t *
   SOX_SAMPLE_LOCALS; \
  \
   for (ch=0;ch<channels;++ch) { \
-    rp[ch]=(T *)p->fr->frame->data[ch]; \
+    rp[ch]=(T *)(void*)p->fr->frame->data[ch]; \
     rp[ch]+=p->fr->nb_samples.frame; \
   } \
  \
-  wp=(sox_sample_t *)p->fw->frame->data[0]; \
+  wp=(sox_sample_t *)(void*)p->fw->frame->data[0]; \
   wp+=channels*p->fw->nb_samples.frame; \
   mp=wp+channels*p->nb_samples; \
  \

I like this approach better, as it do not disable strict alignment
checking for the entire code, but only for the selected parts where it
is believed to be OK to disable it.  So I plan to keep the
-Wstrict-align warning in place for the Debian package for now.

Changing the code like that exposes another build error, the cast to
(pull_cb_t) from char * done in this function:

  static int getopts(sox_effect_t *e, int argc, char *argv[])
  {
    priv_t *priv=e->priv;

    priv->cb=1<argc?(pull_cb_t)argv[1]:NULL;
    priv->data=2<argc?(void *)argv[2]:NULL;

    return SOX_SUCCESS;
  }

I do not quite understand why a char * is used to store a function
pointer, and am thus reluctant to add (void*) until it is analyzed a bit
better.

-- 
Happy hacking
Petter Reinholdtsen



More information about the pkg-multimedia-maintainers mailing list