[libcamera-devel] [PATCH 6/8] qcam: Use Sensor sequence numbers and detect frame drop
Umang Jain
umang.jain at ideasonboard.com
Tue Dec 7 14:58:17 CET 2021
Hi Kieran
On 12/7/21 5:09 AM, Kieran Bingham wrote:
> The stream buffer sequence numbers might produce sequential
> monotonic sequence numbers from an ISP producing a frame for every
> input.
>
> This however, doesn't capture pipeline stalls that cause us to miss or
> drop frames from the sensor.
>
> Use the SensorSequence metadata to report sequence information, and
> report with qInfo if a frame drop is detected.
>
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
> ---
> src/qcam/main_window.cpp | 22 ++++++++++++++++++++++
> src/qcam/main_window.h | 1 +
> 2 files changed, 23 insertions(+)
>
> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> index dd0e51f55b70..8d1d5b275aed 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -12,6 +12,7 @@
> #include <string>
>
> #include <libcamera/camera_manager.h>
> +#include <libcamera/control_ids.h>
> #include <libcamera/version.h>
>
> #include <QComboBox>
> @@ -510,6 +511,7 @@ int MainWindow::startCapture()
> previousFrames_ = 0;
> framesCaptured_ = 0;
> lastBufferTime_ = 0;
> + sequence_ = 0;
>
> ret = camera_->start();
> if (ret) {
> @@ -719,6 +721,26 @@ void MainWindow::processCapture()
> request = doneQueue_.dequeue();
> }
>
> + /* Parse the request metadata for useful information */
> + for (const auto &ctrl : request->metadata()) {
> + const int id = ctrl.first;
> + const ControlValue &value = ctrl.second;
> +
> + if (id == controls::SensorSequence) {
> + /* Handle basic frame drop detection and reporting. */
> + int64_t sequence = value.get<int64_t>();
> + if (sequence_ == 0)
> + sequence_ = sequence - 1;
> + unsigned int drops = sequence - sequence_ - 1;
> + if (drops)
> + qInfo() << "sequence: [" << sequence << "] *"
> + << drops << " frame drops detected *";
> + sequence_ = sequence;
> + }
> +
> + /* \todo Handle all/other metadata types here. */
> + }
> +
> /* Process buffers. */
> if (request->buffers().count(vfStream_))
> processViewfinder(request->buffers().at(vfStream_));
> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> index 3fbe872c0b5b..97568d6b619d 100644
> --- a/src/qcam/main_window.h
> +++ b/src/qcam/main_window.h
> @@ -120,6 +120,7 @@ private:
> QMutex mutex_; /* Protects freeBuffers_, doneQueue_, and freeQueue_ */
>
> uint64_t lastBufferTime_;
> + uint64_t sequence_;
> QElapsedTimer frameRateInterval_;
> uint32_t previousFrames_;
> uint32_t framesCaptured_;
More information about the libcamera-devel
mailing list