
org.monte.media.DefaultRegistry Maven / Gradle / Ivy
/*
* @(#)DefaultRegistry.java
*
* Copyright (c) 2011 Werner Randelshofer, Goldau, Switzerland.
* All rights reserved.
*
* You may not use, copy or modify this file, except in compliance onlyWith the
* license agreement you entered into onlyWith Werner Randelshofer.
* For details see accompanying license terms.
*/
package org.monte.media;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import static org.monte.media.VideoFormatKeys.*;
import static org.monte.media.AudioFormatKeys.*;
/**
* {@code DefaultRegistry}.
*
* FIXME - The registry should be read from a file.
*
* @author Werner Randelshofer
* @version $Id: DefaultRegistry.java 299 2013-01-03 07:40:18Z werner $
*/
public class DefaultRegistry extends Registry {
private HashMap> codecMap;
private HashMap> readerMap;
private HashMap> writerMap;
private HashMap fileFormatMap;
@Override
public Format[] getReaderFormats() {
return getFileFormats();
}
@Override
public Format[] getWriterFormats() {
return getFileFormats();
}
@Override
public Format[] getFileFormats() {
return fileFormatMap.values().toArray(new Format[fileFormatMap.size()]);
}
private static class RegistryEntry {
Format inputFormat;
Format outputFormat;
String className;
public RegistryEntry(Format inputFormat, Format outputFormat, String className) {
this.inputFormat = inputFormat;
this.outputFormat = outputFormat;
this.className = className;
}
}
public DefaultRegistry() {
}
@Override
protected void init() {
codecMap = new HashMap>();
readerMap = new HashMap>();
writerMap = new HashMap>();
fileFormatMap = new HashMap();
// IFF ANIM
// --------
putCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_ANIM, EncodingKey, ENCODING_BITMAP_IMAGE),
"org.monte.media.anim.BitmapCodec");
// AVI
// --------
putBidiCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_AVI, EncodingKey, ENCODING_AVI_DIB),
"org.monte.media.avi.DIBCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_AVI, EncodingKey, ENCODING_AVI_MJPG),
"org.monte.media.jpeg.JPEGCodec");
putCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_AVI, EncodingKey, ENCODING_AVI_PNG),
"org.monte.media.png.PNGCodec");
putCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_AVI, EncodingKey, ENCODING_AVI_RLE),
"org.monte.media.avi.RunLengthCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_AVI, EncodingKey, ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
"org.monte.media.avi.TechSmithCodec");
putCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_AVI, EncodingKey, ENCODING_AVI_DOSBOX_SCREEN_CAPTURE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
"org.monte.media.avi.ZMBVCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_SIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_AVI, EncodingKey, ENCODING_AVI_PCM),
"org.monte.media.avi.AVIPCMAudioCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_UNSIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_AVI, EncodingKey, ENCODING_AVI_PCM),
"org.monte.media.avi.AVIPCMAudioCodec");
// QuickTime
// --------
putCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_RAW),
"org.monte.media.quicktime.RawCodec");
putCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_ANIMATION),
"org.monte.media.quicktime.AnimationCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_JPEG),
"org.monte.media.jpeg.JPEGCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_AVI, EncodingKey, ENCODING_AVI_MJPG),
"org.monte.media.jpeg.JPEGCodec");
putCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_PNG),
"org.monte.media.png.PNGCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_QUICKTIME,
EncodingKey, ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE, CompressorNameKey, COMPRESSOR_NAME_AVI_TECHSMITH_SCREEN_CAPTURE),
new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
"org.monte.media.avi.TechSmithCodec");
putCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_SIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_TWOS_PCM),
"org.monte.media.quicktime.QuickTimePCMAudioCodec");
putCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_UNSIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_TWOS_PCM),
"org.monte.media.quicktime.QuickTimePCMAudioCodec");
putCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_SIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_SOWT_PCM),
"org.monte.media.quicktime.QuickTimePCMAudioCodec");
putCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_UNSIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_SOWT_PCM),
"org.monte.media.quicktime.QuickTimePCMAudioCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_SIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_IN24_PCM),
"org.monte.media.quicktime.QuickTimePCMAudioCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_UNSIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_IN24_PCM),
"org.monte.media.quicktime.QuickTimePCMAudioCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_SIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_IN32_PCM),
"org.monte.media.quicktime.QuickTimePCMAudioCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_UNSIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_IN32_PCM),
"org.monte.media.quicktime.QuickTimePCMAudioCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_SIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_RAW_PCM),
"org.monte.media.quicktime.QuickTimePCMAudioCodec");
putBidiCodec(
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_PCM_UNSIGNED),
new Format(MediaTypeKey, MediaType.AUDIO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_RAW_PCM),
"org.monte.media.quicktime.QuickTimePCMAudioCodec");
putReader(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_AVI), "org.monte.media.avi.AVIReader");
putReader(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_QUICKTIME), "org.monte.media.quicktime.QuickTimeReader");
putReader(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_ANIM), "org.monte.media.anim.ANIMReader");
putWriter(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_AVI), "org.monte.media.avi.AVIWriter");
putWriter(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_QUICKTIME), "org.monte.media.quicktime.QuickTimeWriter");
putWriter(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_ANIM), "org.monte.media.anim.ANIMWriter");
putFileFormat("avi", new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_AVI));
putFileFormat("mov", new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_QUICKTIME));
putFileFormat("anim", new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_ANIM));
}
/**
*
* @param inputFormat Must have {@code MediaTypeKey}, {@code EncodingKey}, {@code MimeTypeKey}.
* @param outputFormat Must have {@code MediaTypeKey}, {@code EncodingKey}, {@code MimeTypeKey}.
* @param codecClass
*/
public void putBidiCodec(Format inputFormat, Format outputFormat, String codecClass) {
putCodec(inputFormat, outputFormat, codecClass);
putCodec(outputFormat, inputFormat, codecClass);
}
/**
*
* @param inputFormat Must have {@code MediaTypeKey}, {@code EncodingKey}, {@code MimeTypeKey}.
* @param outputFormat Must have {@code MediaTypeKey}, {@code EncodingKey}, {@code MimeTypeKey}.
* @param codecClass
*/
@Override
public void putCodec(Format inputFormat, Format outputFormat, String codecClass) {
RegistryEntry entry = new RegistryEntry(inputFormat, outputFormat, codecClass);
addCodecEntry(inputFormat.get(EncodingKey), entry);
addCodecEntry(outputFormat.get(EncodingKey), entry);
}
private void addCodecEntry(String key, RegistryEntry entry) {
LinkedList list = codecMap.get(key);
if (list == null) {
list = new LinkedList();
codecMap.put(key, list);
}
list.add(entry);
}
/**
*
* @param fileFormat Must have {@code MediaTypeKey}, {@code MimeTypeKey}.
* @param readerClass
*/
@Override
public void putReader(Format fileFormat, String readerClass) {
RegistryEntry entry = new RegistryEntry(null, fileFormat, readerClass);
String key = fileFormat.get(MimeTypeKey);
LinkedList list = readerMap.get(key);
if (list == null) {
list = new LinkedList();
readerMap.put(key, list);
}
list.add(entry);
}
/**
*
* @param fileFormat Must have {@code MediaTypeKey}, {@code MimeTypeKey}.
* @param writerClass
*/
@Override
public void putWriter(Format fileFormat, String writerClass) {
RegistryEntry entry = new RegistryEntry(fileFormat, null, writerClass);
String key = fileFormat.get(MimeTypeKey);
LinkedList list = writerMap.get(key);
if (list == null) {
list = new LinkedList();
writerMap.put(key, list);
}
list.add(entry);
}
@Override
public String[] getCodecClasses(Format inputFormat, Format outputFormat) {
HashSet classNames = new HashSet();
HashSet entries = new HashSet();
if (inputFormat != null) {
LinkedList re;
if (inputFormat.get(EncodingKey) == null) {
re = new LinkedList();
for (Map.Entry> i : codecMap.entrySet()) {
for (RegistryEntry j : i.getValue()) {
if (inputFormat.matches(j.inputFormat)) {
re.add(j);
}
}
}
} else {
re = codecMap.get(inputFormat.get(EncodingKey));
}
if (re != null) {
entries.addAll(re);
}
}
if (outputFormat != null) {
LinkedList re;
if (outputFormat.get(EncodingKey) == null) {
re = new LinkedList();
for (Map.Entry> i : codecMap.entrySet()) {
for (RegistryEntry j : i.getValue()) {
if (outputFormat.matches(j.outputFormat)) {
re.add(j);
}
}
}
} else {
re = codecMap.get(outputFormat.get(EncodingKey));
}
if (re != null) {
entries.addAll(re);
}
}
for (RegistryEntry e : entries) {
if ((inputFormat == null || e.inputFormat == null || inputFormat.matches(e.inputFormat))
&& (outputFormat == null || e.outputFormat == null || outputFormat.matches(e.outputFormat))) {
classNames.add(e.className);
}
}
return classNames.toArray(new String[classNames.size()]);
}
@Override
public String[] getReaderClasses(Format fileFormat) {
LinkedList rr = readerMap.get(fileFormat.get(MimeTypeKey));
String[] names = new String[rr == null ? 0 : rr.size()];
if (rr != null) {
int i = 0;
for (RegistryEntry e : rr) {
names[i++] = e.className;
}
}
return names;
}
@Override
public Format getFileFormat(File file) {
String ext = file.getName();
int p = ext.lastIndexOf('.');
if (p != -1) {
ext = ext.substring(p + 1);
}
ext = ext.toLowerCase();
return fileFormatMap.get(ext);
}
@Override
public String[] getWriterClasses(Format fileFormat) {
LinkedList rr = writerMap.get(fileFormat.get(MimeTypeKey));
String[] names = new String[rr == null ? 0 : rr.size()];
if (rr != null) {
int i = 0;
for (RegistryEntry e : rr) {
names[i++] = e.className;
}
}
return names;
}
@Override
public void putFileFormat(String extension, Format format) {
fileFormatMap.put(extension.toLowerCase(), format);
}
@Override
public String getExtension(Format ff) {
for (Map.Entry e : fileFormatMap.entrySet()) {
if (e.getValue().get(MimeTypeKey).equals(ff.get(MimeTypeKey))) {
return e.getKey();
}
}
return "";
}
@Override
public void unregisterCodec(String codecClass) {
for (Map.Entry> i:codecMap.entrySet()) {
LinkedList ll=i.getValue();
for (Iterator j=ll.iterator();j.hasNext();) {
RegistryEntry e=j.next();
if (e.className.equals(codecClass)) {
j.remove();
}
}
}
}
}