1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.googlecode.mp4parser.boxes.threegpp26245; 2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeReader; 4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeWriter; 5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.Utf8; 6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.AbstractBox; 7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException; 9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer; 10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.LinkedList; 11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.List; 12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/** 14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * 15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */ 16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class FontTableBox extends AbstractBox { 17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu List<FontRecord> entries = new LinkedList<FontRecord>(); 18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public FontTableBox() { 20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu super("ftab"); 21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu @Override 24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu protected long getContentSize() { 25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int size = 2; 26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu for (FontRecord fontRecord : entries) { 27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu size += fontRecord.getSize(); 28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return size; 30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu @Override 34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void _parseDetails(ByteBuffer content) { 35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int numberOfRecords = IsoTypeReader.readUInt16(content); 36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu for (int i = 0; i < numberOfRecords; i++) { 37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu FontRecord fr = new FontRecord(); 38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu fr.parse(content); 39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu entries.add(fr); 40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu @Override 44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu protected void getContent(ByteBuffer byteBuffer) { 45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu IsoTypeWriter.writeUInt16(byteBuffer, entries.size()); 46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu for (FontRecord record : entries) { 47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu record.getContent(byteBuffer); 48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public List<FontRecord> getEntries() { 52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return entries; 53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void setEntries(List<FontRecord> entries) { 56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu this.entries = entries; 57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public static class FontRecord { 60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int fontId; 61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu String fontname; 62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public FontRecord() { 64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public FontRecord(int fontId, String fontname) { 67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu this.fontId = fontId; 68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu this.fontname = fontname; 69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void parse(ByteBuffer bb) { 72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu fontId = IsoTypeReader.readUInt16(bb); 73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int length = IsoTypeReader.readUInt8(bb); 74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu fontname = IsoTypeReader.readString(bb, length); 75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void getContent(ByteBuffer bb) { 78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu IsoTypeWriter.writeUInt16(bb, fontId); 79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu IsoTypeWriter.writeUInt8(bb, fontname.length()); 80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu bb.put(Utf8.convert(fontname)); 81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int getSize() { 84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return Utf8.utf8StringLengthInBytes(fontname) + 3; 85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu @Override 88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public String toString() { 89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return "FontRecord{" + 90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "fontId=" + fontId + 91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", fontname='" + fontname + '\'' + 92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu '}'; 93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} 96