Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static void BypassImageNeon(rgbType* frameInput, rgbType* frameOutput)
- {
- // Vector variable
- uint8x8x4_t pixelVectorArray;
- u32 i;
- u8 shift = 128;
- u8 factor = 2;
- int16x8_t factorVector = vdupq_n_s16(factor);
- int16x8_t shiftVector = vdupq_n_s16(shift);
- for (i = 0; i < VMODE_640x480.size; i += 8)
- { // Vectorized pixel copy
- // Load
- pixelVectorArray = vld4_u8((u8*)&frameInput[i]);
- // Load into Q register
- int16x8_t blueValue = (int16x8_t)vmovl_u8(pixelVectorArray.val[0]);
- int16x8_t greenValue = (int16x8_t)vmovl_u8(pixelVectorArray.val[1]);
- int16x8_t redValue = (int16x8_t)vmovl_u8(pixelVectorArray.val[2]);
- // calc contrast values
- blueValue = vqaddq_s16(vshrq_n_s16(vmulq_s16(vsubq_s16(blueValue, shiftVector), factorVector), 4), shiftVector);
- greenValue = vqaddq_s16(vshrq_n_s16(vmulq_s16(vsubq_s16(greenValue, shiftVector), factorVector), 4), shiftVector);
- redValue = vqaddq_s16(vshrq_n_s16(vmulq_s16(vsubq_s16(redValue, shiftVector), factorVector), 4), shiftVector);
- // Move from Q register to D
- pixelVectorArray.val[0] = vqmovun_s16(blueValue);
- pixelVectorArray.val[1] = vqmovun_s16(greenValue);
- pixelVectorArray.val[2] = vqmovun_s16(redValue);
- // Copy
- vst4_u8((u8*)&frameOutput[i], pixelVectorArray);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement