Mercurial > libavutil.hg
annotate md5.c @ 818:2715180d7ffa libavutil
H264 DXVA2 implementation
It allows VLD H264 decoding using DXVA2 (GPU assisted decoding API under
VISTA and Windows 7).
It is implemented by using AVHWAccel API. It has been tested successfully
for some time in VLC using an nvidia card on Windows 7.
To compile it, you need to have the system header dxva2api.h (either from
microsoft or using http://downloads.videolan.org/pub/videolan/testing/contrib/dxva2api.h)
The generated libavcodec.dll does not depend directly on any new lib as
the necessary objects are given by the application using FFmpeg.
author | fenrir |
---|---|
date | Wed, 20 Jan 2010 18:54:51 +0000 |
parents | 22a58fc2125d |
children | 4d9ad0ed07d0 |
rev | line source |
---|---|
45 | 1 /* |
2 * Copyright (C) 2006 Michael Niedermayer (michaelni@gmx.at) | |
3 * Copyright (C) 2003-2005 by Christopher R. Hertel (crh@ubiqx.mn.org) | |
59 | 4 * |
357 | 5 * References: |
6 * IETF RFC 1321: The MD5 Message-Digest Algorithm | |
7 * Ron Rivest. IETF, April, 1992 | |
8 * | |
9 * based on http://ubiqx.org/libcifs/source/Auth/MD5.c | |
10 * from Christopher R. Hertel (crh@ubiqx.mn.org) | |
11 * Simplified, cleaned and IMO redundant comments removed by michael. | |
12 * | |
13 * If you use gcc, then version 4.1 or later and -fomit-frame-pointer is | |
14 * strongly recommended. | |
15 * | |
116
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
59
diff
changeset
|
16 * This file is part of FFmpeg. |
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
59
diff
changeset
|
17 * |
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
59
diff
changeset
|
18 * FFmpeg is free software; you can redistribute it and/or |
59 | 19 * modify it under the terms of the GNU Lesser General Public |
20 * License as published by the Free Software Foundation; either | |
116
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
59
diff
changeset
|
21 * version 2.1 of the License, or (at your option) any later version. |
59 | 22 * |
116
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
59
diff
changeset
|
23 * FFmpeg is distributed in the hope that it will be useful, |
59 | 24 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
26 * Lesser General Public License for more details. | |
27 * | |
28 * You should have received a copy of the GNU Lesser General Public | |
116
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
59
diff
changeset
|
29 * License along with FFmpeg; if not, write to the Free Software |
59 | 30 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
45 | 31 */ |
32 | |
33 #include <string.h> | |
599 | 34 #include "bswap.h" |
45 | 35 #include "md5.h" |
36 | |
37 typedef struct AVMD5{ | |
316 | 38 uint64_t len; |
45 | 39 uint8_t block[64]; |
40 uint32_t ABCD[4]; | |
41 } AVMD5; | |
42 | |
43 const int av_md5_size= sizeof(AVMD5); | |
44 | |
45 static const uint8_t S[4][4] = { | |
633 | 46 { 7, 12, 17, 22 }, /* round 1 */ |
47 { 5, 9, 14, 20 }, /* round 2 */ | |
48 { 4, 11, 16, 23 }, /* round 3 */ | |
49 { 6, 10, 15, 21 } /* round 4 */ | |
45 | 50 }; |
51 | |
318 | 52 static const uint32_t T[64] = { // T[i]= fabs(sin(i+1)<<32) |
633 | 53 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, /* round 1 */ |
45 | 54 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, |
55 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, | |
56 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, | |
57 | |
633 | 58 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, /* round 2 */ |
45 | 59 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, |
60 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, | |
61 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, | |
62 | |
633 | 63 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, /* round 3 */ |
45 | 64 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, |
65 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, | |
66 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, | |
67 | |
633 | 68 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, /* round 4 */ |
45 | 69 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, |
70 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, | |
71 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391, | |
72 }; | |
73 | |
74 #define CORE(i, a, b, c, d) \ | |
75 t = S[i>>4][i&3];\ | |
76 a += T[i];\ | |
77 \ | |
319 | 78 if(i<32){\ |
79 if(i<16) a += (d ^ (b&(c^d))) + X[ i &15 ];\ | |
80 else a += (c ^ (d&(c^b))) + X[ (1+5*i)&15 ];\ | |
81 }else{\ | |
82 if(i<48) a += (b^c^d) + X[ (5+3*i)&15 ];\ | |
83 else a += (c^(b|~d)) + X[ ( 7*i)&15 ];\ | |
45 | 84 }\ |
85 a = b + (( a << t ) | ( a >> (32 - t) )); | |
86 | |
51 | 87 static void body(uint32_t ABCD[4], uint32_t X[16]){ |
53 | 88 |
49 | 89 int t; |
339
8829032777d5
rename attribute_unused to av_unused and moves its declaration to common.h
benoit
parents:
319
diff
changeset
|
90 int i av_unused; |
45 | 91 unsigned int a= ABCD[3]; |
92 unsigned int b= ABCD[2]; | |
93 unsigned int c= ABCD[1]; | |
94 unsigned int d= ABCD[0]; | |
95 | |
758 | 96 #if HAVE_BIGENDIAN |
45 | 97 for(i=0; i<16; i++) |
98 X[i]= bswap_32(X[i]); | |
99 #endif | |
100 | |
603 | 101 #if CONFIG_SMALL |
45 | 102 for( i = 0; i < 64; i++ ){ |
103 CORE(i,a,b,c,d) | |
104 t=d; d=c; c=b; b=a; a=t; | |
105 } | |
106 #else | |
107 #define CORE2(i) CORE(i,a,b,c,d) CORE((i+1),d,a,b,c) CORE((i+2),c,d,a,b) CORE((i+3),b,c,d,a) | |
108 #define CORE4(i) CORE2(i) CORE2((i+4)) CORE2((i+8)) CORE2((i+12)) | |
109 CORE4(0) CORE4(16) CORE4(32) CORE4(48) | |
110 #endif | |
111 | |
112 ABCD[0] += d; | |
113 ABCD[1] += c; | |
114 ABCD[2] += b; | |
115 ABCD[3] += a; | |
116 } | |
117 | |
118 void av_md5_init(AVMD5 *ctx){ | |
119 ctx->len = 0; | |
120 | |
121 ctx->ABCD[0] = 0x10325476; | |
122 ctx->ABCD[1] = 0x98badcfe; | |
123 ctx->ABCD[2] = 0xefcdab89; | |
124 ctx->ABCD[3] = 0x67452301; | |
125 } | |
126 | |
127 void av_md5_update(AVMD5 *ctx, const uint8_t *src, const int len){ | |
312
93d504c22609
get rid of b_used variable (same size with CONFIG_SMALL)
michael
parents:
128
diff
changeset
|
128 int i, j; |
45 | 129 |
312
93d504c22609
get rid of b_used variable (same size with CONFIG_SMALL)
michael
parents:
128
diff
changeset
|
130 j= ctx->len & 63; |
45 | 131 ctx->len += len; |
132 | |
133 for( i = 0; i < len; i++ ){ | |
312
93d504c22609
get rid of b_used variable (same size with CONFIG_SMALL)
michael
parents:
128
diff
changeset
|
134 ctx->block[j++] = src[i]; |
93d504c22609
get rid of b_used variable (same size with CONFIG_SMALL)
michael
parents:
128
diff
changeset
|
135 if( 64 == j ){ |
53 | 136 body(ctx->ABCD, (uint32_t*) ctx->block); |
312
93d504c22609
get rid of b_used variable (same size with CONFIG_SMALL)
michael
parents:
128
diff
changeset
|
137 j = 0; |
45 | 138 } |
139 } | |
140 } | |
141 | |
142 void av_md5_final(AVMD5 *ctx, uint8_t *dst){ | |
313
b4277e786617
borrow finalization algo from sha1 (100byte smaller)
michael
parents:
312
diff
changeset
|
143 int i; |
b4277e786617
borrow finalization algo from sha1 (100byte smaller)
michael
parents:
312
diff
changeset
|
144 uint64_t finalcount= le2me_64(ctx->len<<3); |
312
93d504c22609
get rid of b_used variable (same size with CONFIG_SMALL)
michael
parents:
128
diff
changeset
|
145 |
313
b4277e786617
borrow finalization algo from sha1 (100byte smaller)
michael
parents:
312
diff
changeset
|
146 av_md5_update(ctx, "\200", 1); |
571
1d948bd9850c
Fix generated md5, it was wrong for some input lengths.
michael
parents:
440
diff
changeset
|
147 while((ctx->len & 63)!=56) |
313
b4277e786617
borrow finalization algo from sha1 (100byte smaller)
michael
parents:
312
diff
changeset
|
148 av_md5_update(ctx, "", 1); |
45 | 149 |
440 | 150 av_md5_update(ctx, (uint8_t*)&finalcount, 8); |
45 | 151 |
152 for(i=0; i<4; i++) | |
153 ((uint32_t*)dst)[i]= le2me_32(ctx->ABCD[3-i]); | |
154 } | |
155 | |
156 void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len){ | |
157 AVMD5 ctx[1]; | |
158 | |
159 av_md5_init(ctx); | |
160 av_md5_update(ctx, src, len); | |
161 av_md5_final(ctx, dst); | |
162 } | |
163 | |
164 #ifdef TEST | |
165 #include <stdio.h> | |
314
8b21778cb357
#undef printf under #ifdef TEST (needed for testing)
michael
parents:
313
diff
changeset
|
166 #undef printf |
427
e7192ff1857d
Fix a couple of 'return type defaults to int' and 'control reaches end of
diego
parents:
404
diff
changeset
|
167 int main(void){ |
45 | 168 uint64_t md5val; |
169 int i; | |
170 uint8_t in[1000]; | |
171 | |
172 for(i=0; i<1000; i++) in[i]= i*i; | |
128
d94fb7e6cb53
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
116
diff
changeset
|
173 av_md5_sum( (uint8_t*)&md5val, in, 1000); printf("%"PRId64"\n", md5val); |
d94fb7e6cb53
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
116
diff
changeset
|
174 av_md5_sum( (uint8_t*)&md5val, in, 63); printf("%"PRId64"\n", md5val); |
d94fb7e6cb53
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
116
diff
changeset
|
175 av_md5_sum( (uint8_t*)&md5val, in, 64); printf("%"PRId64"\n", md5val); |
d94fb7e6cb53
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
116
diff
changeset
|
176 av_md5_sum( (uint8_t*)&md5val, in, 65); printf("%"PRId64"\n", md5val); |
45 | 177 for(i=0; i<1000; i++) in[i]= i % 127; |
128
d94fb7e6cb53
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
116
diff
changeset
|
178 av_md5_sum( (uint8_t*)&md5val, in, 999); printf("%"PRId64"\n", md5val); |
427
e7192ff1857d
Fix a couple of 'return type defaults to int' and 'control reaches end of
diego
parents:
404
diff
changeset
|
179 |
e7192ff1857d
Fix a couple of 'return type defaults to int' and 'control reaches end of
diego
parents:
404
diff
changeset
|
180 return 0; |
45 | 181 } |
182 #endif |