package com.basic.security.utils; public class RotateUtil { // // public static byte[] rotateNV21(final byte[] yuv, // final int width, // final int height, // final int rotation) { // if (rotation == 0) return yuv; // if (rotation % 90 != 0 || rotation < 0 || rotation > 270) { // throw new IllegalArgumentException("0 <= rotation < 360, rotation % 90 == 0"); // } // // final byte[] output = new byte[yuv.length]; // final int frameSize = width * height; // final boolean swap = rotation % 180 != 0; // final boolean xflip = rotation % 270 != 0; // final boolean yflip = rotation >= 180; // // for (int j = 0; j < height; j++) { // for (int i = 0; i < width; i++) { // final int yIn = j * width + i; // final int uIn = frameSize + (j >> 1) * width + (i & ~1); // final int vIn = uIn + 1; // // final int wOut = swap ? height : width; // final int hOut = swap ? width : height; // final int iSwapped = swap ? j : i; // final int jSwapped = swap ? i : j; // final int iOut = xflip ? wOut - iSwapped - 1 : iSwapped; // final int jOut = yflip ? hOut - jSwapped - 1 : jSwapped; // // final int yOut = jOut * wOut + iOut; // final int uOut = frameSize + (jOut >> 1) * wOut + (iOut & ~1); // final int vOut = uOut + 1; // // output[yOut] = (byte)(0xff & yuv[yIn]); // output[uOut] = (byte)(0xff & yuv[uIn]); // output[vOut] = (byte)(0xff & yuv[vIn]); // } // } // return output; // } byte[] yuv3; byte[] yuv2; byte[] yuv1; public byte[] rotateYUV420Degree90(byte[] data, int imageWidth, int imageHeight) { if (yuv3 == null) { yuv3 = new byte[imageWidth * imageHeight * 3 / 2]; } int i = 0; for (int x = 0; x < imageWidth; x++) { for (int y = imageHeight - 1; y >= 0; y--) { yuv3[i] = data[y * imageWidth + x]; i++; } } i = imageWidth * imageHeight * 3 / 2 - 1; for (int x = imageWidth - 1; x > 0; x = x - 2) { for (int y = 0; y < imageHeight / 2; y++) { yuv3[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + x]; i--; yuv3[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + (x - 1)]; i--; } } return yuv3; } public byte[] rotateYUV420Degree180(byte[] data, int imageWidth, int imageHeight) { if (yuv2 == null) { yuv2 = new byte[imageWidth * imageHeight * 3 / 2]; } int i = 0; int count = 0; for (i = imageWidth * imageHeight - 1; i >= 0; i--) { yuv2[count] = data[i]; count++; } i = imageWidth * imageHeight * 3 / 2 - 1; for (i = imageWidth * imageHeight * 3 / 2 - 1; i >= imageWidth * imageHeight; i -= 2) { yuv2[count++] = data[i - 1]; yuv2[count++] = data[i]; } return yuv2; } public byte[] rotateYUV420Degree270(byte[] data, int imageWidth, int imageHeight) { if (yuv1 == null) { yuv1 = new byte[imageWidth * imageHeight * 3 / 2]; } int nWidth = 0, nHeight = 0; int wh = 0; int uvHeight = 0; if (imageWidth != nWidth || imageHeight != nHeight) { nWidth = imageWidth; nHeight = imageHeight; wh = imageWidth * imageHeight; uvHeight = imageHeight >> 1; } int k = 0; for (int i = 0; i < imageWidth; i++) { int nPos = 0; for (int j = 0; j < imageHeight; j++) { yuv1[k] = data[nPos + i]; k++; nPos += imageWidth; } } for (int i = 0; i < imageWidth; i += 2) { int nPos = wh; for (int j = 0; j < uvHeight; j++) { yuv1[k] = data[nPos + i]; yuv1[k + 1] = data[nPos + i + 1]; k += 2; nPos += imageWidth; } } return rotateYUV420Degree180(yuv1, imageWidth, imageHeight); } }