diff --git a/src/omv/img/jpeg.c b/src/omv/img/jpeg.c index b1e3b054f..9843394c7 100644 --- a/src/omv/img/jpeg.c +++ b/src/omv/img/jpeg.c @@ -540,11 +540,11 @@ bool jpeg_compress(image_t *src, image_t *dst, int quality, bool realloc) jpeg_subsample_t jpeg_subsample; - if (quality > 70) { + if (quality > 60) { jpeg_subsample = JPEG_SUBSAMPLE_1x1; - } else if (quality > 50) { + } else if (quality > 35) { jpeg_subsample = JPEG_SUBSAMPLE_2x1; - } else { // <= 50 + } else { // <= 35 jpeg_subsample = JPEG_SUBSAMPLE_2x2; } @@ -572,6 +572,9 @@ bool jpeg_compress(image_t *src, image_t *dst, int quality, bool realloc) } DCY = jpeg_processDU(&jpeg_buf, YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); } + if (jpeg_buf.overflow) { + goto jpeg_overflow; + } } } else if (src->bpp == 2) {// TODO assuming RGB565 switch (jpeg_subsample) { @@ -620,6 +623,9 @@ bool jpeg_compress(image_t *src, image_t *dst, int quality, bool realloc) DCU = jpeg_processDU(&jpeg_buf, UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); DCV = jpeg_processDU(&jpeg_buf, VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); } + if (jpeg_buf.overflow) { + goto jpeg_overflow; + } } break; } @@ -674,6 +680,9 @@ bool jpeg_compress(image_t *src, image_t *dst, int quality, bool realloc) DCU = jpeg_processDU(&jpeg_buf, UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); DCV = jpeg_processDU(&jpeg_buf, VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); } + if (jpeg_buf.overflow) { + goto jpeg_overflow; + } } break; } @@ -750,6 +759,9 @@ bool jpeg_compress(image_t *src, image_t *dst, int quality, bool realloc) DCU = jpeg_processDU(&jpeg_buf, UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); DCV = jpeg_processDU(&jpeg_buf, VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); } + if (jpeg_buf.overflow) { + goto jpeg_overflow; + } } break; } @@ -771,6 +783,7 @@ bool jpeg_compress(image_t *src, image_t *dst, int quality, bool realloc) printf("time: %lums\n", HAL_GetTick() - start); #endif +jpeg_overflow: return jpeg_buf.overflow; } diff --git a/src/omv/sensor.c b/src/omv/sensor.c index 3fcbd7c99..397e0afc9 100644 --- a/src/omv/sensor.c +++ b/src/omv/sensor.c @@ -170,7 +170,7 @@ void sensor_init0() memset(JPEG_FB(), 0, sizeof(*JPEG_FB())); // Set default quality - JPEG_FB()->quality = 50; + JPEG_FB()->quality = 35; // Set fb_enabled JPEG_FB()->enabled = fb_enabled; @@ -636,7 +636,7 @@ int sensor_snapshot(image_t *image, line_filter_t line_filter_func, void *line_f } // No buffer overflow, increase quality up to max quality based on frame size if (overflow_count == 0 && - JPEG_FB()->quality < ((MAIN_FB_SIZE() > JPEG_QUALITY_THRESH) ? 50:75)) { + JPEG_FB()->quality < ((MAIN_FB_SIZE() > JPEG_QUALITY_THRESH) ? 35:60)) { JPEG_FB()->quality++; } // Set FB from JPEG image