Home | History | Annotate | Download | only in boxes
      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 
     55     public MovieHeaderBox() {
     56         super(TYPE);
     57     }
     58 
     59     public long getCreationTime() {
     60         return creationTime;
     61     }
     62 
     63     public long getModificationTime() {
     64         return modificationTime;
     65     }
     66 
     67     public long getTimescale() {
     68         return timescale;
     69     }
     70 
     71     public long getDuration() {
     72         return duration;
     73     }
     74 
     75     public double getRate() {
     76         return rate;
     77     }
     78 
     79     public float getVolume() {
     80         return volume;
     81     }
     82 
     83     public long[] getMatrix() {
     84         return matrix;
     85     }
     86 
     87     public long getNextTrackId() {
     88         return nextTrackId;
     89     }
     90 
     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
    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 
    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
    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 
    199     public void setCreationTime(long creationTime) {
    200         this.creationTime = creationTime;
    201     }
    202 
    203     public void setModificationTime(long modificationTime) {
    204         this.modificationTime = modificationTime;
    205     }
    206 
    207     public void setTimescale(long timescale) {
    208         this.timescale = timescale;
    209     }
    210 
    211     public void setDuration(long duration) {
    212         this.duration = duration;
    213     }
    214 
    215     public void setRate(double rate) {
    216         this.rate = rate;
    217     }
    218 
    219     public void setVolume(float volume) {
    220         this.volume = volume;
    221     }
    222 
    223     public void setMatrix(long[] matrix) {
    224         this.matrix = matrix;
    225     }
    226 
    227     public void setNextTrackId(long nextTrackId) {
    228         this.nextTrackId = nextTrackId;
    229     }
    230 
    231     public int getPreviewTime() {
    232         return previewTime;
    233     }
    234 
    235     public void setPreviewTime(int previewTime) {
    236         this.previewTime = previewTime;
    237     }
    238 
    239     public int getPreviewDuration() {
    240         return previewDuration;
    241     }
    242 
    243     public void setPreviewDuration(int previewDuration) {
    244         this.previewDuration = previewDuration;
    245     }
    246 
    247     public int getPosterTime() {
    248         return posterTime;
    249     }
    250 
    251     public void setPosterTime(int posterTime) {
    252         this.posterTime = posterTime;
    253     }
    254 
    255     public int getSelectionTime() {
    256         return selectionTime;
    257     }
    258 
    259     public void setSelectionTime(int selectionTime) {
    260         this.selectionTime = selectionTime;
    261     }
    262 
    263     public int getSelectionDuration() {
    264         return selectionDuration;
    265     }
    266 
    267     public void setSelectionDuration(int selectionDuration) {
    268         this.selectionDuration = selectionDuration;
    269     }
    270 
    271     public int getCurrentTime() {
    272         return currentTime;
    273     }
    274 
    275     public void setCurrentTime(int currentTime) {
    276         this.currentTime = currentTime;
    277     }
    278 }
    279