/* * @(#)Track.java 1.14 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package javax.media; import javax.media.Format; /** * A <CODE>Track</CODE> abstracts the information specific to an individual * track in a media stream. * A media stream might contain multiple media tracks, such as separate tracks for * audio, video, and midi data. A <CODE>Track</CODE> is the output of a <code>Demultiplexer</code>. * @see Demultiplexer * @since JMF 2.0 */ public interface Track extends Duration { /** * The <CODE>mapFrameToTime</CODE> method returns this value if the time mapping * cannot be established or the <CODE>Track</CODE> contains an audio stream. */ public static Time TIME_UNKNOWN = Time.TIME_UNKNOWN; /** * The <CODE>mapTimeToFrame</CODE> method returns this value if the time mapping * cannot be established or the <CODE>Track</CODE> contains an audio stream. * */ public static int FRAME_UNKNOWN = Integer.MAX_VALUE; /** * Gets the <code>Format</code> of the data in this * <code>Track</code>. * * @return The <code>Format</code> associated with this * <code>Track</code>. */ public Format getFormat(); /** * Enables or disables this <code>Track</code>. * A <CODE>Demultiplexer</CODE> discards the data from * disabled tracks. * @param t A boolean value indicating whether or not to enable this <CODE>Track</CODE>. Set to * <CODE>true</CODE> to enable this <CODE>Track</CODE>, <CODE>false</CODE> to disable this <CODE>Track</CODE>. */ public void setEnabled(boolean t); /** * Checks whether or not this <code>Track</code> is enabled. * A <CODE>Demultiplexer</CODE> discards the data from * disabled tracks. * @return <CODE>true</CODE> if the <code>Track</code> is enabled, <CODE>false</CODE> if it is not. */ public boolean isEnabled(); /** * Retrieves the start time of this <CODE>Track</CODE>. * @return A <CODE>Time</CODE> object that specifies the start time for this <CODE>Track</CODE>. */ public Time getStartTime(); /** * Reads the next frame for this <CODE>Track</CODE>. * <p> * This method might block if the * data for a complete frame is not available. It might also block if the stream contains * intervening data for a different interleaved <CODE>Track</CODE>. * Once the other <CODE>Track</CODE> is read by a <CODE>readFrame</CODE> call from a * different thread, this method can read the frame. If the intervening * <CODE>Track</CODE> has been disabled, data for that <CODE>Track</CODE> is read and discarded. * <p> * Note: This scenario is necessary only if a <CODE>PullDataSource</CODE> <CODE>Demultiplexer</CODE> * implementation wants to avoid buffering data locally and * copying the data to the <CODE>Buffer</CODE> passed in as a parameter. * Implementations might decide to buffer data and not * block (if possible) and incur data copy overhead. * <p> * If this method is called on a <CODE>Track</CODE> that has been disabled, * it returns immediately with the <CODE>DISCARD</CODE> flag set on. * <p> * Each track has a sequence number that is updated by the <CODE>Demultiplexer</CODE> * for each frame. * If downstream nodes receive non-contiguous sequence numbers * for a particular <CODE>Track</CODE>, they know that a data overflow has * occurred for that <CODE>Track</CODE>. * @param buffer The <CODE>Buffer</CODE> into which the data is to be read. If * <CODE>readFrame</CODE> is successful, <code>buffer.getLength</code> returns the length of the * data that was read. */ public void readFrame(Buffer buffer); /** * Converts the given media time to the corresponding frame number. * <p> * The frame returned is the nearest frame that has a media time * less than or equal to the given media time. * <p> * @param mediaTime the input media time for the conversion. * @return the converted frame number the given media time. If the * conversion fails, FRAME_UNKNOWN is returned. */ public int mapTimeToFrame(Time t); /** * Gets the <CODE>Time</CODE> that corresponds to the specified frame number. * @return A <CODE>Time</CODE> object that corresponds to the specified frame. * If the mapping cannot be established or the <CODE>Track</CODE> is an audio track, * <CODE>TIME_UNKNOWN</CODE> is returned. */ public Time mapFrameToTime(int frameNumber); /** * Adds an event listener for this <CODE>Track</CODE>. If the <CODE>readFrame</CODE> call in * progress will block, the listener is notified. This enables the listener to * stop the clock and post a <CODE>RestartingEvent</CODE>. * @param listener The <CODE>TrackListener</CODE> to add. */ public void setTrackListener(TrackListener listener); }