Support all rescaling aspects
This commit is contained in:
		
							
								
								
									
										5
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @@ -65,6 +65,9 @@ | |||||||
|     "thread": "cpp", |     "thread": "cpp", | ||||||
|     "cinttypes": "cpp", |     "cinttypes": "cpp", | ||||||
|     "typeinfo": "cpp", |     "typeinfo": "cpp", | ||||||
|     "fourcc.h": "c" |     "fourcc.h": "c", | ||||||
|  |     "device.h": "c", | ||||||
|  |     "log.h": "c", | ||||||
|  |     "buffer_list.h": "c" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,10 +6,25 @@ | |||||||
| #include "opts/log.h" | #include "opts/log.h" | ||||||
| #include "opts/fourcc.h" | #include "opts/fourcc.h" | ||||||
|  |  | ||||||
| void camera_init(camera_t *camera) | camera_t *camera_open(camera_options_t *options) | ||||||
| { | { | ||||||
|   memset(camera, 0, sizeof(*camera)); |   camera_t *camera = calloc(1, sizeof(camera_t)); | ||||||
|   camera->name = "CAMERA"; |   camera->name = "CAMERA"; | ||||||
|  |   camera->options = *options; | ||||||
|  |  | ||||||
|  |   if (camera_configure_input(camera) < 0) { | ||||||
|  |     goto error; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if (camera_set_params(camera) < 0) { | ||||||
|  |     goto error; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return camera; | ||||||
|  |  | ||||||
|  | error: | ||||||
|  |   camera_close(camera); | ||||||
|  |   return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| void camera_close(camera_t *camera) | void camera_close(camera_t *camera) | ||||||
| @@ -34,38 +49,32 @@ void camera_close(camera_t *camera) | |||||||
|   free(camera); |   free(camera); | ||||||
| } | } | ||||||
|  |  | ||||||
| camera_t *camera_open(camera_options_t *options) | link_t *camera_ensure_capture(camera_t *camera, buffer_list_t *capture) | ||||||
| { | { | ||||||
|   camera_t *camera = calloc(1, sizeof(camera_t)); |   for (int i = 0; i < camera->nlinks; i++) { | ||||||
|   camera->name = "CAMERA"; |     if (camera->links[i].source == capture) { | ||||||
|   camera->options = *options; |       return &camera->links[i]; | ||||||
|  |  | ||||||
|   switch (camera->options.type) { |  | ||||||
|   case CAMERA_V4L2: |  | ||||||
|     if (camera_configure_v4l2(camera) < 0) { |  | ||||||
|       goto error; |  | ||||||
|     } |     } | ||||||
|     break; |  | ||||||
|  |  | ||||||
|   case CAMERA_LIBCAMERA: |  | ||||||
|     if (camera_configure_libcamera(camera) < 0) { |  | ||||||
|       goto error; |  | ||||||
|     } |  | ||||||
|     break; |  | ||||||
|  |  | ||||||
|   default: |  | ||||||
|     LOG_ERROR(camera, "Unsupported camera type"); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (camera_set_params(camera) < 0) { |   link_t *link = &camera->links[camera->nlinks++]; | ||||||
|     goto error; |   link->source = capture; | ||||||
|   } |   return link; | ||||||
|  | } | ||||||
|  |  | ||||||
|   return camera; | void camera_capture_add_output(camera_t *camera, buffer_list_t *capture, buffer_list_t *output) | ||||||
|  | { | ||||||
|  |   link_t *link = camera_ensure_capture(camera, capture); | ||||||
|  |  | ||||||
| error: |   int nsinks; | ||||||
|   camera_close(camera); |   for (nsinks = 0; link->sinks[nsinks]; nsinks++); | ||||||
|   return NULL; |   link->sinks[nsinks] = output; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void camera_capture_set_callbacks(camera_t *camera, buffer_list_t *capture, link_callbacks_t callbacks) | ||||||
|  | { | ||||||
|  |   link_t *link = camera_ensure_capture(camera, capture); | ||||||
|  |   link->callbacks = callbacks; | ||||||
| } | } | ||||||
|  |  | ||||||
| int camera_set_params(camera_t *camera) | int camera_set_params(camera_t *camera) | ||||||
| @@ -76,6 +85,7 @@ int camera_set_params(camera_t *camera) | |||||||
|  |  | ||||||
|   // Set some defaults |   // Set some defaults | ||||||
|   for (int i = 0; i < 2; i++) { |   for (int i = 0; i < 2; i++) { | ||||||
|  |     device_set_option_list(camera->legacy_isp[2], camera->options.isp.options); | ||||||
|     device_set_option_string(camera->codec_jpeg[i], "compression_quality", "80"); |     device_set_option_string(camera->codec_jpeg[i], "compression_quality", "80"); | ||||||
|     device_set_option_string(camera->codec_h264[i], "video_bitrate_mode", "0"); |     device_set_option_string(camera->codec_h264[i], "video_bitrate_mode", "0"); | ||||||
|     device_set_option_string(camera->codec_h264[i], "video_bitrate", "5000000"); |     device_set_option_string(camera->codec_h264[i], "video_bitrate", "5000000"); | ||||||
| @@ -88,16 +98,6 @@ int camera_set_params(camera_t *camera) | |||||||
|     device_set_option_list(camera->codec_jpeg[i], camera->options.jpeg.options); |     device_set_option_list(camera->codec_jpeg[i], camera->options.jpeg.options); | ||||||
|     device_set_option_list(camera->codec_h264[i], camera->options.h264.options); |     device_set_option_list(camera->codec_h264[i], camera->options.h264.options); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // DEVICE_SET_OPTION(camera->camera, EXPOSURE, 2684); |  | ||||||
|   // DEVICE_SET_OPTION(camera->camera, ANALOGUE_GAIN, 938); |  | ||||||
|   // DEVICE_SET_OPTION(camera->camera, DIGITAL_GAIN, 512); |  | ||||||
|   // DEVICE_SET_OPTION(camera->camera, VBLANK, 1636); |  | ||||||
|   // DEVICE_SET_OPTION(camera->camera, HBLANK, 6906); |  | ||||||
|  |  | ||||||
|   // DEVICE_SET_OPTION(camera->isp_srgb, RED_BALANCE, 2120); |  | ||||||
|   // DEVICE_SET_OPTION(camera->isp_srgb, BLUE_BALANCE, 1472); |  | ||||||
|   // DEVICE_SET_OPTION(camera->isp_srgb, DIGITAL_GAIN, 1007); |  | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -70,10 +70,10 @@ link_t *camera_ensure_capture(camera_t *camera, buffer_list_t *capture); | |||||||
| void camera_capture_add_output(camera_t *camera, buffer_list_t *capture, buffer_list_t *output); | void camera_capture_add_output(camera_t *camera, buffer_list_t *capture, buffer_list_t *output); | ||||||
| void camera_capture_set_callbacks(camera_t *camera, buffer_list_t *capture, link_callbacks_t callbacks); | void camera_capture_set_callbacks(camera_t *camera, buffer_list_t *capture, link_callbacks_t callbacks); | ||||||
|  |  | ||||||
| int camera_configure_output(camera_t *camera, buffer_list_t *src_capture, int res); | int camera_configure_input(camera_t *camera); | ||||||
| int camera_configure_decoder(camera_t *camera, buffer_list_t *src_capture); | int camera_configure_decoder(camera_t *camera, buffer_list_t *src_capture); | ||||||
|  | int camera_configure_output_rescaler(camera_t *camera, buffer_list_t *src_capture, float high_div, float low_div); | ||||||
|  | int camera_configure_output(camera_t *camera, buffer_list_t *src_capture, int res); | ||||||
|  |  | ||||||
| int camera_configure_v4l2(camera_t *camera); |  | ||||||
| int camera_configure_libcamera(camera_t *camera); |  | ||||||
| int camera_configure_isp(camera_t *camera, buffer_list_t *src, float high_div, float low_div); | int camera_configure_isp(camera_t *camera, buffer_list_t *src, float high_div, float low_div); | ||||||
| int camera_configure_legacy_isp(camera_t *camera, buffer_list_t *src, float div, int res); | int camera_configure_legacy_isp(camera_t *camera, buffer_list_t *src, float div, int res); | ||||||
|   | |||||||
| @@ -22,20 +22,6 @@ int camera_configure_decoder(camera_t *camera, buffer_list_t *src_capture) | |||||||
|  |  | ||||||
|   camera_capture_add_output(camera, src_capture, decoder_output); |   camera_capture_add_output(camera, src_capture, decoder_output); | ||||||
|  |  | ||||||
|   if (camera_configure_output(camera, decoder_capture, 0) < 0) { |   return camera_configure_output_rescaler(camera, decoder_capture, | ||||||
|     return -1; |     camera->options.high_res_factor, camera->options.low_res_factor); | ||||||
|   } |  | ||||||
|  |  | ||||||
|   if (camera->options.low_res_factor > 1) { |  | ||||||
|     float div = camera->options.low_res_factor / camera->options.high_res_factor; |  | ||||||
|  |  | ||||||
|     if (camera_configure_legacy_isp(camera, decoder_capture, div, 1) < 0) { |  | ||||||
|       return -1; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   if (device_set_decoder_start(camera->decoder, true) < 0) { |  | ||||||
|     return -1; |  | ||||||
|   } |  | ||||||
|   return 0; |  | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										104
									
								
								device/camera/camera_input.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								device/camera/camera_input.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | |||||||
|  | #include "camera.h" | ||||||
|  |  | ||||||
|  | #include "device/buffer.h" | ||||||
|  | #include "device/buffer_list.h" | ||||||
|  | #include "device/device.h" | ||||||
|  | #include "device/links.h" | ||||||
|  | #include "opts/log.h" | ||||||
|  | #include "opts/fourcc.h" | ||||||
|  |  | ||||||
|  | static int camera_configure_input_v4l2(camera_t *camera) | ||||||
|  | { | ||||||
|  |   camera->camera = device_v4l2_open(camera->name, camera->options.path); | ||||||
|  |   if (!camera->camera) { | ||||||
|  |     return -1; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   camera->camera->opts.allow_dma = camera->options.allow_dma; | ||||||
|  |  | ||||||
|  |   if (strstr(camera->camera->bus_info, "usb")) { | ||||||
|  |     LOG_INFO(camera, "Disabling DMA since device uses USB (which is likely not working properly)."); | ||||||
|  |     camera->camera->opts.allow_dma = false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   buffer_list_t *camera_capture = device_open_buffer_list(camera->camera, true, camera->options.width, camera->options.height, camera->options.format, 0, camera->options.nbufs, true); | ||||||
|  |   if (!camera_capture) { | ||||||
|  |     return -1; | ||||||
|  |   } | ||||||
|  |   camera_capture->do_timestamps = true; | ||||||
|  |  | ||||||
|  |   if (camera->options.fps > 0) { | ||||||
|  |     camera_capture->fmt.interval_us = 1000 * 1000 / camera->options.fps; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   switch (camera_capture->fmt.format) { | ||||||
|  |   case V4L2_PIX_FMT_YUYV: | ||||||
|  |   case V4L2_PIX_FMT_YVYU: | ||||||
|  |   case V4L2_PIX_FMT_VYUY: | ||||||
|  |   case V4L2_PIX_FMT_UYVY: | ||||||
|  |   case V4L2_PIX_FMT_YUV420: | ||||||
|  |   case V4L2_PIX_FMT_RGB565: | ||||||
|  |   case V4L2_PIX_FMT_RGB24: | ||||||
|  |     if (camera->options.high_res_factor > 1) { | ||||||
|  |       // Use ISP, as there are two resolutions | ||||||
|  |       return camera_configure_isp(camera, camera_capture, | ||||||
|  |         camera->options.high_res_factor, camera->options.low_res_factor); | ||||||
|  |     } else { | ||||||
|  |       // Use direct approach, as there's likely low frequently used low resolution | ||||||
|  |       return camera_configure_output_rescaler(camera, camera_capture, | ||||||
|  |         camera->options.high_res_factor, camera->options.low_res_factor); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   case V4L2_PIX_FMT_MJPEG: | ||||||
|  |   case V4L2_PIX_FMT_H264: | ||||||
|  |     return camera_configure_decoder(camera, camera_capture); | ||||||
|  |  | ||||||
|  |   case V4L2_PIX_FMT_SRGGB10P: | ||||||
|  |     return camera_configure_isp(camera, camera_capture, | ||||||
|  |       camera->options.high_res_factor, camera->options.low_res_factor); | ||||||
|  |  | ||||||
|  |   default: | ||||||
|  |     LOG_INFO(camera, "Unsupported camera format=%s", | ||||||
|  |       fourcc_to_string(camera_capture->fmt.format).buf); | ||||||
|  |     return -1; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int camera_configure_input_libcamera(camera_t *camera) | ||||||
|  | { | ||||||
|  |   camera->camera = device_libcamera_open(camera->name, camera->options.path); | ||||||
|  |   if (!camera->camera) { | ||||||
|  |     return -1; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   camera->camera->opts.allow_dma = camera->options.allow_dma; | ||||||
|  |  | ||||||
|  |   buffer_list_t *camera_capture = device_open_buffer_list( | ||||||
|  |     camera->camera, true, camera->options.width / camera->options.high_res_factor, camera->options.height / camera->options.high_res_factor, camera->options.format, 0, camera->options.nbufs, true); | ||||||
|  |   if (!camera_capture) { | ||||||
|  |     return -1; | ||||||
|  |   } | ||||||
|  |   camera_capture->do_timestamps = true; | ||||||
|  |  | ||||||
|  |   if (camera->options.fps > 0) { | ||||||
|  |     camera_capture->fmt.interval_us = 1000 * 1000 / camera->options.fps; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return camera_configure_output_rescaler(camera, camera_capture, | ||||||
|  |     1.0, camera->options.low_res_factor / camera->options.high_res_factor); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int camera_configure_input(camera_t *camera) | ||||||
|  | { | ||||||
|  |   switch (camera->options.type) { | ||||||
|  |   case CAMERA_V4L2: | ||||||
|  |     return camera_configure_input_v4l2(camera); | ||||||
|  |  | ||||||
|  |   case CAMERA_LIBCAMERA: | ||||||
|  |     return camera_configure_input_libcamera(camera); | ||||||
|  |  | ||||||
|  |   default: | ||||||
|  |     LOG_INFO(camera, "Unsupported camera type"); | ||||||
|  |     return -1; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -9,9 +9,14 @@ | |||||||
| #include "device/buffer_list.h" | #include "device/buffer_list.h" | ||||||
| #include "http/http.h" | #include "http/http.h" | ||||||
|  |  | ||||||
|  | static const char *isp_names[2] = { | ||||||
|  |   "ISP", | ||||||
|  |   "ISP-LOW" | ||||||
|  | }; | ||||||
|  |  | ||||||
| int camera_configure_legacy_isp(camera_t *camera, buffer_list_t *src_capture, float div, int res) | int camera_configure_legacy_isp(camera_t *camera, buffer_list_t *src_capture, float div, int res) | ||||||
| { | { | ||||||
|   camera->legacy_isp[res] = device_v4l2_open("ISP", "/dev/video12"); |   camera->legacy_isp[res] = device_v4l2_open(isp_names[res], "/dev/video12"); | ||||||
|  |  | ||||||
|   buffer_list_t *isp_output = device_open_buffer_list_output( |   buffer_list_t *isp_output = device_open_buffer_list_output( | ||||||
|     camera->legacy_isp[res], src_capture); |     camera->legacy_isp[res], src_capture); | ||||||
|   | |||||||
| @@ -1,46 +0,0 @@ | |||||||
| #include "camera.h" |  | ||||||
|  |  | ||||||
| #include "device/buffer.h" |  | ||||||
| #include "device/buffer_list.h" |  | ||||||
| #include "device/device.h" |  | ||||||
| #include "device/links.h" |  | ||||||
| #include "opts/log.h" |  | ||||||
| #include "opts/fourcc.h" |  | ||||||
|  |  | ||||||
| int camera_configure_libcamera(camera_t *camera) |  | ||||||
| { |  | ||||||
|   camera->camera = device_libcamera_open(camera->name, camera->options.path); |  | ||||||
|   if (!camera->camera) { |  | ||||||
|     goto error; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   camera->camera->opts.allow_dma = camera->options.allow_dma; |  | ||||||
|  |  | ||||||
|   buffer_list_t *camera_capture = device_open_buffer_list( |  | ||||||
|     camera->camera, true, camera->options.width / camera->options.high_res_factor, camera->options.height / camera->options.high_res_factor, camera->options.format, 0, camera->options.nbufs, true); |  | ||||||
|   if (!camera_capture) { |  | ||||||
|     goto error; |  | ||||||
|   } |  | ||||||
|   camera_capture->do_timestamps = true; |  | ||||||
|  |  | ||||||
|   if (camera->options.fps > 0) { |  | ||||||
|     camera_capture->fmt.interval_us = 1000 * 1000 / camera->options.fps; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   if (camera_configure_output(camera, camera_capture, 0) < 0) { |  | ||||||
|     goto error; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   if (camera->options.low_res_factor > 1) { |  | ||||||
|     float div = camera->options.low_res_factor / camera->options.high_res_factor; |  | ||||||
|  |  | ||||||
|     if (camera_configure_legacy_isp(camera, camera_capture, div, 1) < 0) { |  | ||||||
|       return -1; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   return 0; |  | ||||||
|  |  | ||||||
| error: |  | ||||||
|   return -1; |  | ||||||
| } |  | ||||||
| @@ -1,38 +0,0 @@ | |||||||
| #include "camera.h" |  | ||||||
|  |  | ||||||
| #include "device/buffer.h" |  | ||||||
| #include "device/buffer_list.h" |  | ||||||
| #include "device/device.h" |  | ||||||
| #include "device/links.h" |  | ||||||
| #include "opts/log.h" |  | ||||||
| #include "opts/fourcc.h" |  | ||||||
| #include "device/buffer_list.h" |  | ||||||
| #include "http/http.h" |  | ||||||
|  |  | ||||||
| link_t *camera_ensure_capture(camera_t *camera, buffer_list_t *capture) |  | ||||||
| { |  | ||||||
|   for (int i = 0; i < camera->nlinks; i++) { |  | ||||||
|     if (camera->links[i].source == capture) { |  | ||||||
|       return &camera->links[i]; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   link_t *link = &camera->links[camera->nlinks++]; |  | ||||||
|   link->source = capture; |  | ||||||
|   return link; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void camera_capture_add_output(camera_t *camera, buffer_list_t *capture, buffer_list_t *output) |  | ||||||
| { |  | ||||||
|   link_t *link = camera_ensure_capture(camera, capture); |  | ||||||
|  |  | ||||||
|   int nsinks; |  | ||||||
|   for (nsinks = 0; link->sinks[nsinks]; nsinks++); |  | ||||||
|   link->sinks[nsinks] = output; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void camera_capture_set_callbacks(camera_t *camera, buffer_list_t *capture, link_callbacks_t callbacks) |  | ||||||
| { |  | ||||||
|   link_t *link = camera_ensure_capture(camera, capture); |  | ||||||
|   link->callbacks = callbacks; |  | ||||||
| } |  | ||||||
| @@ -76,3 +76,28 @@ int camera_configure_output(camera_t *camera, buffer_list_t *src_capture, int re | |||||||
|   return camera_configure_h264_output(camera, src_capture, res) == 0 && |   return camera_configure_h264_output(camera, src_capture, res) == 0 && | ||||||
|     camera_configure_jpeg_output(camera, src_capture, res) == 0; |     camera_configure_jpeg_output(camera, src_capture, res) == 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int camera_configure_output_rescaler(camera_t *camera, buffer_list_t *src_capture, float high_div, float low_div) | ||||||
|  | { | ||||||
|  |   if (high_div > 1) { | ||||||
|  |     if (camera_configure_legacy_isp(camera, src_capture, high_div, 0) < 0) { | ||||||
|  |       return -1; | ||||||
|  |     } | ||||||
|  |   } else if (high_div > 0) { | ||||||
|  |     if (camera_configure_output(camera, src_capture, 0) < 0) { | ||||||
|  |       return -1; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if (low_div > 1) { | ||||||
|  |     if (camera_configure_legacy_isp(camera, src_capture, low_div, 1) < 0) { | ||||||
|  |       return -1; | ||||||
|  |     } | ||||||
|  |   } else if (low_div > 0) { | ||||||
|  |     if (camera_configure_output(camera, src_capture, 1) < 0) { | ||||||
|  |       return -1; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
| @@ -1,76 +0,0 @@ | |||||||
| #include "camera.h" |  | ||||||
|  |  | ||||||
| #include "device/buffer.h" |  | ||||||
| #include "device/buffer_list.h" |  | ||||||
| #include "device/device.h" |  | ||||||
| #include "device/links.h" |  | ||||||
| #include "opts/log.h" |  | ||||||
| #include "opts/fourcc.h" |  | ||||||
|  |  | ||||||
| int camera_configure_v4l2(camera_t *camera) |  | ||||||
| { |  | ||||||
|   camera->camera = device_v4l2_open(camera->name, camera->options.path); |  | ||||||
|   if (!camera->camera) { |  | ||||||
|     goto error; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   camera->camera->opts.allow_dma = camera->options.allow_dma; |  | ||||||
|  |  | ||||||
|   if (strstr(camera->camera->bus_info, "usb")) { |  | ||||||
|     LOG_INFO(camera, "Disabling DMA since device uses USB (which is likely not working properly)."); |  | ||||||
|     camera->camera->opts.allow_dma = false; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   buffer_list_t *camera_capture = device_open_buffer_list(camera->camera, true, camera->options.width, camera->options.height, camera->options.format, 0, camera->options.nbufs, true); |  | ||||||
|   if (!camera_capture) { |  | ||||||
|     goto error; |  | ||||||
|   } |  | ||||||
|   camera_capture->do_timestamps = true; |  | ||||||
|  |  | ||||||
|   if (camera->options.fps > 0) { |  | ||||||
|     camera_capture->fmt.interval_us = 1000 * 1000 / camera->options.fps; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   switch (camera_capture->fmt.format) { |  | ||||||
|   case V4L2_PIX_FMT_YUYV: |  | ||||||
|   case V4L2_PIX_FMT_YVYU: |  | ||||||
|   case V4L2_PIX_FMT_VYUY: |  | ||||||
|   case V4L2_PIX_FMT_UYVY: |  | ||||||
|   case V4L2_PIX_FMT_YUV420: |  | ||||||
|   case V4L2_PIX_FMT_RGB565: |  | ||||||
|   case V4L2_PIX_FMT_RGB24: |  | ||||||
|     if (camera_configure_output(camera, camera_capture, 0) < 0) { |  | ||||||
|       goto error; |  | ||||||
|     } |  | ||||||
|     break; |  | ||||||
|  |  | ||||||
|   case V4L2_PIX_FMT_MJPEG: |  | ||||||
|   case V4L2_PIX_FMT_H264: |  | ||||||
|     if (camera_configure_decoder(camera, camera_capture) < 0) { |  | ||||||
|       goto error; |  | ||||||
|     } |  | ||||||
|     break; |  | ||||||
|  |  | ||||||
|   case V4L2_PIX_FMT_SRGGB10P: |  | ||||||
| #if 1 |  | ||||||
|     if (camera_configure_isp(camera, camera_capture, camera->options.high_res_factor, camera->options.low_res_factor) < 0) { |  | ||||||
|       goto error; |  | ||||||
|     } |  | ||||||
| #else |  | ||||||
|     if (camera_configure_legacy_isp(camera, camera_capture, camera->options.high_res_factor, 0) < 0) { |  | ||||||
|       goto error; |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
|     break; |  | ||||||
|  |  | ||||||
|   default: |  | ||||||
|     LOG_ERROR(camera, "Unsupported camera format=%s", |  | ||||||
|       fourcc_to_string(camera_capture->fmt.format).buf); |  | ||||||
|     break; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   return 0; |  | ||||||
|  |  | ||||||
| error: |  | ||||||
|   return -1; |  | ||||||
| } |  | ||||||
		Reference in New Issue
	
	Block a user
	 Kamil Trzcinski
					Kamil Trzcinski