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, unsigned int len)
00034 {
00035 unsigned long s1 = adler & 0xffff;
00036 unsigned long s2 = adler >> 16;
00037
00038 while (len>0) {
00039 #if CONFIG_SMALL
00040 while(len>4 && s2 < (1U<<31)){
00041 DO4(buf); len-=4;
00042 #else
00043 while(len>16 && s2 < (1U<<31)){
00044 DO16(buf); len-=16;
00045 #endif
00046 }
00047 DO1(buf); len--;
00048 s1 %= BASE;
00049 s2 %= BASE;
00050 }
00051 return (s2 << 16) | s1;
00052 }
00053
00054 #ifdef TEST
00055 #include "log.h"
00056 #include "timer.h"
00057 #define LEN 7001
00058 volatile int checksum;
00059 int main(void){
00060 int i;
00061 char data[LEN];
00062 av_log_set_level(AV_LOG_DEBUG);
00063 for(i=0; i<LEN; i++)
00064 data[i]= ((i*i)>>3) + 123*i;
00065 for(i=0; i<1000; i++){
00066 START_TIMER
00067 checksum= av_adler32_update(1, data, LEN);
00068 STOP_TIMER("adler")
00069 }
00070 av_log(NULL, AV_LOG_DEBUG, "%X == 50E6E508\n", checksum);
00071 return 0;
00072 }
00073 #endif