package org.jcodec.scale; import static java.lang.System.arraycopy; import org.jcodec.common.model.ColorSpace; import org.jcodec.common.model.Picture; import org.jcodec.common.model.Picture8Bit; import java.util.HashMap; import java.util.Map; /** * This class is part of JCodec ( www.jcodec.org ) This software is distributed * under FreeBSD License * * @author The JCodec project * */ public class ColorUtil { private static Map<ColorSpace, Map<ColorSpace, Transform>> map = new HashMap<ColorSpace, Map<ColorSpace, Transform>>(); private static Map<ColorSpace, Map<ColorSpace, Transform8Bit>> map8Bit = new HashMap<ColorSpace, Map<ColorSpace, Transform8Bit>>(); static { Map<ColorSpace, Transform> rgb = new HashMap<ColorSpace, Transform>(); rgb.put(ColorSpace.RGB, new Idential()); rgb.put(ColorSpace.YUV420, new RgbToYuv420p(0, 0)); rgb.put(ColorSpace.YUV420J, new RgbToYuv420j()); rgb.put(ColorSpace.YUV422, new RgbToYuv422p(0, 0)); rgb.put(ColorSpace.YUV422_10, new RgbToYuv422p(2, 0)); map.put(ColorSpace.RGB, rgb); Map<ColorSpace, Transform> yuv420 = new HashMap<ColorSpace, Transform>(); yuv420.put(ColorSpace.YUV420, new Idential()); yuv420.put(ColorSpace.RGB, new Yuv420pToRgb(0, 0)); yuv420.put(ColorSpace.YUV422, new Yuv420pToYuv422p(0, 0)); yuv420.put(ColorSpace.YUV422_10, new Yuv420pToYuv422p(0, 2)); map.put(ColorSpace.YUV420, yuv420); Map<ColorSpace, Transform> yuv422 = new HashMap<ColorSpace, Transform>(); yuv422.put(ColorSpace.YUV422, new Idential()); yuv422.put(ColorSpace.RGB, new Yuv422pToRgb(0, 0)); yuv422.put(ColorSpace.YUV420, new Yuv422pToYuv420p(0, 0)); yuv422.put(ColorSpace.YUV420J, new Yuv422pToYuv420j(0, 0)); map.put(ColorSpace.YUV422, yuv422); Map<ColorSpace, Transform> yuv422_10 = new HashMap<ColorSpace, Transform>(); yuv422_10.put(ColorSpace.YUV422_10, new Idential()); yuv422_10.put(ColorSpace.RGB, new Yuv422pToRgb(2, 0)); yuv422_10.put(ColorSpace.YUV420, new Yuv422pToYuv420p(0, 2)); yuv422_10.put(ColorSpace.YUV420J, new Yuv422pToYuv420j(0, 2)); map.put(ColorSpace.YUV422_10, yuv422_10); Map<ColorSpace, Transform> yuv444 = new HashMap<ColorSpace, Transform>(); yuv444.put(ColorSpace.YUV444, new Idential()); yuv444.put(ColorSpace.RGB, new Yuv444pToRgb(0, 0)); yuv444.put(ColorSpace.YUV420, new Yuv444pToYuv420p(0, 0)); map.put(ColorSpace.YUV444, yuv444); Map<ColorSpace, Transform> yuv444_10 = new HashMap<ColorSpace, Transform>(); yuv444_10.put(ColorSpace.YUV444_10, new Idential()); yuv444_10.put(ColorSpace.RGB, new Yuv444pToRgb(2, 0)); yuv444_10.put(ColorSpace.YUV420, new Yuv444pToYuv420p(0, 2)); map.put(ColorSpace.YUV444_10, yuv444_10); Map<ColorSpace, Transform> yuv420j = new HashMap<ColorSpace, Transform>(); yuv420j.put(ColorSpace.YUV420J, new Idential()); yuv420j.put(ColorSpace.RGB, new Yuv420jToRgb()); yuv420j.put(ColorSpace.YUV420, new Yuv420jToYuv420()); map.put(ColorSpace.YUV420J, yuv420j); Map<ColorSpace, Transform> yuv422j = new HashMap<ColorSpace, Transform>(); yuv422j.put(ColorSpace.YUV422J, new Idential()); yuv422j.put(ColorSpace.RGB, new Yuv422jToRgb()); yuv422j.put(ColorSpace.YUV420, new Yuv422jToYuv420p()); yuv422j.put(ColorSpace.YUV420J, new Yuv422pToYuv420p(0, 0)); map.put(ColorSpace.YUV422J, yuv422j); Map<ColorSpace, Transform> yuv444j = new HashMap<ColorSpace, Transform>(); yuv444j.put(ColorSpace.YUV444J, new Idential()); yuv444j.put(ColorSpace.RGB, new Yuv444jToRgb()); yuv444j.put(ColorSpace.YUV420, new Yuv444jToYuv420p()); yuv444j.put(ColorSpace.YUV420J, new Yuv444pToYuv420p(0, 0)); map.put(ColorSpace.YUV444J, yuv444j); Map<ColorSpace, Transform8Bit> rgb8Bit = new HashMap<ColorSpace, Transform8Bit>(); rgb8Bit.put(ColorSpace.RGB, new Idential8Bit()); rgb8Bit.put(ColorSpace.YUV420J, new RgbToYuv420j8Bit()); rgb8Bit.put(ColorSpace.YUV420, new RgbToYuv420p8Bit()); rgb8Bit.put(ColorSpace.YUV422, new RgbToYuv422p8Bit()); map8Bit.put(ColorSpace.RGB, rgb8Bit); Map<ColorSpace, Transform8Bit> yuv4208Bit = new HashMap<ColorSpace, Transform8Bit>(); yuv4208Bit.put(ColorSpace.YUV420, new Idential8Bit()); yuv4208Bit.put(ColorSpace.YUV422, new Yuv420pToYuv422p8Bit()); yuv4208Bit.put(ColorSpace.RGB, new Yuv420pToRgb8Bit()); yuv4208Bit.put(ColorSpace.YUV420J, new Idential8Bit()); map8Bit.put(ColorSpace.YUV420, yuv4208Bit); Map<ColorSpace, Transform8Bit> yuv4228Bit = new HashMap<ColorSpace, Transform8Bit>(); yuv4228Bit.put(ColorSpace.YUV422, new Idential8Bit()); yuv4228Bit.put(ColorSpace.YUV420, new Yuv422pToYuv420p8Bit()); yuv4228Bit.put(ColorSpace.YUV420J, new Yuv422pToYuv420p8Bit()); yuv4228Bit.put(ColorSpace.RGB, new Yuv422pToRgb8Bit()); map8Bit.put(ColorSpace.YUV422, yuv4228Bit); Map<ColorSpace, Transform8Bit> yuv4448Bit = new HashMap<ColorSpace, Transform8Bit>(); yuv4448Bit.put(ColorSpace.YUV444, new Idential8Bit()); map8Bit.put(ColorSpace.YUV444, yuv4448Bit); Map<ColorSpace, Transform8Bit> yuv420j8Bit = new HashMap<ColorSpace, Transform8Bit>(); yuv420j8Bit.put(ColorSpace.YUV420J, new Idential8Bit()); yuv420j8Bit.put(ColorSpace.YUV422, new Yuv420pToYuv422p8Bit()); yuv420j8Bit.put(ColorSpace.RGB, new Yuv420jToRgb8Bit()); yuv420j8Bit.put(ColorSpace.YUV420, new Idential8Bit()); map8Bit.put(ColorSpace.YUV420J, yuv420j8Bit); } @Deprecated public static Transform getTransform(ColorSpace from, ColorSpace to) { Map<ColorSpace, Transform> map2 = map.get(from); return map2 == null ? null : map2.get(to); } public static Transform8Bit getTransform8Bit(ColorSpace from, ColorSpace to) { Map<ColorSpace, Transform8Bit> map2 = map8Bit.get(from); return map2 == null ? null : map2.get(to); } @Deprecated public static class Idential implements Transform { @Override public void transform(Picture src, Picture dst) { for (int i = 0; i < 3; i++) arraycopy(src.getPlaneData(i), 0, dst.getPlaneData(i), 0, Math.min( src.getPlaneWidth(i) * src.getPlaneHeight(i), dst.getPlaneWidth(i) * dst.getPlaneHeight(i))); } } public static class Idential8Bit implements Transform8Bit { @Override public void transform(Picture8Bit src, Picture8Bit dst) { for (int i = 0; i < Math.min(src.getData().length, dst.getData().length); i++) arraycopy(src.getPlaneData(i), 0, dst.getPlaneData(i), 0, Math.min(src.getPlaneData(i).length, dst.getPlaneData(i).length)); } } }