/*
* 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.od;
import java.io.IOException;
import net.sourceforge.jaad.mp4.MP4InputStream;
/**
* The <code>DecoderConfigDescriptor</code> provides information about the
* decoder type and the required decoder resources needed for the associates
* elementary stream. This is needed at the receiver to determine whether it is
* able to decode the elementary stream. A stream type identifies the category
* of the stream while the optional decoder specific information contains stream
* specific information for the set up of the decoder in a stream specific
* format that is opaque to this layer.
*
* @author in-somnia
*/
public class DecoderConfigDescriptor extends Descriptor {
private int objectProfile, streamType, decodingBufferSize;
private boolean upstream;
private long maxBitRate, averageBitRate;
void decode(MP4InputStream in) throws IOException {
objectProfile = in.read();
//6 bits stream type, 1 bit upstream flag, 1 bit reserved
final int x = in.read();
streamType = (x>>2)&0x3F;
upstream = ((x>>1)&1)==1;
decodingBufferSize = (int) in.readBytes(3);
maxBitRate = in.readBytes(4);
averageBitRate = in.readBytes(4);
readChildren(in);
}
/**
* An indication for the object profile (or scene description profile if
* streamType==scene description stream), that needs to be supported by the
* decoder for this elementary stream as per the following table. For
* streamType==object descriptor stream the value 0xFF ('no profile
* specified') shall be used.
*
* <table>
* <tr><th>Value</th><th>Description</th></tr>
* <tr>0x00<td></td><td>Reserved for ISO use</td></tr>
* <tr>0x01<td></td><td>ISO 14496-1:Systems Simple Scene Description</td></tr>
* <tr>0x02<td></td><td>ISO 14496-1:Systems 2D Scene Description</td></tr>
* <tr>0x03<td></td><td>ISO 14496-1:Systems VRML Scene Description</td></tr>
* <tr>0x04<td></td><td>ISO 14496-1:Systems Audio Scene Description</td></tr>
* <tr>0x05<td></td><td>ISO 14496-1:Systems Complete Scene Description</td></tr>
* <tr>0x06-0x1F<td></td><td>reserved for ISO use</td></tr>
* <tr>0x20<td></td><td>ISO 14496-2:Visual Simple Profile</td></tr>
* <tr>0x21<td></td><td>ISO 14496-2:Visual Core Profile</td></tr>
* <tr>0x22<td></td><td>ISO 14496-2:Visual Main Profile</td></tr>
* <tr>0x23<td></td><td>ISO 14496-2:Visual Simple Scalable Profile</td></tr>
* <tr>0x24<td></td><td>ISO 14496-2:Visual 12 Bit</td></tr>
* <tr>0x25<td></td><td>ISO 14496-2:Visual Basic Anim. 2D Texture</td></tr>
* <tr>0x26<td></td><td>ISO 14496-2:Visual Anim. 2D Mesh</td></tr>
* <tr>0x27<td></td><td>ISO 14496-2:Visual Simple Face</td></tr>
* <tr>0x28<td></td><td>ISO 14496-2:Visual Simple Scalable Texture</td></tr>
* <tr>0x29<td></td><td>ISO 14496-2:Visual Core Scalable Texture</td></tr>
* <tr>0x2A-0x3F<td></td><td>reserved for ISO use</td></tr>
* <tr>0x40<td></td><td>ISO 14496-3:Audio AAC Main</td></tr>
* <tr>0x41<td></td><td>ISO 14496-3:Audio AAC LC</td></tr>
* <tr>0x42<td></td><td>ISO 14496-3:Audio T/F</td></tr>
* <tr>0x43<td></td><td>ISO 14496-3:Audio T/F Main Scalable</td></tr>
* <tr>0x44<td></td><td>ISO 14496-3:Audio T/F LC Scalable</td></tr>
* <tr>0x45<td></td><td>ISO 14496-3:Audio TwinVQ Core</td></tr>
* <tr>0x46<td></td><td>ISO 14496-3:Audio CELP</td></tr>
* <tr>0x47<td></td><td>ISO 14496-3:Audio HVXC</td></tr>
* <tr>0x48<td></td><td>ISO 14496-3:Audio HILN</td></tr>
* <tr>0x49<td></td><td>ISO 14496-3:Audio TTSI</td></tr>
* <tr>0x4A<td></td><td>ISO 14496-3:Audio Main Synthetic</td></tr>
* <tr>0x4B<td></td><td>ISO 14496-3:Audio Wavetable Synthetic</td></tr>
* <tr>0x4C-0x5F<td></td><td>reserved for ISO use</td></tr>
* <tr>0x60<td></td><td>ISO 13818-2:Visual Simple Profile</td></tr>
* <tr>0x61<td></td><td>ISO 13818-2:Visual Main Profile</td></tr>
* <tr>0x62<td></td><td>ISO 13818-2:Visual SNR Profile</td></tr>
* <tr>0x63<td></td><td>ISO 13818-2:Visual Spatial Profile</td></tr>
* <tr>0x64<td></td><td>ISO 13818-2:Visual High Profile</td></tr>
* <tr>0x65<td></td><td>ISO 13818-2:Visual 442 Profile</td></tr>
* <tr>0x66<td></td><td>ISO 13818-7:Audio (MPEG-2 AAC)</td></tr>
* <tr>0x67<td></td><td>ISO 13818-3:Audio (MPEG-2 layer 1/2/3)</td></tr>
* <tr>0x68<td></td><td>ISO 11172-2:Visual (MPEG-1)</td></tr>
* <tr>0x69<td></td><td>ISO 11172-3:Audio (MPEG-1)</td></tr>
* <tr>0x6A-0xBF<td></td><td>reserved for ISO use</td></tr>
* <tr>0xC0-0xFE<td></td><td>user private</td></tr>
* <tr>0xFF<td></td><td>no profile specified</td></tr>
* </table>
*
* @return the object profile
*/
public int getObjectProfile() {
return objectProfile;
}
/**
* The stream type conveys the type of this elementary stream as per the
* following table:
* <table>
* <tr><th>Value</th><th>Description</th></tr>
* <tr>0x00<td></td><td>reserved for ISO use</td></tr>
* <tr>0x01<td></td><td>ObjectDescriptorStream</td></tr>
* <tr>0x02<td></td><td>ClockReferenceStream</td></tr>
* <tr>0x03<td></td><td>SceneDescriptionStream</td></tr>
* <tr>0x04<td></td><td>VisualStream</td></tr>
* <tr>0x05<td></td><td>AudioStream</td></tr>
* <tr>0x06<td></td><td>MPEG-7 Stream</td></tr>
* <tr>0x07-0x09<td></td><td>reserved for ISO use</td></tr>
* <tr>0x0A<td></td><td>ObjectContentInfoStream</td></tr>
* <tr>0x0B-0x1F<td></td><td>reserved for ISO use</td></tr>
* <tr>0x20-0x3F<td></td><td>user private</td></tr>
* </table>
*
* @return the stream type
*/
public int getStreamType() {
return streamType;
}
/**
* Indicates if this stream is used for upstream information.
*
* @return true if this stream is used for upstream information
*/
public boolean isUpstream() {
return upstream;
}
/**
* The size of the decoding buffer for this elementary stream in byte.
*
* @return the decoding buffer size
*/
public int getDecodingBufferSize() {
return decodingBufferSize;
}
/**
* The maximum bitrate of this elementary stream in any time window of one
* second duration.
*
* @return the maximum bitrate
*/
public long getMaxBitRate() {
return maxBitRate;
}
/**
* The average bitrate of the elementary stream. For streams with variable
* bitrates this value shall be set to zero.
*
* @return the average bitrate or 0 if the stream has a variable bitrate
*/
public long getAverageBitRate() {
return averageBitRate;
}
}