/* * 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/ */ package org.xiph.libogg; public class ogg_page { public byte[] header; // unsigned char public int header_len; // long public byte[] body; // unsigned char public int body_len; // long // static ogg_uint32_t crc_lookup[256]={ private static int[] crc_lookup = new int[256]; static { for (int i = 0; i < crc_lookup.length; i++) { crc_lookup[i] = crc_entry(i); } } private static int crc_entry(int index) { int r = index << 24; for (int i = 0; i < 8; i++) { if ((r & 0x80000000) != 0) { r = (r << 1) ^ 0x04c11db7; /* The same as the ethernet generator * polynomial, although we use an * unreflected alg and an init/final * of 0, not 0xffffffff */ } else { r <<= 1; } } return (r & 0xffffffff); } public ogg_page() { } public int ogg_page_eos() { return ((int) (header[5] & 0x04)); } public void ogg_page_checksum_set() { // ogg_uint32_t crc_reg=0; int crc_reg = 0; int i; // safety; needed for API behavior, but not framing code header[22] = 0; header[23] = 0; header[24] = 0; header[25] = 0; for (i = 0; i < header_len; i++) { crc_reg = (crc_reg << 8) ^ crc_lookup[((crc_reg >>> 24) & 0xff) ^ (header[i] & 0xff)]; } for (i = 0; i < body_len; i++) { crc_reg = (crc_reg << 8) ^ crc_lookup[((crc_reg >>> 24) & 0xff) ^ (body[i] & 0xff)]; } header[22] = (byte) crc_reg /*&0xff*/; header[23] = (byte) (crc_reg >>> 8) /*&0xff*/; header[24] = (byte) (crc_reg >>> 16) /*&0xff*/; header[25] = (byte) (crc_reg >>> 24) /*&0xff*/; } }