• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2011 castLabs, Berlin
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.googlecode.mp4parser.boxes.mp4.objectdescriptors;
18 
19 import com.coremedia.iso.IsoTypeReader;
20 import com.coremedia.iso.IsoTypeWriter;
21 
22 import java.io.IOException;
23 import java.nio.ByteBuffer;
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.logging.Logger;
27 
28 /*
29 class ES_Descriptor extends BaseDescriptor : bit(8) tag=ES_DescrTag {
30 bit(16) ES_ID;
31 bit(1) streamDependenceFlag;
32 bit(1) URL_Flag;
33 bit(1) OCRstreamFlag;
34 bit(5) streamPriority;
35 if (streamDependenceFlag)
36 bit(16) dependsOn_ES_ID;
37 if (URL_Flag) {
38 bit(8) URLlength;
39 bit(8) URLstring[URLlength];
40 }
41 if (OCRstreamFlag)
42 bit(16) OCR_ES_Id;
43 DecoderConfigDescriptor decConfigDescr;
44 if (ODProfileLevelIndication==0x01) //no SL extension.
45 {
46 SLConfigDescriptor slConfigDescr;
47 }
48 else // SL extension is possible.
49 {
50 SLConfigDescriptor slConfigDescr;
51 }
52 IPI_DescrPointer ipiPtr[0 .. 1];
53 IP_IdentificationDataSet ipIDS[0 .. 255];
54 IPMP_DescriptorPointer ipmpDescrPtr[0 .. 255];
55 LanguageDescriptor langDescr[0 .. 255];
56 QoS_Descriptor qosDescr[0 .. 1];
57 RegistrationDescriptor regDescr[0 .. 1];
58 ExtensionDescriptor extDescr[0 .. 255];
59 }
60  */
61 @Descriptor(tags = {0x03})
62 public class ESDescriptor extends BaseDescriptor {
63     private static Logger log = Logger.getLogger(ESDescriptor.class.getName());
64 
65     int esId;
66     int streamDependenceFlag;
67     int URLFlag;
68     int oCRstreamFlag;
69     int streamPriority;
70 
71 
72     int URLLength = 0;
73     String URLString;
74     int remoteODFlag;
75 
76     int dependsOnEsId;
77     int oCREsId;
78 
79     DecoderConfigDescriptor decoderConfigDescriptor;
80     SLConfigDescriptor slConfigDescriptor;
81     List<BaseDescriptor> otherDescriptors = new ArrayList<BaseDescriptor>();
82 
83     @Override
parseDetail(ByteBuffer bb)84     public void parseDetail(ByteBuffer bb) throws IOException {
85         esId = IsoTypeReader.readUInt16(bb);
86 
87         int data = IsoTypeReader.readUInt8(bb);
88         streamDependenceFlag = data >>> 7;
89         URLFlag = (data >>> 6) & 0x1;
90         oCRstreamFlag = (data >>> 5) & 0x1;
91         streamPriority = data & 0x1f;
92 
93         if (streamDependenceFlag == 1) {
94             dependsOnEsId = IsoTypeReader.readUInt16(bb);
95         }
96         if (URLFlag == 1) {
97             URLLength = IsoTypeReader.readUInt8(bb);
98             URLString = IsoTypeReader.readString(bb, URLLength);
99         }
100         if (oCRstreamFlag == 1) {
101             oCREsId = IsoTypeReader.readUInt16(bb);
102         }
103 
104         int baseSize = 1 /*tag*/ + getSizeBytes() + 2 + 1 + (streamDependenceFlag == 1 ? 2 : 0) + (URLFlag == 1 ? 1 + URLLength : 0) + (oCRstreamFlag == 1 ? 2 : 0);
105 
106         int begin = bb.position();
107         if (getSize() > baseSize + 2) {
108             BaseDescriptor descriptor = ObjectDescriptorFactory.createFrom(-1, bb);
109             final long read = bb.position() - begin;
110             log.finer(descriptor + " - ESDescriptor1 read: " + read + ", size: " + (descriptor != null ? descriptor.getSize() : null));
111             if (descriptor != null) {
112                 final int size = descriptor.getSize();
113                 bb.position(begin + size);
114                 baseSize += size;
115             } else {
116                 baseSize += read;
117             }
118             if (descriptor instanceof DecoderConfigDescriptor) {
119                 decoderConfigDescriptor = (DecoderConfigDescriptor) descriptor;
120             }
121         }
122 
123         begin = bb.position();
124         if (getSize() > baseSize + 2) {
125             BaseDescriptor descriptor = ObjectDescriptorFactory.createFrom(-1, bb);
126             final long read = bb.position() - begin;
127             log.finer(descriptor + " - ESDescriptor2 read: " + read + ", size: " + (descriptor != null ? descriptor.getSize() : null));
128             if (descriptor != null) {
129                 final int size = descriptor.getSize();
130                 bb.position(begin + size);
131                 baseSize += size;
132             } else {
133                 baseSize += read;
134             }
135             if (descriptor instanceof SLConfigDescriptor) {
136                 slConfigDescriptor = (SLConfigDescriptor) descriptor;
137             }
138         } else {
139             log.warning("SLConfigDescriptor is missing!");
140         }
141 
142         while (getSize() - baseSize > 2) {
143             begin = bb.position();
144             BaseDescriptor descriptor = ObjectDescriptorFactory.createFrom(-1, bb);
145             final long read = bb.position() - begin;
146             log.finer(descriptor + " - ESDescriptor3 read: " + read + ", size: " + (descriptor != null ? descriptor.getSize() : null));
147             if (descriptor != null) {
148                 final int size = descriptor.getSize();
149                 bb.position(begin + size);
150                 baseSize += size;
151             } else {
152                 baseSize += read;
153             }
154             otherDescriptors.add(descriptor);
155         }
156     }
serializedSize()157     public int serializedSize() {
158         int out = 5;
159         if (streamDependenceFlag > 0) {
160             out += 2;
161         }
162         if (URLFlag > 0) {
163             out += 1 + URLLength;
164         }
165         if (oCRstreamFlag > 0) {
166             out += 2;
167         }
168 
169         out += decoderConfigDescriptor.serializedSize();
170         out += slConfigDescriptor.serializedSize();
171 
172         // Doesn't handle other descriptors yet
173 
174         return out;
175     }
176 
serialize()177     public ByteBuffer serialize() {
178         ByteBuffer out = ByteBuffer.allocate(serializedSize()); // Usually is around 30 bytes, so 200 should be enough...
179         IsoTypeWriter.writeUInt8(out, 3);
180         IsoTypeWriter.writeUInt8(out, serializedSize() - 2); // Not OK for longer sizes!
181         IsoTypeWriter.writeUInt16(out, esId);
182         int flags = (streamDependenceFlag << 7) | (URLFlag << 6) | (oCRstreamFlag << 5) | (streamPriority & 0x1f);
183         IsoTypeWriter.writeUInt8(out, flags);
184         if (streamDependenceFlag > 0) {
185             IsoTypeWriter.writeUInt16(out, dependsOnEsId);
186         }
187         if (URLFlag > 0) {
188             IsoTypeWriter.writeUInt8(out, URLLength);
189             IsoTypeWriter.writeUtf8String(out, URLString);
190         }
191         if (oCRstreamFlag > 0) {
192             IsoTypeWriter.writeUInt16(out, oCREsId);
193         }
194 
195         ByteBuffer dec = decoderConfigDescriptor.serialize();
196         ByteBuffer sl = slConfigDescriptor.serialize();
197         out.put(dec.array());
198         out.put(sl.array());
199 
200         // Doesn't handle other descriptors yet
201 
202         return out;
203     }
204 
205 //  @Override
206 //  public int getSize() {
207 //    return 3 + (streamDependenceFlag == 1 ? 2 : 0) +
208 //            (URLFlag == 1 ? 1 + 8 * URLLength : 0) +
209 //            (oCRstreamFlag == 1 ? 2 : 0);
210 //  }
211 
getDecoderConfigDescriptor()212     public DecoderConfigDescriptor getDecoderConfigDescriptor() {
213         return decoderConfigDescriptor;
214     }
215 
getSlConfigDescriptor()216     public SLConfigDescriptor getSlConfigDescriptor() {
217         return slConfigDescriptor;
218     }
219 
setDecoderConfigDescriptor(DecoderConfigDescriptor decoderConfigDescriptor)220     public void setDecoderConfigDescriptor(DecoderConfigDescriptor decoderConfigDescriptor) {
221         this.decoderConfigDescriptor = decoderConfigDescriptor;
222     }
223 
setSlConfigDescriptor(SLConfigDescriptor slConfigDescriptor)224     public void setSlConfigDescriptor(SLConfigDescriptor slConfigDescriptor) {
225         this.slConfigDescriptor = slConfigDescriptor;
226     }
227 
getOtherDescriptors()228     public List<BaseDescriptor> getOtherDescriptors() {
229         return otherDescriptors;
230     }
231 
getoCREsId()232     public int getoCREsId() {
233         return oCREsId;
234     }
235 
setoCREsId(int oCREsId)236     public void setoCREsId(int oCREsId) {
237         this.oCREsId = oCREsId;
238     }
239 
getEsId()240     public int getEsId() {
241         return esId;
242     }
243 
setEsId(int esId)244     public void setEsId(int esId) {
245         this.esId = esId;
246     }
247 
getStreamDependenceFlag()248     public int getStreamDependenceFlag() {
249         return streamDependenceFlag;
250     }
251 
setStreamDependenceFlag(int streamDependenceFlag)252     public void setStreamDependenceFlag(int streamDependenceFlag) {
253         this.streamDependenceFlag = streamDependenceFlag;
254     }
255 
getURLFlag()256     public int getURLFlag() {
257         return URLFlag;
258     }
259 
setURLFlag(int URLFlag)260     public void setURLFlag(int URLFlag) {
261         this.URLFlag = URLFlag;
262     }
263 
getoCRstreamFlag()264     public int getoCRstreamFlag() {
265         return oCRstreamFlag;
266     }
267 
setoCRstreamFlag(int oCRstreamFlag)268     public void setoCRstreamFlag(int oCRstreamFlag) {
269         this.oCRstreamFlag = oCRstreamFlag;
270     }
271 
getStreamPriority()272     public int getStreamPriority() {
273         return streamPriority;
274     }
275 
setStreamPriority(int streamPriority)276     public void setStreamPriority(int streamPriority) {
277         this.streamPriority = streamPriority;
278     }
279 
getURLLength()280     public int getURLLength() {
281         return URLLength;
282     }
283 
setURLLength(int URLLength)284     public void setURLLength(int URLLength) {
285         this.URLLength = URLLength;
286     }
287 
getURLString()288     public String getURLString() {
289         return URLString;
290     }
291 
setURLString(String URLString)292     public void setURLString(String URLString) {
293         this.URLString = URLString;
294     }
295 
getRemoteODFlag()296     public int getRemoteODFlag() {
297         return remoteODFlag;
298     }
299 
setRemoteODFlag(int remoteODFlag)300     public void setRemoteODFlag(int remoteODFlag) {
301         this.remoteODFlag = remoteODFlag;
302     }
303 
getDependsOnEsId()304     public int getDependsOnEsId() {
305         return dependsOnEsId;
306     }
307 
setDependsOnEsId(int dependsOnEsId)308     public void setDependsOnEsId(int dependsOnEsId) {
309         this.dependsOnEsId = dependsOnEsId;
310     }
311 
312     @Override
toString()313     public String toString() {
314         final StringBuilder sb = new StringBuilder();
315         sb.append("ESDescriptor");
316         sb.append("{esId=").append(esId);
317         sb.append(", streamDependenceFlag=").append(streamDependenceFlag);
318         sb.append(", URLFlag=").append(URLFlag);
319         sb.append(", oCRstreamFlag=").append(oCRstreamFlag);
320         sb.append(", streamPriority=").append(streamPriority);
321         sb.append(", URLLength=").append(URLLength);
322         sb.append(", URLString='").append(URLString).append('\'');
323         sb.append(", remoteODFlag=").append(remoteODFlag);
324         sb.append(", dependsOnEsId=").append(dependsOnEsId);
325         sb.append(", oCREsId=").append(oCREsId);
326         sb.append(", decoderConfigDescriptor=").append(decoderConfigDescriptor);
327         sb.append(", slConfigDescriptor=").append(slConfigDescriptor);
328         sb.append('}');
329         return sb.toString();
330     }
331 
332     @Override
equals(Object o)333     public boolean equals(Object o) {
334         if (this == o) return true;
335         if (o == null || getClass() != o.getClass()) return false;
336 
337         ESDescriptor that = (ESDescriptor) o;
338 
339         if (URLFlag != that.URLFlag) return false;
340         if (URLLength != that.URLLength) return false;
341         if (dependsOnEsId != that.dependsOnEsId) return false;
342         if (esId != that.esId) return false;
343         if (oCREsId != that.oCREsId) return false;
344         if (oCRstreamFlag != that.oCRstreamFlag) return false;
345         if (remoteODFlag != that.remoteODFlag) return false;
346         if (streamDependenceFlag != that.streamDependenceFlag) return false;
347         if (streamPriority != that.streamPriority) return false;
348         if (URLString != null ? !URLString.equals(that.URLString) : that.URLString != null) return false;
349         if (decoderConfigDescriptor != null ? !decoderConfigDescriptor.equals(that.decoderConfigDescriptor) : that.decoderConfigDescriptor != null)
350             return false;
351         if (otherDescriptors != null ? !otherDescriptors.equals(that.otherDescriptors) : that.otherDescriptors != null)
352             return false;
353         if (slConfigDescriptor != null ? !slConfigDescriptor.equals(that.slConfigDescriptor) : that.slConfigDescriptor != null)
354             return false;
355 
356         return true;
357     }
358 
359     @Override
hashCode()360     public int hashCode() {
361         int result = esId;
362         result = 31 * result + streamDependenceFlag;
363         result = 31 * result + URLFlag;
364         result = 31 * result + oCRstreamFlag;
365         result = 31 * result + streamPriority;
366         result = 31 * result + URLLength;
367         result = 31 * result + (URLString != null ? URLString.hashCode() : 0);
368         result = 31 * result + remoteODFlag;
369         result = 31 * result + dependsOnEsId;
370         result = 31 * result + oCREsId;
371         result = 31 * result + (decoderConfigDescriptor != null ? decoderConfigDescriptor.hashCode() : 0);
372         result = 31 * result + (slConfigDescriptor != null ? slConfigDescriptor.hashCode() : 0);
373         result = 31 * result + (otherDescriptors != null ? otherDescriptors.hashCode() : 0);
374         return result;
375     }
376 }
377