/* * Copyright (C) 2011 in-somnia * * This file is part of JAAD. * * JAAD 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 3 of the * License, or (at your option) any later version. * * JAAD 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, see <http://www.gnu.org/licenses/>. */ package net.sourceforge.jaad.mp4.boxes.impl; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import net.sourceforge.jaad.mp4.MP4InputStream; import net.sourceforge.jaad.mp4.boxes.FullBox; /** * A typical presentation stored in a file contains one alternate group per * media type: one for video, one for audio, etc. Such a file may include * several video tracks, although, at any point in time, only one of them should * be played or streamed. This is achieved by assigning all video tracks to the * same alternate group. (See subclause 8.3.2 for the definition of alternate * groups.) * * All tracks in an alternate group are candidates for media selection, but it * may not make sense to switch between some of those tracks during a session. * One may for instance allow switching between video tracks at different * bitrates and keep frame size but not allow switching between tracks of * different frame size. In the same manner it may be desirable to enable * selection – but not switching – between tracks of different video codecs or * different audio languages. * * The distinction between tracks for selection and switching is addressed by * assigning tracks to switch groups in addition to alternate groups. One * alternate group may contain one or more switch groups. All tracks in an * alternate group are candidates for media selection, while tracks in a switch * group are also available for switching during a session. Different switch * groups represent different operation points, such as different frame size, * high/low quality, etc. * * For the case of non-scalable bitstreams, several tracks may be included in a * switch group. The same also applies to non-layered scalable bitstreams, such * as traditional AVC streams. * * By labelling tracks with attributes it is possible to characterize them. Each * track can be labelled with a list of attributes which can be used to describe * tracks in a particular switch group or differentiate tracks that belong to * different switch groups. * @author in-somnia */ public class TrackSelectionBox extends FullBox { private long switchGroup; private final List<Long> attributes; public TrackSelectionBox() { super("Track Selection Box"); attributes = new ArrayList<Long>(); } @Override public void decode(MP4InputStream in) throws IOException { super.decode(in); switchGroup = in.readBytes(4); while(getLeft(in)>3) { attributes.add(in.readBytes(4)); } } /** * The switch group is an integer that specifies a group or collection of * tracks. If this field is 0 (default value) or if the Track Selection box * is absent there is no information on whether the track can be used for * switching during playing or streaming. If this integer is not 0 it shall * be the same for tracks that can be used for switching between each other. * Tracks that belong to the same switch group shall belong to the same * alternate group. A switch group may have only one member. */ public long getSwitchGroup() { return switchGroup; } /** * <p>A list of attributes, that should be used as descriptions of tracks or * differentiation criteria for tracks in the same alternate or switch * group. Each differentiating attribute is associated with a pointer to the * field or information that distinguishes the track.</p> * * <p>The following attributes are descriptive: * <table> * <tr><th>Name</th><th>Attribute</th><th>Description</th></tr> * <tr><td>Temporal scalability</td><td>'tesc'</td><td>The track can be * temporally scaled.</td></tr> * <tr><td>Fine-grain SNR scalability</td><td>'fgsc'</td><td>The track can * be fine-grain scaled.</td></tr> * <tr><td>Coarse-grain SNR scalability</td><td>'cgsc'</td><td>The track can * be coarse-grain scaled.</td></tr> * <tr><td>Spatial scalability</td><td>'spsc'</td><td>The track can be * spatially scaled.</td></tr> * <tr><td>Region-of-interest scalability</td><td>'resc'</td><td>The track * can be region-of-interest scaled.</td></tr> * </table></p> * * <p>The following attributes are differentiating: * <table><tr><th>Name</th><th>Attribute</th><th>Pointer</th></tr> * <tr><td>Codec</td><td>'cdec'</td><td>Sample Entry (in Sample Description * box of media track)</td></tr> * <tr><td>Screen size</td><td>'scsz'</td><td>Width and height fields of * Visual Sample Entries.</td></tr> * <tr><td>Max packet size</td><td>'mpsz'</td><td>Maxpacketsize field in RTP * Hint Sample Entry</td></tr> * <tr><td>Media type</td><td>'mtyp'</td><td>Handlertype in Handler box (of * media track)</td></tr> * <tr><td>Media language</td><td>'mela'</td><td>Language field in Media * Header box</td></tr> * <tr><td>Bitrate</td><td>'bitr'</td><td>Total size of the samples in the * track divided by the duration in the track header box</td></tr> * <tr><td>Frame rate</td><td>'frar'</td><td>Number of samples in the track * divided by duration in the track header box</td></tr> * </table></p> * * <p>Descriptive attributes characterize the tracks they modify, whereas * differentiating attributes differentiate between tracks that belong to * the same alternate or switch groups. The pointer of a differentiating * attribute indicates the location of the information that differentiates * the track from other tracks with the same attribute.</p> */ public List<Long> getAttributes() { return Collections.unmodifiableList(attributes); } }