]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
Fix cast of byte buffer to uint32 that was disregarding alignment
authorheydowns <heydowns@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Fri, 12 Jun 2009 02:13:12 +0000 (02:13 +0000)
committerheydowns <heydowns@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Fri, 12 Jun 2009 02:13:12 +0000 (02:13 +0000)
requirements.
Now calculates crc byte at a time until aligned, then continues with uint32
optimized calculation.
This fixes crashes during mlp decoding on sparc (at least, maybe others).

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19160 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

libavutil/crc.c

index ed065d8d50484783ceda100e6982820e1596b5ec..6fa14fcc58b64d8594b8bb6ad1ab544d70de32f6 100644 (file)
@@ -115,7 +115,10 @@ uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t le
     const uint8_t *end= buffer+length;
 
 #if !CONFIG_SMALL
-    if(!ctx[256])
+    if(!ctx[256]) {
+        while(((intptr_t) buffer & 3) && buffer < end)
+            crc = ctx[((uint8_t)crc) ^ *buffer++] ^ (crc >> 8);
+
         while(buffer<end-3){
             crc ^= le2me_32(*(const uint32_t*)buffer); buffer+=4;
             crc =  ctx[3*256 + ( crc     &0xFF)]
@@ -123,6 +126,7 @@ uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t le
                   ^ctx[1*256 + ((crc>>16)&0xFF)]
                   ^ctx[0*256 + ((crc>>24)     )];
         }
+    }
 #endif
     while(buffer<end)
         crc = ctx[((uint8_t)crc) ^ *buffer++] ^ (crc >> 8);