• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
EC3SpecificBox()19     public EC3SpecificBox() {
20         super("dec3");
21     }
22 
23     @Override
getContentSize()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
_parseDetails(ByteBuffer content)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
getContent(ByteBuffer byteBuffer)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 
getEntries()85     public List<Entry> getEntries() {
86         return entries;
87     }
88 
setEntries(List<Entry> entries)89     public void setEntries(List<Entry> entries) {
90         this.entries = entries;
91     }
92 
addEntry(Entry entry)93     public void addEntry(Entry entry) {
94         this.entries.add(entry);
95     }
96 
getDataRate()97     public int getDataRate() {
98         return dataRate;
99     }
100 
setDataRate(int dataRate)101     public void setDataRate(int dataRate) {
102         this.dataRate = dataRate;
103     }
104 
getNumIndSub()105     public int getNumIndSub() {
106         return numIndSub;
107     }
108 
setNumIndSub(int numIndSub)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
toString()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