package mp4.util.atom; import java.io.DataOutput; import java.io.IOException; public class Avc1Atom extends LeafAtom { //public static final int DATA_SIZE = 78; public static final int AVCC_OFFSET = 78; private static final int WIDTH_OFFSET = 24; private static final int HEIGHT_OFFSET = 26; //private AvcCAtom avcc; protected static final int AVCC_PROFILE_OFFSET = 1; protected static final int AVCC_PROFILE_COMPAT_OFFSET = 2; protected static final int AVCC_PROFILE_LEVEL_OFFSET = 3; protected static final byte[] avcCType = new byte[] { 'a', 'v', 'c', 'C' }; /** * Constructor that creates an empty avc1 atom. */ public Avc1Atom() { super(new byte[]{'a','v','c','1'}); } /** * Copy constructor. Performs a deep copy * @param old the version to copy */ public Avc1Atom(Avc1Atom old) { super(old); /* if (old.avcc != null) this.avcc = new AvcCAtom(old.avcc); */ } @Override public void accept(AtomVisitor v) throws AtomException { v.visit(this); } public int getWidth() { return data.getUnsignedShort(WIDTH_OFFSET); } public int getHeight() { return data.getUnsignedShort(HEIGHT_OFFSET); } public int getProfile() { if (!hasAvcc()) return 0; return ((int)data.getData(AVCC_OFFSET + ATOM_HEADER_SIZE + AVCC_PROFILE_OFFSET))&0xff; } public int getProfileLevel() { if (!hasAvcc()) return 0; return ((int)data.getData(AVCC_OFFSET + ATOM_HEADER_SIZE + AVCC_PROFILE_LEVEL_OFFSET))&0xff; } public int getProfileCompatability() { if (!hasAvcc()) return 0; return ((int)data.getData(AVCC_OFFSET + ATOM_HEADER_SIZE + AVCC_PROFILE_COMPAT_OFFSET))&0xff; } public void setProfile(int p) { if (!hasAvcc()) return; data.addData(AVCC_OFFSET + ATOM_HEADER_SIZE + AVCC_PROFILE_OFFSET, (byte)(p&0xff)); } public void setProfileLevel(int p) { if (hasAvcc()) return; data.addData(AVCC_OFFSET + ATOM_HEADER_SIZE + AVCC_PROFILE_LEVEL_OFFSET, (byte)(p&0xff)); } public void setProfileCompatability(int p) { if (hasAvcc()) return; data.addData(AVCC_OFFSET + ATOM_HEADER_SIZE + AVCC_PROFILE_COMPAT_OFFSET, (byte)(p&0xff)); } public boolean hasAvcc() { return Atom.typeEquals(data.getData(AVCC_OFFSET+4, AVCC_OFFSET+8), avcCType); } /* public long pureDataSize() { return DATA_SIZE; } @Override public void addChild(Atom child) { if (child instanceof AvcCAtom) avcc = (AvcCAtom)child; else addUnknownChild(child); } */ /* public AvcCAtom getAvcc() { return avcc; } */ /** * Write the avc1 atom data to the specified output * @param out where the data goes * @throws IOException if there is an error writing the data */ @Override public void writeData(DataOutput out) throws IOException { writeHeader(out); data.writeData(out); /* if (avcc != null) avcc.writeData(out); writeUnknownChildren(out); */ } }