package org.jcodec.filters.color; import org.jcodec.common.model.Picture8Bit; import java.nio.ByteBuffer; /** * This class is part of JCodec ( www.jcodec.org ) * This software is distributed under FreeBSD License * * @author The JCodec project * */ public class CVTColorFilter { public void yuv422BitTObgr24(Picture8Bit yuv, ByteBuffer rgb32) { ByteBuffer y = ByteBuffer.wrap(yuv.getPlaneData(0)); ByteBuffer cb = ByteBuffer.wrap(yuv.getPlaneData(1)); ByteBuffer cr = ByteBuffer.wrap(yuv.getPlaneData(2)); while (y.hasRemaining()) { int c1 = (y.get() + 112) << 2; int c2 = (y.get() + 112) << 2; int d = cb.get() << 2; int e = cr.get() << 2; rgb32.put(blue(d, c1)); rgb32.put(green(d, e, c1)); rgb32.put(red(e, c1)); rgb32.put(blue(d, c2)); rgb32.put(green(d, e, c2)); rgb32.put(red(e, c2)); } } private static byte blue(int d, int c) { int blue = (1192 * c + 2064 * d + 512) >> 10; blue = blue < 0 ? 0 : (blue > 1023 ? 1023 : blue); return (byte)((blue >> 2) & 0xff); } private static byte green(int d, int e, int c) { int green = (1192 * c - 400 * d - 832 * e + 512) >> 10; green = green < 0 ? 0 : (green > 1023 ? 1023 : green); return (byte)((green >> 2) & 0xff); } private static byte red(int e, int c) { int red = (1192 * c + 1636 * e + 512) >> 10; red = red < 0 ? 0 : (red > 1023 ? 1023 : red); return (byte)((red >> 2) & 0xff); } }