package org.jcodec.scale;
import java.util.HashMap;
import java.util.Map;
import org.jcodec.common.model.ColorSpace;
import org.jcodec.common.model.Picture;
/**
* 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>>();
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);
}
public static Transform getTransform(ColorSpace from, ColorSpace to) {
Map<ColorSpace, Transform> map2 = map.get(from);
return map2 == null ? null : map2.get(to);
}
public static class Idential implements Transform {
@Override
public void transform(Picture src, Picture dst) {
for (int i = 0; i < 3; i++)
System.arraycopy(
src.getPlaneData(i),
0,
dst.getPlaneData(i),
0,
Math.min(src.getPlaneWidth(i) * src.getPlaneHeight(i),
dst.getPlaneWidth(i) * dst.getPlaneHeight(i)));
}
}
}