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.IsoFile;
     20 import com.coremedia.iso.IsoTypeReader;
     21 import com.coremedia.iso.IsoTypeWriter;
     22 import com.googlecode.mp4parser.AbstractBox;
     23 import com.googlecode.mp4parser.annotations.DoNotParseDetail;
     24 
     25 import java.nio.ByteBuffer;
     26 import java.util.Collection;
     27 import java.util.Collections;
     28 import java.util.LinkedList;
     29 import java.util.List;
     30 
     31 /**
     32  * This box identifies the specifications to which this file complies. <br>
     33  * Each brand is a printable four-character code, registered with ISO, that
     34  * identifies a precise specification.
     35  */
     36 public class FileTypeBox extends AbstractBox {
     37     public static final String TYPE = "ftyp";
     38 
     39     private String majorBrand;
     40     private long minorVersion;
     41     private List<String> compatibleBrands = Collections.emptyList();
     42 
     43     public FileTypeBox() {
     44         super(TYPE);
     45     }
     46 
     47     public FileTypeBox(String majorBrand, long minorVersion, List<String> compatibleBrands) {
     48         super(TYPE);
     49         this.majorBrand = majorBrand;
     50         this.minorVersion = minorVersion;
     51         this.compatibleBrands = compatibleBrands;
     52     }
     53 
     54     protected long getContentSize() {
     55         return 8 + compatibleBrands.size() * 4;
     56 
     57     }
     58 
     59     @Override
     60     public void _parseDetails(ByteBuffer content) {
     61         majorBrand = IsoTypeReader.read4cc(content);
     62         minorVersion = IsoTypeReader.readUInt32(content);
     63         int compatibleBrandsCount = content.remaining() / 4;
     64         compatibleBrands = new LinkedList<String>();
     65         for (int i = 0; i < compatibleBrandsCount; i++) {
     66             compatibleBrands.add(IsoTypeReader.read4cc(content));
     67         }
     68     }
     69 
     70     @Override
     71     protected void getContent(ByteBuffer byteBuffer) {
     72         byteBuffer.put(IsoFile.fourCCtoBytes(majorBrand));
     73         IsoTypeWriter.writeUInt32(byteBuffer, minorVersion);
     74         for (String compatibleBrand : compatibleBrands) {
     75             byteBuffer.put(IsoFile.fourCCtoBytes(compatibleBrand));
     76         }
     77 
     78     }
     79 
     80     /**
     81      * Gets the brand identifier.
     82      *
     83      * @return the brand identifier
     84      */
     85     public String getMajorBrand() {
     86         return majorBrand;
     87     }
     88 
     89     /**
     90      * Sets the major brand of the file used to determine an appropriate reader.
     91      *
     92      * @param majorBrand the new major brand
     93      */
     94     public void setMajorBrand(String majorBrand) {
     95         this.majorBrand = majorBrand;
     96     }
     97 
     98     /**
     99      * Sets the "informative integer for the minor version of the major brand".
    100      *
    101      * @param minorVersion the version number of the major brand
    102      */
    103     public void setMinorVersion(int minorVersion) {
    104         this.minorVersion = minorVersion;
    105     }
    106 
    107     /**
    108      * Gets an informative integer for the minor version of the major brand.
    109      *
    110      * @return an informative integer
    111      * @see FileTypeBox#getMajorBrand()
    112      */
    113     public long getMinorVersion() {
    114         return minorVersion;
    115     }
    116 
    117     /**
    118      * Gets an array of 4-cc brands.
    119      *
    120      * @return the compatible brands
    121      */
    122     public List<String> getCompatibleBrands() {
    123         return compatibleBrands;
    124     }
    125 
    126     public void setCompatibleBrands(List<String> compatibleBrands) {
    127         this.compatibleBrands = compatibleBrands;
    128     }
    129 
    130     @DoNotParseDetail
    131     public String toString() {
    132         StringBuilder result = new StringBuilder();
    133         result.append("FileTypeBox[");
    134         result.append("majorBrand=").append(getMajorBrand());
    135         result.append(";");
    136         result.append("minorVersion=").append(getMinorVersion());
    137         for (String compatibleBrand : compatibleBrands) {
    138             result.append(";");
    139             result.append("compatibleBrand=").append(compatibleBrand);
    140         }
    141         result.append("]");
    142         return result.toString();
    143     }
    144 }
    145