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