From ceb9f8d9271f2cd18a0d389be044ca93aa1b4870 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <michaelni@gmx.at>
Date: Fri, 14 Dec 2012 04:47:17 +0100
Subject: [PATCH] audioconvert: support simd code with specific alignment
 requirements.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
---
 libswresample/audioconvert.c | 18 +++++++++++++++++-
 libswresample/audioconvert.h |  2 ++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/libswresample/audioconvert.c b/libswresample/audioconvert.c
index d2e3722a406..4ba0ff13b16 100644
--- a/libswresample/audioconvert.c
+++ b/libswresample/audioconvert.c
@@ -170,12 +170,28 @@ int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len
     int ch;
     int off=0;
     const int os= (out->planar ? 1 :out->ch_count) *out->bps;
+    unsigned misaligned = 0;
 
     av_assert0(ctx->channels == out->ch_count);
 
+    if (ctx->in_simd_align_mask) {
+        int planes = in->planar ? in->ch_count : 1;
+        unsigned m = 0;
+        for (ch = 0; ch < planes; ch++)
+            m |= (intptr_t)in->ch[ch];
+        misaligned |= m & ctx->in_simd_align_mask;
+    }
+    if (ctx->out_simd_align_mask) {
+        int planes = out->planar ? out->ch_count : 1;
+        unsigned m = 0;
+        for (ch = 0; ch < planes; ch++)
+            m |= (intptr_t)out->ch[ch];
+        misaligned |= m & ctx->out_simd_align_mask;
+    }
+
     //FIXME optimize common cases
 
-    if(ctx->simd_f && !ctx->ch_map){
+    if(ctx->simd_f && !ctx->ch_map && !misaligned){
         off = len&~15;
         av_assert1(off>=0);
         av_assert1(off<=len);
diff --git a/libswresample/audioconvert.h b/libswresample/audioconvert.h
index d8af0036713..2e983df2866 100644
--- a/libswresample/audioconvert.h
+++ b/libswresample/audioconvert.h
@@ -38,6 +38,8 @@ typedef void (simd_func_type)(uint8_t **dst, const uint8_t **src, int len);
 
 typedef struct AudioConvert {
     int channels;
+    int  in_simd_align_mask;
+    int out_simd_align_mask;
     conv_func_type *conv_f;
     simd_func_type *simd_f;
     const int *ch_map;
-- 
GitLab