$OpenBSD: patch-filter_filter_unsharp_c,v 1.1.1.1 2005/01/25 21:58:59 naddy Exp $
--- filter/filter_unsharp.c.orig	Tue Nov  2 19:45:58 2004
+++ filter/filter_unsharp.c	Fri Dec 31 01:13:17 2004
@@ -60,6 +60,7 @@ typedef struct FilterParam {
     int msizeX, msizeY;
     double amount;
     uint32_t *SC[MAX_MATRIX_SIZE-1];
+    uint32_t *SC_unaligned[MAX_MATRIX_SIZE-1];
 } FilterParam;
 
 typedef struct vf_priv_s {
@@ -78,8 +79,18 @@ static void *bufalloc(size_t size)
    long buffer_align=16;
 #endif
 
-   char *buf = malloc(size + buffer_align);
+   return malloc(size + buffer_align);
+}
 
+static void *bufalign(char *buf)
+{
+
+#ifdef HAVE_GETPAGESIZE
+   long buffer_align=getpagesize();
+#else
+   long buffer_align=16;
+#endif
+
    long adjust;
 
    if (buf == NULL) {
@@ -311,7 +322,10 @@ int tc_filter(vframe_list_t *ptr, char *
     stepsX = fp->msizeX/2;
     stepsY = fp->msizeY/2;
     for( z=0; z<2*stepsY; z++ )
-	fp->SC[z] = bufalloc(sizeof(*(fp->SC[z])) * (width+2*stepsX) );
+        {
+	fp->SC_unaligned[z] = bufalloc(sizeof(*(fp->SC[z])) * (width+2*stepsX) );
+	fp->SC[z] = bufalign((char *)(fp->SC_unaligned[z]));
+        }
 
     fp = &mfd->chromaParam;
     effect = fp->amount == 0 ? "don't touch" : fp->amount < 0 ? "blur" : "sharpen";
@@ -320,7 +334,10 @@ int tc_filter(vframe_list_t *ptr, char *
     stepsX = fp->msizeX/2;
     stepsY = fp->msizeY/2;
     for( z=0; z<2*stepsY; z++ )
-	fp->SC[z] = bufalloc( sizeof(*(fp->SC[z])) * (width+2*stepsX) );
+        {
+	fp->SC_unaligned[z] = bufalloc( sizeof(*(fp->SC[z])) * (width+2*stepsX) );
+	fp->SC[z] = bufalign((char *)(fp->SC_unaligned[z]));
+        }
 
 
     if(verbose) printf("[%s] %s %s\n", MOD_NAME, MOD_VERSION, MOD_CAP);
@@ -336,12 +353,14 @@ int tc_filter(vframe_list_t *ptr, char *
 
       fp = &mfd->lumaParam;
       for( z=0; z<sizeof(fp->SC)/sizeof(fp->SC[0]); z++ ) {
-	  if( fp->SC[z] ) free( fp->SC[z] );
+	  if( fp->SC_unaligned[z] ) free( fp->SC_unaligned[z] );
+	  fp->SC_unaligned[z] = NULL;
 	  fp->SC[z] = NULL;
       }
       fp = &mfd->chromaParam;
       for( z=0; z<sizeof(fp->SC)/sizeof(fp->SC[0]); z++ ) {
-	  if( fp->SC[z] ) free( fp->SC[z] );
+	  if( fp->SC_unaligned[z] ) free( fp->SC_unaligned[z] );
+	  fp->SC_unaligned[z] = NULL;
 	  fp->SC[z] = NULL;
       }
 
