Add full debayering support

This commit is contained in:
Kwabena W. Agyeman 2021-09-09 14:06:16 -07:00
parent d5ad043c30
commit 3ed668ab5b
7 changed files with 1093 additions and 941 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2728,7 +2728,7 @@ void imlib_draw_image(image_t *dst_img, image_t *src_img, int dst_x_start, int d
switch (new_src_img.pixfmt) {
case PIXFORMAT_BINARY: {
if (src_img->is_bayer) {
imlib_debayer_image_to_binary(&new_src_img, src_img);
imlib_debayer_image(&new_src_img, src_img);
} else if (src_img->pixfmt == PIXFORMAT_JPEG) {
jpeg_decompress_image_to_binary(&new_src_img, src_img);
}
@ -2736,7 +2736,7 @@ void imlib_draw_image(image_t *dst_img, image_t *src_img, int dst_x_start, int d
}
case PIXFORMAT_GRAYSCALE: {
if (src_img->is_bayer) {
imlib_debayer_image_to_grayscale(&new_src_img, src_img);
imlib_debayer_image(&new_src_img, src_img);
} else if (src_img->pixfmt == PIXFORMAT_JPEG) {
jpeg_decompress_image_to_grayscale(&new_src_img, src_img);
}
@ -2744,7 +2744,7 @@ void imlib_draw_image(image_t *dst_img, image_t *src_img, int dst_x_start, int d
}
case PIXFORMAT_RGB565: {
if (src_img->is_bayer) {
imlib_debayer_image_to_rgb565(&new_src_img, src_img);
imlib_debayer_image(&new_src_img, src_img);
} else if (src_img->pixfmt == PIXFORMAT_JPEG) {
jpeg_decompress_image_to_rgb565(&new_src_img, src_img);
}
@ -2888,7 +2888,7 @@ void imlib_draw_image(image_t *dst_img, image_t *src_img, int dst_x_start, int d
for (int i = src_y_index; i < src_y_index_end; i++) {
uint8_t *src_row_ptr = IMAGE_COMPUTE_GRAYSCALE_PIXEL_ROW_PTR(src_img, i) + src_x_index;
int n = width;
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
#if defined(ARM_MATH_DSP)
uint16_t *src_row_ptr16 = (uint16_t *) src_row_ptr;
for (; n > 1; n -= 2) {
@ -2906,7 +2906,7 @@ void imlib_draw_image(image_t *dst_img, image_t *src_img, int dst_x_start, int d
for (int i = src_y_index; i < src_y_index_end; i++) {
uint8_t *src_row_ptr = IMAGE_COMPUTE_GRAYSCALE_PIXEL_ROW_PTR(src_img, i) + src_x_index;
int n = width;
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
#if defined(ARM_MATH_DSP)
uint32_t *src_row_ptr32 = (uint32_t *) src_row_ptr;
for (; n > 3; n -= 4) {
@ -2972,7 +2972,7 @@ void imlib_draw_image(image_t *dst_img, image_t *src_img, int dst_x_start, int d
for (int i = src_y_index; i < src_y_index_end; i++) {
uint16_t *src_row_ptr = IMAGE_COMPUTE_RGB565_PIXEL_ROW_PTR(src_img, i) + src_x_index;
int n = width;
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
#if defined(ARM_MATH_DSP)
uint32_t *src_row_ptr32 = (uint32_t *) src_row_ptr;
for (; n > 1; n -= 2) {
@ -3248,7 +3248,7 @@ void imlib_draw_image(image_t *dst_img, image_t *src_img, int dst_x_start, int d
for (int i = src_y_index_p_1; i < src_y_index_end; i++) {
uint8_t *src_row_ptr = IMAGE_COMPUTE_GRAYSCALE_PIXEL_ROW_PTR(src_img, i) + src_x_index_p_1;
int n = x_width_m_2;
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
#if defined(ARM_MATH_DSP)
uint16_t *src_row_ptr16 = (uint16_t *) src_row_ptr;
for (; n > 1; n -= 2) {
@ -3266,7 +3266,7 @@ void imlib_draw_image(image_t *dst_img, image_t *src_img, int dst_x_start, int d
for (int i = src_y_index_p_1; i < src_y_index_end; i++) {
uint8_t *src_row_ptr = IMAGE_COMPUTE_GRAYSCALE_PIXEL_ROW_PTR(src_img, i) + src_x_index_p_1;
int n = x_width_m_2;
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
#if defined(ARM_MATH_DSP)
uint32_t *src_row_ptr32 = (uint32_t *) src_row_ptr;
for (; n > 4; n -= 4) {
@ -3447,7 +3447,7 @@ void imlib_draw_image(image_t *dst_img, image_t *src_img, int dst_x_start, int d
for (int i = src_y_index_p_1; i < src_y_index_end; i++) {
uint16_t *src_row_ptr = IMAGE_COMPUTE_RGB565_PIXEL_ROW_PTR(src_img, i) + src_x_index_p_1;
int n = x_width_m_2;
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
#if defined(ARM_MATH_DSP)
uint32_t *src_row_ptr32 = (uint32_t *) src_row_ptr;
for (; n > 1; n -= 2) {
@ -3945,7 +3945,7 @@ void imlib_draw_image(image_t *dst_img, image_t *src_img, int dst_x_start, int d
int src_x_index = next_src_x_index;
int src_x_index_m_1 = src_x_index - 1;
int src_x_index_p_1 = src_x_index + 1;
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
#if defined(ARM_MATH_DSP)
uint32_t pixel_row_0[2], pixel_row_1[2], pixel_row_2[2], pixel_row_3[2];
// Column 0 = Bits[15:0]
// Column 1 = Bits[31:16]
@ -4623,22 +4623,11 @@ void imlib_draw_image(image_t *dst_img, image_t *src_img, int dst_x_start, int d
case PIXFORMAT_BAYER_ANY: {
while (y_not_done) {
switch (is_bayer_or_jpeg_pixfmt) {
case PIXFORMAT_BINARY: {
uint32_t *dst_row_ptr = imlib_draw_row_get_row_buffer(&imlib_draw_row_data);
imlib_debayer_line_to_binary(dst_x_start, dst_x_end, next_src_y_index,
dst_row_ptr, src_img);
break;
}
case PIXFORMAT_GRAYSCALE: {
uint8_t *dst_row_ptr = imlib_draw_row_get_row_buffer(&imlib_draw_row_data);
imlib_debayer_line_to_grayscale(dst_x_start, dst_x_end, next_src_y_index,
dst_row_ptr, src_img);
break;
}
case PIXFORMAT_BINARY:
case PIXFORMAT_GRAYSCALE:
case PIXFORMAT_RGB565: {
uint16_t *dst_row_ptr = imlib_draw_row_get_row_buffer(&imlib_draw_row_data);
imlib_debayer_line_to_rgb565(dst_x_start, dst_x_end, next_src_y_index,
dst_row_ptr, src_img);
imlib_debayer_line(dst_x_start, dst_x_end, next_src_y_index,
imlib_draw_row_get_row_buffer(&imlib_draw_row_data), is_bayer_or_jpeg_pixfmt, src_img);
break;
}
case PIXFORMAT_BAYER_ANY: { // Bayer images have the same shape as grayscale.

View File

@ -94,7 +94,7 @@ void gif_add_frame(FIL *fp, image_t *img, uint16_t delay)
write_byte(fp, 1 + block_size);
write_byte(fp, 0x80); // clear code
uint16_t pixels[block_size];
imlib_debayer_line_to_rgb565(0, block_size, y, pixels, img);
imlib_debayer_line(0, block_size, y, pixels, PIXFORMAT_RGB565, img);
for (int x=0; x<block_size; x++) {
int r = COLOR_RGB565_TO_R8(pixels[x]);
int g = COLOR_RGB565_TO_G8(pixels[x]);

View File

@ -1013,12 +1013,8 @@ void imlib_fill_image_from_float(image_t *img, int w, int h, float *data, float
bool mirror, bool flip, bool dst_transpose, bool src_transpose);
// Bayer Image Processing
void imlib_debayer_line_to_binary(int x_start, int x_end, int y_row, uint32_t *dst_row_ptr, image_t *src);
void imlib_debayer_image_to_binary(image_t *dst, image_t *src);
void imlib_debayer_line_to_grayscale(int x_start, int x_end, int y_row, uint8_t *dst_row_ptr, image_t *src);
void imlib_debayer_image_to_grayscale(image_t *dst, image_t *src);
void imlib_debayer_line_to_rgb565(int x_start, int x_end, int y_row, uint16_t *dst_row_ptr, image_t *src);
void imlib_debayer_image_to_rgb565(image_t *dst, image_t *src);
void imlib_debayer_line(int x_start, int x_end, int y_row, void *dst_row_ptr, pixformat_t pixfmt, image_t *src);
void imlib_debayer_image(image_t *dst, image_t *src);
/* Color space functions */
int8_t imlib_rgb565_to_l(uint16_t pixel);

View File

@ -243,28 +243,116 @@ static void jpeg_get_mcu(image_t *src, int x_offset, int y_offset, int dx, int d
uint32_t row_grgr_2 = *((uint32_t *) (rowptr_grgr_2 + x));
uint32_t row_bgbg_3 = *((uint32_t *) (rowptr_bgbg_3 + x));
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
int row_01 = __UHADD8(row_grgr_0, row_grgr_2);
int r_pixels_0, g_pixels_0, b_pixels_0;
switch (src->pixfmt) {
case PIXFORMAT_BAYER_BGGR: {
#if defined(ARM_MATH_DSP)
int row_02 = __UHADD8(row_grgr_0, row_grgr_2);
int row_1g = __UHADD8(row_bgbg_1, __PKHTB(row_bgbg_1, row_bgbg_1, 16));
int r_pixels_0 = __UXTB16(__UHADD8(row_01, __PKHTB(row_01, row_01, 16)));
int g_pixels_0 = __UXTB16(__UHADD8(row_1g, __PKHTB(row_1g, row_01, 8)));
int b_pixels_0 = __UXTB16_RORn(__UHADD8(row_bgbg_1, __PKHBT(row_bgbg_1, row_bgbg_1, 16)), 8);
r_pixels_0 = __UXTB16(__UHADD8(row_02, __PKHTB(row_02, row_02, 16)));
g_pixels_0 = __UXTB16(__UHADD8(row_1g, __PKHTB(row_1g, row_02, 8)));
b_pixels_0 = __UXTB16_RORn(__UHADD8(row_bgbg_1, __PKHBT(row_bgbg_1, row_bgbg_1, 16)), 8);
#else
int r0 = ((row_grgr_0 & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
int r2 = (((row_grgr_0 >> 16) & 0xFF) + ((row_grgr_2 >> 16) & 0xFF)) >> 1;
int r_pixels_0 = (r2 << 16) | ((r0 + r2) >> 1);
r_pixels_0 = (r2 << 16) | ((r0 + r2) >> 1);
int g0 = (row_grgr_0 >> 8) & 0xFF;
int g1 = (((row_bgbg_1 >> 16) & 0xFF) + (row_bgbg_1 & 0xFF)) >> 1;
int g2 = (row_grgr_2 >> 8) & 0xFF;
int g_pixels_0 = (row_bgbg_1 & 0xFF0000) | ((((g0 + g2) >> 1) + g1) >> 1);
g_pixels_0 = (row_bgbg_1 & 0xFF0000) | ((((g0 + g2) >> 1) + g1) >> 1);
int b1 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_1 >> 8) & 0xFF)) >> 1;
int b_pixels_0 = (b1 << 16) | ((row_bgbg_1 >> 8) & 0xFF);
b_pixels_0 = (b1 << 16) | ((row_bgbg_1 >> 8) & 0xFF);
#endif
break;
}
case PIXFORMAT_BAYER_GBRG: {
#if defined(ARM_MATH_DSP)
int row_02 = __UHADD8(row_grgr_0, row_grgr_2);
int row_1g = __UHADD8(row_bgbg_1, __PKHBT(row_bgbg_1, row_bgbg_1, 16));
r_pixels_0 = __UXTB16_RORn(__UHADD8(row_02, __PKHBT(row_02, row_02, 16)), 8);
g_pixels_0 = __UXTB16_RORn(__UHADD8(row_1g, __PKHBT(row_1g, row_02, 8)), 8);
b_pixels_0 = __UXTB16(__UHADD8(row_bgbg_1, __PKHTB(row_bgbg_1, row_bgbg_1, 16)));
#else
int r0 = (((row_grgr_0 >> 8) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
int r2 = (((row_grgr_0 >> 24) & 0xFF) + ((row_grgr_2 >> 24) & 0xFF)) >> 1;
r_pixels_0 = r0 | (((r0 + r2) >> 1) << 16);
int g0 = (row_grgr_0 >> 16) & 0xFF;
int g1 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_1 >> 8) & 0xFF)) >> 1;
int g2 = (row_grgr_2 >> 16) & 0xFF;
g_pixels_0 = ((row_bgbg_1 >> 8) & 0xFF) | (((((g0 + g2) >> 1) + g1) >> 1) << 16);
int b1 = (((row_bgbg_1 >> 16) & 0xFF) + (row_bgbg_1 & 0xFF)) >> 1;
b_pixels_0 = b1 | (row_bgbg_1 & 0xFF0000);
#endif
break;
}
case PIXFORMAT_BAYER_GRBG: {
#if defined(ARM_MATH_DSP)
int row_02 = __UHADD8(row_grgr_0, row_grgr_2);
int row_1g = __UHADD8(row_bgbg_1, __PKHBT(row_bgbg_1, row_bgbg_1, 16));
r_pixels_0 = __UXTB16(__UHADD8(row_bgbg_1, __PKHTB(row_bgbg_1, row_bgbg_1, 16)));
g_pixels_0 = __UXTB16_RORn(__UHADD8(row_1g, __PKHBT(row_1g, row_02, 8)), 8);
b_pixels_0 = __UXTB16_RORn(__UHADD8(row_02, __PKHBT(row_02, row_02, 16)), 8);
#else
int r1 = (((row_bgbg_1 >> 16) & 0xFF) + (row_bgbg_1 & 0xFF)) >> 1;
r_pixels_0 = r1 | (row_bgbg_1 & 0xFF0000);
int g0 = (row_grgr_0 >> 16) & 0xFF;
int g1 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_1 >> 8) & 0xFF)) >> 1;
int g2 = (row_grgr_2 >> 16) & 0xFF;
g_pixels_0 = ((row_bgbg_1 >> 8) & 0xFF) | (((((g0 + g2) >> 1) + g1) >> 1) << 16);
int b0 = (((row_grgr_0 >> 8) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
int b2 = (((row_grgr_0 >> 24) & 0xFF) + ((row_grgr_2 >> 24) & 0xFF)) >> 1;
b_pixels_0 = b0 | (((b0 + b2) >> 1) << 16);
#endif
break;
}
case PIXFORMAT_BAYER_RGGB: {
#if defined(ARM_MATH_DSP)
int row_02 = __UHADD8(row_grgr_0, row_grgr_2);
int row_1g = __UHADD8(row_bgbg_1, __PKHTB(row_bgbg_1, row_bgbg_1, 16));
r_pixels_0 = __UXTB16_RORn(__UHADD8(row_bgbg_1, __PKHBT(row_bgbg_1, row_bgbg_1, 16)), 8);
g_pixels_0 = __UXTB16(__UHADD8(row_1g, __PKHTB(row_1g, row_02, 8)));
b_pixels_0 = __UXTB16(__UHADD8(row_02, __PKHTB(row_02, row_02, 16)));
#else
int r1 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_1 >> 8) & 0xFF)) >> 1;
r_pixels_0 = (r1 << 16) | ((row_bgbg_1 >> 8) & 0xFF);
int g0 = (row_grgr_0 >> 8) & 0xFF;
int g1 = (((row_bgbg_1 >> 16) & 0xFF) + (row_bgbg_1 & 0xFF)) >> 1;
int g2 = (row_grgr_2 >> 8) & 0xFF;
g_pixels_0 = (row_bgbg_1 & 0xFF0000) | ((((g0 + g2) >> 1) + g1) >> 1);
int b0 = ((row_grgr_0 & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
int b2 = (((row_grgr_0 >> 16) & 0xFF) + ((row_grgr_2 >> 16) & 0xFF)) >> 1;
b_pixels_0 = (b2 << 16) | ((b0 + b2) >> 1);
#endif
break;
}
default: {
r_pixels_0 = 0;
g_pixels_0 = 0;
b_pixels_0 = 0;
break;
}
}
int y0 = ((r_pixels_0 * 38) + (g_pixels_0 * 75) + (b_pixels_0 * 15)) >> 7;
@ -290,28 +378,116 @@ static void jpeg_get_mcu(image_t *src, int x_offset, int y_offset, int dx, int d
CR[index_e] = v0, CR[index_e + 1] = v0 >> 16;
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
int r_pixels_1, g_pixels_1, b_pixels_1;
switch (src->pixfmt) {
case PIXFORMAT_BAYER_BGGR: {
#if defined(ARM_MATH_DSP)
int row_13 = __UHADD8(row_bgbg_1, row_bgbg_3);
int row_2g = __UHADD8(row_grgr_2, __PKHBT(row_grgr_2, row_grgr_2, 16));
int r_pixels_1 = __UXTB16(__UHADD8(row_grgr_2, __PKHTB(row_grgr_2, row_grgr_2, 16)));
int g_pixels_1 = __UXTB16_RORn(__UHADD8(row_2g, __PKHBT(row_2g, row_13, 8)), 8);
int b_pixels_1 = __UXTB16_RORn(__UHADD8(row_13, __PKHBT(row_13, row_13, 16)), 8);
r_pixels_1 = __UXTB16(__UHADD8(row_grgr_2, __PKHTB(row_grgr_2, row_grgr_2, 16)));
g_pixels_1 = __UXTB16_RORn(__UHADD8(row_2g, __PKHBT(row_2g, row_13, 8)), 8);
b_pixels_1 = __UXTB16_RORn(__UHADD8(row_13, __PKHBT(row_13, row_13, 16)), 8);
#else
r2 = (((row_grgr_2 >> 16) & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
int r_pixels_1 = (row_grgr_2 & 0xFF0000) | r2;
int r2 = (((row_grgr_2 >> 16) & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
r_pixels_1 = (row_grgr_2 & 0xFF0000) | r2;
g1 = (row_bgbg_1 >> 16) & 0xFF;
g2 = (((row_grgr_2 >> 24) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
int g1 = (row_bgbg_1 >> 16) & 0xFF;
int g2 = (((row_grgr_2 >> 24) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
int g3 = (row_bgbg_3 >> 16) & 0xFF;
int g_pixels_1 = (((((g1 + g3) >> 1) + g2) >> 1) << 16) | ((row_grgr_2 >> 8) & 0xFF);
g_pixels_1 = (((((g1 + g3) >> 1) + g2) >> 1) << 16) | ((row_grgr_2 >> 8) & 0xFF);
b1 = (((row_bgbg_1 >> 8) & 0xFF) + ((row_bgbg_3 >> 8) & 0xFF)) >> 1;
int b1 = (((row_bgbg_1 >> 8) & 0xFF) + ((row_bgbg_3 >> 8) & 0xFF)) >> 1;
int b3 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_3 >> 24) & 0xFF)) >> 1;
int b_pixels_1 = (((b1 + b3) >> 1) << 16) | b1;
b_pixels_1 = (((b1 + b3) >> 1) << 16) | b1;
#endif
break;
}
case PIXFORMAT_BAYER_GBRG: {
#if defined(ARM_MATH_DSP)
int row_13 = __UHADD8(row_bgbg_1, row_bgbg_3);
int row_2g = __UHADD8(row_grgr_2, __PKHTB(row_grgr_2, row_grgr_2, 16));
r_pixels_1 = __UXTB16_RORn(__UHADD8(row_grgr_2, __PKHBT(row_grgr_2, row_grgr_2, 16)), 8);
g_pixels_1 = __UXTB16(__UHADD8(row_2g, __PKHTB(row_2g, row_13, 8)));
b_pixels_1 = __UXTB16(__UHADD8(row_13, __PKHTB(row_13, row_13, 16)));
#else
int r2 = (((row_grgr_2 >> 24) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
r_pixels_1 = ((row_grgr_2 >> 8) & 0xFF) | (r2 << 16);
int g1 = (row_bgbg_1 >> 8) & 0xFF;
int g2 = (((row_grgr_2 >> 16) & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
int g3 = (row_bgbg_3 >> 8) & 0xFF;
g_pixels_1 = ((((g1 + g3) >> 1) + g2) >> 1) | (row_grgr_2 & 0xFF0000);
int b1 = ((row_bgbg_1 & 0xFF) + (row_bgbg_3 & 0xFF)) >> 1;
int b3 = (((row_bgbg_1 >> 16) & 0xFF) + ((row_bgbg_3 >> 16) & 0xFF)) >> 1;
b_pixels_1 = ((b1 + b3) >> 1) | (b3 << 16);
#endif
break;
}
case PIXFORMAT_BAYER_GRBG: {
#if defined(ARM_MATH_DSP)
int row_13 = __UHADD8(row_bgbg_1, row_bgbg_3);
int row_2g = __UHADD8(row_grgr_2, __PKHTB(row_grgr_2, row_grgr_2, 16));
r_pixels_1 = __UXTB16(__UHADD8(row_13, __PKHTB(row_13, row_13, 16)));
g_pixels_1 = __UXTB16(__UHADD8(row_2g, __PKHTB(row_2g, row_13, 8)));
b_pixels_1 = __UXTB16_RORn(__UHADD8(row_grgr_2, __PKHBT(row_grgr_2, row_grgr_2, 16)), 8);
#else
int r1 = ((row_bgbg_1 & 0xFF) + (row_bgbg_3 & 0xFF)) >> 1;
int r3 = (((row_bgbg_1 >> 16) & 0xFF) + ((row_bgbg_3 >> 16) & 0xFF)) >> 1;
r_pixels_1 = ((r1 + r3) >> 1) | (r3 << 16);
int g1 = (row_bgbg_1 >> 8) & 0xFF;
int g2 = (((row_grgr_2 >> 16) & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
int g3 = (row_bgbg_3 >> 8) & 0xFF;
g_pixels_1 = ((((g1 + g3) >> 1) + g2) >> 1) | (row_grgr_2 & 0xFF0000);
int b2 = (((row_grgr_2 >> 24) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
b_pixels_1 = ((row_grgr_2 >> 8) & 0xFF) | (b2 << 16);
#endif
break;
}
case PIXFORMAT_BAYER_RGGB: {
#if defined(ARM_MATH_DSP)
int row_13 = __UHADD8(row_bgbg_1, row_bgbg_3);
int row_2g = __UHADD8(row_grgr_2, __PKHBT(row_grgr_2, row_grgr_2, 16));
r_pixels_1 = __UXTB16_RORn(__UHADD8(row_13, __PKHBT(row_13, row_13, 16)), 8);
g_pixels_1 = __UXTB16_RORn(__UHADD8(row_2g, __PKHBT(row_2g, row_13, 8)), 8);
b_pixels_1 = __UXTB16(__UHADD8(row_grgr_2, __PKHTB(row_grgr_2, row_grgr_2, 16)));
#else
int r1 = (((row_bgbg_1 >> 8) & 0xFF) + ((row_bgbg_3 >> 8) & 0xFF)) >> 1;
int r3 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_3 >> 24) & 0xFF)) >> 1;
r_pixels_1 = (((r1 + r3) >> 1) << 16) | r1;
int g1 = (row_bgbg_1 >> 16) & 0xFF;
int g2 = (((row_grgr_2 >> 24) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
int g3 = (row_bgbg_3 >> 16) & 0xFF;
g_pixels_1 = (((((g1 + g3) >> 1) + g2) >> 1) << 16) | ((row_grgr_2 >> 8) & 0xFF);
int b2 = (((row_grgr_2 >> 16) & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
b_pixels_1 = (row_grgr_2 & 0xFF0000) | b2;
#endif
break;
}
default: {
r_pixels_1 = 0;
g_pixels_1 = 0;
b_pixels_1 = 0;
break;
}
}
int y1 = ((r_pixels_1 * 38) + (g_pixels_1 * 75) + (b_pixels_1 * 15)) >> 7;
@ -430,28 +606,116 @@ static void jpeg_get_mcu(image_t *src, int x_offset, int y_offset, int dx, int d
row_bgbg_3 = *((uint32_t *) (rowptr_bgbg_3 + x - 1));
}
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
int row_01 = __UHADD8(row_grgr_0, row_grgr_2);
int r_pixels_0, g_pixels_0, b_pixels_0;
switch (src->pixfmt) {
case PIXFORMAT_BAYER_BGGR: {
#if defined(ARM_MATH_DSP)
int row_02 = __UHADD8(row_grgr_0, row_grgr_2);
int row_1g = __UHADD8(row_bgbg_1, __PKHTB(row_bgbg_1, row_bgbg_1, 16));
int r_pixels_0 = __UXTB16(__UHADD8(row_01, __PKHTB(row_01, row_01, 16)));
int g_pixels_0 = __UXTB16(__UHADD8(row_1g, __PKHTB(row_1g, row_01, 8)));
int b_pixels_0 = __UXTB16_RORn(__UHADD8(row_bgbg_1, __PKHBT(row_bgbg_1, row_bgbg_1, 16)), 8);
r_pixels_0 = __UXTB16(__UHADD8(row_02, __PKHTB(row_02, row_02, 16)));
g_pixels_0 = __UXTB16(__UHADD8(row_1g, __PKHTB(row_1g, row_02, 8)));
b_pixels_0 = __UXTB16_RORn(__UHADD8(row_bgbg_1, __PKHBT(row_bgbg_1, row_bgbg_1, 16)), 8);
#else
int r0 = ((row_grgr_0 & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
int r2 = (((row_grgr_0 >> 16) & 0xFF) + ((row_grgr_2 >> 16) & 0xFF)) >> 1;
int r_pixels_0 = (r2 << 16) | ((r0 + r2) >> 1);
r_pixels_0 = (r2 << 16) | ((r0 + r2) >> 1);
int g0 = (row_grgr_0 >> 8) & 0xFF;
int g1 = (((row_bgbg_1 >> 16) & 0xFF) + (row_bgbg_1 & 0xFF)) >> 1;
int g2 = (row_grgr_2 >> 8) & 0xFF;
int g_pixels_0 = (row_bgbg_1 & 0xFF0000) | ((((g0 + g2) >> 1) + g1) >> 1);
g_pixels_0 = (row_bgbg_1 & 0xFF0000) | ((((g0 + g2) >> 1) + g1) >> 1);
int b1 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_1 >> 8) & 0xFF)) >> 1;
int b_pixels_0 = (b1 << 16) | ((row_bgbg_1 >> 8) & 0xFF);
b_pixels_0 = (b1 << 16) | ((row_bgbg_1 >> 8) & 0xFF);
#endif
break;
}
case PIXFORMAT_BAYER_GBRG: {
#if defined(ARM_MATH_DSP)
int row_02 = __UHADD8(row_grgr_0, row_grgr_2);
int row_1g = __UHADD8(row_bgbg_1, __PKHBT(row_bgbg_1, row_bgbg_1, 16));
r_pixels_0 = __UXTB16_RORn(__UHADD8(row_02, __PKHBT(row_02, row_02, 16)), 8);
g_pixels_0 = __UXTB16_RORn(__UHADD8(row_1g, __PKHBT(row_1g, row_02, 8)), 8);
b_pixels_0 = __UXTB16(__UHADD8(row_bgbg_1, __PKHTB(row_bgbg_1, row_bgbg_1, 16)));
#else
int r0 = (((row_grgr_0 >> 8) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
int r2 = (((row_grgr_0 >> 24) & 0xFF) + ((row_grgr_2 >> 24) & 0xFF)) >> 1;
r_pixels_0 = r0 | (((r0 + r2) >> 1) << 16);
int g0 = (row_grgr_0 >> 16) & 0xFF;
int g1 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_1 >> 8) & 0xFF)) >> 1;
int g2 = (row_grgr_2 >> 16) & 0xFF;
g_pixels_0 = ((row_bgbg_1 >> 8) & 0xFF) | (((((g0 + g2) >> 1) + g1) >> 1) << 16);
int b1 = (((row_bgbg_1 >> 16) & 0xFF) + (row_bgbg_1 & 0xFF)) >> 1;
b_pixels_0 = b1 | (row_bgbg_1 & 0xFF0000);
#endif
break;
}
case PIXFORMAT_BAYER_GRBG: {
#if defined(ARM_MATH_DSP)
int row_02 = __UHADD8(row_grgr_0, row_grgr_2);
int row_1g = __UHADD8(row_bgbg_1, __PKHBT(row_bgbg_1, row_bgbg_1, 16));
r_pixels_0 = __UXTB16(__UHADD8(row_bgbg_1, __PKHTB(row_bgbg_1, row_bgbg_1, 16)));
g_pixels_0 = __UXTB16_RORn(__UHADD8(row_1g, __PKHBT(row_1g, row_02, 8)), 8);
b_pixels_0 = __UXTB16_RORn(__UHADD8(row_02, __PKHBT(row_02, row_02, 16)), 8);
#else
int r1 = (((row_bgbg_1 >> 16) & 0xFF) + (row_bgbg_1 & 0xFF)) >> 1;
r_pixels_0 = r1 | (row_bgbg_1 & 0xFF0000);
int g0 = (row_grgr_0 >> 16) & 0xFF;
int g1 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_1 >> 8) & 0xFF)) >> 1;
int g2 = (row_grgr_2 >> 16) & 0xFF;
g_pixels_0 = ((row_bgbg_1 >> 8) & 0xFF) | (((((g0 + g2) >> 1) + g1) >> 1) << 16);
int b0 = (((row_grgr_0 >> 8) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
int b2 = (((row_grgr_0 >> 24) & 0xFF) + ((row_grgr_2 >> 24) & 0xFF)) >> 1;
b_pixels_0 = b0 | (((b0 + b2) >> 1) << 16);
#endif
break;
}
case PIXFORMAT_BAYER_RGGB: {
#if defined(ARM_MATH_DSP)
int row_02 = __UHADD8(row_grgr_0, row_grgr_2);
int row_1g = __UHADD8(row_bgbg_1, __PKHTB(row_bgbg_1, row_bgbg_1, 16));
r_pixels_0 = __UXTB16_RORn(__UHADD8(row_bgbg_1, __PKHBT(row_bgbg_1, row_bgbg_1, 16)), 8);
g_pixels_0 = __UXTB16(__UHADD8(row_1g, __PKHTB(row_1g, row_02, 8)));
b_pixels_0 = __UXTB16(__UHADD8(row_02, __PKHTB(row_02, row_02, 16)));
#else
int r1 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_1 >> 8) & 0xFF)) >> 1;
r_pixels_0 = (r1 << 16) | ((row_bgbg_1 >> 8) & 0xFF);
int g0 = (row_grgr_0 >> 8) & 0xFF;
int g1 = (((row_bgbg_1 >> 16) & 0xFF) + (row_bgbg_1 & 0xFF)) >> 1;
int g2 = (row_grgr_2 >> 8) & 0xFF;
g_pixels_0 = (row_bgbg_1 & 0xFF0000) | ((((g0 + g2) >> 1) + g1) >> 1);
int b0 = ((row_grgr_0 & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
int b2 = (((row_grgr_0 >> 16) & 0xFF) + ((row_grgr_2 >> 16) & 0xFF)) >> 1;
b_pixels_0 = (b2 << 16) | ((b0 + b2) >> 1);
#endif
break;
}
default: {
r_pixels_0 = 0;
g_pixels_0 = 0;
b_pixels_0 = 0;
break;
}
}
int y0 = ((r_pixels_0 * 38) + (g_pixels_0 * 75) + (b_pixels_0 * 15)) >> 7;
@ -477,28 +741,116 @@ static void jpeg_get_mcu(image_t *src, int x_offset, int y_offset, int dx, int d
CR[index_e] = v0, CR[index_e + 1] = v0 >> 16;
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
int r_pixels_1, g_pixels_1, b_pixels_1;
switch (src->pixfmt) {
case PIXFORMAT_BAYER_BGGR: {
#if defined(ARM_MATH_DSP)
int row_13 = __UHADD8(row_bgbg_1, row_bgbg_3);
int row_2g = __UHADD8(row_grgr_2, __PKHBT(row_grgr_2, row_grgr_2, 16));
int r_pixels_1 = __UXTB16(__UHADD8(row_grgr_2, __PKHTB(row_grgr_2, row_grgr_2, 16)));
int g_pixels_1 = __UXTB16_RORn(__UHADD8(row_2g, __PKHBT(row_2g, row_13, 8)), 8);
int b_pixels_1 = __UXTB16_RORn(__UHADD8(row_13, __PKHBT(row_13, row_13, 16)), 8);
r_pixels_1 = __UXTB16(__UHADD8(row_grgr_2, __PKHTB(row_grgr_2, row_grgr_2, 16)));
g_pixels_1 = __UXTB16_RORn(__UHADD8(row_2g, __PKHBT(row_2g, row_13, 8)), 8);
b_pixels_1 = __UXTB16_RORn(__UHADD8(row_13, __PKHBT(row_13, row_13, 16)), 8);
#else
r2 = (((row_grgr_2 >> 16) & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
int r_pixels_1 = (row_grgr_2 & 0xFF0000) | r2;
int r2 = (((row_grgr_2 >> 16) & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
r_pixels_1 = (row_grgr_2 & 0xFF0000) | r2;
g1 = (row_bgbg_1 >> 16) & 0xFF;
g2 = (((row_grgr_2 >> 24) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
int g1 = (row_bgbg_1 >> 16) & 0xFF;
int g2 = (((row_grgr_2 >> 24) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
int g3 = (row_bgbg_3 >> 16) & 0xFF;
int g_pixels_1 = (((((g1 + g3) >> 1) + g2) >> 1) << 16) | ((row_grgr_2 >> 8) & 0xFF);
g_pixels_1 = (((((g1 + g3) >> 1) + g2) >> 1) << 16) | ((row_grgr_2 >> 8) & 0xFF);
b1 = (((row_bgbg_1 >> 8) & 0xFF) + ((row_bgbg_3 >> 8) & 0xFF)) >> 1;
int b1 = (((row_bgbg_1 >> 8) & 0xFF) + ((row_bgbg_3 >> 8) & 0xFF)) >> 1;
int b3 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_3 >> 24) & 0xFF)) >> 1;
int b_pixels_1 = (((b1 + b3) >> 1) << 16) | b1;
b_pixels_1 = (((b1 + b3) >> 1) << 16) | b1;
#endif
break;
}
case PIXFORMAT_BAYER_GBRG: {
#if defined(ARM_MATH_DSP)
int row_13 = __UHADD8(row_bgbg_1, row_bgbg_3);
int row_2g = __UHADD8(row_grgr_2, __PKHTB(row_grgr_2, row_grgr_2, 16));
r_pixels_1 = __UXTB16_RORn(__UHADD8(row_grgr_2, __PKHBT(row_grgr_2, row_grgr_2, 16)), 8);
g_pixels_1 = __UXTB16(__UHADD8(row_2g, __PKHTB(row_2g, row_13, 8)));
b_pixels_1 = __UXTB16(__UHADD8(row_13, __PKHTB(row_13, row_13, 16)));
#else
int r2 = (((row_grgr_2 >> 24) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
r_pixels_1 = ((row_grgr_2 >> 8) & 0xFF) | (r2 << 16);
int g1 = (row_bgbg_1 >> 8) & 0xFF;
int g2 = (((row_grgr_2 >> 16) & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
int g3 = (row_bgbg_3 >> 8) & 0xFF;
g_pixels_1 = ((((g1 + g3) >> 1) + g2) >> 1) | (row_grgr_2 & 0xFF0000);
int b1 = ((row_bgbg_1 & 0xFF) + (row_bgbg_3 & 0xFF)) >> 1;
int b3 = (((row_bgbg_1 >> 16) & 0xFF) + ((row_bgbg_3 >> 16) & 0xFF)) >> 1;
b_pixels_1 = ((b1 + b3) >> 1) | (b3 << 16);
#endif
break;
}
case PIXFORMAT_BAYER_GRBG: {
#if defined(ARM_MATH_DSP)
int row_13 = __UHADD8(row_bgbg_1, row_bgbg_3);
int row_2g = __UHADD8(row_grgr_2, __PKHTB(row_grgr_2, row_grgr_2, 16));
r_pixels_1 = __UXTB16(__UHADD8(row_13, __PKHTB(row_13, row_13, 16)));
g_pixels_1 = __UXTB16(__UHADD8(row_2g, __PKHTB(row_2g, row_13, 8)));
b_pixels_1 = __UXTB16_RORn(__UHADD8(row_grgr_2, __PKHBT(row_grgr_2, row_grgr_2, 16)), 8);
#else
int r1 = ((row_bgbg_1 & 0xFF) + (row_bgbg_3 & 0xFF)) >> 1;
int r3 = (((row_bgbg_1 >> 16) & 0xFF) + ((row_bgbg_3 >> 16) & 0xFF)) >> 1;
r_pixels_1 = ((r1 + r3) >> 1) | (r3 << 16);
int g1 = (row_bgbg_1 >> 8) & 0xFF;
int g2 = (((row_grgr_2 >> 16) & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
int g3 = (row_bgbg_3 >> 8) & 0xFF;
g_pixels_1 = ((((g1 + g3) >> 1) + g2) >> 1) | (row_grgr_2 & 0xFF0000);
int b2 = (((row_grgr_2 >> 24) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
b_pixels_1 = ((row_grgr_2 >> 8) & 0xFF) | (b2 << 16);
#endif
break;
}
case PIXFORMAT_BAYER_RGGB: {
#if defined(ARM_MATH_DSP)
int row_13 = __UHADD8(row_bgbg_1, row_bgbg_3);
int row_2g = __UHADD8(row_grgr_2, __PKHBT(row_grgr_2, row_grgr_2, 16));
r_pixels_1 = __UXTB16_RORn(__UHADD8(row_13, __PKHBT(row_13, row_13, 16)), 8);
g_pixels_1 = __UXTB16_RORn(__UHADD8(row_2g, __PKHBT(row_2g, row_13, 8)), 8);
b_pixels_1 = __UXTB16(__UHADD8(row_grgr_2, __PKHTB(row_grgr_2, row_grgr_2, 16)));
#else
int r1 = (((row_bgbg_1 >> 8) & 0xFF) + ((row_bgbg_3 >> 8) & 0xFF)) >> 1;
int r3 = (((row_bgbg_1 >> 24) & 0xFF) + ((row_bgbg_3 >> 24) & 0xFF)) >> 1;
r_pixels_1 = (((r1 + r3) >> 1) << 16) | r1;
int g1 = (row_bgbg_1 >> 16) & 0xFF;
int g2 = (((row_grgr_2 >> 24) & 0xFF) + ((row_grgr_2 >> 8) & 0xFF)) >> 1;
int g3 = (row_bgbg_3 >> 16) & 0xFF;
g_pixels_1 = (((((g1 + g3) >> 1) + g2) >> 1) << 16) | ((row_grgr_2 >> 8) & 0xFF);
int b2 = (((row_grgr_2 >> 16) & 0xFF) + (row_grgr_2 & 0xFF)) >> 1;
b_pixels_1 = (row_grgr_2 & 0xFF0000) | b2;
#endif
break;
}
default: {
r_pixels_1 = 0;
g_pixels_1 = 0;
b_pixels_1 = 0;
break;
}
}
int y1 = ((r_pixels_1 * 38) + (g_pixels_1 * 75) + (b_pixels_1 * 15)) >> 7;

View File

@ -365,16 +365,16 @@ static void py_image_print(const mp_print_t *print, mp_obj_t self, mp_print_kind
&& image->pixels[0] == 0xFE
&& image->pixels[image->size-1] == 0xFE) {
// print for ide.
print->print_strn(print->data, (const char *) image->pixels, image->bpp);
print->print_strn(print->data, (const char *) image->pixels, image->size);
} else {
mp_printf(print, "{\"w\":%d, \"h\":%d, \"type\"=\"binary\", \"size\":%d}",
mp_printf(print, "{\"w\":%d, \"h\":%d, \"type\":\"%s\", \"size\":%d}",
image->w,
image->h,
(image->pixfmt == PIXFORMAT_BINARY) ? "Binary" :
(image->pixfmt == PIXFORMAT_GRAYSCALE) ? "Grayscale" :
(image->pixfmt == PIXFORMAT_RGB565) ? "RGB565" :
(image->pixfmt == PIXFORMAT_YUV422) ? "YUV422" :
(image->pixfmt == PIXFORMAT_JPEG) ? "JPEG" : "Bayer",
(image->pixfmt == PIXFORMAT_BINARY) ? "binary" :
(image->pixfmt == PIXFORMAT_GRAYSCALE) ? "grayscale" :
(image->pixfmt == PIXFORMAT_RGB565) ? "rgb565" :
(image->pixfmt == PIXFORMAT_YUV422) ? "yuv422" :
(image->pixfmt == PIXFORMAT_JPEG) ? "jpeg" : "bayer",
image_size(image));
}
}
@ -443,7 +443,7 @@ static mp_obj_t py_image_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value
case PIXFORMAT_JPEG: {
if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) {
mp_bound_slice_t slice;
if (!mp_seq_get_fast_slice_indexes(image->bpp, index, &slice)) {
if (!mp_seq_get_fast_slice_indexes(image->size, index, &slice)) {
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("only slices with step=1 (aka None) are supported"));
}
mp_obj_tuple_t *result = mp_obj_new_tuple(slice.stop - slice.start, NULL);
@ -452,7 +452,7 @@ static mp_obj_t py_image_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value
}
return result;
}
mp_uint_t i = mp_get_index(self->base.type, image->bpp, index, false);
mp_uint_t i = mp_get_index(self->base.type, image->size, index, false);
return mp_obj_new_int(image->data[i]);
}
default:
@ -552,7 +552,7 @@ static mp_obj_t py_image_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value
case PIXFORMAT_JPEG: {
if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) {
mp_bound_slice_t slice;
if (!mp_seq_get_fast_slice_indexes(image->bpp, index, &slice)) {
if (!mp_seq_get_fast_slice_indexes(image->size, index, &slice)) {
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("only slices with step=1 (aka None) are supported"));
}
if (MP_OBJ_IS_TYPE(value, &mp_type_list)) {
@ -571,7 +571,7 @@ static mp_obj_t py_image_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value
}
return mp_const_none;
}
mp_uint_t i = mp_get_index(self->base.type, image->bpp, index, false);
mp_uint_t i = mp_get_index(self->base.type, image->size, index, false);
image->data[i] = mp_obj_get_int(value);
return mp_const_none;
}
@ -700,7 +700,7 @@ STATIC mp_obj_t py_image_get_pixel(uint n_args, const mp_obj_t *args, mp_map_t *
}
case PIXFORMAT_BAYER_ANY:
if (arg_rgbtuple) {
uint16_t pixel; imlib_debayer_line_to_rgb565(arg_x, arg_x + 1, arg_y, &pixel, arg_img);
uint16_t pixel; imlib_debayer_line(arg_x, arg_x + 1, arg_y, &pixel, PIXFORMAT_RGB565, arg_img);
mp_obj_t pixel_tuple[3];
pixel_tuple[0] = mp_obj_new_int(COLOR_RGB565_TO_R8(pixel));
pixel_tuple[1] = mp_obj_new_int(COLOR_RGB565_TO_G8(pixel));
@ -951,6 +951,53 @@ static mp_obj_t py_image_to(pixformat_t pixfmt, const uint16_t *default_color_pa
(alpha_palette != NULL)) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Only bayer copying/cropping is supported!"));
} else {
bool shift_right = arg_roi.x % 2;
bool shift_down = arg_roi.y % 2;
switch (dst_img.pixfmt) {
case PIXFORMAT_BAYER_BGGR: {
if (shift_right && shift_down) {
dst_img.pixfmt = PIXFORMAT_BAYER_RGGB;
} else if (shift_right) {
dst_img.pixfmt = PIXFORMAT_BAYER_GBRG;
} else if (shift_down) {
dst_img.pixfmt = PIXFORMAT_BAYER_GRBG;
}
break;
}
case PIXFORMAT_BAYER_GBRG: {
if (shift_right && shift_down) {
dst_img.pixfmt = PIXFORMAT_BAYER_GRBG;
} else if (shift_right) {
dst_img.pixfmt = PIXFORMAT_BAYER_BGGR;
} else if (shift_down) {
dst_img.pixfmt = PIXFORMAT_BAYER_RGGB;
}
break;
}
case PIXFORMAT_BAYER_GRBG: {
if (shift_right && shift_down) {
dst_img.pixfmt = PIXFORMAT_BAYER_GBRG;
} else if (shift_right) {
dst_img.pixfmt = PIXFORMAT_BAYER_RGGB;
} else if (shift_down) {
dst_img.pixfmt = PIXFORMAT_BAYER_BGGR;
}
break;
}
case PIXFORMAT_BAYER_RGGB: {
if (shift_right && shift_down) {
dst_img.pixfmt = PIXFORMAT_BAYER_BGGR;
} else if (shift_right) {
dst_img.pixfmt = PIXFORMAT_BAYER_GRBG;
} else if (shift_down) {
dst_img.pixfmt = PIXFORMAT_BAYER_GBRG;
}
break;
}
default: {
break;
}
}
hint &= ~(IMAGE_HINT_AREA |
IMAGE_HINT_BICUBIC |
IMAGE_HINT_BILINEAR |
@ -1098,7 +1145,7 @@ static mp_obj_t py_image_compress(uint n_args, const mp_obj_t *args, mp_map_t *k
fb_alloc_mark();
image_t out = { .w=arg_img->w, .h=arg_img->h, .pixfmt=PIXFORMAT_JPEG, .size=0, .data=NULL }; // alloc in jpeg compress
PY_ASSERT_FALSE_MSG(jpeg_compress(arg_img, &out, arg_q, false), "Out of Memory!");
PY_ASSERT_TRUE_MSG(out.bpp <= image_size(arg_img), "Can't compress in place!");
PY_ASSERT_TRUE_MSG(out.size <= image_size(arg_img), "Can't compress in place!");
memcpy(arg_img->data, out.data, out.size);
arg_img->size = out.size;
fb_alloc_free_till_mark();

View File

@ -615,7 +615,7 @@ static void spi_tv_draw_image_cb_convert_grayscale(uint8_t *row_pointer_i, uint8
static void spi_tv_draw_image_cb_convert_rgb565(uint16_t *row_pointer_i, uint8_t *row_pointer_o)
{
for (int i = 0, j = 0; i < TV_WIDTH; i += 2, j += 3) {
#if defined(MCU_SERIES_F4) || defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7)
#if defined(ARM_MATH_DSP)
int pixels = *((uint32_t *) (row_pointer_i + i));
int r_pixels = ((pixels >> 8) & 0xf800f8) | ((pixels >> 13) & 0x70007);