package org.jcodec.containers.mp4.boxes;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import org.jcodec.common.NIOUtils;
import org.jcodec.common.tools.ToJSON;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* Describes timecode payload sample
*
* @author The JCodec project
*
*/
public class TimecodeSampleEntry extends SampleEntry {
public static final int FLAG_DROPFRAME = 0x1;
public static final int FLAG_24HOURMAX = 0x2;
public static final int FLAG_NEGATIVETIMEOK = 0x4;
public static final int FLAG_COUNTER = 0x8;
private static final MyFactory FACTORY = new MyFactory();
private int flags;
private int timescale;
private int frameDuration;
private byte numFrames;
public TimecodeSampleEntry(Header header) {
super(header);
factory = FACTORY;
}
public TimecodeSampleEntry() {
super(new Header("tmcd"));
factory = FACTORY;
}
public TimecodeSampleEntry(int flags, int timescale, int frameDuration, int numFrames) {
super(new Header("tmcd"));
this.flags = flags;
this.timescale = timescale;
this.frameDuration = frameDuration;
this.numFrames = (byte) numFrames;
}
public void parse(ByteBuffer input) {
super.parse(input);
NIOUtils.skip(input, 4);
flags = input.getInt();
timescale = input.getInt();
frameDuration = input.getInt();
numFrames = input.get();
NIOUtils.skip(input, 1);
}
protected void doWrite(ByteBuffer out) {
super.doWrite(out);
out.putInt(0);
out.putInt(flags);
out.putInt(timescale);
out.putInt(frameDuration);
out.put(numFrames);
out.put((byte) 207);
}
public static class MyFactory extends BoxFactory {
private Map<String, Class<? extends Box>> mappings = new HashMap<String, Class<? extends Box>>();
public MyFactory() {
}
public Class<? extends Box> toClass(String fourcc) {
return mappings.get(fourcc);
}
}
public int getFlags() {
return flags;
}
public int getTimescale() {
return timescale;
}
public int getFrameDuration() {
return frameDuration;
}
public byte getNumFrames() {
return numFrames;
}
public boolean isDropFrame() {
return (flags & FLAG_DROPFRAME) != 0;
}
@Override
public void dump(StringBuilder sb) {
sb.append(header.getFourcc() + ": {\n");
sb.append("entry: ");
ToJSON.toJSON(this, sb, "flags", "timescale", "frameDuration", "numFrames");
sb.append(",\nexts: [\n");
dumpBoxes(sb);
sb.append("\n]\n");
sb.append("}\n");
}
}