/* * Java port of ffmpeg VOB demultiplexer. * Contains some liba52 and Xine code (GPL) * Copyright (c) 2003 Jonathan Hueber. * * Copyright (c) 2000, 2001, 2002 Fabrice Bellard. * * vobdemux 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. * * vobdemux 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.jffmpeg.demux.vob; import java.io.*; import javax.media.Track; import javax.media.Time; import javax.media.Format; import javax.media.Buffer; import javax.media.TrackListener; import javax.media.format.AudioFormat; import java.io.IOException; import java.io.InputStream; import net.sourceforge.jffmpeg.GPLLicense; /** * This class handles audio data read from a VOB file */ public class AudioTrack extends DataBuffer implements Track, GPLLicense { VobDemux demux; int streamNumber; boolean enabled = true; /** Creates a new instance of AudioTrack */ public AudioTrack( VobDemux demux, int streamNumber ) { this.demux = demux; this.streamNumber = streamNumber; } public Time getDuration() { System.out.println( "Get Duration" ); return new Time( 500 ); } /** * Return Audio format of ac3 */ public Format getFormat() { return new AudioFormat("ac3", 48000, 16, 2, 0, 1); // endian, int signed } public boolean isEnabled() { return enabled; } public Time mapFrameToTime(int param) { System.out.println( "Map Frame To Time" ); return new Time( param ); } public int mapTimeToFrame(javax.media.Time time) { System.out.println( "Map Time to Frame" ); return 0; } public static final int[] halfRate = {0,0,0,0,0,0,0,0,0,1,2,3}; public static final int[] rate = { 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640}; private int offset = 0; private int sample_rate; private int frame_length; private long time = 0; // Using microseconds /** * Return a buffer containing audio data */ public void readFrame(Buffer buffer) { try { demux.readAudio( streamNumber, buffer ); if ( !enabled ) buffer.setLength(0); if ( timeStamp != 0 ) demux.setAudioTimeStamp( timeStamp ); timeStamp = 0; byte[] data = (byte[])buffer.getData(); int length = buffer.getLength(); /* byte[] data = (byte[])buffer.getData(); int length = buffer.getLength(); while ( offset < length - 6 ) { if ( !parseHeader( data, offset ) ) { // System.out.println( "NOT sync block" ); offset++; continue; } offset += frame_length; } offset -= length; if ( offset < 0 ) offset = 0; // System.out.println( sample_rate); */ } catch (IOException e) { } } // private boolean parseHeader( byte[] data, int offset ) { // /** // * Sync header // */ // if ( data[ offset ] == 0x0b && data[ offset + 1 ] == 0x77 ) { // int frmsizecod = data[ offset + 4 ] & 63; // // int halfRateIndex = (data[ offset + 5 ] >> 3) &0xff; // if ( halfRateIndex >= halfRate.length ) return false; // int half = halfRate[ halfRateIndex ]; // // if ( frmsizecod >= 38 ) return false; // int bit_rate = (rate[ frmsizecod >> 1 ] * 1000) >> half; // // switch ( data[ offset + 4 ] & 0xc0 ) { // case 0x00: { // sample_rate = 48000 >> half; // frame_length = 4 * rate[ frmsizecod >> 1 ]; // break; // } // case 0x40: { // sample_rate = 44100 >> half; // frame_length = 2 * ( 320 * rate[ frmsizecod >> 1 ] / 147 + (frmsizecod & 1) ); // break; // } // case 0x80: { // sample_rate = 32000 >> half; // frame_length = 6 * rate[ frmsizecod >> 1 ]; // break; // } // default: { // return false; // } // } // } else { // return false; // } // return true; // } public void setEnabled(boolean enabled) { this.enabled = enabled; } public Time getStartTime() { System.out.println( "Get Start time" ); return new Time( 2000 ); } public void setTrackListener(TrackListener trackListener) { } private volatile long timeStamp; /** * Data received from vob file */ public void readData( long timeStamp, InputStream in, int length ) throws IOException { super.readData( timeStamp, in, length ); if ( this.timeStamp == 0 ) this.timeStamp = timeStamp; } }