1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/*
2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Copyright 2008 CoreMedia AG, Hamburg
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.sampleentry;
18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.BoxParser;
20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeReader;
21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeWriter;
22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.boxes.Box;
23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.boxes.ContainerBox;
24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer;
26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/**
28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Contains basic information about the audio samples in this track. Format-specific information
29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * is appened as boxes after the data described in ISO/IEC 14496-12 chapter 8.16.2.
30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class AudioSampleEntry extends SampleEntry implements ContainerBox {
32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE1 = "samr";
34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE2 = "sawb";
35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE3 = "mp4a";
36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE4 = "drms";
37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE5 = "alac";
38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE7 = "owma";
39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE8 = "ac-3"; /* ETSI TS 102 366 1.2.1 Annex F */
40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE9 = "ec-3"; /* ETSI TS 102 366 1.2.1 Annex F */
41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE10 = "mlpa";
42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE11 = "dtsl";
43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE12 = "dtsh";
44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE13 = "dtse";
45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    /**
47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu     * Identifier for an encrypted audio track.
48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu     *
49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu     * @see com.coremedia.iso.boxes.ProtectionSchemeInformationBox
50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu     */
51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE_ENCRYPTED = "enca";
52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private int channelCount;
54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private int sampleSize;
55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private long sampleRate;
56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private int soundVersion;
57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private int compressionId;
58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private int packetSize;
59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private long samplesPerPacket;
60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private long bytesPerPacket;
61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private long bytesPerFrame;
62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private long bytesPerSample;
63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private int reserved1;
65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private long reserved2;
66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private byte[] soundVersion2Data;
67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    private BoxParser boxParser;
68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public AudioSampleEntry(String type) {
70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        super(type);
71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getChannelCount() {
74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return channelCount;
75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getSampleSize() {
78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return sampleSize;
79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public long getSampleRate() {
82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return sampleRate;
83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getSoundVersion() {
86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return soundVersion;
87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getCompressionId() {
90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return compressionId;
91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getPacketSize() {
94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return packetSize;
95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public long getSamplesPerPacket() {
98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return samplesPerPacket;
99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public long getBytesPerPacket() {
102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return bytesPerPacket;
103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
105dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public long getBytesPerFrame() {
106dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return bytesPerFrame;
107dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
108dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
109dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public long getBytesPerSample() {
110dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return bytesPerSample;
111dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
112dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
113dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public byte[] getSoundVersion2Data() {
114dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return soundVersion2Data;
115dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
116dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
117dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getReserved1() {
118dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return reserved1;
119dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
120dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
121dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public long getReserved2() {
122dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return reserved2;
123dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
124dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
125dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setChannelCount(int channelCount) {
126dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.channelCount = channelCount;
127dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
128dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
129dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setSampleSize(int sampleSize) {
130dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.sampleSize = sampleSize;
131dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
132dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
133dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setSampleRate(long sampleRate) {
134dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.sampleRate = sampleRate;
135dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
136dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
137dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setSoundVersion(int soundVersion) {
138dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.soundVersion = soundVersion;
139dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
140dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
141dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setCompressionId(int compressionId) {
142dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.compressionId = compressionId;
143dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
144dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
145dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setPacketSize(int packetSize) {
146dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.packetSize = packetSize;
147dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
148dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
149dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setSamplesPerPacket(long samplesPerPacket) {
150dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.samplesPerPacket = samplesPerPacket;
151dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
152dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
153dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setBytesPerPacket(long bytesPerPacket) {
154dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.bytesPerPacket = bytesPerPacket;
155dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
156dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
157dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setBytesPerFrame(long bytesPerFrame) {
158dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.bytesPerFrame = bytesPerFrame;
159dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
160dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
161dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setBytesPerSample(long bytesPerSample) {
162dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.bytesPerSample = bytesPerSample;
163dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
164dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
165dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setReserved1(int reserved1) {
166dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.reserved1 = reserved1;
167dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
168dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
169dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setReserved2(long reserved2) {
170dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.reserved2 = reserved2;
171dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
172dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
173dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setSoundVersion2Data(byte[] soundVersion2Data) {
174dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.soundVersion2Data = soundVersion2Data;
175dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
176dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
177dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setBoxParser(BoxParser boxParser) {
178dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.boxParser = boxParser;
179dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
180dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
181dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
182dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void _parseDetails(ByteBuffer content) {
183dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        _parseReservedAndDataReferenceIndex(content);    //parses the six reserved bytes and dataReferenceIndex
184dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        // 8 bytes already parsed
185dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        //reserved bits - used by qt
186dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        soundVersion = IsoTypeReader.readUInt16(content);
187dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
188dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        //reserved
189dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        reserved1 = IsoTypeReader.readUInt16(content);
190dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        reserved2 = IsoTypeReader.readUInt32(content);
191dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
192dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        channelCount = IsoTypeReader.readUInt16(content);
193dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sampleSize = IsoTypeReader.readUInt16(content);
194dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        //reserved bits - used by qt
195dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        compressionId = IsoTypeReader.readUInt16(content);
196dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        //reserved bits - used by qt
197dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        packetSize = IsoTypeReader.readUInt16(content);
198dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        //sampleRate = in.readFixedPoint1616();
199dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sampleRate = IsoTypeReader.readUInt32(content);
200dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (!type.equals("mlpa")) {
201dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            sampleRate = sampleRate >>> 16;
202dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
203dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
204dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        //more qt stuff - see http://mp4v2.googlecode.com/svn-history/r388/trunk/src/atom_sound.cpp
205dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (soundVersion > 0) {
206dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            samplesPerPacket = IsoTypeReader.readUInt32(content);
207dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bytesPerPacket = IsoTypeReader.readUInt32(content);
208dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bytesPerFrame = IsoTypeReader.readUInt32(content);
209dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bytesPerSample = IsoTypeReader.readUInt32(content);
210dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
211dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (soundVersion == 2) {
212dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
213dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            soundVersion2Data = new byte[20];
214dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            content.get(20);
215dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
216dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        _parseChildBoxes(content);
217dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
218dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
219dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
220dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
221dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
222dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    protected long getContentSize() {
223dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        long contentSize = 28;
224dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        contentSize += soundVersion > 0 ? 16 : 0;
225dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        contentSize += soundVersion == 2 ? 20 : 0;
226dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        for (Box boxe : boxes) {
227dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            contentSize += boxe.getSize();
228dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
229dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return contentSize;
230dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
231dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
232dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
233dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public String toString() {
234dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return "AudioSampleEntry{" +
235dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                "bytesPerSample=" + bytesPerSample +
236dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ", bytesPerFrame=" + bytesPerFrame +
237dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ", bytesPerPacket=" + bytesPerPacket +
238dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ", samplesPerPacket=" + samplesPerPacket +
239dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ", packetSize=" + packetSize +
240dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ", compressionId=" + compressionId +
241dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ", soundVersion=" + soundVersion +
242dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ", sampleRate=" + sampleRate +
243dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ", sampleSize=" + sampleSize +
244dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ", channelCount=" + channelCount +
245dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ", boxes=" + getBoxes() +
246dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                '}';
247dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
248dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
249dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
250dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    protected void getContent(ByteBuffer byteBuffer) {
251dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        _writeReservedAndDataReferenceIndex(byteBuffer);
252dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        IsoTypeWriter.writeUInt16(byteBuffer, soundVersion);
253dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        IsoTypeWriter.writeUInt16(byteBuffer, reserved1);
254dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        IsoTypeWriter.writeUInt32(byteBuffer, reserved2);
255dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        IsoTypeWriter.writeUInt16(byteBuffer, channelCount);
256dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        IsoTypeWriter.writeUInt16(byteBuffer, sampleSize);
257dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        IsoTypeWriter.writeUInt16(byteBuffer, compressionId);
258dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        IsoTypeWriter.writeUInt16(byteBuffer, packetSize);
259dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        //isos.writeFixedPont1616(getSampleRate());
260dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (type.equals("mlpa")) {
261dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt32(byteBuffer, getSampleRate());
262dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        } else {
263dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt32(byteBuffer, getSampleRate() << 16);
264dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
265dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
266dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (soundVersion > 0) {
267dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt32(byteBuffer, samplesPerPacket);
268dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt32(byteBuffer, bytesPerPacket);
269dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt32(byteBuffer, bytesPerFrame);
270dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt32(byteBuffer, bytesPerSample);
271dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
272dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
273dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (soundVersion == 2) {
274dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            byteBuffer.put(soundVersion2Data);
275dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
276dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        _writeChildBoxes(byteBuffer);
277dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
278dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
279