AtomFactory.java
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:4k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. package com.axiosys.bento4;
  2. import java.io.IOException;
  3. import java.io.RandomAccessFile;
  4. import com.axiosys.bento4.ismacryp.EncaSampleEntry;
  5. import com.axiosys.bento4.ismacryp.EncvSampleEntry;
  6. import com.axiosys.bento4.ismacryp.IkmsAtom;
  7. import com.axiosys.bento4.ismacryp.SchmAtom;
  8. public class AtomFactory {
  9.     public static final AtomFactory DefaultFactory = new AtomFactory();
  10.     
  11.     private int context = 0;
  12.     
  13.     public Atom createAtom(RandomAccessFile file) throws IOException, InvalidFormatException {
  14.         return createAtom(file, new int[] { (int) (file.length()-file.getFilePointer()) });
  15.     }
  16.     Atom createAtom(RandomAccessFile source, int[] bytesAvailable /* by reference */) throws IOException, InvalidFormatException {
  17.         Atom atom = null;
  18.         
  19.         // check that there are enough bytes for at least a header
  20.         if (bytesAvailable[0] < Atom.HEADER_SIZE) return null;
  21.         // remember current file offset
  22.         long start = source.getFilePointer();
  23.         // read atom size
  24.         int size = source.readInt();
  25.         if (size == 0) {
  26.             // atom extends to end of file
  27.             size = (int)(source.length()-start);
  28.         }
  29.         // check the size (we don't handle extended size yet)
  30.         if (size > bytesAvailable[0]) {
  31.             source.seek(start);
  32.             return null;
  33.         }
  34.         if (size < 0) {
  35.             // something is corrupted
  36.             throw new InvalidFormatException("invalid atom size");
  37.         }
  38.         
  39.         // read atom type
  40.         int type = source.readInt();
  41.         // create the atom
  42.         switch (type) {
  43.           case Atom.TYPE_STSD:
  44.             atom = new StsdAtom(size, source, this);
  45.             break;
  46.                 
  47.           case Atom.TYPE_SCHM:
  48.             atom = new SchmAtom(size, source);
  49.             break;
  50.           case Atom.TYPE_IKMS:
  51.             atom = new IkmsAtom(size, source);
  52.             break;
  53.           case Atom.TYPE_TRAK:
  54.             atom = new TrakAtom(size, source, this);
  55.             break;
  56.             
  57.           case Atom.TYPE_TKHD:
  58.             atom = new TkhdAtom(size, source);
  59.             break;
  60.             
  61.           case Atom.TYPE_HDLR:
  62.             atom = new HdlrAtom(size, source);
  63.             break;
  64.             
  65.           // container atoms
  66.           case Atom.TYPE_MOOV:
  67.           case Atom.TYPE_HNTI:
  68.           case Atom.TYPE_STBL:
  69.           case Atom.TYPE_MDIA:
  70.           case Atom.TYPE_DINF:
  71.           case Atom.TYPE_MINF:
  72.           case Atom.TYPE_SCHI:
  73.           case Atom.TYPE_SINF:
  74.           case Atom.TYPE_UDTA:
  75.           case Atom.TYPE_ILST:
  76.           case Atom.TYPE_EDTS: {
  77.               int previousContext = context;
  78.               context = type; // set the context for the children
  79.               atom = new ContainerAtom(type, size, false, source, this);
  80.               context = previousContext; // restore the previous context
  81.               break;
  82.           }
  83.           // full container atoms
  84.           case Atom.TYPE_META:
  85.             atom = new ContainerAtom(type, size, false, source, this);
  86.             break;
  87.           // sample entries
  88.           case Atom.TYPE_MP4A:
  89.             atom = new Mp4aSampleEntry(size, source, this);
  90.             break;
  91.           case Atom.TYPE_MP4V:
  92.               atom = new Mp4vSampleEntry(size, source, this);
  93.               break;
  94.           case Atom.TYPE_ENCA:
  95.               atom = new EncaSampleEntry(size, source, this);
  96.               break;
  97.           case Atom.TYPE_ENCV:
  98.               atom = new EncvSampleEntry(size, source, this);
  99.               break;
  100.           default:
  101.               atom = new UnknownAtom(type, size, source);
  102.               break;
  103.         }
  104.         // skip to the end of the atom
  105.         bytesAvailable[0] -= size;
  106.         source.seek(start+size);
  107.         return atom;
  108.     }
  109. }