/*
* Java port of ffmpeg MPEG demultiplexer.
* Copyright (c) 2003 Jonathan Hueber.
*
* Copyright (c) 2000, 2001 Fabrice Bellard.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* See Credits file and Readme for details
* 1a39e335700bec46ae31a38e2156a898
*/
package net.sourceforge.jffmpeg.demux.mpg;
import javax.media.Demultiplexer;
import javax.media.protocol.Positionable;
import javax.media.protocol.Seekable;
import javax.media.Time;
import javax.media.protocol.ContentDescriptor;
import javax.media.protocol.FileTypeDescriptor;
import javax.media.Track;
import javax.media.protocol.DataSource;
import javax.media.protocol.PullDataSource;
import javax.media.protocol.PullSourceStream;
import javax.media.MediaLocator;
import javax.media.BadHeaderException;
import javax.media.Buffer;
import javax.media.Format;
import javax.media.format.AudioFormat;
import javax.media.format.VideoFormat;
import javax.media.TrackListener;
import java.io.IOException;
import java.util.HashMap;
import java.util.Enumeration;
import java.awt.Dimension;
/**
* Mpeg Track implementation. Reads an MPEG stream
*/
public class MpegTrack implements Track {
/**
* Demultiplexer
*/
protected MpegDemux demux;
/**
* Track identification
*/
protected int trackId;
protected int streamId;
protected Format format;
/**
* Position in demultiplexer
*/
protected long pos;
/**
* Constructor - pass Track Identifier
*/
public MpegTrack( MpegDemux demux, int trackId ) {
this.demux = demux;
this.trackId = trackId;
pos = 0;
}
public Time getDuration() {
return new Time(0);
}
/**
* Return Audio format
*/
public Format getFormat() {
return format;
}
public void setEnabled( boolean enabled ) {
}
public boolean isEnabled() {
return true;
}
public Time mapFrameToTime( int frame ) {
return new Time( 0 );
}
public int mapTimeToFrame(javax.media.Time time) {
return 0;
}
public Time getStartTime() {
return new Time( 0 );
}
public void setTrackListener(TrackListener trackListener) {
}
/**
* Return a buffer containing audio data
*/
public void readFrame(Buffer buffer) {
try {
/**
* Initialise buffer
*/
buffer.setLength(0);
buffer.setOffset( 0 );
buffer.setFlags( Buffer.FLAG_NO_WAIT );
/**
* Loop until we have the correct packet
*/
boolean gotPacket = false;
while (!gotPacket) {
/**
* Look at the next packet
*/
int startcode = demux.peekPacket( pos );
/* Is this a DTS packet? */
if ( ((startcode >= 0x1c0 && startcode <= 0x1df) ||
(startcode >= 0x1e0 && startcode <= 0x1ef) ||
(startcode == 0x1bd))) {
/**
* Is this the right kind of DTS/PTS packet?
*/
if ( startcode != trackId ) {
pos = demux.skipDTSPacket( pos );
continue;
}
/** Read the DTS/PTS packet */
pos = demux.readDTSPacket( buffer, streamId, pos );
gotPacket = true;
break;
}
/**
* Skip packet
*/
pos = demux.skipPacket( pos );
}
} catch( Exception e ) {
e.printStackTrace();
}
}
}