public static BaseDescriptor | createFrom(int objectTypeIndication, java.nio.ByteBuffer bb)
Set<Class<? extends BaseDescriptor>> annotated = new HashSet<Class<? extends BaseDescriptor>>();
annotated.add(DecoderSpecificInfo.class);
annotated.add(SLConfigDescriptor.class);
annotated.add(BaseDescriptor.class);
annotated.add(ExtensionDescriptor.class);
annotated.add(ObjectDescriptorBase.class);
annotated.add(ProfileLevelIndicationDescriptor.class);
annotated.add(AudioSpecificConfig.class);
annotated.add(ExtensionProfileLevelDescriptor.class);
annotated.add(ESDescriptor.class);
annotated.add(DecoderConfigDescriptor.class);
//annotated.add(ObjectDescriptor.class);
for (Class<? extends BaseDescriptor> clazz : annotated) {
final Descriptor descriptor = clazz.getAnnotation(Descriptor.class);
final int[] tags = descriptor.tags();
final int objectTypeInd = descriptor.objectTypeIndication();
Map<Integer, Class<? extends BaseDescriptor>> tagMap = descriptorRegistry.get(objectTypeInd);
if (tagMap == null) {
tagMap = new HashMap<Integer, Class<? extends BaseDescriptor>>();
}
for (int tag : tags) {
tagMap.put(tag, clazz);
}
descriptorRegistry.put(objectTypeInd, tagMap);
}
int tag = IsoTypeReader.readUInt8(bb);
Map<Integer, Class<? extends BaseDescriptor>> tagMap = descriptorRegistry.get(objectTypeIndication);
if (tagMap == null) {
tagMap = descriptorRegistry.get(-1);
}
Class<? extends BaseDescriptor> aClass = tagMap.get(tag);
// if (tag == 0x00) {
// log.warning("Found illegal tag 0x00! objectTypeIndication " + Integer.toHexString(objectTypeIndication) +
// " and tag " + Integer.toHexString(tag) + " using: " + aClass);
// aClass = BaseDescriptor.class;
// }
BaseDescriptor baseDescriptor;
if (aClass == null || aClass.isInterface() || Modifier.isAbstract(aClass.getModifiers())) {
log.warning("No ObjectDescriptor found for objectTypeIndication " + Integer.toHexString(objectTypeIndication) +
" and tag " + Integer.toHexString(tag) + " found: " + aClass);
baseDescriptor = new UnknownDescriptor();
} else {
try {
baseDescriptor = aClass.newInstance();
} catch (Exception e) {
log.log(Level.SEVERE, "Couldn't instantiate BaseDescriptor class " + aClass + " for objectTypeIndication " + objectTypeIndication + " and tag " + tag, e);
throw new RuntimeException(e);
}
}
baseDescriptor.parse(tag, bb);
return baseDescriptor;
|