windows-nt/Source/XPSP1/NT/drivers/wdm/bda/slip/mpegcrc.c
2020-09-26 16:20:57 +08:00

64 lines
1.6 KiB
C

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 1996-1997 Microsoft Corporation. All Rights Reserved.
//
// MODULE: mpegcrc.c
//
// PURPOSE: calculate a standard MPEG 13818-1 style MSB CRC 32.
//
// FUNCTIONS:
//
// COMMENTS: Routine replaced with known good algorithm 4/9/1999 =tkb
//
///////////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
///////////////////////////////////////////////////////////////////////////////
//
//
// Build crc table the first time
//
//
#define MPEGCRC_POLY 0x04c11db7 // MPEG polynomial
ULONG crc32_table[256];
///////////////////////////////////////////////////////////////////////////////
void
init_mpegcrc (
)
///////////////////////////////////////////////////////////////////////////////
{
int i, j;
ULONG c;
for (i = 0; i < 256; ++i) {
for (c = i << 24, j = 8; j > 0; --j)
c = c & 0x80000000 ? (c << 1) ^ MPEGCRC_POLY : (c << 1);
crc32_table[i] = c;
}
}
///////////////////////////////////////////////////////////////////////////////
void
MpegCrcUpdate (
ULONG * crc,
UINT len,
UCHAR * buf
)
///////////////////////////////////////////////////////////////////////////////
{
UCHAR *p;
if (!crc32_table[1]) /* if not already done, */
init_mpegcrc(); /* build table */
for (p = buf; len > 0; ++p, --len)
*crc = (*crc << 8) ^ crc32_table[(*crc >> 24) ^ *p];
}