package org.jcodec.scale; import org.jcodec.common.model.Picture; public class Yuv420pToYuv422p implements Transform { public void transform(Picture src, Picture 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 k = 0; k < strideSrc; k++) { dest[offD] = src[srcOff++]; offD += stepX; } int lastOff = offD - stepX; for (int m = strideSrc * stepX; m < strideDest; m += stepX) { dest[offD] = dest[lastOff]; offD += stepX; } offD += (stepY - 1) * strideDest; } int lastLine = offD - stepY * strideDest; for (int j = heightSrc * stepY; j < heightDst; j += stepY) { for (int k = 0; k < strideDest; k += stepX) { dest[offD] = dest[lastLine + k]; 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 m = 0; m < srcWidth; m++) dest[dstOff++] = src[srcOff++]; for (int k = srcWidth; k < dstWidth; k++) dest[dstOff++] = dest[srcWidth - 1]; } int lastLine = (height - 1) * dstWidth; for (int j = height; j < dstHeight; j++) { for (int k = 0; k < dstWidth; k++) dest[dstOff++] = dest[lastLine + k]; } } }