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 +
'}';
}
}
}
|