On 18.06.2015 22:26, Michael Niedermayer wrote:
> On Thu, Jun 18, 2015 at 08:29:06PM +0200, Andreas Cadhalpun wrote:
>> QP_store is only 8-bit-aligned, so accessing it as uint32_t causes
>> SIGILL crashes on sparc.
>>
>> Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
>> ---
>>  libpostproc/postprocess.c | 5 +----
>>  1 file changed, 1 insertion(+), 4 deletions(-)
>>
>> diff --git a/libpostproc/postprocess.c b/libpostproc/postprocess.c
>> index 92cc436..e4ea515 100644
>> --- a/libpostproc/postprocess.c
>> +++ b/libpostproc/postprocess.c
>> @@ -996,10 +996,7 @@ void  pp_postprocess(const uint8_t * src[3], const int 
>> srcStride[3],
>>          if (QPStride >= 0){
>>              int i;
>>              const int count= FFMAX(mbHeight * QPStride, mbWidth);
>> -            for(i=0; i<(count>>2); i++){
>> -                ((uint32_t*)c->nonBQPTable)[i] = ((const 
>> uint32_t*)QP_store)[i] & 0x3F3F3F3F;
>> -            }
>> -            for(i<<=2; i<count; i++){
> 
> maybe this can be left under #if HAVE_FAST_UNALIGNED with
> AV_RN32 AV_WN32

Yes, updated patch attached.

Best regards,
Andreas
>From 92662bfcebb5a49b3f6728d18582f1ae7205bcb3 Mon Sep 17 00:00:00 2001
From: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
Date: Thu, 18 Jun 2015 20:15:12 +0200
Subject: [PATCH] postproc: fix unaligned access

QP_store is only 8-bit-aligned, so accessing it as uint32_t causes
SIGBUS crashes on sparc.
The AV_RN32/AV_WN32 macros only do unaligned access in the
HAVE_FAST_UNALIGNED case.

Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
---
 libpostproc/postprocess.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/libpostproc/postprocess.c b/libpostproc/postprocess.c
index 92cc436..3b86f93 100644
--- a/libpostproc/postprocess.c
+++ b/libpostproc/postprocess.c
@@ -76,6 +76,7 @@ try to unroll inner for(x=0 ... loop to avoid these damn if(x ... checks
 #include "config.h"
 #include "libavutil/avutil.h"
 #include "libavutil/avassert.h"
+#include "libavutil/intreadwrite.h"
 #include <inttypes.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -997,7 +998,7 @@ void  pp_postprocess(const uint8_t * src[3], const int srcStride[3],
             int i;
             const int count= FFMAX(mbHeight * QPStride, mbWidth);
             for(i=0; i<(count>>2); i++){
-                ((uint32_t*)c->nonBQPTable)[i] = ((const uint32_t*)QP_store)[i] & 0x3F3F3F3F;
+                AV_WN32(c->nonBQPTable + (i<<2), AV_RN32(QP_store + (i<<2)) & 0x3F3F3F3F);
             }
             for(i<<=2; i<count; i++){
                 c->nonBQPTable[i] = QP_store[i] & 0x3F;
-- 
2.1.4

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to