libcamera: pipeline: simple: Rename converterBuffers_ and related vars
The converterBuffers_ and the converterQueue_ are not that specific to the Converter, and could be used by another entity doing the format conversion. Rename converterBuffers_, converterQueue_, and useConverter_ to conversionBuffers_, conversionQueue_ and useConversion_ to disassociate them from the Converter. Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # sc8280xp Lenovo x13s Tested-by: Pavel Machek <pavel@ucw.cz> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Pavel Machek <pavel@ucw.cz> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Andrey Konovalov <andrey.konovalov@linaro.org> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
6362bd46ca
commit
4095a8184b
1 changed files with 32 additions and 31 deletions
|
@ -270,17 +270,18 @@ public:
|
||||||
std::vector<Configuration> configs_;
|
std::vector<Configuration> configs_;
|
||||||
std::map<PixelFormat, std::vector<const Configuration *>> formats_;
|
std::map<PixelFormat, std::vector<const Configuration *>> formats_;
|
||||||
|
|
||||||
|
std::vector<std::unique_ptr<FrameBuffer>> conversionBuffers_;
|
||||||
|
std::queue<std::map<unsigned int, FrameBuffer *>> conversionQueue_;
|
||||||
|
bool useConversion_;
|
||||||
|
|
||||||
std::unique_ptr<Converter> converter_;
|
std::unique_ptr<Converter> converter_;
|
||||||
std::vector<std::unique_ptr<FrameBuffer>> converterBuffers_;
|
|
||||||
bool useConverter_;
|
|
||||||
std::queue<std::map<unsigned int, FrameBuffer *>> converterQueue_;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void tryPipeline(unsigned int code, const Size &size);
|
void tryPipeline(unsigned int code, const Size &size);
|
||||||
static std::vector<const MediaPad *> routedSourcePads(MediaPad *sink);
|
static std::vector<const MediaPad *> routedSourcePads(MediaPad *sink);
|
||||||
|
|
||||||
void converterInputDone(FrameBuffer *buffer);
|
void conversionInputDone(FrameBuffer *buffer);
|
||||||
void converterOutputDone(FrameBuffer *buffer);
|
void conversionOutputDone(FrameBuffer *buffer);
|
||||||
};
|
};
|
||||||
|
|
||||||
class SimpleCameraConfiguration : public CameraConfiguration
|
class SimpleCameraConfiguration : public CameraConfiguration
|
||||||
|
@ -504,8 +505,8 @@ int SimpleCameraData::init()
|
||||||
<< "Failed to create converter, disabling format conversion";
|
<< "Failed to create converter, disabling format conversion";
|
||||||
converter_.reset();
|
converter_.reset();
|
||||||
} else {
|
} else {
|
||||||
converter_->inputBufferReady.connect(this, &SimpleCameraData::converterInputDone);
|
converter_->inputBufferReady.connect(this, &SimpleCameraData::conversionInputDone);
|
||||||
converter_->outputBufferReady.connect(this, &SimpleCameraData::converterOutputDone);
|
converter_->outputBufferReady.connect(this, &SimpleCameraData::conversionOutputDone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -741,7 +742,7 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
|
||||||
* point converting an erroneous buffer.
|
* point converting an erroneous buffer.
|
||||||
*/
|
*/
|
||||||
if (buffer->metadata().status != FrameMetadata::FrameSuccess) {
|
if (buffer->metadata().status != FrameMetadata::FrameSuccess) {
|
||||||
if (!useConverter_) {
|
if (!useConversion_) {
|
||||||
/* No conversion, just complete the request. */
|
/* No conversion, just complete the request. */
|
||||||
Request *request = buffer->request();
|
Request *request = buffer->request();
|
||||||
pipe->completeBuffer(request, buffer);
|
pipe->completeBuffer(request, buffer);
|
||||||
|
@ -757,16 +758,16 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
|
||||||
if (buffer->metadata().status != FrameMetadata::FrameCancelled)
|
if (buffer->metadata().status != FrameMetadata::FrameCancelled)
|
||||||
video_->queueBuffer(buffer);
|
video_->queueBuffer(buffer);
|
||||||
|
|
||||||
if (converterQueue_.empty())
|
if (conversionQueue_.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Request *request = nullptr;
|
Request *request = nullptr;
|
||||||
for (auto &item : converterQueue_.front()) {
|
for (auto &item : conversionQueue_.front()) {
|
||||||
FrameBuffer *outputBuffer = item.second;
|
FrameBuffer *outputBuffer = item.second;
|
||||||
request = outputBuffer->request();
|
request = outputBuffer->request();
|
||||||
pipe->completeBuffer(request, outputBuffer);
|
pipe->completeBuffer(request, outputBuffer);
|
||||||
}
|
}
|
||||||
converterQueue_.pop();
|
conversionQueue_.pop();
|
||||||
|
|
||||||
if (request)
|
if (request)
|
||||||
pipe->completeRequest(request);
|
pipe->completeRequest(request);
|
||||||
|
@ -783,9 +784,9 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
|
||||||
*/
|
*/
|
||||||
Request *request = buffer->request();
|
Request *request = buffer->request();
|
||||||
|
|
||||||
if (useConverter_ && !converterQueue_.empty()) {
|
if (useConversion_ && !conversionQueue_.empty()) {
|
||||||
const std::map<unsigned int, FrameBuffer *> &outputs =
|
const std::map<unsigned int, FrameBuffer *> &outputs =
|
||||||
converterQueue_.front();
|
conversionQueue_.front();
|
||||||
if (!outputs.empty()) {
|
if (!outputs.empty()) {
|
||||||
FrameBuffer *outputBuffer = outputs.begin()->second;
|
FrameBuffer *outputBuffer = outputs.begin()->second;
|
||||||
if (outputBuffer)
|
if (outputBuffer)
|
||||||
|
@ -802,14 +803,14 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
|
||||||
* conversion is needed. If there's no queued request, just requeue the
|
* conversion is needed. If there's no queued request, just requeue the
|
||||||
* captured buffer for capture.
|
* captured buffer for capture.
|
||||||
*/
|
*/
|
||||||
if (useConverter_) {
|
if (useConversion_) {
|
||||||
if (converterQueue_.empty()) {
|
if (conversionQueue_.empty()) {
|
||||||
video_->queueBuffer(buffer);
|
video_->queueBuffer(buffer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
converter_->queueBuffers(buffer, converterQueue_.front());
|
converter_->queueBuffers(buffer, conversionQueue_.front());
|
||||||
converterQueue_.pop();
|
conversionQueue_.pop();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -818,13 +819,13 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
|
||||||
pipe->completeRequest(request);
|
pipe->completeRequest(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SimpleCameraData::converterInputDone(FrameBuffer *buffer)
|
void SimpleCameraData::conversionInputDone(FrameBuffer *buffer)
|
||||||
{
|
{
|
||||||
/* Queue the input buffer back for capture. */
|
/* Queue the input buffer back for capture. */
|
||||||
video_->queueBuffer(buffer);
|
video_->queueBuffer(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SimpleCameraData::converterOutputDone(FrameBuffer *buffer)
|
void SimpleCameraData::conversionOutputDone(FrameBuffer *buffer)
|
||||||
{
|
{
|
||||||
SimplePipelineHandler *pipe = SimpleCameraData::pipe();
|
SimplePipelineHandler *pipe = SimpleCameraData::pipe();
|
||||||
|
|
||||||
|
@ -1193,14 +1194,14 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)
|
||||||
|
|
||||||
/* Configure the converter if needed. */
|
/* Configure the converter if needed. */
|
||||||
std::vector<std::reference_wrapper<StreamConfiguration>> outputCfgs;
|
std::vector<std::reference_wrapper<StreamConfiguration>> outputCfgs;
|
||||||
data->useConverter_ = config->needConversion();
|
data->useConversion_ = config->needConversion();
|
||||||
|
|
||||||
for (unsigned int i = 0; i < config->size(); ++i) {
|
for (unsigned int i = 0; i < config->size(); ++i) {
|
||||||
StreamConfiguration &cfg = config->at(i);
|
StreamConfiguration &cfg = config->at(i);
|
||||||
|
|
||||||
cfg.setStream(&data->streams_[i]);
|
cfg.setStream(&data->streams_[i]);
|
||||||
|
|
||||||
if (data->useConverter_)
|
if (data->useConversion_)
|
||||||
outputCfgs.push_back(cfg);
|
outputCfgs.push_back(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1226,7 +1227,7 @@ int SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream,
|
||||||
* Export buffers on the converter or capture video node, depending on
|
* Export buffers on the converter or capture video node, depending on
|
||||||
* whether the converter is used or not.
|
* whether the converter is used or not.
|
||||||
*/
|
*/
|
||||||
if (data->useConverter_)
|
if (data->useConversion_)
|
||||||
return data->converter_->exportBuffers(data->streamIndex(stream),
|
return data->converter_->exportBuffers(data->streamIndex(stream),
|
||||||
count, buffers);
|
count, buffers);
|
||||||
else
|
else
|
||||||
|
@ -1247,13 +1248,13 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->useConverter_) {
|
if (data->useConversion_) {
|
||||||
/*
|
/*
|
||||||
* When using the converter allocate a fixed number of internal
|
* When using the converter allocate a fixed number of internal
|
||||||
* buffers.
|
* buffers.
|
||||||
*/
|
*/
|
||||||
ret = video->allocateBuffers(kNumInternalBuffers,
|
ret = video->allocateBuffers(kNumInternalBuffers,
|
||||||
&data->converterBuffers_);
|
&data->conversionBuffers_);
|
||||||
} else {
|
} else {
|
||||||
/* Otherwise, prepare for using buffers from the only stream. */
|
/* Otherwise, prepare for using buffers from the only stream. */
|
||||||
Stream *stream = &data->streams_[0];
|
Stream *stream = &data->streams_[0];
|
||||||
|
@ -1272,7 +1273,7 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->useConverter_) {
|
if (data->useConversion_) {
|
||||||
ret = data->converter_->start();
|
ret = data->converter_->start();
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
stop(camera);
|
stop(camera);
|
||||||
|
@ -1280,7 +1281,7 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Queue all internal buffers for capture. */
|
/* Queue all internal buffers for capture. */
|
||||||
for (std::unique_ptr<FrameBuffer> &buffer : data->converterBuffers_)
|
for (std::unique_ptr<FrameBuffer> &buffer : data->conversionBuffers_)
|
||||||
video->queueBuffer(buffer.get());
|
video->queueBuffer(buffer.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1292,7 +1293,7 @@ void SimplePipelineHandler::stopDevice(Camera *camera)
|
||||||
SimpleCameraData *data = cameraData(camera);
|
SimpleCameraData *data = cameraData(camera);
|
||||||
V4L2VideoDevice *video = data->video_;
|
V4L2VideoDevice *video = data->video_;
|
||||||
|
|
||||||
if (data->useConverter_)
|
if (data->useConversion_)
|
||||||
data->converter_->stop();
|
data->converter_->stop();
|
||||||
|
|
||||||
video->streamOff();
|
video->streamOff();
|
||||||
|
@ -1300,7 +1301,7 @@ void SimplePipelineHandler::stopDevice(Camera *camera)
|
||||||
|
|
||||||
video->bufferReady.disconnect(data, &SimpleCameraData::bufferReady);
|
video->bufferReady.disconnect(data, &SimpleCameraData::bufferReady);
|
||||||
|
|
||||||
data->converterBuffers_.clear();
|
data->conversionBuffers_.clear();
|
||||||
|
|
||||||
releasePipeline(data);
|
releasePipeline(data);
|
||||||
}
|
}
|
||||||
|
@ -1318,7 +1319,7 @@ int SimplePipelineHandler::queueRequestDevice(Camera *camera, Request *request)
|
||||||
* queue, it will be handed to the converter in the capture
|
* queue, it will be handed to the converter in the capture
|
||||||
* completion handler.
|
* completion handler.
|
||||||
*/
|
*/
|
||||||
if (data->useConverter_) {
|
if (data->useConversion_) {
|
||||||
buffers.emplace(data->streamIndex(stream), buffer);
|
buffers.emplace(data->streamIndex(stream), buffer);
|
||||||
} else {
|
} else {
|
||||||
ret = data->video_->queueBuffer(buffer);
|
ret = data->video_->queueBuffer(buffer);
|
||||||
|
@ -1327,8 +1328,8 @@ int SimplePipelineHandler::queueRequestDevice(Camera *camera, Request *request)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->useConverter_)
|
if (data->useConversion_)
|
||||||
data->converterQueue_.push(std::move(buffers));
|
data->conversionQueue_.push(std::move(buffers));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue