camera: improve FPS handling

This commit is contained in:
Kamil Trzcinski 2023-02-23 16:48:19 +01:00
parent a24e100983
commit 21ce78a277
3 changed files with 22 additions and 8 deletions

View File

@ -47,10 +47,6 @@ int camera_configure_pipeline(camera_t *camera, buffer_list_t *capture)
if (capture) {
capture->do_timestamps = true;
if (camera->options.fps > 0) {
capture->fmt.interval_us = 1000 * 1000 / camera->options.fps;
}
switch (capture->fmt.format) {
case V4L2_PIX_FMT_SRGGB10P:
case V4L2_PIX_FMT_SGRBG10P:

View File

@ -107,6 +107,9 @@ buffer_list_t *device_open_buffer_list_output(device_t *dev, buffer_list_t *capt
}
buffer_format_t fmt = capture_list->fmt;
fmt.interval_us = 0;
bool do_mmap = capture_list->dev->opts.allow_dma ? !capture_list->do_mmap : true;
// If manually allocating buffers, ensure that `sizeimage` is at least `buf->length`
@ -137,8 +140,6 @@ buffer_list_t *device_open_buffer_list_capture(device_t *dev, const char *path,
fmt.height = output_list->fmt.height;
if (!fmt.nbufs)
fmt.nbufs = output_list->fmt.nbufs;
if (!fmt.interval_us)
fmt.interval_us = output_list->fmt.interval_us;
return device_open_buffer_list2(dev, path, true, fmt, do_mmap);
}
@ -235,9 +236,26 @@ void device_dump_options(device_t *dev, FILE *stream)
int device_set_fps(device_t *dev, int desired_fps)
{
if (!dev || dev->hw->device_set_fps(dev, desired_fps) < 0)
if (!dev)
return -1;
unsigned interval_us = 0;
if (desired_fps > 0) {
interval_us = 1000 * 1000 / desired_fps;
}
// try to use HW fps setting
if (dev->hw->device_set_fps && dev->hw->device_set_fps(dev, desired_fps) >= 0) {
interval_us = 0;
}
LOG_INFO(dev, "Setting frame interval_us=%d for FPS=%d", interval_us, desired_fps);
for (int i = 0; i < dev->n_capture_list; i++) {
dev->capture_lists[i]->fmt.interval_us = interval_us;
}
return 0;
}

View File

@ -128,7 +128,7 @@ void libcamera_device_close(device_t *dev)
int libcamera_device_set_fps(device_t *dev, int desired_fps)
{
int64_t frame_time = 1000000 / desired_fps;
int64_t frame_time = desired_fps ? 1000000 / desired_fps : 0;
dev->libcamera->controls.set(libcamera::controls::FrameDurationLimits, libcamera::Span<const int64_t, 2>({ frame_time, frame_time }));
return 0;
}