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