1/*
2 * Copyright 2009 castLabs GmbH, 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
17package com.coremedia.iso.boxes;
18
19import com.coremedia.iso.IsoTypeReader;
20import com.coremedia.iso.IsoTypeWriter;
21import com.googlecode.mp4parser.AbstractFullBox;
22
23import java.nio.ByteBuffer;
24import java.util.LinkedList;
25import java.util.List;
26
27import static com.googlecode.mp4parser.util.CastUtils.l2i;
28
29/*
30aligned(8) class SampleAuxiliaryInformationOffsetsBox
31            extends FullBox(‘saio’, version, flags)
32{
33            if (flags & 1) {
34                        unsigned int(32) aux_info_type;
35                        unsigned int(32) aux_info_type_parameter;
36            }
37            unsigned int(32) entry_count;
38            if ( version == 0 )
39            {
40                        unsigned int(32) offset[ entry_count ];
41            }
42            else
43            {
44                        unsigned int(64) offset[ entry_count ];
45            }
46}
47 */
48public class SampleAuxiliaryInformationOffsetsBox extends AbstractFullBox {
49    public static final String TYPE = "saio";
50
51    private List<Long> offsets = new LinkedList<Long>();
52    private long auxInfoType;
53    private long auxInfoTypeParameter;
54
55    public SampleAuxiliaryInformationOffsetsBox() {
56        super(TYPE);
57    }
58
59    @Override
60    protected long getContentSize() {
61        return 8 + (getVersion() == 0 ? 4 * offsets.size() : 8 * offsets.size()) + ((getFlags() & 1) == 1 ? 8 : 0);
62    }
63
64    @Override
65    protected void getContent(ByteBuffer byteBuffer) {
66        writeVersionAndFlags(byteBuffer);
67        if ((getFlags() & 1) == 1) {
68            IsoTypeWriter.writeUInt32(byteBuffer, auxInfoType);
69            IsoTypeWriter.writeUInt32(byteBuffer, auxInfoTypeParameter);
70        }
71
72        IsoTypeWriter.writeUInt32(byteBuffer, offsets.size());
73        for (Long offset : offsets) {
74            if (getVersion() == 0) {
75                IsoTypeWriter.writeUInt32(byteBuffer, offset);
76            } else {
77                IsoTypeWriter.writeUInt64(byteBuffer, offset);
78            }
79        }
80    }
81
82    @Override
83    public void _parseDetails(ByteBuffer content) {
84        parseVersionAndFlags(content);
85
86        if ((getFlags() & 1) == 1) {
87            auxInfoType = IsoTypeReader.readUInt32(content);
88            auxInfoTypeParameter = IsoTypeReader.readUInt32(content);
89        }
90
91        int entryCount = l2i(IsoTypeReader.readUInt32(content));
92        offsets.clear();
93
94        for (int i = 0; i < entryCount; i++) {
95            if (getVersion() == 0) {
96                offsets.add(IsoTypeReader.readUInt32(content));
97            } else {
98                offsets.add(IsoTypeReader.readUInt64(content));
99            }
100        }
101    }
102
103
104    public long getAuxInfoType() {
105        return auxInfoType;
106    }
107
108    public void setAuxInfoType(long auxInfoType) {
109        this.auxInfoType = auxInfoType;
110    }
111
112    public long getAuxInfoTypeParameter() {
113        return auxInfoTypeParameter;
114    }
115
116    public void setAuxInfoTypeParameter(long auxInfoTypeParameter) {
117        this.auxInfoTypeParameter = auxInfoTypeParameter;
118    }
119
120    public List<Long> getOffsets() {
121        return offsets;
122    }
123
124    public void setOffsets(List<Long> offsets) {
125        this.offsets = offsets;
126    }
127}
128