package com.basic.security.utils; import java.nio.ByteBuffer; public class RotateUtil { byte[] yuv3; byte[] yuv2; byte[] yuv1; public static ByteBuffer[] nv21ToI420(byte[] data, int width, int height) { ByteBuffer byteBufferArray[] = new ByteBuffer[3]; int total = width * height; byte[] ret = new byte[total]; byte[] u = new byte[total / 4]; byte[] v = new byte[total / 4]; ByteBuffer bufferY = ByteBuffer.wrap(ret, 0, total); ByteBuffer bufferU = ByteBuffer.wrap(u, 0, total / 4); ByteBuffer bufferV = ByteBuffer.wrap(v, 0, total / 4); // // ByteBuffer bufferY = ByteBuffer.wrap(ret, 0, total); // ByteBuffer bufferU = ByteBuffer.wrap(ret, total, total / 4); // ByteBuffer bufferV = ByteBuffer.wrap(ret, total + total / 4, total / 4); bufferY.put(data, 0, total); for (int i = total; i < data.length; i += 2) { bufferV.put(data[i]); bufferU.put(data[i + 1]); } byteBufferArray[0] = bufferY; byteBufferArray[1] = bufferU; byteBufferArray[2] = bufferV; // return ret; return byteBufferArray; } public static void mirror(byte[] src, int w, int h) { //src是原始yuv数组 int i; int index; byte temp; int a, b; //mirror y for (i = 0; i < h; i++) { a = i * w; b = (i + 1) * w - 1; while (a < b) { temp = src[a]; src[a] = src[b]; src[b] = temp; a++; b--; } } // mirror u and v index = w * h; for (i = 0; i < h / 2; i++) { a = i * w; b = (i + 1) * w - 2; while (a < b) { temp = src[a + index]; src[a + index] = src[b + index]; src[b + index] = temp; temp = src[a + index + 1]; src[a + index + 1] = src[b + index + 1]; src[b + index + 1] = temp; a += 2; b -= 2; } } } 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); } private byte[] rotateYUVDegree270(byte[] data, int imageWidth, int imageHeight) { byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2]; // Rotate the Y luma int i = 0; for (int x = imageWidth - 1; x >= 0; x--) { for (int y = 0; y < imageHeight; y++) { yuv[i] = data[y * imageWidth + x]; i++; } }// Rotate the U and V color components i = imageWidth * imageHeight; for (int x = imageWidth - 1; x > 0; x = x - 2) { for (int y = 0; y < imageHeight / 2; y++) { yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + (x - 1)]; i++; yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + x]; i++; } } return yuv; } }