You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	avutil/md5: fix misaligned reads
This makes ubsan happy and also considerably increases performance on big endian systems. Tested on an IBM POWER7 3.55 GHz Before: 2.24user 0.14system 0:02.39elapsed 99%CPU (0avgtext+0avgdata 2624maxresident)k 2.26user 0.11system 0:02.38elapsed 99%CPU (0avgtext+0avgdata 2688maxresident)k 2.23user 0.15system 0:02.38elapsed 99%CPU (0avgtext+0avgdata 2624maxresident)k 2.25user 0.12system 0:02.38elapsed 100%CPU (0avgtext+0avgdata 2624maxresident)k 2.20user 0.15system 0:02.36elapsed 99%CPU (0avgtext+0avgdata 2624maxresident)k After: 1.86user 0.13system 0:02.00elapsed 99%CPU (0avgtext+0avgdata 2624maxresident)k 1.89user 0.11system 0:02.01elapsed 99%CPU (0avgtext+0avgdata 2624maxresident)k 1.85user 0.14system 0:02.00elapsed 99%CPU (0avgtext+0avgdata 2624maxresident)k 1.84user 0.15system 0:01.99elapsed 99%CPU (0avgtext+0avgdata 2624maxresident)k 1.89user 0.13system 0:02.02elapsed 99%CPU (0avgtext+0avgdata 2688maxresident)k Tested-by: Nicolas George <george@nsup.org> Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: James Almer <jamrial@gmail.com> Signed-off-by: Sean McGovern <gseanmcg@gmail.com>
This commit is contained in:
		
				
					committed by
					
						 Sean McGovern
						Sean McGovern
					
				
			
			
				
	
			
			
			
						parent
						
							61cec5adaa
						
					
				
				
					commit
					a876958d0f
				
			| @@ -83,15 +83,15 @@ static const uint32_t T[64] = { // T[i]= fabs(sin(i+1)<<32) | ||||
|         a += T[i];                                                      \ | ||||
|                                                                         \ | ||||
|         if (i < 32) {                                                   \ | ||||
|             if (i < 16)                                                 \ | ||||
|                 a += (d ^ (b & (c ^ d))) + X[i           & 15];         \ | ||||
|             else                                                        \ | ||||
|                 a += (c ^ (d & (c ^ b))) + X[(1 + 5 * i) & 15];         \ | ||||
|             if (i < 16)                                                     \ | ||||
|                 a += (d ^ (b & (c ^ d))) + AV_RL32(X + (i          & 15));  \ | ||||
|             else                                                            \ | ||||
|                 a += (c ^ (d & (c ^ b))) + AV_RL32(X + ((1 + 5 * i) & 15)); \ | ||||
|         } else {                                                        \ | ||||
|             if (i < 48)                                                 \ | ||||
|                 a += (b ^ c ^ d)    + X[(5 + 3 * i) & 15];              \ | ||||
|                 a += (b ^ c ^ d)    + AV_RL32(X + ((5 + 3 * i) & 15));  \ | ||||
|             else                                                        \ | ||||
|                 a += (c ^ (b | ~d)) + X[(7     * i) & 15];              \ | ||||
|                 a += (c ^ (b | ~d)) + AV_RL32(X + ((7     * i) & 15));  \ | ||||
|         }                                                               \ | ||||
|         a = b + (a << t | a >> (32 - t));                               \ | ||||
|     } while (0) | ||||
| @@ -99,18 +99,14 @@ static const uint32_t T[64] = { // T[i]= fabs(sin(i+1)<<32) | ||||
| static void body(uint32_t ABCD[4], uint32_t X[16]) | ||||
| { | ||||
|     int t; | ||||
|     int i av_unused; | ||||
|     unsigned int a = ABCD[3]; | ||||
|     unsigned int b = ABCD[2]; | ||||
|     unsigned int c = ABCD[1]; | ||||
|     unsigned int d = ABCD[0]; | ||||
|  | ||||
| #if HAVE_BIGENDIAN | ||||
|     for (i = 0; i < 16; i++) | ||||
|         X[i] = av_bswap32(X[i]); | ||||
| #endif | ||||
|  | ||||
| #if CONFIG_SMALL | ||||
|     int i; | ||||
|  | ||||
|     for (i = 0; i < 64; i++) { | ||||
|         CORE(i, a, b, c, d); | ||||
|         t = d; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user