package org.korsakow.services.encoders.video; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; public class VideoEncoderFactory { public static VideoEncoderFactory getNewFactory() { return new VideoEncoderFactory(); } private static Collection<VideoEncoder.VideoEncoderDescription> descriptions = new ArrayList<VideoEncoder.VideoEncoderDescription>(); public static void addEncoder(VideoEncoder.VideoEncoderDescription description) { synchronized (descriptions) { descriptions.add(description); } } private final Collection<VideoCodec> requiredInputFormats = new HashSet<VideoCodec>(); private final Collection<VideoCodec> requiredOutputFormats = new HashSet<VideoCodec>(); private VideoEncoderFactory() { } public void addRequiredInputFormat(VideoCodec format) { requiredInputFormats.add(format); } public void addRequiredOutputFormat(VideoCodec format) { requiredOutputFormats.add(format); } public void clear() { requiredInputFormats.clear(); requiredOutputFormats.clear(); } public VideoEncoder createVideoEncoder() throws VideoEncoderException { List<VideoEncoder.VideoEncoderDescription> descs; synchronized (descriptions) { descs = new ArrayList<VideoEncoder.VideoEncoderDescription>(descriptions); } for (VideoEncoder.VideoEncoderDescription desc : descs) { if (!desc.getSupportedInputFormats().containsAll(requiredInputFormats)) continue; if (!desc.getSupportedOutputFormats().containsAll(requiredOutputFormats)) continue; VideoEncoder videoEncoder; try { videoEncoder = desc.getEncoderClass().newInstance(); } catch (InstantiationException e) { throw new VideoEncoderException(e); } catch (IllegalAccessException e) { throw new VideoEncoderException(e); } return videoEncoder; } throw new VideoEncoderException("No encoder matching the requirements was found"); } }