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

org.monte.media.Registry Maven / Gradle / Ivy

The newest version!

package org.monte.media;

import java.io.File;
import java.util.ArrayList;
import static org.monte.media.FormatKeys.*;


public abstract class Registry {

    private static Registry instance;

    public static Registry getInstance() {
        if (instance == null) {
            instance = new DefaultRegistry();
            instance.init();
        }
        return instance;
    }


    protected abstract void init();


    public abstract void putCodec(Format inputFormat, Format outputFormat, String codecClass);


    public final String[] getDecoderClasses(Format format) {
        return getCodecClasses(format, null);
    }


    public final String[] getEncoderClasses(Format format) {
        return getCodecClasses(null, format);
    }


    public abstract String[] getCodecClasses(
            Format inputFormat,
            Format outputFormat);


    public final Codec[] getDecoders(Format inputFormat) {
        return getCodecs(inputFormat, null);
    }


    public Codec getDecoder(Format inputFormat) {
        return getCodec(inputFormat, null);
    }


    public final Codec[] getEncoders(Format outputFormat) {
        return getCodecs(null, outputFormat);
    }


    public Codec getEncoder(Format outputFormat) {
        return getCodec(null, outputFormat);
    }


    public Codec[] getCodecs(Format inputFormat, Format outputFormat) {
        String[] clazz = getCodecClasses(inputFormat, outputFormat);
        ArrayList codecs = new ArrayList(clazz.length);
        for (int i = 0; i < clazz.length; i++) {
            try {
                codecs.add((Codec) Class.forName(clazz[i]).newInstance());
            } catch (Exception ex) {

                System.err.println("Monte Registry. Codec class not found: " + clazz[i]);
                unregisterCodec(clazz[i]);
            }
        }
        return codecs.toArray(new Codec[codecs.size()]);
    }


    public Codec getCodec(Format inputFormat, Format outputFormat) {
        String[] clazz = getCodecClasses(inputFormat, outputFormat);
        for (int i = 0; i < clazz.length; i++) {
            try {
                Codec codec = ((Codec) Class.forName(clazz[i]).newInstance());
                codec.setInputFormat(inputFormat);
                if (outputFormat != null) {
                    codec.setOutputFormat(outputFormat);
                }
                return codec;
            } catch (Exception ex) {

                System.err.println("Monte Registry. Codec class not found: " + clazz[i]);
                unregisterCodec(clazz[i]);
            }
        }
        return null;
    }


    public abstract void putReader(Format fileFormat, String readerClass);


    public abstract void putWriter(Format fileFormat, String writerClass);


    public abstract String[] getReaderClasses(Format fileFormat);


    public abstract String[] getWriterClasses(Format fileFormat);

    public MovieReader getReader(Format fileFormat, File file) {
        String[] clazz = getReaderClasses(fileFormat);
        for (int i = 0; i < clazz.length; i++) {
            try {
                return ((MovieReader) Class.forName(clazz[i]).getConstructor(File.class).newInstance(file));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }

    public MovieWriter getWriter(File file) {
        Format format = getFileFormat(file);
        return format == null ? null : getWriter(format, file);
    }

    public MovieWriter getWriter(Format fileFormat, File file) {
        String[] clazz = getWriterClasses(fileFormat);
        for (int i = 0; i < clazz.length; i++) {
            try {
                return ((MovieWriter) Class.forName(clazz[i]).getConstructor(File.class).newInstance(file));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }

    public MovieReader getReader(File file) {
        Format format = getFileFormat(file);
        return format == null ? null : getReader(format, file);
    }

    public abstract void putFileFormat(String extension, Format format);

    public abstract Format getFileFormat(File file);

    public abstract Format[] getReaderFormats();

    public abstract Format[] getWriterFormats();

    public abstract Format[] getFileFormats();

    public abstract String getExtension(Format ff);


    public ArrayList suggestOutputFormats(Format inputMediaFormat, Format outputFileFormat) {
        ArrayList formats = new ArrayList();
        Format matchFormat = new Format(
                MimeTypeKey, outputFileFormat.get(MimeTypeKey),
                MediaTypeKey, inputMediaFormat.get(MediaTypeKey));
        Codec[] codecs = getEncoders(matchFormat);
        int matchingCount = 0;
        for (Codec c : codecs) {
            for (Format mf : c.getOutputFormats(null)) {
                if (mf.matches(matchFormat)) {
                    if (inputMediaFormat.matchesWithout(mf, MimeTypeKey)) {

                        formats.add(0, mf.append(inputMediaFormat));
                        matchingCount++;
                    } else if (inputMediaFormat.matchesWithout(mf, MimeTypeKey, EncodingKey)) {

                        formats.add(matchingCount, mf.append(inputMediaFormat));
                    } else {

                        formats.add(mf.append(inputMediaFormat));
                    }
                }
            }
        }


        for (int i = formats.size() - 1; i >= 0; i--) {
            Format fi = formats.get(i);
            for (int j = i - 1; j >= 0; j--) {
                Format fj = formats.get(j);
                if (fi.matches(fj)) {
                    formats.remove(i);
                    break;
                }
            }
        }

        return formats;
    }

    public abstract void unregisterCodec(String codecClass);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy