Home | History | Annotate | Download | only in objectdescriptors
      1 /*
      2  * Copyright 2011 castLabs, Berlin
      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.googlecode.mp4parser.boxes.mp4.objectdescriptors;
     18 
     19 import com.coremedia.iso.IsoTypeReader;
     20 
     21 import java.io.IOException;
     22 import java.lang.reflect.Modifier;
     23 import java.nio.ByteBuffer;
     24 import java.util.HashMap;
     25 import java.util.HashSet;
     26 import java.util.Map;
     27 import java.util.Set;
     28 import java.util.logging.Level;
     29 import java.util.logging.Logger;
     30 
     31 /* class tag values of 14496-1
     32 0x00 Forbidden
     33 0x01 ObjectDescrTag
     34 0x02 InitialObjectDescrTag
     35 0x03 ES_DescrTag
     36 0x04 DecoderConfigDescrTag
     37 0x05 DecSpecificInfoTag
     38 0x06 SLConfigDescrTag
     39 0x07 ContentIdentDescrTag
     40 0x08 SupplContentIdentDescrTag
     41 0x09 IPI_DescrPointerTag
     42 0x0A IPMP_DescrPointerTag
     43 0x0B IPMP_DescrTag
     44 0x0C QoS_DescrTag
     45 0x0D RegistrationDescrTag
     46 0x0E ES_ID_IncTag
     47 0x0F ES_ID_RefTag
     48 0x10 MP4_IOD_Tag
     49 0x11 MP4_OD_Tag
     50 0x12 IPL_DescrPointerRefTag
     51 0x13 ExtensionProfileLevelDescrTag
     52 0x14 profileLevelIndicationIndexDescrTag
     53 0x15-0x3F Reserved for ISO use
     54 0x40 ContentClassificationDescrTag
     55 0x41 KeyWordDescrTag
     56 0x42 RatingDescrTag
     57 0x43 LanguageDescrTag
     58 0x44 ShortTextualDescrTag
     59 0x45 ExpandedTextualDescrTag
     60 0x46 ContentCreatorNameDescrTag
     61 0x47 ContentCreationDateDescrTag
     62 0x48 OCICreatorNameDescrTag
     63 0x49 OCICreationDateDescrTag
     64 0x4A SmpteCameraPositionDescrTag
     65 0x4B SegmentDescrTag
     66 0x4C MediaTimeDescrTag
     67 0x4D-0x5F Reserved for ISO use (OCI extensions)
     68 0x60 IPMP_ToolsListDescrTag
     69 0x61 IPMP_ToolTag
     70 0x62 M4MuxTimingDescrTag
     71 0x63 M4MuxCodeTableDescrTag
     72 0x64 ExtSLConfigDescrTag
     73 0x65 M4MuxBufferSizeDescrTag
     74 0x66 M4MuxIdentDescrTag
     75 0x67 DependencyPointerTag
     76 0x68 DependencyMarkerTag
     77 0x69 M4MuxChannelDescrTag
     78 0x6A-0xBF Reserved for ISO use
     79 0xC0-0xFE User private
     80 0xFF Forbidden
     81  */
     82 
     83 /* objectTypeIndication as of 14496-1
     84 0x00 Forbidden
     85 0x01 Systems ISO/IEC 14496-1 a
     86 0x02 Systems ISO/IEC 14496-1 b
     87 0x03 Interaction Stream
     88 0x04 Systems ISO/IEC 14496-1 Extended BIFS Configuration c
     89 0x05 Systems ISO/IEC 14496-1 AFX d
     90 0x06 Font Data Stream
     91 0x07 Synthesized Texture Stream
     92 0x08 Streaming Text Stream
     93 0x09-0x1F reserved for ISO use
     94 0x20 Visual ISO/IEC 14496-2 e
     95 0x21 Visual ITU-T Recommendation H.264 | ISO/IEC 14496-10 f
     96 0x22 Parameter Sets for ITU-T Recommendation H.264 | ISO/IEC 14496-10 f
     97 0x23-0x3F reserved for ISO use
     98 0x40 Audio ISO/IEC 14496-3 g
     99 0x41-0x5F reserved for ISO use
    100 0x60 Visual ISO/IEC 13818-2 Simple Profile
    101 0x61 Visual ISO/IEC 13818-2 Main Profile
    102 0x62 Visual ISO/IEC 13818-2 SNR Profile
    103 0x63 Visual ISO/IEC 13818-2 Spatial Profile
    104 0x64 Visual ISO/IEC 13818-2 High Profile
    105 0x65 Visual ISO/IEC 13818-2 422 Profile
    106 0x66 Audio ISO/IEC 13818-7 Main Profile
    107 0x67 Audio ISO/IEC 13818-7 LowComplexity Profile
    108 0x68 Audio ISO/IEC 13818-7 Scaleable Sampling Rate Profile
    109 0x69 Audio ISO/IEC 13818-3
    110 0x6A Visual ISO/IEC 11172-2
    111 0x6B Audio ISO/IEC 11172-3
    112 0x6C Visual ISO/IEC 10918-1
    113 0x6D reserved for registration authority
    114 0x6E Visual ISO/IEC 15444-1
    115 0x6F - 0x9F reserved for ISO use
    116 0xA0 - 0xBF reserved for registration authority i
    117 0xC0 - 0xE0 user private
    118 0xE1 reserved for registration authority i
    119 0xE2 - 0xFE user private
    120 0xFF no object type specified h
    121  */
    122 public class ObjectDescriptorFactory {
    123     protected static Logger log = Logger.getLogger(ObjectDescriptorFactory.class.getName());
    124 
    125     protected static Map<Integer, Map<Integer, Class<? extends BaseDescriptor>>> descriptorRegistry = new HashMap<Integer, Map<Integer, Class<? extends BaseDescriptor>>>();
    126 
    127     static {
    128         Set<Class<? extends BaseDescriptor>> annotated = new HashSet<Class<? extends BaseDescriptor>>();
    129 
    130         annotated.add(DecoderSpecificInfo.class);
    131         annotated.add(SLConfigDescriptor.class);
    132         annotated.add(BaseDescriptor.class);
    133         annotated.add(ExtensionDescriptor.class);
    134         annotated.add(ObjectDescriptorBase.class);
    135         annotated.add(ProfileLevelIndicationDescriptor.class);
    136         annotated.add(AudioSpecificConfig.class);
    137         annotated.add(ExtensionProfileLevelDescriptor.class);
    138         annotated.add(ESDescriptor.class);
    139         annotated.add(DecoderConfigDescriptor.class);
    140         //annotated.add(ObjectDescriptor.class);
    141 
    142         for (Class<? extends BaseDescriptor> clazz : annotated) {
    143             final Descriptor descriptor = clazz.getAnnotation(Descriptor.class);
    144             final int[] tags = descriptor.tags();
    145             final int objectTypeInd = descriptor.objectTypeIndication();
    146 
    147             Map<Integer, Class<? extends BaseDescriptor>> tagMap = descriptorRegistry.get(objectTypeInd);
    148             if (tagMap == null) {
    149                 tagMap = new HashMap<Integer, Class<? extends BaseDescriptor>>();
    150             }
    151             for (int tag : tags) {
    152                 tagMap.put(tag, clazz);
    153             }
    154             descriptorRegistry.put(objectTypeInd, tagMap);
    155         }
    156     }
    157 
    158     public static BaseDescriptor createFrom(int objectTypeIndication, ByteBuffer bb) throws IOException {
    159         int tag = IsoTypeReader.readUInt8(bb);
    160 
    161         Map<Integer, Class<? extends BaseDescriptor>> tagMap = descriptorRegistry.get(objectTypeIndication);
    162         if (tagMap == null) {
    163             tagMap = descriptorRegistry.get(-1);
    164         }
    165         Class<? extends BaseDescriptor> aClass = tagMap.get(tag);
    166 
    167 //    if (tag == 0x00) {
    168 //      log.warning("Found illegal tag 0x00! objectTypeIndication " + Integer.toHexString(objectTypeIndication) +
    169 //              " and tag " + Integer.toHexString(tag) + " using: " + aClass);
    170 //      aClass = BaseDescriptor.class;
    171 //    }
    172 
    173         BaseDescriptor baseDescriptor;
    174         if (aClass == null || aClass.isInterface() || Modifier.isAbstract(aClass.getModifiers())) {
    175             log.warning("No ObjectDescriptor found for objectTypeIndication " + Integer.toHexString(objectTypeIndication) +
    176                     " and tag " + Integer.toHexString(tag) + " found: " + aClass);
    177             baseDescriptor = new UnknownDescriptor();
    178         } else {
    179             try {
    180                 baseDescriptor = aClass.newInstance();
    181             } catch (Exception e) {
    182                 log.log(Level.SEVERE, "Couldn't instantiate BaseDescriptor class " + aClass + " for objectTypeIndication " + objectTypeIndication + " and tag " + tag, e);
    183                 throw new RuntimeException(e);
    184             }
    185         }
    186         baseDescriptor.parse(tag, bb);
    187         return baseDescriptor;
    188     }
    189 }
    190