From 5d6f9025049011811acbadc9a3e33c1257a81a0f Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 24 Dec 2020 17:54:07 +0200 Subject: libcamera: pipeline: simple: Move converter data to camera data Converter usage is a per-camera property, move its data to the SimpleCameraData class. Signed-off-by: Laurent Pinchart Tested-by: Phi-Bang Nguyen Reviewed-by: Paul Elder Reviewed-by: Kieran Bingham --- src/libcamera/pipeline/simple/simple.cpp | 46 ++++++++++++++++---------------- 1 file changed, 23 insertions(+), 23 deletions(-) (limited to 'src/libcamera/pipeline') diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index d923db0c..17fd744c 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -170,6 +170,10 @@ public: std::vector configs_; std::map formats_; + + std::vector> converterBuffers_; + bool useConverter_; + std::queue converterQueue_; }; class SimpleCameraConfiguration : public CameraConfiguration @@ -239,9 +243,6 @@ private: std::map subdevs_; std::unique_ptr converter_; - bool useConverter_; - std::vector> converterBuffers_; - std::queue converterQueue_; Camera *activeCamera_; }; @@ -693,9 +694,8 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c) } /* Configure the converter if required. */ - useConverter_ = config->needConversion(); - - if (useConverter_) { + data->useConverter_ = config->needConversion(); + if (data->useConverter_) { StreamConfiguration inputCfg; inputCfg.pixelFormat = pipeConfig->captureFormat; inputCfg.size = pipeConfig->captureSize; @@ -727,7 +727,7 @@ int SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream, * Export buffers on the converter or capture video node, depending on * whether the converter is used or not. */ - if (useConverter_) + if (data->useConverter_) return converter_->exportBuffers(0, count, buffers); else return data->video_->exportBuffers(count, buffers); @@ -740,8 +740,8 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL unsigned int count = data->streams_[0].configuration().bufferCount; int ret; - if (useConverter_) - ret = video->allocateBuffers(count, &converterBuffers_); + if (data->useConverter_) + ret = video->allocateBuffers(count, &data->converterBuffers_); else ret = video->importBuffers(count); if (ret < 0) @@ -753,7 +753,7 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL return ret; } - if (useConverter_) { + if (data->useConverter_) { ret = converter_->start(); if (ret < 0) { stop(camera); @@ -761,7 +761,7 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL } /* Queue all internal buffers for capture. */ - for (std::unique_ptr &buffer : converterBuffers_) + for (std::unique_ptr &buffer : data->converterBuffers_) video->queueBuffer(buffer.get()); } @@ -775,13 +775,13 @@ void SimplePipelineHandler::stop(Camera *camera) SimpleCameraData *data = cameraData(camera); V4L2VideoDevice *video = data->video_; - if (useConverter_) + if (data->useConverter_) converter_->stop(); video->streamOff(); video->releaseBuffers(); - converterBuffers_.clear(); + data->converterBuffers_.clear(); activeCamera_ = nullptr; } @@ -801,8 +801,8 @@ int SimplePipelineHandler::queueRequestDevice(Camera *camera, Request *request) * If conversion is needed, push the buffer to the converter queue, it * will be handed to the converter in the capture completion handler. */ - if (useConverter_) { - converterQueue_.push(buffer); + if (data->useConverter_) { + data->converterQueue_.push(buffer); return 0; } @@ -978,7 +978,7 @@ void SimplePipelineHandler::bufferReady(FrameBuffer *buffer) * point converting an erroneous buffer. */ if (buffer->metadata().status != FrameMetadata::FrameSuccess) { - if (useConverter_) { + if (data->useConverter_) { /* Requeue the buffer for capture. */ data->video_->queueBuffer(buffer); @@ -986,11 +986,11 @@ void SimplePipelineHandler::bufferReady(FrameBuffer *buffer) * Get the next user-facing buffer to complete the * request. */ - if (converterQueue_.empty()) + if (data->converterQueue_.empty()) return; - buffer = converterQueue_.front(); - converterQueue_.pop(); + buffer = data->converterQueue_.front(); + data->converterQueue_.pop(); } Request *request = buffer->request(); @@ -1004,14 +1004,14 @@ void SimplePipelineHandler::bufferReady(FrameBuffer *buffer) * conversion is needed. If there's no queued request, just requeue the * captured buffer for capture. */ - if (useConverter_) { - if (converterQueue_.empty()) { + if (data->useConverter_) { + if (data->converterQueue_.empty()) { data->video_->queueBuffer(buffer); return; } - FrameBuffer *output = converterQueue_.front(); - converterQueue_.pop(); + FrameBuffer *output = data->converterQueue_.front(); + data->converterQueue_.pop(); converter_->queueBuffers(buffer, { { 0, output } }); return; -- cgit v1.2.1