From 4ee74d6373d2baafd969077d9a0dac2060fb71a5 Mon Sep 17 00:00:00 2001 From: Richard Oliver Date: Tue, 9 Sep 2025 16:28:24 +0100 Subject: [PATCH] ipa: rpi: Expose frameCount in extracted IMX500 tensors When injecting input tensors, the output results are expected to be made available at a specific frame. This change exports tensors' frameCount so that an appropriate comparison can be made by the controlling application. Signed-off-by: Richard Oliver --- src/ipa/rpi/cam_helper/cam_helper_imx500.cpp | 2 ++ .../cam_helper/imx500_tensor_parser/imx500_tensor_parser.cpp | 2 ++ .../rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.h | 2 ++ src/ipa/rpi/controller/controller.h | 2 ++ src/libcamera/control_ids_rpi.yaml | 2 ++ 5 files changed, 10 insertions(+) diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx500.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx500.cpp index 6b12f302..31408027 100644 --- a/src/ipa/rpi/cam_helper/cam_helper_imx500.cpp +++ b/src/ipa/rpi/cam_helper/cam_helper_imx500.cpp @@ -245,6 +245,7 @@ void CamHelperImx500::parseInferenceData(libcamera::Span buffer, exported.width = inputTensorInfo.width; exported.height = inputTensorInfo.height; exported.numChannels = inputTensorInfo.channels; + exported.frameCount = inputTensorInfo.frameCount; strncpy(exported.networkName, inputTensorInfo.networkName.c_str(), sizeof(exported.networkName) - 1); exported.networkName[sizeof(exported.networkName) - 1] = '\0'; @@ -281,6 +282,7 @@ void CamHelperImx500::parseInferenceData(libcamera::Span buffer, strncpy(exported.networkName, outputTensorInfo.networkName.c_str(), sizeof(exported.networkName) - 1); exported.networkName[sizeof(exported.networkName) - 1] = '\0'; + exported.frameCount = outputTensorInfo.frameCount; metadata.set("cnn.output_tensor_info", exported); metadata.set("cnn.output_tensor", std::move(outputTensorInfo.data)); metadata.set("cnn.output_tensor_size", outputTensorInfo.totalSize); diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.cpp b/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.cpp index cd72c2a0..8b6e3745 100644 --- a/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.cpp +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.cpp @@ -623,6 +623,7 @@ int parseInputTensorBody(IMX500InputTensorInfo &inputTensorInfo, const uint8_t * inputTensorInfo.widthStride = inputApParams.widthStride; inputTensorInfo.heightStride = inputApParams.heightStride; inputTensorInfo.networkName = inputApParams.networkName; + inputTensorInfo.frameCount = dnnHeader.frameCount; return 0; } @@ -693,6 +694,7 @@ int RPiController::imx500ParseOutputTensor(IMX500OutputTensorInfo &outputTensorI LOG(IMX500, Error) << "Failed to populate OutputTensorInfo!"; return ret; } + outputTensorInfo.frameCount = dnnHeader.frameCount; ret = parseOutputTensorBody(outputTensorInfo, src + TensorStride, outputApParams, dnnHeader); if (ret) { diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.h index 98b7b1d3..48072e06 100644 --- a/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.h +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.h @@ -36,6 +36,7 @@ struct IMX500OutputTensorInfo { std::vector tensorDataNum; std::vector> vecDim; std::vector numDimensions; + uint8_t frameCount; }; struct IMX500InputTensorInfo { @@ -47,6 +48,7 @@ struct IMX500InputTensorInfo { unsigned int size; std::string networkName; std::shared_ptr data; + uint8_t frameCount; }; struct IMX500Tensors { diff --git a/src/ipa/rpi/controller/controller.h b/src/ipa/rpi/controller/controller.h index 5e6e76ff..d36bca04 100644 --- a/src/ipa/rpi/controller/controller.h +++ b/src/ipa/rpi/controller/controller.h @@ -44,6 +44,7 @@ struct CnnOutputTensorInfo { char networkName[NetworkNameLen]; uint32_t numTensors; OutputTensorInfo info[MaxNumTensors]; + uint8_t frameCount; }; struct CnnInputTensorInfo { @@ -51,6 +52,7 @@ struct CnnInputTensorInfo { uint32_t width; uint32_t height; uint32_t numChannels; + uint8_t frameCount; }; struct CnnKpiInfo { diff --git a/src/libcamera/control_ids_rpi.yaml b/src/libcamera/control_ids_rpi.yaml index 785b86ef..0c524f4c 100644 --- a/src/libcamera/control_ids_rpi.yaml +++ b/src/libcamera/control_ids_rpi.yaml @@ -218,6 +218,7 @@ controls: char networkName[NetworkNameLen]; uint32_t numTensors; OutputTensorInfo info[MaxNumTensors]; + uint8_t frameCount; }; with @@ -279,6 +280,7 @@ controls: uint32_t width; uint32_t height; uint32_t numChannels; + uint8_t frameCount; }; where