libcamera: pipeline: simple: Fix crash when storing timestamp in metadata
Commit922833f774
("libcamera: simple: Report sensor timestamp") unconditionally tries to access the request through the capture buffer to store the capture timestamp in the metadata. This causes a null pointer dereference when using a converter, as the capture buffers are free-wheeling in that case, and not associated with a request. Fix this by getting the request from the user-facing buffer, which can be the capture buffer when no converter is used. Fixes:922833f774
("libcamera: simple: Report sensor timestamp") Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
parent
b4c3db4c01
commit
73b823b220
1 changed files with 17 additions and 3 deletions
|
@ -1126,14 +1126,28 @@ void SimplePipelineHandler::bufferReady(FrameBuffer *buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Record the sensor's timestamp in the request metadata.
|
* Record the sensor's timestamp in the request metadata. The request
|
||||||
|
* needs to be obtained from the user-facing buffer, as internal
|
||||||
|
* buffers are free-wheeling and have no request associated with them.
|
||||||
*
|
*
|
||||||
* \todo The sensor timestamp should be better estimated by connecting
|
* \todo The sensor timestamp should be better estimated by connecting
|
||||||
* to the V4L2Device::frameStart signal if the platform provides it.
|
* to the V4L2Device::frameStart signal if the platform provides it.
|
||||||
*/
|
*/
|
||||||
Request *request = buffer->request();
|
Request *request = buffer->request();
|
||||||
request->metadata().set(controls::SensorTimestamp,
|
|
||||||
buffer->metadata().timestamp);
|
if (data->useConverter_ && !data->converterQueue_.empty()) {
|
||||||
|
const std::map<unsigned int, FrameBuffer *> &outputs =
|
||||||
|
data->converterQueue_.front();
|
||||||
|
if (!outputs.empty()) {
|
||||||
|
FrameBuffer *outputBuffer = outputs.begin()->second;
|
||||||
|
if (outputBuffer)
|
||||||
|
request = outputBuffer->request();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request)
|
||||||
|
request->metadata().set(controls::SensorTimestamp,
|
||||||
|
buffer->metadata().timestamp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Queue the captured and the request buffer to the converter if format
|
* Queue the captured and the request buffer to the converter if format
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue