summaryrefslogtreecommitdiff
path: root/isoparser/src/main/java/com/googlecode/mp4parser/boxes/EC3SpecificBox.java
diff options
context:
space:
mode:
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.java140
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 +
+ '}';
+ }
+ }
+}