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