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  * This box defines overall information which is media-independent, and relevant to the entire presentation
27  * considered as a whole.
28  */
29 public class MediaHeaderBox extends AbstractFullBox {
30     public static final String TYPE = "mdhd";
31 
32 
33     private long creationTime;
34     private long modificationTime;
35     private long timescale;
36     private long duration;
37     private String language;
38 
MediaHeaderBox()39     public MediaHeaderBox() {
40         super(TYPE);
41     }
42 
getCreationTime()43     public long getCreationTime() {
44         return creationTime;
45     }
46 
getModificationTime()47     public long getModificationTime() {
48         return modificationTime;
49     }
50 
getTimescale()51     public long getTimescale() {
52         return timescale;
53     }
54 
getDuration()55     public long getDuration() {
56         return duration;
57     }
58 
getLanguage()59     public String getLanguage() {
60         return language;
61     }
62 
getContentSize()63     protected long getContentSize() {
64         long contentSize = 4;
65         if (getVersion() == 1) {
66             contentSize += 8 + 8 + 4 + 8;
67         } else {
68             contentSize += 4 + 4 + 4 + 4;
69         }
70         contentSize += 2;
71         contentSize += 2;
72         return contentSize;
73 
74     }
75 
setCreationTime(long creationTime)76     public void setCreationTime(long creationTime) {
77         this.creationTime = creationTime;
78     }
79 
setModificationTime(long modificationTime)80     public void setModificationTime(long modificationTime) {
81         this.modificationTime = modificationTime;
82     }
83 
setTimescale(long timescale)84     public void setTimescale(long timescale) {
85         this.timescale = timescale;
86     }
87 
setDuration(long duration)88     public void setDuration(long duration) {
89         this.duration = duration;
90     }
91 
setLanguage(String language)92     public void setLanguage(String language) {
93         this.language = language;
94     }
95 
96     @Override
_parseDetails(ByteBuffer content)97     public void _parseDetails(ByteBuffer content) {
98         parseVersionAndFlags(content);
99         if (getVersion() == 1) {
100             creationTime = IsoTypeReader.readUInt64(content);
101             modificationTime = IsoTypeReader.readUInt64(content);
102             timescale = IsoTypeReader.readUInt32(content);
103             duration = IsoTypeReader.readUInt64(content);
104         } else {
105             creationTime = IsoTypeReader.readUInt32(content);
106             modificationTime = IsoTypeReader.readUInt32(content);
107             timescale = IsoTypeReader.readUInt32(content);
108             duration = IsoTypeReader.readUInt32(content);
109         }
110         language = IsoTypeReader.readIso639(content);
111         IsoTypeReader.readUInt16(content);
112     }
113 
114 
toString()115     public String toString() {
116         StringBuilder result = new StringBuilder();
117         result.append("MediaHeaderBox[");
118         result.append("creationTime=").append(getCreationTime());
119         result.append(";");
120         result.append("modificationTime=").append(getModificationTime());
121         result.append(";");
122         result.append("timescale=").append(getTimescale());
123         result.append(";");
124         result.append("duration=").append(getDuration());
125         result.append(";");
126         result.append("language=").append(getLanguage());
127         result.append("]");
128         return result.toString();
129     }
130 
getContent(ByteBuffer byteBuffer)131     protected void getContent(ByteBuffer byteBuffer) {
132         writeVersionAndFlags(byteBuffer);
133         if (getVersion() == 1) {
134             IsoTypeWriter.writeUInt64(byteBuffer, creationTime);
135             IsoTypeWriter.writeUInt64(byteBuffer, modificationTime);
136             IsoTypeWriter.writeUInt32(byteBuffer, timescale);
137             IsoTypeWriter.writeUInt64(byteBuffer, duration);
138         } else {
139             IsoTypeWriter.writeUInt32(byteBuffer, creationTime);
140             IsoTypeWriter.writeUInt32(byteBuffer, modificationTime);
141             IsoTypeWriter.writeUInt32(byteBuffer, timescale);
142             IsoTypeWriter.writeUInt32(byteBuffer, duration);
143         }
144         IsoTypeWriter.writeIso639(byteBuffer, language);
145         IsoTypeWriter.writeUInt16(byteBuffer, 0);
146     }
147 }
148