使用Neon做快速的Endian变换

通过opengl得到的RGBA格式跟Delphi的TBitmap格式不一样,所有的字节是逆序的,neon指令一个时钟周期可以并行处理16个字节的Endian变换.参考了https://github.com/zbjornson/node-bswap这里的代码.

  1.  
  2. static void libenc_ARGBToBGRA(JNIEnv *env, jobject thiz, jbyteArray frame, jint src_width,
  3. jint src_height) {
  4. jbyte *argb_frame = env->GetByteArrayElements(frame, NULL);
  5. uint8_t * argb=(uint8_t *) argb_frame;
  6.  
  7. for (int p=0; p<src_height*src_width*4; p+=16, argb+=16)
  8. {
  9. uint8x16_t v = vld1q_u8(argb);
  10. v = vrev32q_u8(v);
  11. vst1q_u8(argb, v);
  12. }
  13.  
  14. env->ReleaseByteArrayElements(frame, argb_frame, JNI_ABORT);
  15. }