Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavutil
adler32.c
Go to the documentation of this file.
1
/*
2
* Compute the Adler-32 checksum of a data stream.
3
* This is a modified version based on adler32.c from the zlib library.
4
*
5
* Copyright (C) 1995 Mark Adler
6
*
7
* This software is provided 'as-is', without any express or implied
8
* warranty. In no event will the authors be held liable for any damages
9
* arising from the use of this software.
10
*
11
* Permission is granted to anyone to use this software for any purpose,
12
* including commercial applications, and to alter it and redistribute it
13
* freely, subject to the following restrictions:
14
*
15
* 1. The origin of this software must not be misrepresented; you must not
16
* claim that you wrote the original software. If you use this software
17
* in a product, an acknowledgment in the product documentation would be
18
* appreciated but is not required.
19
* 2. Altered source versions must be plainly marked as such, and must not be
20
* misrepresented as being the original software.
21
* 3. This notice may not be removed or altered from any source distribution.
22
*/
23
24
#include "
config.h
"
25
#include "
adler32.h
"
26
27
#define BASE 65521L
/* largest prime smaller than 65536 */
28
29
#define DO1(buf) { s1 += *buf++; s2 += s1; }
30
#define DO4(buf) DO1(buf); DO1(buf); DO1(buf); DO1(buf);
31
#define DO16(buf) DO4(buf); DO4(buf); DO4(buf); DO4(buf);
32
33
unsigned
long
av_adler32_update
(
unsigned
long
adler,
const
uint8_t * buf,
34
unsigned
int
len
)
35
{
36
unsigned
long
s1
= adler & 0xffff;
37
unsigned
long
s2
= adler >> 16;
38
39
while
(len > 0) {
40
#if CONFIG_SMALL
41
while
(len > 4 && s2 < (1
U
<< 31)) {
42
DO4
(buf);
43
len -= 4;
44
}
45
#else
46
while
(len > 16 && s2 < (1
U
<< 31)) {
47
DO16
(buf);
48
len -= 16;
49
}
50
#endif
51
DO1
(buf); len--;
52
s1 %=
BASE
;
53
s2 %=
BASE
;
54
}
55
return
(s2 << 16) |
s1
;
56
}
57
58
#ifdef TEST
59
#include <string.h>
60
#include "
log.h
"
61
#include "timer.h"
62
#define LEN 7001
63
64
static
volatile
int
checksum;
65
66
int
main
(
int
argc,
char
**argv)
67
{
68
int
i;
69
char
data
[LEN];
70
71
av_log_set_level
(
AV_LOG_DEBUG
);
72
73
for
(i = 0; i < LEN; i++)
74
data[i] = ((i * i) >> 3) + 123 * i;
75
76
if
(argc > 1 && !strcmp(argv[1],
"-t"
)) {
77
for
(i = 0; i < 1000; i++) {
78
START_TIMER
;
79
checksum =
av_adler32_update
(1, data, LEN);
80
STOP_TIMER
(
"adler"
);
81
}
82
}
else
{
83
checksum =
av_adler32_update
(1, data, LEN);
84
}
85
86
av_log
(
NULL
,
AV_LOG_DEBUG
,
"%X (expected 50E6E508)\n"
, checksum);
87
return
checksum == 0x50e6e508 ? 0 : 1;
88
}
89
#endif