package org.jcodec.scale;
import org.jcodec.common.model.Picture8Bit;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* @author The JCodec project
*
*/
public class Yuv420pToYuv422p8Bit implements Transform8Bit {
public Yuv420pToYuv422p8Bit() {
}
@Override
public void transform(Picture8Bit src, Picture8Bit dst) {
copy(src.getPlaneData(0), dst.getPlaneData(0), src.getWidth(), dst.getWidth(), dst.getHeight());
_copy(src.getPlaneData(1), dst.getPlaneData(1), 0, 0, 1, 2, src.getWidth() >> 1, dst.getWidth() >> 1,
src.getHeight() >> 1, dst.getHeight());
_copy(src.getPlaneData(1), dst.getPlaneData(1), 0, 1, 1, 2, src.getWidth() >> 1, dst.getWidth() >> 1,
src.getHeight() >> 1, dst.getHeight());
_copy(src.getPlaneData(2), dst.getPlaneData(2), 0, 0, 1, 2, src.getWidth() >> 1, dst.getWidth() >> 1,
src.getHeight() >> 1, dst.getHeight());
_copy(src.getPlaneData(2), dst.getPlaneData(2), 0, 1, 1, 2, src.getWidth() >> 1, dst.getWidth() >> 1,
src.getHeight() >> 1, dst.getHeight());
}
private static final void _copy(byte[] src, byte[] dest, int offX, int offY, int stepX, int stepY, int strideSrc,
int strideDest, int heightSrc, int heightDst) {
int offD = offX + offY * strideDest, srcOff = 0;
for (int i = 0; i < heightSrc; i++) {
for (int j = 0; j < strideSrc; j++) {
dest[offD] = src[srcOff++];
offD += stepX;
}
int lastOff = offD - stepX;
for (int j = strideSrc * stepX; j < strideDest; j += stepX) {
dest[offD] = dest[lastOff];
offD += stepX;
}
offD += (stepY - 1) * strideDest;
}
int lastLine = offD - stepY * strideDest;
for (int i = heightSrc * stepY; i < heightDst; i += stepY) {
for (int j = 0; j < strideDest; j += stepX) {
dest[offD] = dest[lastLine + j];
offD += stepX;
}
offD += (stepY - 1) * strideDest;
}
}
private static void copy(byte[] src, byte[] dest, int srcWidth, int dstWidth, int dstHeight) {
int height = src.length / srcWidth;
int dstOff = 0, srcOff = 0;
for (int i = 0; i < height; i++) {
for (int j = 0; j < srcWidth; j++) {
dest[dstOff++] = src[srcOff++];
}
for (int j = srcWidth; j < dstWidth; j++)
dest[dstOff++] = dest[srcWidth - 1];
}
int lastLine = (height - 1) * dstWidth;
for (int i = height; i < dstHeight; i++) {
for (int j = 0; j < dstWidth; j++) {
dest[dstOff++] = dest[lastLine + j];
}
}
}
}