/*
* @(#)RawPullBufferParser.java 1.6 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.media.parser;
import java.io.IOException;
import javax.media.*;
import javax.media.Buffer;
import javax.media.protocol.*;
import javax.media.format.*;
import com.sun.media.*;
public class RawPullBufferParser extends RawPullStreamParser {
static final String NAME = "Raw pull stream parser";
public String getName() {
return NAME;
}
public void setSource(DataSource source)
throws IOException, IncompatibleSourceException {
if (!(source instanceof PullBufferDataSource)) {
throw new IncompatibleSourceException("DataSource not supported: " + source);
} else {
streams = ((PullBufferDataSource) source).getStreams();
}
if ( streams == null) {
throw new IOException("Got a null stream from the DataSource");
}
if (streams.length == 0) {
throw new IOException("Got a empty stream array from the DataSource");
}
if (!supports(streams))
throw new IncompatibleSourceException("DataSource not supported: " + source);
this.source = source;
this.streams = streams;
// System.out.println("content length is " + streams[0].getContentLength());
}
/**
* Override this if the Parser has additional requirements
* from the PullBufferStream
*/
protected boolean supports(SourceStream[] streams) {
return ( (streams[0] != null) &&
(streams[0] instanceof PullBufferStream) );
}
/**
* Opens the plug-in software or hardware component and acquires
* necessary resources. If all the needed resources could not be
* acquired, it throws a ResourceUnavailableException. Data should not
* be passed into the plug-in without first calling this method.
*/
public void open() {
if (tracks != null)
return;
tracks = new Track[streams.length];
for (int i = 0; i < streams.length; i++) {
tracks[i] = new FrameTrack(this, (PullBufferStream)streams[i]);
}
}
////////////////////////
//
// Inner class
////////////////////////
class FrameTrack implements Track {
Demultiplexer parser;
PullBufferStream pbs;
boolean enabled = true;
Format format = null;
TrackListener listener;
Integer stateReq = new Integer(0);
public FrameTrack(Demultiplexer parser, PullBufferStream pbs) {
this.pbs = pbs;
format = pbs.getFormat();
}
public Format getFormat() {
return format;
}
public void setEnabled(boolean t) {
enabled = t;
}
public boolean isEnabled() {
return enabled;
}
public Time getDuration() {
return parser.getDuration();
}
public Time getStartTime() {
return new Time(0);
}
public void setTrackListener(TrackListener l) {
listener = l;
}
public void readFrame(Buffer buffer) {
// If the buffer is empty, just allocate some random number.
if (buffer.getData() == null)
buffer.setData(new byte[500]);
try {
pbs.read(buffer);
} catch (IOException e) {
buffer.setDiscard(true);
}
}
public int mapTimeToFrame(Time t) {
return -1;
}
public Time mapFrameToTime(int frameNumber) {
return new Time(0);
}
}
}
|