package org.jcodec.codecs.mpeg4.mp4;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import org.jcodec.codecs.aac.AACUtils;
import org.jcodec.codecs.mpeg4.es.DecoderConfig;
import org.jcodec.codecs.mpeg4.es.DecoderSpecific;
import org.jcodec.codecs.mpeg4.es.Descriptor;
import org.jcodec.codecs.mpeg4.es.DescriptorFactory;
import org.jcodec.codecs.mpeg4.es.ES;
import org.jcodec.codecs.mpeg4.es.NodeDescriptor;
import org.jcodec.codecs.mpeg4.es.SL;
import org.jcodec.common.io.BitWriter;
import org.jcodec.containers.mp4.boxes.Box;
import org.jcodec.containers.mp4.boxes.FullBox;
import org.jcodec.containers.mp4.boxes.Header;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* MPEG 4 elementary stream descriptor
*
* @author The JCodec project
*
*/
public class EsdsBox extends FullBox {
private ByteBuffer streamInfo;
private int objectType;
private int bufSize;
private int maxBitrate;
private int avgBitrate;
private int trackId;
public static String fourcc() {
return "esds";
}
public EsdsBox(Header atom) {
super(atom);
}
@Override
protected void doWrite(ByteBuffer out) {
super.doWrite(out);
if (streamInfo != null && streamInfo.remaining() > 0) {
ArrayList<Descriptor> l = new ArrayList<Descriptor>();
ArrayList<Descriptor> l1 = new ArrayList<Descriptor>();
l1.add(new DecoderSpecific(streamInfo));
l.add(new DecoderConfig(objectType, bufSize, maxBitrate, avgBitrate, l1));
l.add(new SL());
new ES(trackId, l).write(out);
} else {
ArrayList<Descriptor> l = new ArrayList<Descriptor>();
l.add(new DecoderConfig(objectType, bufSize, maxBitrate, avgBitrate, new ArrayList<Descriptor>()));
l.add(new SL());
new ES(trackId, l).write(out);
}
}
public void parse(ByteBuffer input) {
super.parse(input);
ES es = (ES) Descriptor.read(input, DescriptorFactory.getInstance());
trackId = es.getTrackId();
DecoderConfig decoderConfig = NodeDescriptor.find(es, DecoderConfig.class, DecoderConfig.tag());
objectType = decoderConfig.getObjectType();
bufSize = decoderConfig.getBufSize();
maxBitrate = decoderConfig.getMaxBitrate();
avgBitrate = decoderConfig.getAvgBitrate();
DecoderSpecific decoderSpecific = NodeDescriptor.find(decoderConfig, DecoderSpecific.class, DecoderSpecific.tag());
streamInfo = decoderSpecific.getData();
}
public ByteBuffer getStreamInfo() {
return streamInfo;
}
public int getObjectType() {
return objectType;
}
public int getBufSize() {
return bufSize;
}
public int getMaxBitrate() {
return maxBitrate;
}
public int getAvgBitrate() {
return avgBitrate;
}
public int getTrackId() {
return trackId;
}
public static EsdsBox fromADTS(org.jcodec.codecs.aac.ADTSParser.Header hdr) {
return createEsdsBox(AACUtils.adtsToStreamInfo(hdr), hdr.getObjectType() << 5, 0, 210750, 133350, 2);
}
public static EsdsBox createEsdsBox(ByteBuffer streamInfo, int objectType, int bufSize, int maxBitrate,
int avgBitrate, int trackId) {
EsdsBox esds = new EsdsBox(new Header(fourcc()));
esds.objectType = objectType;
esds.bufSize = bufSize;
esds.maxBitrate = maxBitrate;
esds.avgBitrate = avgBitrate;
esds.trackId = trackId;
esds.streamInfo = streamInfo;
return esds;
}
public static EsdsBox newEsdsBox() {
return new EsdsBox(new Header(fourcc()));
}
}