diff options
Diffstat (limited to 'isoparser/src/main/java/com/googlecode/mp4parser/boxes/EC3SpecificBox.java')
-rw-r--r-- | isoparser/src/main/java/com/googlecode/mp4parser/boxes/EC3SpecificBox.java | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/isoparser/src/main/java/com/googlecode/mp4parser/boxes/EC3SpecificBox.java b/isoparser/src/main/java/com/googlecode/mp4parser/boxes/EC3SpecificBox.java new file mode 100644 index 0000000..412db04 --- /dev/null +++ b/isoparser/src/main/java/com/googlecode/mp4parser/boxes/EC3SpecificBox.java @@ -0,0 +1,140 @@ +package com.googlecode.mp4parser.boxes; + +import com.googlecode.mp4parser.AbstractBox; +import com.googlecode.mp4parser.boxes.mp4.objectdescriptors.BitReaderBuffer; +import com.googlecode.mp4parser.boxes.mp4.objectdescriptors.BitWriterBuffer; + +import java.nio.ByteBuffer; +import java.util.LinkedList; +import java.util.List; + +/** + * + */ +public class EC3SpecificBox extends AbstractBox { + List<Entry> entries = new LinkedList<Entry>(); + int dataRate; + int numIndSub; + + public EC3SpecificBox() { + super("dec3"); + } + + @Override + public long getContentSize() { + long size = 2; + for (Entry entry : entries) { + if (entry.num_dep_sub > 0) { + size += 4; + } else { + size += 3; + } + } + return size; + } + + @Override + public void _parseDetails(ByteBuffer content) { + BitReaderBuffer brb = new BitReaderBuffer(content); + dataRate = brb.readBits(13); + numIndSub = brb.readBits(3) + 1; + // This field indicates the number of independent substreams that are present in the Enhanced AC-3 bitstream. The value + // of this field is one less than the number of independent substreams present. + + + for (int i = 0; i < numIndSub; i++) { + Entry e = new Entry(); + e.fscod = brb.readBits(2); + e.bsid = brb.readBits(5); + e.bsmod = brb.readBits(5); + e.acmod = brb.readBits(3); + e.lfeon = brb.readBits(1); + e.reserved = brb.readBits(3); + e.num_dep_sub = brb.readBits(4); + if (e.num_dep_sub > 0) { + e.chan_loc = brb.readBits(9); + } else { + e.reserved2 = brb.readBits(1); + } + entries.add(e); + } + } + + @Override + public void getContent(ByteBuffer byteBuffer) { + BitWriterBuffer bwb = new BitWriterBuffer(byteBuffer); + bwb.writeBits(dataRate, 13); + bwb.writeBits(entries.size() - 1, 3); + for (Entry e : entries) { + bwb.writeBits(e.fscod, 2); + bwb.writeBits(e.bsid, 5); + bwb.writeBits(e.bsmod, 5); + bwb.writeBits(e.acmod, 3); + bwb.writeBits(e.lfeon, 1); + bwb.writeBits(e.reserved, 3); + bwb.writeBits(e.num_dep_sub, 4); + if (e.num_dep_sub > 0) { + bwb.writeBits(e.chan_loc, 9); + } else { + bwb.writeBits(e.reserved2, 1); + } + } + } + + + public List<Entry> getEntries() { + return entries; + } + + public void setEntries(List<Entry> entries) { + this.entries = entries; + } + + public void addEntry(Entry entry) { + this.entries.add(entry); + } + + public int getDataRate() { + return dataRate; + } + + public void setDataRate(int dataRate) { + this.dataRate = dataRate; + } + + public int getNumIndSub() { + return numIndSub; + } + + public void setNumIndSub(int numIndSub) { + this.numIndSub = numIndSub; + } + + public static class Entry { + public int fscod; + public int bsid; + public int bsmod; + public int acmod; + public int lfeon; + public int reserved; + public int num_dep_sub; + public int chan_loc; + public int reserved2; + + + @Override + public String toString() { + return "Entry{" + + "fscod=" + fscod + + ", bsid=" + bsid + + ", bsmod=" + bsmod + + ", acmod=" + acmod + + ", lfeon=" + lfeon + + ", reserved=" + reserved + + ", num_dep_sub=" + num_dep_sub + + ", chan_loc=" + chan_loc + + ", reserved2=" + reserved2 + + '}'; + } + } +} |