使用Neon做快速的Endian变换
Submitted by hubdog on Wed, 2020-04-01 16:49
通过opengl得到的RGBA格式跟Delphi的TBitmap格式不一样,所有的字节是逆序的,neon指令一个时钟周期可以并行处理16个字节的Endian变换.参考了https://github.com/zbjornson/node-bswap这里的代码.
static void libenc_ARGBToBGRA(JNIEnv *env, jobject thiz, jbyteArray frame, jint src_width, jint src_height) { jbyte *argb_frame = env->GetByteArrayElements(frame, NULL); uint8_t * argb=(uint8_t *) argb_frame; for (int p=0; p<src_height*src_width*4; p+=16, argb+=16) { uint8x16_t v = vld1q_u8(argb); v = vrev32q_u8(v); vst1q_u8(argb, v); } env->ReleaseByteArrayElements(frame, argb_frame, JNI_ABORT); }