diff --git a/src/omv/common/sensor.h b/src/omv/common/sensor.h index df39ec77b..43791f246 100644 --- a/src/omv/common/sensor.h +++ b/src/omv/common/sensor.h @@ -14,6 +14,18 @@ #include "omv_i2c.h" #include "imlib.h" +#define copy_transposed_line(dstp, srcp) \ + for (int i = MAIN_FB()->u, h = MAIN_FB()->v; i; i--) { \ + *dstp = *srcp++; \ + dstp += h; \ + } + +#define copy_transposed_line_rev16(dstp, srcp) \ + for (int i = MAIN_FB()->u, h = MAIN_FB()->v; i; i--) { \ + *dstp = __REV16(*srcp++); \ + dstp += h; \ + } + #define OV2640_SLV_ADDR (0x60) #define OV5640_SLV_ADDR (0x78) #define OV7725_SLV_ADDR (0x42) diff --git a/src/omv/ports/mimxrt/sensor.c b/src/omv/ports/mimxrt/sensor.c index ae574737b..4a1b9884f 100644 --- a/src/omv/ports/mimxrt/sensor.c +++ b/src/omv/ports/mimxrt/sensor.c @@ -36,18 +36,6 @@ static bool drop_frame = false; | CSI_CR1_FB1_DMA_DONE_INTEN_MASK) //CSI_CR1_RF_OR_INTEN_MASK -#define copy_line(dstp, srcp) \ - for (int i = MAIN_FB()->u, h = MAIN_FB()->v; i; i--) { \ - *dstp = *srcp++; \ - dstp += h; \ - } - -#define copy_line_rev(dstp, srcp) \ - for (int i = MAIN_FB()->u, h = MAIN_FB()->v; i; i--) { \ - *dstp = __REV16(*srcp++); \ - dstp += h; \ - } - void sensor_init0() { sensor_abort(true, false); @@ -315,7 +303,7 @@ void sensor_line_callback(uint32_t addr) { if (!sensor.transpose) { unaligned_memcpy(dst, src, MAIN_FB()->u); } else { - copy_line(dst, src); + copy_transposed_line(dst, src); } #endif break; @@ -328,14 +316,14 @@ void sensor_line_callback(uint32_t addr) { if (!sensor.transpose) { unaligned_memcpy(dst, src, MAIN_FB()->u); } else { - copy_line(dst, src); + copy_transposed_line(dst, src); } } else { // Extract Y channel from YUV. if (!sensor.transpose) { unaligned_2_to_1_memcpy(dst, src16, MAIN_FB()->u); } else { - copy_line(dst, src16); + copy_transposed_line(dst, src16); } } #endif @@ -350,13 +338,13 @@ void sensor_line_callback(uint32_t addr) { if (!sensor.transpose) { unaligned_memcpy_rev16(dst16, src16, MAIN_FB()->u); } else { - copy_line_rev(dst16, src16); + copy_transposed_line_rev16(dst16, src16); } } else { if (!sensor.transpose) { unaligned_memcpy(dst16, src16, MAIN_FB()->u * sizeof(uint16_t)); } else { - copy_line(dst16, src16); + copy_transposed_line(dst16, src16); } } #endif diff --git a/src/omv/ports/stm32/sensor.c b/src/omv/ports/stm32/sensor.c index 7806d6ec3..3843cc6c8 100644 --- a/src/omv/ports/stm32/sensor.c +++ b/src/omv/ports/stm32/sensor.c @@ -596,10 +596,7 @@ void DCMI_DMAConvCpltUser(uint32_t addr) { if (!sensor.transpose) { unaligned_memcpy(dst, src, MAIN_FB()->u); } else { - for (int i = MAIN_FB()->u, h = MAIN_FB()->v; i; i--) { - *dst = *src++; - dst += h; - } + copy_transposed_line(dst, src); } #endif break; @@ -612,20 +609,14 @@ void DCMI_DMAConvCpltUser(uint32_t addr) { if (!sensor.transpose) { unaligned_memcpy(dst, src, MAIN_FB()->u); } else { - for (int i = MAIN_FB()->u, h = MAIN_FB()->v; i; i--) { - *dst = *src++; - dst += h; - } + copy_transposed_line(dst, src); } } else { // Extract Y channel from YUV. if (!sensor.transpose) { unaligned_2_to_1_memcpy(dst, src16, MAIN_FB()->u); } else { - for (int i = MAIN_FB()->u, h = MAIN_FB()->v; i; i--) { - *dst = *src16++; - dst += h; - } + copy_transposed_line(dst, src16); } } #endif @@ -640,19 +631,13 @@ void DCMI_DMAConvCpltUser(uint32_t addr) { if (!sensor.transpose) { unaligned_memcpy_rev16(dst16, src16, MAIN_FB()->u); } else { - for (int i = MAIN_FB()->u, h = MAIN_FB()->v; i; i--) { - *dst16 = __REV16(*src16++); - dst16 += h; - } + copy_transposed_line_rev16(dst16, src16); } } else { if (!sensor.transpose) { unaligned_memcpy(dst16, src16, MAIN_FB()->u * sizeof(uint16_t)); } else { - for (int i = MAIN_FB()->u, h = MAIN_FB()->v; i; i--) { - *dst16 = *src16++; - dst16 += h; - } + copy_transposed_line(dst16, src16); } } #endif