1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/*
2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Copyright 2009 castLabs GmbH, 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.coremedia.iso.boxes;
18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeReader;
20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeWriter;
21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.AbstractFullBox;
22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
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 Zhu * aligned(8) class SampleDependencyTypeBox
29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * extends FullBox('sdtp', version = 0, 0) {
30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * for (i=0; i < sample_count; i++){
31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * unsigned int(2) reserved = 0;
32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * unsigned int(2) sample_depends_on;
33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * unsigned int(2) sample_is_depended_on;
34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * unsigned int(2) sample_has_redundancy;
35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * }
36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * }
37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class SampleDependencyTypeBox extends AbstractFullBox {
39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE = "sdtp";
40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private List<Entry> entries = new ArrayList<Entry>();
42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static class Entry {
44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public Entry(int value) {
46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            this.value = value;
47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        private int value;
50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int getReserved() {
53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return (value >> 6) & 0x03;
54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public void setReserved(int res) {
57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            value = (res & 0x03) << 6 | value & 0x3f;
58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int getSampleDependsOn() {
61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return (value >> 4) & 0x03;
62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public void setSampleDependsOn(int sdo) {
65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            value = (sdo & 0x03) << 4 | value & 0xcf;
66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int getSampleIsDependentOn() {
69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return (value >> 2) & 0x03;
70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public void setSampleIsDependentOn(int sido) {
73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            value = (sido & 0x03) << 2 | value & 0xf3;
74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int getSampleHasRedundancy() {
77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return value & 0x03;
78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public void setSampleHasRedundancy(int shr) {
81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            value = shr & 0x03 | value & 0xfc;
82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        @Override
85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public String toString() {
86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return "Entry{" +
87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    "reserved=" + getReserved() +
88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", sampleDependsOn=" + getSampleDependsOn() +
89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", sampleIsDependentOn=" + getSampleIsDependentOn() +
90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", sampleHasRedundancy=" + getSampleHasRedundancy() +
91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    '}';
92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public SampleDependencyTypeBox() {
96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        super(TYPE);
97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    protected long getContentSize() {
101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return 4 + entries.size();
102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
105dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    protected void getContent(ByteBuffer byteBuffer) {
106dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writeVersionAndFlags(byteBuffer);
107dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        for (Entry entry : entries) {
108dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt8(byteBuffer, entry.value);
109dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
110dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
111dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
112dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
113dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void _parseDetails(ByteBuffer content) {
114dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        parseVersionAndFlags(content);
115dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        while (content.remaining() > 0) {
116dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            entries.add(new Entry(IsoTypeReader.readUInt8(content)));
117dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
118dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
119dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
120dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public List<Entry> getEntries() {
121dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return entries;
122dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
123dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
124dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setEntries(List<Entry> entries) {
125dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.entries = entries;
126dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
127dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
128dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
129dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public String toString() {
130dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        final StringBuilder sb = new StringBuilder();
131dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append("SampleDependencyTypeBox");
132dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append("{entries=").append(entries);
133dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sb.append('}');
134dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return sb.toString();
135dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
136dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
137