Go to the documentation of this file.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 #include <string.h>
00060 #include "log.h"
00061 #include "timer.h"
00062 #define LEN 7001
00063
00064 static volatile int checksum;
00065
00066 int main(int argc, char **argv)
00067 {
00068 int i;
00069 char data[LEN];
00070
00071 av_log_set_level(AV_LOG_DEBUG);
00072
00073 for (i = 0; i < LEN; i++)
00074 data[i] = ((i * i) >> 3) + 123 * i;
00075
00076 if (argc > 1 && !strcmp(argv[1], "-t")) {
00077 for (i = 0; i < 1000; i++) {
00078 START_TIMER;
00079 checksum = av_adler32_update(1, data, LEN);
00080 STOP_TIMER("adler");
00081 }
00082 } else {
00083 checksum = av_adler32_update(1, data, LEN);
00084 }
00085
00086 av_log(NULL, AV_LOG_DEBUG, "%X (expected 50E6E508)\n", checksum);
00087 return checksum == 0x50e6e508 ? 0 : 1;
00088 }
00089 #endif