Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.26 KB | None | 0 0
  1. static void BypassImageNeon(rgbType* frameInput, rgbType* frameOutput)
  2. {
  3.     // Vector variable
  4.     uint8x8x4_t pixelVectorArray;
  5.     u32 i;
  6.     u8 shift = 128;
  7.     u8 factor = 2;
  8.  
  9.     int16x8_t factorVector = vdupq_n_s16(factor);
  10.     int16x8_t shiftVector = vdupq_n_s16(shift);
  11.  
  12.     for (i = 0; i < VMODE_640x480.size; i += 8)
  13.     {   // Vectorized pixel copy
  14.         // Load
  15.         pixelVectorArray = vld4_u8((u8*)&frameInput[i]);
  16.  
  17.         // Load into Q register
  18.         int16x8_t blueValue = (int16x8_t)vmovl_u8(pixelVectorArray.val[0]);
  19.         int16x8_t greenValue = (int16x8_t)vmovl_u8(pixelVectorArray.val[1]);
  20.         int16x8_t redValue = (int16x8_t)vmovl_u8(pixelVectorArray.val[2]);
  21.  
  22.         // calc contrast values
  23.         blueValue = vqaddq_s16(vshrq_n_s16(vmulq_s16(vsubq_s16(blueValue, shiftVector), factorVector), 4), shiftVector);
  24.         greenValue = vqaddq_s16(vshrq_n_s16(vmulq_s16(vsubq_s16(greenValue, shiftVector), factorVector), 4), shiftVector);
  25.         redValue = vqaddq_s16(vshrq_n_s16(vmulq_s16(vsubq_s16(redValue, shiftVector), factorVector), 4), shiftVector);
  26.  
  27.         // Move from Q register to D
  28.         pixelVectorArray.val[0] = vqmovun_s16(blueValue);
  29.         pixelVectorArray.val[1] = vqmovun_s16(greenValue);
  30.         pixelVectorArray.val[2] = vqmovun_s16(redValue);
  31.  
  32.         // Copy
  33.         vst4_u8((u8*)&frameOutput[i], pixelVectorArray);
  34.     }
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement