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