Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
1.6 KiB

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (C) 1996-1997 Microsoft Corporation. All Rights Reserved.
  4. //
  5. // MODULE: mpegcrc.c
  6. //
  7. // PURPOSE: calculate a standard MPEG 13818-1 style MSB CRC 32.
  8. //
  9. // FUNCTIONS:
  10. //
  11. // COMMENTS: Routine replaced with known good algorithm 4/9/1999 =tkb
  12. //
  13. ///////////////////////////////////////////////////////////////////////////////
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. #include <winsock2.h>
  17. #include <windows.h>
  18. ///////////////////////////////////////////////////////////////////////////////
  19. //
  20. //
  21. // Build crc table the first time
  22. //
  23. //
  24. #define MPEGCRC_POLY 0x04c11db7 // MPEG polynomial
  25. ULONG crc32_table[256];
  26. ///////////////////////////////////////////////////////////////////////////////
  27. void
  28. init_mpegcrc (
  29. )
  30. ///////////////////////////////////////////////////////////////////////////////
  31. {
  32. int i, j;
  33. ULONG c;
  34. for (i = 0; i < 256; ++i) {
  35. for (c = i << 24, j = 8; j > 0; --j)
  36. c = c & 0x80000000 ? (c << 1) ^ MPEGCRC_POLY : (c << 1);
  37. crc32_table[i] = c;
  38. }
  39. }
  40. ///////////////////////////////////////////////////////////////////////////////
  41. void
  42. MpegCrcUpdate (
  43. ULONG * crc,
  44. UINT len,
  45. UCHAR * buf
  46. )
  47. ///////////////////////////////////////////////////////////////////////////////
  48. {
  49. UCHAR *p;
  50. if (!crc32_table[1]) /* if not already done, */
  51. init_mpegcrc(); /* build table */
  52. for (p = buf; len > 0; ++p, --len)
  53. *crc = (*crc << 8) ^ crc32_table[(*crc >> 24) ^ *p];
  54. }