%PDF- %PDF-
Direktori : /home/waritko/build/Bento4/Source/Java/com/axiosys/bento4/ |
Current File : //home/waritko/build/Bento4/Source/Java/com/axiosys/bento4/Atom.java |
/***************************************************************** | | Copyright 2002-2008 Axiomatic Systems, LLC | | $Id: Atom.java 196 2008-10-14 22:59:31Z bok $ | | This file is part of Bento4/AP4 (MP4 Atom Processing Library). | | Unless you have obtained Bento4 under a difference license, | this version of Bento4 is Bento4|GPL. | Bento4|GPL is free software; you can redistribute it and/or modify | it under the terms of the GNU General Public License as published by | the Free Software Foundation; either version 2, or (at your option) | any later version. | | Bento4|GPL 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 General Public License for more details. | | You should have received a copy of the GNU General Public License | along with Bento4|GPL; see the file COPYING. If not, write to the | Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA | 02111-1307, USA. | ****************************************************************/ package com.axiosys.bento4; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.RandomAccessFile; public abstract class Atom { public final static int TYPE_MOOV = 0x6d6f6f76; public final static int TYPE_TRAK = 0x7472616b; public final static int TYPE_HNTI = 0x686e7469; public final static int TYPE_STBL = 0x7374626c; public final static int TYPE_MDIA = 0x6d646961; public final static int TYPE_DINF = 0x64696e66; public final static int TYPE_MINF = 0x6d696e66; public final static int TYPE_SCHI = 0x73636869; public final static int TYPE_SINF = 0x73696e66; public final static int TYPE_UDTA = 0x75647461; public final static int TYPE_ILST = 0x696c7374; public final static int TYPE_EDTS = 0x65647473; public final static int TYPE_META = 0x6d657461; public final static int TYPE_STSD = 0x73747364; public final static int TYPE_MP4A = 0x6d703461; public final static int TYPE_ENCA = 0x656e6361; public final static int TYPE_MP4V = 0x6d703476; public final static int TYPE_ENCV = 0x656e6376; public final static int TYPE_IKMS = 0x694b4d53; public final static int TYPE_TKHD = 0x746b6864; public final static int TYPE_SCHM = 0x7363686d; public final static int TYPE_HDLR = 0x68646c72; public final static int TYPE_ODKM = 0x6f646b6d; public final static int TYPE_ODAF = 0x6f646166; public final static int TYPE_OHDR = 0x6f686472; public final static int HEADER_SIZE = 8; public final static int FULL_HEADER_SIZE = 12; // members protected int type; protected int size; protected int flags; protected int version; protected boolean isFull; public static String typeString(int type) { StringBuffer result = new StringBuffer(4); result.append((char)((type>>24)&0xFF)); result.append((char)((type>>16)&0xFF)); result.append((char)((type>> 8)&0xFF)); result.append((char)((type )&0xFF)); return result.toString(); } public static int nameToType(String name) { return ((name.charAt(0)&0xFF)<<24) | ((name.charAt(1)&0xFF)<<16) | ((name.charAt(2)&0xFF)<< 8) | ((name.charAt(3)&0xFF)); } public Atom(int type, int size, boolean isFull) { this.type = type; this.size = size; this.isFull = isFull; } public Atom(int type, int size, boolean isFull, RandomAccessFile source) throws IOException { this(type, size, isFull); if (isFull) { // read the version and flags int extension = source.readInt(); version = (extension>>24)&0xFF; flags = extension&0xFFFFFF; } else { this.flags = 0; this.version = 0; } } public int getType() { return type; } public int getSize() { return size; } public int getHeaderSize() { return isFull?FULL_HEADER_SIZE:HEADER_SIZE; } public int getPayloadSize() { return size-getHeaderSize(); } public void write(DataOutputStream stream) throws IOException { // write the header writeHeader(stream); // write the fields writeFields(stream); } public void writeHeader(DataOutputStream stream) throws IOException { // write the size stream.writeInt(size); // write the type stream.writeInt(type); // for full atoms, write version and flags if (isFull) { stream.writeInt(version<<24 | flags); } } protected abstract void writeFields(DataOutputStream stream) throws IOException; public byte[] toBytes() throws IOException { ByteArrayOutputStream stream = new ByteArrayOutputStream(); DataOutputStream output = new DataOutputStream(stream); write(output); return stream.toByteArray(); } public byte[] getPayload() throws IOException { byte[] bytes = toBytes(); byte[] result = new byte[getPayloadSize()]; System.arraycopy(bytes, getHeaderSize(), result, 0, result.length); return result; } public String toString(String indentation) { return indentation+"[" + typeString(type) + "] size=" + getHeaderSize() + "+" + getPayloadSize(); } public String toString() { return toString(""); } }