From 04dd8c926fd9f6b4dc82ef314b71464c55ff89da Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 7 Mar 2023 10:54:00 +0100 Subject: [PATCH] debug: dump all buffers to path specified by `CAMERA_DEBUG_CAPTURE` --- device/camera/camera.h | 1 + device/camera/camera_debug.c | 40 +++++++++++++++++++++++++++++++++ device/camera/camera_decoder.c | 34 +--------------------------- device/camera/camera_output.c | 1 + device/camera/camera_pipeline.c | 2 ++ device/libcamera/buffer.cc | 9 ++++++++ 6 files changed, 54 insertions(+), 33 deletions(-) create mode 100644 device/camera/camera_debug.c diff --git a/device/camera/camera.h b/device/camera/camera.h index 1187609..80215d4 100644 --- a/device/camera/camera.h +++ b/device/camera/camera.h @@ -94,6 +94,7 @@ void camera_capture_add_callbacks(camera_t *camera, buffer_list_t *capture, link int camera_configure_input(camera_t *camera); int camera_configure_pipeline(camera_t *camera, buffer_list_t *camera_capture); +void camera_debug_capture(camera_t *camera, buffer_list_t *capture); buffer_list_t *camera_configure_isp(camera_t *camera, buffer_list_t *src_capture); buffer_list_t *camera_configure_decoder(camera_t *camera, buffer_list_t *src_capture); diff --git a/device/camera/camera_debug.c b/device/camera/camera_debug.c new file mode 100644 index 0000000..d42104c --- /dev/null +++ b/device/camera/camera_debug.c @@ -0,0 +1,40 @@ +#include "device/buffer.h" +#include "device/buffer_list.h" +#include "device/links.h" +#include "device/camera/camera.h" +#include "util/opts/log.h" +#include "util/opts/fourcc.h" +#include "output/output.h" + +#include + +static void debug_capture_on_buffer(buffer_t *buf) +{ + if (!buf) { + return; + } + + char path[256]; + sprintf(path, "%s/decoder_capture.%d.%s", getenv("CAMERA_DEBUG_CAPTURE"), buf->index, fourcc_to_string(buf->buf_list->fmt.format).buf); + + FILE *fp = fopen(path, "wb"); + if (!fp) { + return; + } + + fwrite(buf->start, 1, buf->used, fp); + fclose(fp); +} + +static link_callbacks_t debug_capture_callbacks = { + .name = "DEBUG-CAPTURE", + .on_buffer = debug_capture_on_buffer +}; + +void camera_debug_capture(camera_t *camera, buffer_list_t *capture) +{ + if (getenv("CAMERA_DEBUG_CAPTURE")) { + mkdir(getenv("CAMERA_DEBUG_CAPTURE"), 0755); + camera_capture_add_callbacks(camera, capture, debug_capture_callbacks); + } +} diff --git a/device/camera/camera_decoder.c b/device/camera/camera_decoder.c index 59b72b6..75fbcde 100644 --- a/device/camera/camera_decoder.c +++ b/device/camera/camera_decoder.c @@ -12,8 +12,6 @@ #include "output/rtsp/rtsp.h" #include "output/output.h" -#include - static unsigned decoder_formats[] = { // best quality @@ -29,31 +27,6 @@ static unsigned decoder_formats[] = 0 }; -static void decoder_debug_on_buffer(buffer_t *buf) -{ - if (!buf) { - return; - } - - static int index = 0; - - char path[256]; - sprintf(path, "%s/decoder_capture.%d.%s", getenv("CAMERA_DECODER_DEBUG"), index++ % 10, fourcc_to_string(buf->buf_list->fmt.format).buf); - - FILE *fp = fopen(path, "wb"); - if (!fp) { - return; - } - - fwrite(buf->start, 1, buf->used, fp); - fclose(fp); -} - -static link_callbacks_t decoder_debug_callbacks = { - .name = "DECODER-DEBUG-CAPTURE", - .on_buffer = decoder_debug_on_buffer -}; - buffer_list_t *camera_configure_decoder(camera_t *camera, buffer_list_t *src_capture) { unsigned chosen_format = 0; @@ -73,12 +46,7 @@ buffer_list_t *camera_configure_decoder(camera_t *camera, buffer_list_t *src_cap buffer_list_t *decoder_capture = device_open_buffer_list_capture2( camera->decoder, NULL, decoder_output, chosen_format, true); - if (getenv("CAMERA_DECODER_DEBUG")) { - mkdir(getenv("CAMERA_DECODER_DEBUG"), 0755); - camera_capture_add_callbacks(camera, src_capture, decoder_debug_callbacks); - camera_capture_add_callbacks(camera, decoder_capture, decoder_debug_callbacks); - } - + camera_debug_capture(camera, decoder_capture); camera_capture_add_output(camera, src_capture, decoder_output); return decoder_capture; diff --git a/device/camera/camera_output.c b/device/camera/camera_output.c index f579098..64ac5a2 100644 --- a/device/camera/camera_output.c +++ b/device/camera/camera_output.c @@ -164,5 +164,6 @@ int camera_configure_output(camera_t *camera, buffer_list_t *camera_capture, con camera_capture_add_output(camera, src_capture, output); camera_capture_add_callbacks(camera, capture, callbacks); + camera_debug_capture(camera, capture); return 0; } diff --git a/device/camera/camera_pipeline.c b/device/camera/camera_pipeline.c index 1ba0e29..e0ff6f1 100644 --- a/device/camera/camera_pipeline.c +++ b/device/camera/camera_pipeline.c @@ -46,6 +46,8 @@ int camera_configure_pipeline(camera_t *camera, buffer_list_t *camera_capture) { camera_capture->do_timestamps = true; + camera_debug_capture(camera, camera_capture); + if (camera_configure_output(camera, camera_capture, "SNAPSHOT", &camera->options.snapshot, snapshot_formats, snapshot_callbacks, &camera->codec_snapshot) < 0) { return -1; diff --git a/device/libcamera/buffer.cc b/device/libcamera/buffer.cc index af48547..de02b43 100644 --- a/device/libcamera/buffer.cc +++ b/device/libcamera/buffer.cc @@ -151,6 +151,15 @@ int libcamera_buffer_list_dequeue(buffer_list_t *buf_list, buffer_t **bufp) uint64_t now_us = get_monotonic_time_us(NULL, NULL); (*bufp)->captured_time_us = now_us - (boot_time_us - sensor_timestamp_us); + (*bufp)->used = 0; + + for (auto &bufferMap : (*bufp)->libcamera->request->buffers()) { + auto frameBuffer = bufferMap.second; + + for (auto const &plane : frameBuffer->metadata().planes()) { + (*bufp)->used += plane.bytesused; + } + } if (index == 0) { libcamera_buffer_dump_metadata(*bufp);