• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2012 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "webrtc/base/crc32.h"
12 
13 #include "webrtc/base/basicdefs.h"
14 
15 namespace rtc {
16 
17 // This implementation is based on the sample implementation in RFC 1952.
18 
19 // CRC32 polynomial, in reversed form.
20 // See RFC 1952, or http://en.wikipedia.org/wiki/Cyclic_redundancy_check
21 static const uint32 kCrc32Polynomial = 0xEDB88320;
22 static uint32 kCrc32Table[256] = { 0 };
23 
EnsureCrc32TableInited()24 static void EnsureCrc32TableInited() {
25   if (kCrc32Table[ARRAY_SIZE(kCrc32Table) - 1])
26     return;  // already inited
27   for (uint32 i = 0; i < ARRAY_SIZE(kCrc32Table); ++i) {
28     uint32 c = i;
29     for (size_t j = 0; j < 8; ++j) {
30       if (c & 1) {
31         c = kCrc32Polynomial ^ (c >> 1);
32       } else {
33         c >>= 1;
34       }
35     }
36     kCrc32Table[i] = c;
37   }
38 }
39 
UpdateCrc32(uint32 start,const void * buf,size_t len)40 uint32 UpdateCrc32(uint32 start, const void* buf, size_t len) {
41   EnsureCrc32TableInited();
42 
43   uint32 c = start ^ 0xFFFFFFFF;
44   const uint8* u = static_cast<const uint8*>(buf);
45   for (size_t i = 0; i < len; ++i) {
46     c = kCrc32Table[(c ^ u[i]) & 0xFF] ^ (c >> 8);
47   }
48   return c ^ 0xFFFFFFFF;
49 }
50 
51 }  // namespace rtc
52 
53