• 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 
21 import java.io.IOException;
22 import java.nio.ByteBuffer;
23 
24 /*
25 abstract aligned(8) expandable(228-1) class BaseDescriptor : bit(8) tag=0 {
26 // empty. To be filled by classes extending this class.
27 }
28 
29 int sizeOfInstance = 0;
30 bit(1) nextByte;
31 bit(7) sizeOfInstance;
32 while(nextByte) {
33 bit(1) nextByte;
34 bit(7) sizeByte;
35 sizeOfInstance = sizeOfInstance<<7 | sizeByte;
36 }
37  */
38 @Descriptor(tags = 0x00)
39 public abstract class BaseDescriptor {
40     int tag;
41     int sizeOfInstance;
42     int sizeBytes;
43 
BaseDescriptor()44     public BaseDescriptor() {
45     }
46 
getTag()47     public int getTag() {
48         return tag;
49     }
50 
getSize()51     public int getSize() {
52         return sizeOfInstance
53                 + 1//1 for the tag
54                 + sizeBytes;
55     }
56 
getSizeOfInstance()57     public int getSizeOfInstance() {
58         return sizeOfInstance;
59     }
60 
getSizeBytes()61     public int getSizeBytes() {
62         return sizeBytes;
63     }
64 
parse(int tag, ByteBuffer bb)65     public final void parse(int tag, ByteBuffer bb) throws IOException {
66         this.tag = tag;
67 
68         int i = 0;
69         int tmp = IsoTypeReader.readUInt8(bb);
70         i++;
71         sizeOfInstance = tmp & 0x7f;
72         while (tmp >>> 7 == 1) { //nextbyte indicator bit
73             tmp = IsoTypeReader.readUInt8(bb);
74             i++;
75             //sizeOfInstance = sizeOfInstance<<7 | sizeByte;
76             sizeOfInstance = sizeOfInstance << 7 | tmp & 0x7f;
77         }
78         sizeBytes = i;
79         ByteBuffer detailSource = bb.slice();
80         detailSource.limit(sizeOfInstance);
81         parseDetail(detailSource);
82         assert detailSource.remaining() == 0: this.getClass().getSimpleName() + " has not been fully parsed";
83         bb.position(bb.position() + sizeOfInstance);
84     }
85 
parseDetail(ByteBuffer bb)86     public abstract void parseDetail(ByteBuffer bb) throws IOException;
87 
88 
89 
90     @Override
toString()91     public String toString() {
92         final StringBuilder sb = new StringBuilder();
93         sb.append("BaseDescriptor");
94         sb.append("{tag=").append(tag);
95         sb.append(", sizeOfInstance=").append(sizeOfInstance);
96         sb.append('}');
97         return sb.toString();
98     }
99 }
100