/*
* @(#)AudioFormatDTS.java - parse Audioheaders, dts
*
* 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 AudioFormatDTS extends AudioFormat {
public AudioFormatDTS()
{
super();
}
/* DTS stuff taken from the VideoLAN project. */
/* Added by R One, 2003/12/18. */
private int[] dts_frequency_index = {
0, 8000, 16000, 32000, 64000, 128000,
11025, 22050, 44100, 88200, 176400,
12000, 24000, 48000, 96000, 192000
};
/**
*
*/
private int[] dts_bitrate_index = {
32000, 56000, 64000, 96000, 112000, 128000,
192000, 224000, 256000, 320000, 384000,
448000, 512000, 576000, 640000, 768000,
896000, 1024000, 1152000, 1280000, 1344000,
1408000, 1411200, 1472000, 1536000, 1920000,
2048000, 3072000, 3840000, 4096000, 0, 0
};
/**
*
*/
private String[] dts_acmod = {
"1", "DM", "2/0", "2/0", "2/0", "3/0", "2.1/0", "3.1/0",
"2/2", "3/2", "2/2/2", "2/2/2", "3/2/2", "3.1/2/2", "","",
"","","","","","","","","","","","","","","","",
"","","","","","","","","","","","","","","","",
"","","","","","","","","","","","","","","",""
};
/**
*
*/
private int[] dts_channels = {
1,2,2,2, 2,3,3,4, 4,5,6,6, 7,8,0,0,
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
};
/**
* parse dts Header
*/
public int parseHeader(byte[] frame, int pos)
{
if (frame[pos] != 0x7F || frame[pos + 1] != (byte)0xFE || frame[pos + 2] != (byte)0x80 || frame[pos + 3] != 1 )
return -1;
setID(0);
setEmphasis(0);
setProtectionBit(0 ^ 1);
setSamplingFrequency(dts_frequency_index[0xF & (frame[pos + 8]>>>2)]);
if (getSamplingFrequency() < 1)
return -4;
setBitrate(dts_bitrate_index[((3 & frame[pos + 8])<<3) | (7 & (frame[pos + 9]>>>5))]);
if (getBitrate() < 1)
return -3;
setLayer(0);
setPaddingBit(0);
setPrivateBit(0);
setMode(((0xF & frame[pos + 7])<<2) | ((0xC0 & frame[pos + 8])>>>6));
setModeExtension(0);
setChannel(dts_channels[getMode()]);
setCopyright(0);
setOriginal(0);
setSize(((1 & frame[pos + 4])<<6) | ((0xFC & frame[pos + 5])>>>2));
setSize((getSize() + 1)<<5);
setFrameTimeLength(90000.0 * getSize() / getSamplingFrequency());
setSize(((3 & frame[pos + 5])<<12) | ((0xFF & frame[pos + 6])<<4) | ((0xF0 & frame[pos + 7])>>>4));
setSize(getSize() + 1);
setSizeBase(getSize());
return 1;
}
/**
* parse dts Header
*/
public int parseNextHeader(byte[] frame, int pos)
{
if (frame[pos] != 0x7F || frame[pos + 1] != (byte)0xFE || frame[pos + 2] != (byte)0x80 || frame[pos + 3] != 1 )
return -1;
setNextID(0);
setNextEmphasis(0);
setNextProtectionBit(0 ^ 1);
setNextSamplingFrequency(dts_frequency_index[0xF & (frame[pos + 8]>>>2)]);
if (getNextSamplingFrequency() < 1)
return -4;
setNextBitrate(dts_bitrate_index[((3 & frame[pos + 8])<<3) | (7 & (frame[pos + 9]>>>5))]);
if (getNextBitrate() < 1)
return -3;
setNextLayer(0);
setNextPaddingBit(0);
setNextPrivateBit(0);
setNextMode(((0xF & frame[pos + 7])<<2) | ((0xC0 & frame[pos + 8])>>>6));
setNextModeExtension(0);
setNextChannel(dts_channels[getNextMode()]);
setNextCopyright(0);
setNextOriginal(0);
setNextSize(((1 & frame[pos + 4])<<6) | ((0xFC & frame[pos + 5])>>>2));
setNextSize((getNextSize() + 1)<<5);
setNextFrameTimeLength(90000.0 * getNextSize() / getNextSamplingFrequency());
setNextSize(((3 & frame[pos + 5])<<12) | ((0xFF & frame[pos + 6])<<4) | ((0xF0 & frame[pos + 7])>>>4));
setNextSize(getNextSize() + 1);
setNextSizeBase(getNextSize());
return 1;
}
/**
* verify current & last dts header
*/
public int compareHeader()
{
if (getLastID() != getID())
return 0x1;
else if (getLastLayer() != getLayer())
return 0x2;
else if (getLastSamplingFrequency() != getSamplingFrequency())
return 0x4;
else if (getLastBitrate() != getBitrate())
return 0x8;
else if (getLastMode() != getMode())
return 0x10;
else if (getLastModeExtension() != getModeExtension())
return 0x20;
else if (getLastSize() != getSize())
return 0x40;
else
return 0;
}
/**
* display last dts header
*/
public String displayHeader()
{
return ("DTS, " + dts_acmod[getLastMode()] + "(" + dts_channels[getLastMode()] + "), " + getLastSamplingFrequency() + "Hz, " + (getLastBitrate() / 1000.0) + "kbps, " + getLastSize() + "BpF");
}
//ROne18122003
}