00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "common.h"
00024 #include "adler32.h"
00025
00026 #define BASE 65521L
00027
00028 #define DO1(buf) {s1 += *buf++; s2 += s1;}
00029 #define DO4(buf) DO1(buf); DO1(buf); DO1(buf); DO1(buf);
00030 #define DO16(buf) DO4(buf); DO4(buf); DO4(buf); DO4(buf);
00031
00032 unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf, unsigned int len)
00033 {
00034 unsigned long s1 = adler & 0xffff;
00035 unsigned long s2 = adler >> 16;
00036
00037 while (len>0) {
00038 #ifdef CONFIG_SMALL
00039 while(len>4 && s2 < (1U<<31)){
00040 DO4(buf); len-=4;
00041 #else
00042 while(len>16 && s2 < (1U<<31)){
00043 DO16(buf); len-=16;
00044 #endif
00045 }
00046 DO1(buf); len--;
00047 s1 %= BASE;
00048 s2 %= BASE;
00049 }
00050 return (s2 << 16) | s1;
00051 }
00052
00053 #ifdef TEST
00054 #include "log.h"
00055 #define LEN 7001
00056 volatile int checksum;
00057 int main(void){
00058 int i;
00059 char data[LEN];
00060 av_log_level = AV_LOG_DEBUG;
00061 for(i=0; i<LEN; i++)
00062 data[i]= ((i*i)>>3) + 123*i;
00063 for(i=0; i<1000; i++){
00064 START_TIMER
00065 checksum= av_adler32_update(1, data, LEN);
00066 STOP_TIMER("adler")
00067 }
00068 av_log(NULL, AV_LOG_DEBUG, "%X == 50E6E508\n", checksum);
00069 return 0;
00070 }
00071 #endif