Regalamiunsorriso/decompiled-libs/www/acxent-videoj-1.0.0/org/jcodec/scale/Yuv420pToYuv422p.java

57 lines
2.3 KiB
Java

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];
}
}
}