/* * @(#)Demultiplexer.java 1.12 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package javax.media; import java.io.IOException; import javax.media.format.*; import javax.media.protocol.ContentDescriptor; /** * A <code>Demultiplexer</code> is a media processing unit that * takes an interleaved media stream as input, extracts the individual tracks from the stream, * and outputs the resulting tracks. It has one input and multiple outputs. * <p> * A <code>Demultiplexer</code> is a <CODE>MediaHandler</CODE> and needs to * implement the <code>setSource</code> method. This method * should throw an <CODE>IncompatibleSourceException</CODE> if the * <code>Demultiplexer</code> cannot use the specified <code>DataSource</code>. * This typically happens if: * <ul> * <li>The <code>Demultiplexer</code> doesn't support the type of <CODE>DataSource</CODE> specified (push or * pull). <br> </li> * <li>The <code>Demultiplexer</code> requires a positionable <CODE>DataSource</CODE>.<br> </li> * <li>The <code>Demultiplexer</code> requires a seekable, random-access stream. * (For example, the QuickTime <CODE>Demultiplexer</CODE> has this requirement.)</li> * </ul> * The <code>setSource</code> method should throw an <CODE>IOException</CODE> if the specified * <code>DataSource</code> contains a null stream array. * <p> * Note: No data is read by the <code>setSource</code> method. * When trying to select a <CODE>Demultiplexer</CODE> for a particular content-type from a * list of <CODE>Demultiplexer</CODE> implementations obtained through the <CODE>PlugInManager</CODE>, * the <CODE>Processor</CODE> picks the first * <CODE>Demultiplexer</CODE> that doesn't for throw an * <CODE>IncompatibleSourceException</CODE> or an * <CODE>IOException</CODE> when <CODE>setSource</CODE> is called. * If a particular <code>Demultiplexer</code> reads some * data from the stream and then throws an <CODE>IncompatibleSourceException</CODE>, * the next <CODE>Demultiplexer</CODE> in the list gets the stream in a different state. * @since JMF 2.0 */ public interface Demultiplexer extends PlugIn, MediaHandler, Duration { /** * Lists the all of the input content descriptors that this <CODE>Demultiplexer</CODE> supports. */ public ContentDescriptor [] getSupportedInputContentDescriptors(); /** * Signals that data is going to start being read from the <CODE>Demultiplexer</CODE>. * The <CODE>start</CODE> method is called before any calls are made to <code>readFrame</code>. * * @exception IOException If there is an error when trying to read from the <code>DataSource</code>. */ public void start() throws IOException; /** * Signals that data is going to stop being read from the <CODE>Demultiplexer</CODE>. * After the <CODE>stop</CODE> method is called, <code>readFrame</code> will not be called again unless * <code>start</code> is called first. */ public void stop(); /** *<p> * Retrieves the individual tracks that the media stream contains. * A stream can contain multiple media tracks, such as separate tracks for * audio, video, and midi data. The information specific to a track * is abstracted by an instance of a class that implements the <code>Track</code> interface. * The <code>Track</code> interface also provides methods for enabling or disabling * a track. * <p> * When <CODE>getTracks</CODE> is called, the stream header is read and * parsed (if there is one), the track information is retrieved, * the maximum frame size for each track is computed, and * the play list is built (if applicable). * @return * An array of <code>Track</code> objects. The length of the array * is equal to the number of tracks in the stream. * @exception BadHeaderException If the header information * is incomplete or inconsistent. * @exception IOException If there is an error when trying to read from the <code>DataSource</code>. */ public Track[] getTracks() throws IOException, BadHeaderException; /** * Checks whether or not the stream can be repositioned * to the beginning. * @return <CODE>true</CODE> if the stream can be repositioned, <CODE>false</CODE> if it cannot. */ public boolean isPositionable(); /** * Checks whether or not the stream can be positioned at any <CODE>Time</CODE>. * If <CODE>isRandomAccess</CODE> returns <CODE>true</CODE>, then the stream is also positionable (<CODE>isPositionable</CODE> returns <CODE>true</CODE>). * However, a stream can be positionable but not random access--the <CODE>isPositionable</CODE> method might return <CODE>true</CODE> even * if <CODE>isRandomAccess</CODE> returns <CODE>false</CODE>. * @return <CODE>true</CODE> if the stream is a random access stream, <CODE>false</CODE> if it is not. */ public boolean isRandomAccess(); /** * Sets the stream position (media time) to the specified <CODE>Time</CODE>. * Returns the rounded position that was actually set. * Implementations should set the position to a key frame, if possible. * @param time The new stream position, specified as a <CODE>Time</CODE>. * @param round The rounding technique to be used: <CODE>RoundUp</CODE>, <CODE>RoundDown</CODE>, or <CODE>RoundNearest</CODE>. * @return The actual stream position that was set as a <CODE>Time</CODE> object. */ Time setPosition(Time where, int rounding); /** * Gets the current media time. This is the stream position that the next <CODE>readFrame</CODE> will read. * @return The current position in the media stream as a <CODE>Time</CODE> object. */ public Time getMediaTime(); /** * Gets the duration of this media stream * when played at the default rate. * <p> * Note that each track can have a different duration and a * different start time. This method returns * the total duration from when the first track starts and the last track ends. * @return A <CODE>Time</CODE> object that represents the duration * or <CODE>DURATION_UNKNOWN</CODE> if the duration cannot be determined. * */ public Time getDuration(); }