mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Merge pull request #2358 from kwagyeman/kwabena/fixes_for_raw_streaming
boards/OPENMV_RT1060: Add support for RAW streaming.
This commit is contained in:
commit
d7eccdbb88
@ -146,10 +146,11 @@ void usbdbg_data_in(uint32_t size, usbdbg_write_callback_t write_callback) {
|
||||
case USBDBG_FRAME_SIZE: {
|
||||
// Return 0 if FB is locked or not ready.
|
||||
uint32_t buffer[3] = { 0 };
|
||||
// Try to lock FB. If header size == 0 frame is not ready
|
||||
buffer[2] = -1; // size < 0
|
||||
// Try to lock FB. If header size < 0 frame is not ready
|
||||
if (mutex_try_lock_alternate(&JPEG_FB()->lock, MUTEX_TID_IDE)) {
|
||||
// If header size == 0 frame is not ready
|
||||
if (JPEG_FB()->size == 0) {
|
||||
// If header size < 0 frame is not ready
|
||||
if (JPEG_FB()->size < 0) {
|
||||
// unlock FB
|
||||
mutex_unlock(&JPEG_FB()->lock, MUTEX_TID_IDE);
|
||||
} else {
|
||||
@ -170,7 +171,7 @@ void usbdbg_data_in(uint32_t size, usbdbg_write_callback_t write_callback) {
|
||||
xfer_offs += size;
|
||||
if (xfer_offs == xfer_size) {
|
||||
cmd = USBDBG_NONE;
|
||||
JPEG_FB()->w = 0; JPEG_FB()->h = 0; JPEG_FB()->size = 0;
|
||||
JPEG_FB()->w = 0; JPEG_FB()->h = 0; JPEG_FB()->size = -1;
|
||||
mutex_unlock(&JPEG_FB()->lock, MUTEX_TID_IDE);
|
||||
}
|
||||
}
|
||||
@ -203,6 +204,7 @@ void usbdbg_data_in(uint32_t size, usbdbg_write_callback_t write_callback) {
|
||||
|
||||
case USBDBG_GET_STATE: {
|
||||
uint32_t buffer[16] = { 0 };
|
||||
buffer[3] = -1; // size < 0
|
||||
|
||||
// Set script running flag
|
||||
if (script_running) {
|
||||
@ -215,10 +217,10 @@ void usbdbg_data_in(uint32_t size, usbdbg_write_callback_t write_callback) {
|
||||
buffer[0] |= USBDBG_STATE_FLAGS_TEXT;
|
||||
}
|
||||
|
||||
// Try to lock FB. If header size == 0 frame is not ready
|
||||
// Try to lock FB. If header size < 0 frame is not ready
|
||||
if (mutex_try_lock_alternate(&JPEG_FB()->lock, MUTEX_TID_IDE)) {
|
||||
// If header size == 0 frame is not ready
|
||||
if (JPEG_FB()->size == 0) {
|
||||
// If header size < 0 frame is not ready
|
||||
if (JPEG_FB()->size < 0) {
|
||||
// unlock FB
|
||||
mutex_unlock(&JPEG_FB()->lock, MUTEX_TID_IDE);
|
||||
} else {
|
||||
|
||||
@ -3009,12 +3009,6 @@ void imlib_draw_image(image_t *dst_img,
|
||||
hint &= ~(IMAGE_HINT_AREA | IMAGE_HINT_BILINEAR);
|
||||
}
|
||||
|
||||
// Bicbuic and bilinear both shift the image right by (0.5, 0.5) so we have to undo that.
|
||||
if (hint & (IMAGE_HINT_BICUBIC | IMAGE_HINT_BILINEAR)) {
|
||||
src_x_accum_reset -= 0x8000;
|
||||
src_y_accum_reset -= 0x8000;
|
||||
}
|
||||
|
||||
// rgb_channel extracted / color_palette applied image
|
||||
image_t new_src_img;
|
||||
|
||||
@ -3255,6 +3249,12 @@ void imlib_draw_image(image_t *dst_img,
|
||||
}
|
||||
#endif
|
||||
|
||||
// Bicbuic and bilinear both shift the image right by (0.5, 0.5) so we have to undo that.
|
||||
if (hint & (IMAGE_HINT_BICUBIC | IMAGE_HINT_BILINEAR)) {
|
||||
src_x_accum_reset -= 0x8000;
|
||||
src_y_accum_reset -= 0x8000;
|
||||
}
|
||||
|
||||
imlib_draw_row_data_t imlib_draw_row_data;
|
||||
imlib_draw_row_data.dst_img = dst_img;
|
||||
imlib_draw_row_data.src_img_pixfmt = src_img->pixfmt;
|
||||
|
||||
@ -86,6 +86,9 @@ void framebuffer_init0() {
|
||||
// Enable streaming.
|
||||
MAIN_FB()->streaming_enabled = true; // controlled by the OpenMV Cam.
|
||||
|
||||
// Set invalid size.
|
||||
JPEG_FB()->size = -1;
|
||||
|
||||
// Set default quality
|
||||
JPEG_FB()->quality = ((OMV_JPEG_QUALITY_HIGH - OMV_JPEG_QUALITY_LOW) / 2) + OMV_JPEG_QUALITY_LOW;
|
||||
|
||||
@ -117,7 +120,7 @@ static void jpegbuffer_init_from_image(image_t *img) {
|
||||
if (img == NULL) {
|
||||
jpeg_framebuffer->w = 0;
|
||||
jpeg_framebuffer->h = 0;
|
||||
jpeg_framebuffer->size = 0;
|
||||
jpeg_framebuffer->size = -1;
|
||||
} else {
|
||||
jpeg_framebuffer->w = img->w;
|
||||
jpeg_framebuffer->h = img->h;
|
||||
@ -167,29 +170,36 @@ void framebuffer_update_jpeg_buffer() {
|
||||
.size = OMV_JPEG_BUFFER_SIZE_MAX,
|
||||
.pixels = jpeg_framebuffer->pixels
|
||||
};
|
||||
|
||||
bool compress = true;
|
||||
bool overflow = false;
|
||||
if (0) {
|
||||
|
||||
#if OMV_RAW_PREVIEW_ENABLE
|
||||
} else if (src->is_mutable &&
|
||||
image_size(src) <= OMV_JPEG_BUFFER_SIZE_MAX) {
|
||||
if (src->is_mutable) {
|
||||
// Down-scale the frame (if necessary) and send the raw frame.
|
||||
dst.size = src->bpp;
|
||||
dst.pixfmt = src->pixfmt;
|
||||
if (src->w <= OMV_RAW_PREVIEW_WIDTH && src->h <= OMV_RAW_PREVIEW_HEIGHT) {
|
||||
memcpy(dst.pixels, src->pixels, image_size(src));
|
||||
} else {
|
||||
dst.w = OMV_RAW_PREVIEW_WIDTH;
|
||||
dst.h = OMV_RAW_PREVIEW_HEIGHT;
|
||||
if (src->w > src->h) {
|
||||
dst.h = fast_floorf(dst.h * (src->h / (float) src->w));
|
||||
} else if (src->h > src->w) {
|
||||
dst.w = fast_floorf(dst.w * (src->w / (float) src->h));
|
||||
if (image_size(&dst) <= OMV_JPEG_BUFFER_SIZE_MAX) {
|
||||
memcpy(dst.pixels, src->pixels, image_size(src));
|
||||
compress = false;
|
||||
}
|
||||
} else {
|
||||
float x_scale = OMV_RAW_PREVIEW_WIDTH / (float) src->w;
|
||||
float y_scale = OMV_RAW_PREVIEW_HEIGHT / (float) src->h;
|
||||
float scale = IM_MIN(x_scale, y_scale);
|
||||
dst.w = fast_floorf(src->w * scale);
|
||||
dst.h = fast_floorf(src->h * scale);
|
||||
if (image_size(&dst) <= OMV_JPEG_BUFFER_SIZE_MAX) {
|
||||
imlib_draw_image(&dst, src, 0, 0, scale, scale, NULL, -1, 255, NULL, NULL,
|
||||
IMAGE_HINT_BILINEAR | IMAGE_HINT_BLACK_BACKGROUND, NULL, NULL, NULL);
|
||||
compress = false;
|
||||
}
|
||||
imlib_draw_image(&dst, src, 0, 0, 1.0f, 1.0f, NULL, -1, 255,
|
||||
NULL, NULL, IMAGE_HINT_BILINEAR, NULL, NULL, NULL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
|
||||
if (compress) {
|
||||
// For all other formats, send a compressed frame.
|
||||
overflow = jpeg_compress(src, &dst, jpeg_framebuffer->quality, false, JPEG_SUBSAMPLING_AUTO);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user