1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.googlecode.mp4parser.boxes;
2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.AbstractBox;
4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.boxes.mp4.objectdescriptors.BitReaderBuffer;
5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.boxes.mp4.objectdescriptors.BitWriterBuffer;
6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer;
8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.LinkedList;
9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.List;
10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/**
12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class EC3SpecificBox extends AbstractBox {
15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    List<Entry> entries = new LinkedList<Entry>();
16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int dataRate;
17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int numIndSub;
18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public EC3SpecificBox() {
20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        super("dec3");
21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public long getContentSize() {
25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        long size = 2;
26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        for (Entry entry : entries) {
27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (entry.num_dep_sub > 0) {
28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                size += 4;
29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            } else {
30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                size += 3;
31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return size;
34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void _parseDetails(ByteBuffer content) {
38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        BitReaderBuffer brb = new BitReaderBuffer(content);
39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        dataRate = brb.readBits(13);
40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        numIndSub = brb.readBits(3) + 1;
41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        // This field indicates the number of independent substreams that are present in the Enhanced AC-3 bitstream. The value
42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        // of this field is one less than the number of independent substreams present.
43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        for (int i = 0; i < numIndSub; i++) {
46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            Entry e = new Entry();
47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            e.fscod = brb.readBits(2);
48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            e.bsid = brb.readBits(5);
49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            e.bsmod = brb.readBits(5);
50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            e.acmod = brb.readBits(3);
51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            e.lfeon = brb.readBits(1);
52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            e.reserved = brb.readBits(3);
53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            e.num_dep_sub = brb.readBits(4);
54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (e.num_dep_sub > 0) {
55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                e.chan_loc = brb.readBits(9);
56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            } else {
57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                e.reserved2 = brb.readBits(1);
58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            entries.add(e);
60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void getContent(ByteBuffer byteBuffer) {
65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        BitWriterBuffer bwb = new BitWriterBuffer(byteBuffer);
66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        bwb.writeBits(dataRate, 13);
67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        bwb.writeBits(entries.size() - 1, 3);
68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        for (Entry e : entries) {
69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bwb.writeBits(e.fscod, 2);
70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bwb.writeBits(e.bsid, 5);
71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bwb.writeBits(e.bsmod, 5);
72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bwb.writeBits(e.acmod, 3);
73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bwb.writeBits(e.lfeon, 1);
74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bwb.writeBits(e.reserved, 3);
75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bwb.writeBits(e.num_dep_sub, 4);
76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (e.num_dep_sub > 0) {
77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bwb.writeBits(e.chan_loc, 9);
78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            } else {
79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bwb.writeBits(e.reserved2, 1);
80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public List<Entry> getEntries() {
86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return entries;
87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setEntries(List<Entry> entries) {
90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.entries = entries;
91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void addEntry(Entry entry) {
94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.entries.add(entry);
95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getDataRate() {
98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return dataRate;
99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setDataRate(int dataRate) {
102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.dataRate = dataRate;
103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
105dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getNumIndSub() {
106dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return numIndSub;
107dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
108dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
109dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setNumIndSub(int numIndSub) {
110dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.numIndSub = numIndSub;
111dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
112dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
113dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static class Entry {
114dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int fscod;
115dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int bsid;
116dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int bsmod;
117dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int acmod;
118dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int lfeon;
119dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int reserved;
120dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int num_dep_sub;
121dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int chan_loc;
122dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int reserved2;
123dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
124dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
125dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        @Override
126dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public String toString() {
127dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return "Entry{" +
128dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    "fscod=" + fscod +
129dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", bsid=" + bsid +
130dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", bsmod=" + bsmod +
131dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", acmod=" + acmod +
132dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", lfeon=" + lfeon +
133dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", reserved=" + reserved +
134dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", num_dep_sub=" + num_dep_sub +
135dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", chan_loc=" + chan_loc +
136dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", reserved2=" + reserved2 +
137dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    '}';
138dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
139dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
140dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
141