57 lines
2.3 KiB
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];
|
|
}
|
|
}
|
|
}
|