content: /******************************************************************************
   *                                                                            *
   * 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.1 2011/12/27 04:39:13 gauss 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.1 2011/12/27 04:39:13 gauss 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 com.mogujie.tt.audio;
  
  /**
   * 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.1 $
   */
  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;
      }
  }
  