• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2008 CoreMedia AG, Hamburg
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.coremedia.iso.boxes;
18 
19 import com.coremedia.iso.IsoTypeReader;
20 import com.coremedia.iso.IsoTypeWriter;
21 import com.googlecode.mp4parser.AbstractFullBox;
22 
23 import java.nio.ByteBuffer;
24 
25 /**
26  * <code>
27  * Box Type: 'mvhd'<br>
28  * Container: {@link MovieBox} ('moov')<br>
29  * Mandatory: Yes<br>
30  * Quantity: Exactly one<br><br>
31  * </code>
32  * This box defines overall information which is media-independent, and relevant to the entire presentation
33  * considered as a whole.
34  */
35 public class MovieHeaderBox extends AbstractFullBox {
36     private long creationTime;
37     private long modificationTime;
38     private long timescale;
39     private long duration;
40     private double rate = 1.0;
41     private float volume = 1.0f;
42     private long[] matrix = new long[]{0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000};
43     private long nextTrackId;
44 
45     private int previewTime;
46     private int previewDuration;
47     private int posterTime;
48     private int selectionTime;
49     private int selectionDuration;
50     private int currentTime;
51 
52 
53     public static final String TYPE = "mvhd";
54 
MovieHeaderBox()55     public MovieHeaderBox() {
56         super(TYPE);
57     }
58 
getCreationTime()59     public long getCreationTime() {
60         return creationTime;
61     }
62 
getModificationTime()63     public long getModificationTime() {
64         return modificationTime;
65     }
66 
getTimescale()67     public long getTimescale() {
68         return timescale;
69     }
70 
getDuration()71     public long getDuration() {
72         return duration;
73     }
74 
getRate()75     public double getRate() {
76         return rate;
77     }
78 
getVolume()79     public float getVolume() {
80         return volume;
81     }
82 
getMatrix()83     public long[] getMatrix() {
84         return matrix;
85     }
86 
getNextTrackId()87     public long getNextTrackId() {
88         return nextTrackId;
89     }
90 
getContentSize()91     protected long getContentSize() {
92         long contentSize = 4;
93         if (getVersion() == 1) {
94             contentSize += 28;
95         } else {
96             contentSize += 16;
97         }
98         contentSize += 80;
99         return contentSize;
100     }
101 
102     @Override
_parseDetails(ByteBuffer content)103     public void _parseDetails(ByteBuffer content) {
104         parseVersionAndFlags(content);
105         if (getVersion() == 1) {
106             creationTime = IsoTypeReader.readUInt64(content);
107             modificationTime = IsoTypeReader.readUInt64(content);
108             timescale = IsoTypeReader.readUInt32(content);
109             duration = IsoTypeReader.readUInt64(content);
110         } else {
111             creationTime = IsoTypeReader.readUInt32(content);
112             modificationTime = IsoTypeReader.readUInt32(content);
113             timescale = IsoTypeReader.readUInt32(content);
114             duration = IsoTypeReader.readUInt32(content);
115         }
116         rate = IsoTypeReader.readFixedPoint1616(content);
117         volume = IsoTypeReader.readFixedPoint88(content);
118         IsoTypeReader.readUInt16(content);
119         IsoTypeReader.readUInt32(content);
120         IsoTypeReader.readUInt32(content);
121         matrix = new long[9];
122         for (int i = 0; i < 9; i++) {
123             matrix[i] = IsoTypeReader.readUInt32(content);
124         }
125 
126         previewTime = content.getInt();
127         previewDuration = content.getInt();
128         posterTime = content.getInt();
129         selectionTime = content.getInt();
130         selectionDuration = content.getInt();
131         currentTime = content.getInt();
132 
133         nextTrackId = IsoTypeReader.readUInt32(content);
134 
135     }
136 
toString()137     public String toString() {
138         StringBuilder result = new StringBuilder();
139         result.append("MovieHeaderBox[");
140         result.append("creationTime=").append(getCreationTime());
141         result.append(";");
142         result.append("modificationTime=").append(getModificationTime());
143         result.append(";");
144         result.append("timescale=").append(getTimescale());
145         result.append(";");
146         result.append("duration=").append(getDuration());
147         result.append(";");
148         result.append("rate=").append(getRate());
149         result.append(";");
150         result.append("volume=").append(getVolume());
151         for (int i = 0; i < matrix.length; i++) {
152             result.append(";");
153             result.append("matrix").append(i).append("=").append(matrix[i]);
154         }
155         result.append(";");
156         result.append("nextTrackId=").append(getNextTrackId());
157         result.append("]");
158         return result.toString();
159     }
160 
161 
162     @Override
getContent(ByteBuffer byteBuffer)163     protected void getContent(ByteBuffer byteBuffer) {
164         writeVersionAndFlags(byteBuffer);
165         if (getVersion() == 1) {
166             IsoTypeWriter.writeUInt64(byteBuffer, creationTime);
167             IsoTypeWriter.writeUInt64(byteBuffer, modificationTime);
168             IsoTypeWriter.writeUInt32(byteBuffer, timescale);
169             IsoTypeWriter.writeUInt64(byteBuffer, duration);
170         } else {
171             IsoTypeWriter.writeUInt32(byteBuffer, creationTime);
172             IsoTypeWriter.writeUInt32(byteBuffer, modificationTime);
173             IsoTypeWriter.writeUInt32(byteBuffer, timescale);
174             IsoTypeWriter.writeUInt32(byteBuffer, duration);
175         }
176         IsoTypeWriter.writeFixedPont1616(byteBuffer, rate);
177         IsoTypeWriter.writeFixedPont88(byteBuffer, volume);
178         IsoTypeWriter.writeUInt16(byteBuffer, 0);
179         IsoTypeWriter.writeUInt32(byteBuffer, 0);
180         IsoTypeWriter.writeUInt32(byteBuffer, 0);
181 
182 
183         for (int i = 0; i < 9; i++) {
184             IsoTypeWriter.writeUInt32(byteBuffer, matrix[i]);
185         }
186 
187 
188         byteBuffer.putInt(previewTime);
189         byteBuffer.putInt(previewDuration);
190         byteBuffer.putInt(posterTime);
191         byteBuffer.putInt(selectionTime);
192         byteBuffer.putInt(selectionDuration);
193         byteBuffer.putInt(currentTime);
194 
195         IsoTypeWriter.writeUInt32(byteBuffer, nextTrackId);
196     }
197 
198 
setCreationTime(long creationTime)199     public void setCreationTime(long creationTime) {
200         this.creationTime = creationTime;
201     }
202 
setModificationTime(long modificationTime)203     public void setModificationTime(long modificationTime) {
204         this.modificationTime = modificationTime;
205     }
206 
setTimescale(long timescale)207     public void setTimescale(long timescale) {
208         this.timescale = timescale;
209     }
210 
setDuration(long duration)211     public void setDuration(long duration) {
212         this.duration = duration;
213     }
214 
setRate(double rate)215     public void setRate(double rate) {
216         this.rate = rate;
217     }
218 
setVolume(float volume)219     public void setVolume(float volume) {
220         this.volume = volume;
221     }
222 
setMatrix(long[] matrix)223     public void setMatrix(long[] matrix) {
224         this.matrix = matrix;
225     }
226 
setNextTrackId(long nextTrackId)227     public void setNextTrackId(long nextTrackId) {
228         this.nextTrackId = nextTrackId;
229     }
230 
getPreviewTime()231     public int getPreviewTime() {
232         return previewTime;
233     }
234 
setPreviewTime(int previewTime)235     public void setPreviewTime(int previewTime) {
236         this.previewTime = previewTime;
237     }
238 
getPreviewDuration()239     public int getPreviewDuration() {
240         return previewDuration;
241     }
242 
setPreviewDuration(int previewDuration)243     public void setPreviewDuration(int previewDuration) {
244         this.previewDuration = previewDuration;
245     }
246 
getPosterTime()247     public int getPosterTime() {
248         return posterTime;
249     }
250 
setPosterTime(int posterTime)251     public void setPosterTime(int posterTime) {
252         this.posterTime = posterTime;
253     }
254 
getSelectionTime()255     public int getSelectionTime() {
256         return selectionTime;
257     }
258 
setSelectionTime(int selectionTime)259     public void setSelectionTime(int selectionTime) {
260         this.selectionTime = selectionTime;
261     }
262 
getSelectionDuration()263     public int getSelectionDuration() {
264         return selectionDuration;
265     }
266 
setSelectionDuration(int selectionDuration)267     public void setSelectionDuration(int selectionDuration) {
268         this.selectionDuration = selectionDuration;
269     }
270 
getCurrentTime()271     public int getCurrentTime() {
272         return currentTime;
273     }
274 
setCurrentTime(int currentTime)275     public void setCurrentTime(int currentTime) {
276         this.currentTime = currentTime;
277     }
278 }
279