All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.sbtqa.monte.media.DefaultRegistry Maven / Gradle / Ivy

There is a newer version: 1.1.0-JAVA7
Show newest version
/* @(#)DefaultRegistry.java
 * Copyright © 2011 Werner Randelshofer, Switzerland.
 * 
 * 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 ru.sbtqa.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 ru.sbtqa.monte.media.AudioFormatKeys.*;
import ru.sbtqa.monte.media.FormatKeys.MediaType;
import static ru.sbtqa.monte.media.VideoFormatKeys.*;

/**
 * {@code DefaultRegistry}.
 * 
 * FIXME - The registry should be read from a file.
 *
 * @author Werner Randelshofer
 * @version $Id: DefaultRegistry.java 364 2016-11-09 19:54:25Z 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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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_PNG),
              "ru.sbtqa.monte.media.png.PNGCodec");

        putBidiCodec(
              new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
              new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_AVI, EncodingKey, ENCODING_AVI_RLE8),
              "ru.sbtqa.monte.media.avi.RunLengthCodec");
        putBidiCodec(
              new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
              new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_AVI, EncodingKey, ENCODING_AVI_RLE4),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.monte.media.jpeg.JPEGCodec");

        putBidiCodec(
              new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_JAVA, EncodingKey, ENCODING_BUFFERED_IMAGE),
              new Format(MediaTypeKey, MediaType.VIDEO, MimeTypeKey, MIME_QUICKTIME, EncodingKey, ENCODING_QUICKTIME_PNG),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.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),
              "ru.sbtqa.monte.media.quicktime.QuickTimePCMAudioCodec");

        putReader(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_AVI), "ru.sbtqa.monte.media.avi.AVIReader");
        putReader(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_QUICKTIME), "ru.sbtqa.monte.media.quicktime.QuickTimeReader");
        putReader(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_ANIM), "ru.sbtqa.monte.media.anim.ANIMReader");
        putWriter(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_AVI), "ru.sbtqa.monte.media.avi.AVIWriter");
        putWriter(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_QUICKTIME), "ru.sbtqa.monte.media.quicktime.QuickTimeWriter");
        putWriter(new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_ANIM), "ru.sbtqa.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 TODO
     */
    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 TODO
     */
    @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 TODO
     */
    @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 TODO
     */
    @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();
                }
            }
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy