Last active
February 4, 2024 17:06
-
-
Save wobbals/5725412 to your computer and use it in GitHub Desktop.
Inspired from http://stackoverflow.com/a/13055615/1308729
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private byte [] getYV12(int inputWidth, int inputHeight, Bitmap scaled) { | |
int [] argb = new int[inputWidth * inputHeight]; | |
scaled.getPixels(argb, 0, inputWidth, 0, 0, inputWidth, inputHeight); | |
byte [] yuv = new byte[inputWidth*inputHeight*3/2]; | |
encodeYV12(yuv, argb, inputWidth, inputHeight); | |
scaled.recycle(); | |
return yuv; | |
} | |
private void encodeYV12(byte[] yuv420sp, int[] argb, int width, int height) { | |
final int frameSize = width * height; | |
int yIndex = 0; | |
int uIndex = frameSize; | |
int vIndex = frameSize + (frameSize / 4); | |
int a, R, G, B, Y, U, V; | |
int index = 0; | |
for (int j = 0; j < height; j++) { | |
for (int i = 0; i < width; i++) { | |
a = (argb[index] & 0xff000000) >> 24; // a is not used obviously | |
R = (argb[index] & 0xff0000) >> 16; | |
G = (argb[index] & 0xff00) >> 8; | |
B = (argb[index] & 0xff) >> 0; | |
// well known RGB to YUV algorithm | |
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16; | |
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128; | |
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128; | |
// YV12 has a plane of Y and two chroma plans (U, V) planes each sampled by a factor of 2 | |
// meaning for every 4 Y pixels there are 1 V and 1 U. Note the sampling is every other | |
// pixel AND every other scanline. | |
yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y)); | |
if (j % 2 == 0 && index % 2 == 0) { | |
yuv420sp[uIndex++] = (byte)((V<0) ? 0 : ((V > 255) ? 255 : V)); | |
yuv420sp[vIndex++] = (byte)((U<0) ? 0 : ((U > 255) ? 255 : U)); | |
} | |
index ++; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment