android: Document the structures and functions for post-processing

Specifically document:
 - CameraDevice::sendCaptureResults()
 - CameraDevice::completeDescriptor()
 - CameraDevice::streamProcessingComplete()

 - CameraStream::PostProcessorWorker class
 - Camera3RequestDescriptor::StreamBuffer structure

Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Umang Jain 2022-01-04 12:22:00 +05:30
parent a7ab5ef1d2
commit bf0154697b
3 changed files with 87 additions and 0 deletions

View file

@ -1164,6 +1164,17 @@ void CameraDevice::requestComplete(Request *request)
} }
} }
/**
* \brief Complete the Camera3RequestDescriptor
* \param[in] descriptor The Camera3RequestDescriptor that has completed
*
* The function marks the Camera3RequestDescriptor as 'complete'. It shall be
* called when all the streams in the Camera3RequestDescriptor have completed
* capture (or have been generated via post-processing) and the request is ready
* to be sent back to the framework.
*
* \context This function is \threadsafe.
*/
void CameraDevice::completeDescriptor(Camera3RequestDescriptor *descriptor) void CameraDevice::completeDescriptor(Camera3RequestDescriptor *descriptor)
{ {
MutexLocker lock(descriptorsMutex_); MutexLocker lock(descriptorsMutex_);
@ -1172,6 +1183,19 @@ void CameraDevice::completeDescriptor(Camera3RequestDescriptor *descriptor)
sendCaptureResults(); sendCaptureResults();
} }
/**
* \brief Sequentially send capture results to the framework
*
* Iterate over the descriptors queue to send completed descriptors back to the
* framework, in the same order as they have been queued. For each complete
* descriptor, populate a locally-scoped camera3_capture_result_t from the
* descriptor, send the capture result back by calling the
* process_capture_result() callback, and remove the descriptor from the queue.
* Stop iterating if the descriptor at the front of the queue is not complete.
*
* This function should never be called directly in the codebase. Use
* completeDescriptor() instead.
*/
void CameraDevice::sendCaptureResults() void CameraDevice::sendCaptureResults()
{ {
while (!descriptors_.empty() && !descriptors_.front()->isPending()) { while (!descriptors_.empty() && !descriptors_.front()->isPending()) {
@ -1231,6 +1255,19 @@ void CameraDevice::setBufferStatus(Camera3RequestDescriptor::StreamBuffer &strea
} }
} }
/**
* \brief Handle post-processing completion of a stream in a capture request
* \param[in] streamBuffer The StreamBuffer for which processing is complete
* \param[in] status Stream post-processing status
*
* This function is called from the post-processor's thread whenever a camera
* stream has finished post processing. The corresponding entry is dropped from
* the descriptor's pendingStreamsToProcess_ map.
*
* If the pendingStreamsToProcess_ map is then empty, all streams requiring to
* be generated from post-processing have been completed. Mark the descriptor as
* complete using completeDescriptor() in that case.
*/
void CameraDevice::streamProcessingComplete(Camera3RequestDescriptor::StreamBuffer *streamBuffer, void CameraDevice::streamProcessingComplete(Camera3RequestDescriptor::StreamBuffer *streamBuffer,
Camera3RequestDescriptor::Status status) Camera3RequestDescriptor::Status status)
{ {

View file

@ -52,6 +52,44 @@ Camera3RequestDescriptor::Camera3RequestDescriptor(
Camera3RequestDescriptor::~Camera3RequestDescriptor() = default; Camera3RequestDescriptor::~Camera3RequestDescriptor() = default;
/**
* \struct Camera3RequestDescriptor::StreamBuffer
* \brief Group information for per-stream buffer of Camera3RequestDescriptor
*
* A capture request placed to the libcamera HAL can contain multiple streams.
* Each stream will have an associated buffer to be filled. StreamBuffer
* tracks this buffer with contextual information which aids in the stream's
* generation. The generation of the stream will depend on its type (refer to
* the CameraStream::Type documentation).
*
* \var Camera3RequestDescriptor::StreamBuffer::stream
* \brief Pointer to the corresponding CameraStream
*
* \var Camera3RequestDescriptor::StreamBuffer::camera3Buffer
* \brief Native handle to the buffer
*
* \var Camera3RequestDescriptor::StreamBuffer::frameBuffer
* \brief Encapsulate the dmabuf handle inside a libcamera::FrameBuffer for
* direct streams
*
* \var Camera3RequestDescriptor::StreamBuffer::fence
* \brief Acquire fence of the buffer
*
* \var Camera3RequestDescriptor::StreamBuffer::status
* \brief Track the status of the buffer
*
* \var Camera3RequestDescriptor::StreamBuffer::internalBuffer
* \brief Pointer to a buffer internally handled by CameraStream (if any)
*
* \var Camera3RequestDescriptor::StreamBuffer::srcBuffer
* \brief Pointer to the source frame buffer used for post-processing
*
* \var Camera3RequestDescriptor::StreamBuffer::dstBuffer
* \brief Pointer to the destination frame buffer used for post-processing
*
* \var Camera3RequestDescriptor::StreamBuffer::request
* \brief Back pointer to the Camera3RequestDescriptor to which the StreamBuffer belongs
*/
Camera3RequestDescriptor::StreamBuffer::StreamBuffer( Camera3RequestDescriptor::StreamBuffer::StreamBuffer(
CameraStream *cameraStream, const camera3_stream_buffer_t &buffer, CameraStream *cameraStream, const camera3_stream_buffer_t &buffer,
Camera3RequestDescriptor *requestDescriptor) Camera3RequestDescriptor *requestDescriptor)

View file

@ -244,6 +244,18 @@ void CameraStream::putBuffer(FrameBuffer *buffer)
buffers_.push_back(buffer); buffers_.push_back(buffer);
} }
/**
* \class CameraStream::PostProcessorWorker
* \brief Post-process a CameraStream in an internal thread
*
* If the association between CameraStream and camera3_stream_t dictated by
* CameraStream::Type is internal or mapped, the stream is generated by post
* processing of a libcamera stream. Such a request is queued to a
* PostProcessorWorker in CameraStream::process(). A queue of post-processing
* requests is maintained by the PostProcessorWorker and it will run the
* post-processing on an internal thread as soon as any request is available on
* its queue.
*/
CameraStream::PostProcessorWorker::PostProcessorWorker(PostProcessor *postProcessor) CameraStream::PostProcessorWorker::PostProcessorWorker(PostProcessor *postProcessor)
: postProcessor_(postProcessor) : postProcessor_(postProcessor)
{ {