/*
* @(#)AudioFormatLPCM.java - parse Audioheaders, lpcm
*
* Copyright (c) 2003-2008 by dvb.matt, All Rights Reserved.
*
* This file is part of ProjectX, a free Java based demux utility.
* By the authors, ProjectX is intended for educational purposes only,
* as a non-commercial test project.
*
* The part of audio parsing was derived from the MPEG/Audio
* Software Simulation Group's audio codec and ATSC A/52 in a special modified manner.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package net.sourceforge.dvb.projectx.audio;
import net.sourceforge.dvb.projectx.audio.AudioFormat;
public class AudioFormatLPCM extends AudioFormat {
public AudioFormatLPCM()
{
super();
}
private int lpcm_frequency_index[] = { 48000, 96000 };
private int lpcm_bps_index[] = { 16, 20, 24, -1 };
/**
*
*/
public int parseHeader(byte[] frame_header, int pos)
{
setINTEL(true); // force intel/wav output
setID(0xFF & frame_header[pos]); // no of frameheaders
setPaddingBit((0xFF & frame_header[pos + 1])<<8 | (0xFF & frame_header[pos + 2])); // first_access_unit_pointer
setLayer(0xFF & frame_header[pos + 3]); // audio_frame_number
setProtectionBit(0^1);
setPrivateBit(0);
setCopyright(0);
setOriginal(0);
setSizeBase(0);
setSize(lpcm_bps_index[(3 & frame_header[pos + 4]>>>6)]); //bits per sample
setSamplingFrequency(lpcm_frequency_index[(1 & frame_header[pos + 4]>>>4)]); // samplerate
setChannel(1 + (7 & frame_header[pos + 4])); // channels
setEmphasis(0xFF & frame_header[pos + 5]); // dynamic_range
setMode((getChannel() * getSize()) / 8); // block_align, bytes per sample
setBitrate(getChannel() * getSamplingFrequency() * getSize()); // bitrate per second
if (getSize() < 1)
return -1;
setFrameTimeLength(90000.0 / getSamplingFrequency()); // 1 frame = 150 * timelength
return 0;
}
/**
*
*/
public int parseNextHeader(byte[] frame_header, int pos)
{
setINTEL(true); // force intel/wav output
setNextID(0xFF & frame_header[pos]); // no of frameheaders
setNextPaddingBit((0xFF & frame_header[pos + 1])<<8 | (0xFF & frame_header[pos + 2])); // first_access_unit_pointer
setNextLayer(0xFF & frame_header[pos + 3]); // audio_frame_number
setNextProtectionBit(0^1);
setNextPrivateBit(0);
setNextCopyright(0);
setNextOriginal(0);
setNextSizeBase(0);
setNextSize(lpcm_bps_index[(3 & frame_header[pos + 4]>>>6)]); //bits per sample
setNextSamplingFrequency(lpcm_frequency_index[(1 & frame_header[pos + 4]>>>4)]); // samplerate
setNextChannel(1 + (7 & frame_header[pos + 4])); // channels
setNextEmphasis(0xFF & frame_header[pos + 5]); // dynamic_range
setNextMode((getNextChannel() * getNextSize()) / 8); // block_align, bytes per sample
setNextBitrate(getNextChannel() * getNextSamplingFrequency() * getNextSize()); // bitrate per second
if (getNextSize() < 1)
return -1;
setNextFrameTimeLength(90000.0 / getNextSamplingFrequency()); // 1 frame = 150 * timelength
return 0;
}
/**
*
*/
public String displayHeader()
{
return ("LPCM, DR-" + getLastEmphasis() + ", " + getLastChannel() + "-ch, " + getLastSamplingFrequency() + "Hz, " + getLastSize() + "bit, " + (getLastBitrate() / 1000.0) + "kbps");
}
/**
*
*/
public int compareHeader()
{
if (getLastChannel() != getChannel())
return 1;
else if (getLastSamplingFrequency() != getSamplingFrequency())
return 2;
else if (getLastSize() != getSize())
return 3;
else if (getLastEmphasis() != getEmphasis())
return 4;
else
return 0;
}
}