00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "config.h"
00025 #include "adler32.h"
00026
00027 #define BASE 65521L
00028
00029 #define DO1(buf) { s1 += *buf++; s2 += s1; }
00030 #define DO4(buf) DO1(buf); DO1(buf); DO1(buf); DO1(buf);
00031 #define DO16(buf) DO4(buf); DO4(buf); DO4(buf); DO4(buf);
00032
00033 unsigned long av_adler32_update(unsigned long adler, const uint8_t * buf,
00034 unsigned int len)
00035 {
00036 unsigned long s1 = adler & 0xffff;
00037 unsigned long s2 = adler >> 16;
00038
00039 while (len > 0) {
00040 #if CONFIG_SMALL
00041 while (len > 4 && s2 < (1U << 31)) {
00042 DO4(buf);
00043 len -= 4;
00044 }
00045 #else
00046 while (len > 16 && s2 < (1U << 31)) {
00047 DO16(buf);
00048 len -= 16;
00049 }
00050 #endif
00051 DO1(buf); len--;
00052 s1 %= BASE;
00053 s2 %= BASE;
00054 }
00055 return (s2 << 16) | s1;
00056 }
00057
00058 #ifdef TEST
00059
00060 #include <string.h>
00061 #include "log.h"
00062 #include "timer.h"
00063 #define LEN 7001
00064
00065 static volatile int checksum;
00066
00067 int main(int argc, char **argv)
00068 {
00069 int i;
00070 char data[LEN];
00071
00072 av_log_set_level(AV_LOG_DEBUG);
00073
00074 for (i = 0; i < LEN; i++)
00075 data[i] = ((i * i) >> 3) + 123 * i;
00076
00077 if (argc > 1 && !strcmp(argv[1], "-t")) {
00078 for (i = 0; i < 1000; i++) {
00079 START_TIMER;
00080 checksum = av_adler32_update(1, data, LEN);
00081 STOP_TIMER("adler");
00082 }
00083 } else {
00084 checksum = av_adler32_update(1, data, LEN);
00085 }
00086
00087 av_log(NULL, AV_LOG_DEBUG, "%X (expected 50E6E508)\n", checksum);
00088 return checksum == 0x50e6e508 ? 0 : 1;
00089 }
00090
00091 #endif