1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/*
2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Copyright 2011 castLabs, Berlin
3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Licensed under the Apache License, Version 2.0 (the License);
5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * you may not use this file except in compliance with the License.
6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * You may obtain a copy of the License at
7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *     http://www.apache.org/licenses/LICENSE-2.0
9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Unless required by applicable law or agreed to in writing, software
11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * distributed under the License is distributed on an AS IS BASIS,
12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * See the License for the specific language governing permissions and
14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * limitations under the License.
15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.googlecode.mp4parser.boxes.mp4.objectdescriptors;
18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeReader;
21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException;
23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer;
24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.ArrayList;
25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.List;
26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/*
28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuclass InitialObjectDescriptor extends ObjectDescriptorBase : bit(8)
29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhutag=InitialObjectDescrTag {
30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(10) ObjectDescriptorID;
31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(1) URL_Flag;
32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(1) includeInlineProfileLevelFlag;
33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuconst bit(4) reserved=0b1111;
34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuif (URL_Flag) {
35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) URLlength;
36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) URLstring[URLlength];
37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} else {
38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) ODProfileLevelIndication;
39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) sceneProfileLevelIndication;
40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) audioProfileLevelIndication;
41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) visualProfileLevelIndication;
42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) graphicsProfileLevelIndication;
43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuES_Descriptor esDescr[1 .. 255];
44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuOCI_Descriptor ociDescr[0 .. 255];
45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuIPMP_DescriptorPointer ipmpDescrPtr[0 .. 255];
46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuIPMP_Descriptor ipmpDescr [0 .. 255];
47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuIPMP_ToolListDescriptor toolListDescr[0 .. 1];
48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuExtensionDescriptor extDescr[0 .. 255];
50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu*/
52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//@Descriptor(tags = {0x02, 0x10})
53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class InitialObjectDescriptor extends ObjectDescriptorBase {
54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private int objectDescriptorId;
55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int urlFlag;
56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int includeInlineProfileLevelFlag;
57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int urlLength;
59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    String urlString;
60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int oDProfileLevelIndication;
62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int sceneProfileLevelIndication;
63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int audioProfileLevelIndication;
64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int visualProfileLevelIndication;
65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int graphicsProfileLevelIndication;
66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    List<ESDescriptor> esDescriptors = new ArrayList<ESDescriptor>();
68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    List<ExtensionDescriptor> extensionDescriptors = new ArrayList<ExtensionDescriptor>();
70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    List<BaseDescriptor> unknownDescriptors = new ArrayList<BaseDescriptor>();
72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void parseDetail(ByteBuffer bb) throws IOException {
75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        int data = IsoTypeReader.readUInt16(bb);
76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        objectDescriptorId = (data & 0xFFC0) >> 6;
77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        urlFlag = (data & 0x3F) >> 5;
79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        includeInlineProfileLevelFlag = (data & 0x1F) >> 4;
80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        int sizeLeft = getSize() - 2;
82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (urlFlag == 1) {
83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            urlLength = IsoTypeReader.readUInt8(bb);
84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            urlString = IsoTypeReader.readString(bb, urlLength);
85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            sizeLeft = sizeLeft - (1 + urlLength);
86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        } else {
87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            oDProfileLevelIndication = IsoTypeReader.readUInt8(bb);
88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            sceneProfileLevelIndication = IsoTypeReader.readUInt8(bb);
89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            audioProfileLevelIndication = IsoTypeReader.readUInt8(bb);
90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            visualProfileLevelIndication = IsoTypeReader.readUInt8(bb);
91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            graphicsProfileLevelIndication = IsoTypeReader.readUInt8(bb);
92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            sizeLeft = sizeLeft - 5;
94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (sizeLeft > 2) {
96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                final BaseDescriptor descriptor = ObjectDescriptorFactory.createFrom(-1, bb);
97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                sizeLeft = sizeLeft - descriptor.getSize();
98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                if (descriptor instanceof ESDescriptor) {
99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    esDescriptors.add((ESDescriptor) descriptor);
100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                } else {
101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    unknownDescriptors.add(descriptor);
102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
105dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
106dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (sizeLeft > 2) {
107dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            final BaseDescriptor descriptor = ObjectDescriptorFactory.createFrom(-1, bb);
108dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (descriptor instanceof ExtensionDescriptor) {
109dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                extensionDescriptors.add((ExtensionDescriptor) descriptor);
110dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            } else {
111dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                unknownDescriptors.add(descriptor);
112dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
113dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
114dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
115dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
116dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
117dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public String toString() {
118dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        final StringBuilder sb = new StringBuilder();
119dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append("InitialObjectDescriptor");
120dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append("{objectDescriptorId=").append(objectDescriptorId);
121dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", urlFlag=").append(urlFlag);
122dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", includeInlineProfileLevelFlag=").append(includeInlineProfileLevelFlag);
123dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", urlLength=").append(urlLength);
124dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", urlString='").append(urlString).append('\'');
125dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", oDProfileLevelIndication=").append(oDProfileLevelIndication);
126dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", sceneProfileLevelIndication=").append(sceneProfileLevelIndication);
127dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", audioProfileLevelIndication=").append(audioProfileLevelIndication);
128dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", visualProfileLevelIndication=").append(visualProfileLevelIndication);
129dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", graphicsProfileLevelIndication=").append(graphicsProfileLevelIndication);
130dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", esDescriptors=").append(esDescriptors);
131dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", extensionDescriptors=").append(extensionDescriptors);
132dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append(", unknownDescriptors=").append(unknownDescriptors);
133dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append('}');
134dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return sb.toString();
135dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
136dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
137