//GPUImageNativeLibrary.YUVtoRBGA(data, mWidth, mHeight, mGLRgbBuffer.array());
这个耗时有 15-20ms
//long start = System.currentTimeMillis(); LibYuv.NV21ToARGB(data, mWidth, mHeight, mGLRgbBuffer.array()); //Log.e("200", "NV21ToARGB cost: " + (System.currentTimeMillis() - start));
这个耗时有 1-3ms
前提是这个要LibYuv编译要打开 neon指令集才可以
jint LibYuv_NV21ToARGB(JNIEnv * env, jobject obj, jbyteArray yuv420sp, jint width, jint height, jintArray rgbOut) {
uint8_t *rgbData = (uint8_t *)((*env)->GetPrimitiveArrayCritical(env, rgbOut, 0));
jbyte* yuv = (jbyte*) (*env)->GetPrimitiveArrayCritical(env, yuv420sp, 0);
const uint8* src_y = yuv;
int src_stride_y = width;
const uint8* src_vu = src_y + width * height;
int src_stride_vu = (width + 1) / 2 * 2;;
int dst_stride_argb = width * 4;
NV12ToARGB(src_y, src_stride_y,
src_vu, src_stride_vu,
rgbData,dst_stride_argb,
width, height); //不知道为什么用NV21toARGB不行,有空再研究
(*env)->ReleasePrimitiveArrayCritical(env, rgbOut, rgbData, 0);
(*env)->ReleasePrimitiveArrayCritical(env, yuv420sp, yuv, 0);
}
libyuv: Android.mk
common_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon