/******************************************************************************
* *
* Copyright (c) 1999-2003 Wimba S.A., All Rights Reserved. *
* *
* COPYRIGHT: *
* This software is the property of Wimba S.A. *
* This software is redistributed under the Xiph.org variant of *
* the BSD license. *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions *
* are met: *
* - Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. *
* - Redistributions in binary form must reproduce the above copyright *
* notice, this list of conditions and the following disclaimer in the *
* documentation and/or other materials provided with the distribution. *
* - Neither the name of Wimba, the Xiph.org Foundation nor the names of *
* its contributors may be used to endorse or promote products derived *
* from this software without specific prior written permission. *
* *
* WARRANTIES: *
* This software is made available by the authors in the hope *
* that it will be useful, but without any warranty. *
* Wimba S.A. is not liable for any consequence related to the *
* use of the provided software. *
* *
* Class: OggCrc.java *
* *
* Author: Marc GIMPEL *
* Based on code by: Ross WILLIAMS *
* *
* Date: 20th April 2003 *
* *
******************************************************************************/
/* $Id: OggCrc.java,v 1.2 2004/10/21 16:21:57 mgimpel Exp $ */
/********************************************************************
* *
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
* *
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
* by the Xiph.Org Foundation http://www.xiph.org/ *
* *
********************************************************************
function: code raw [Vorbis] packets into framed OggSquish stream and
decode Ogg streams back into raw packets
last mod: $Id: OggCrc.java,v 1.2 2004/10/21 16:21:57 mgimpel Exp $
note: The CRC code is directly derived from public domain code by
Ross Williams (ross@guest.adelaide.edu.au). See docs/framing.html
for details.
********************************************************************/
package org.xiph.speex;
/**
* Calculates the CRC checksum for Ogg packets.
*
* <p>Ogg uses the same generator polynomial as ethernet, although with an
* unreflected alg and an init/final of 0, not 0xffffffff.
*
* @author Jim Lawrence, helloNetwork.com
* @author Marc Gimpel, Wimba S.A. (mgimpel@horizonwimba.com)
* @version $Revision: 1.2 $
*/
public class OggCrc
{
// TODO - implement java.util.zip.Checksum
/**
* CRC checksum lookup table
*/
private static int[] crc_lookup;
static {
crc_lookup = new int[256];
for (int i=0; i<crc_lookup.length; i++) {
int r=i<<24;
for (int j=0; j<8; j++) {
if ((r& 0x80000000)!=0) {
/* The same as the ethernet generator polynomial, although we use an
unreflected alg and an init/final of 0, not 0xffffffff */
r=(r << 1)^0x04c11db7;
}
else {
r<<=1;
}
}
crc_lookup[i]=(r&0xffffffff);
}
}
/**
* Calculates the checksum on the given data, from the give offset and
* for the given length, using the given initial value.
* This allows on to calculate the checksum iteratively, by reinjecting the
* last returned value as the initial value when the function is called for
* the next data chunk.
* The initial value should be 0 for the first iteration.
* @param crc - the initial value
* @param data - the data
* @param offset - the offset at which to start calculating the checksum.
* @param length - the length of data over which to calculate the checksum.
* @return the checksum.
*/
public static int checksum(int crc,
final byte[] data,
int offset,
final int length)
{
int end=offset+length;
for (;offset<end;offset++){
crc=(crc<<8)^crc_lookup[((crc>>>24)&0xff)^(data[offset]&0xff)];
}
return crc;
}
}