libcamera: pipeline: rkisp1: Move start and stop of path to RkISP1Path
Move the start and stop of a path to RkISP1Path. This allows the importing of buffers to be moved closer the path start/stop simplifying the code. Also by adding a simple running tracker the error logic in PipelineHandlerRkISP1 can be simplified as stop() can always be called. This also removes all external users of RkISP1Path::video_ so it can be made private. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
@@ -770,20 +770,6 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)
|
||||
data->selfPathStream_.configuration().bufferCount,
|
||||
});
|
||||
|
||||
if (data->mainPathActive_) {
|
||||
ret = mainPath_.video_->importBuffers(
|
||||
data->mainPathStream_.configuration().bufferCount);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (data->selfPathActive_) {
|
||||
ret = selfPath_.video_->importBuffers(
|
||||
data->selfPathStream_.configuration().bufferCount);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = param_->allocateBuffers(maxCount, ¶mBuffers_);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
@@ -813,8 +799,6 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)
|
||||
error:
|
||||
paramBuffers_.clear();
|
||||
statBuffers_.clear();
|
||||
mainPath_.video_->releaseBuffers();
|
||||
selfPath_.video_->releaseBuffers();
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -845,12 +829,6 @@ int PipelineHandlerRkISP1::freeBuffers(Camera *camera)
|
||||
if (stat_->releaseBuffers())
|
||||
LOG(RkISP1, Error) << "Failed to release stat buffers";
|
||||
|
||||
if (mainPath_.video_->releaseBuffers())
|
||||
LOG(RkISP1, Error) << "Failed to release main path buffers";
|
||||
|
||||
if (selfPath_.video_->releaseBuffers())
|
||||
LOG(RkISP1, Error) << "Failed to release self path buffers";
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -896,15 +874,12 @@ int PipelineHandlerRkISP1::start(Camera *camera)
|
||||
std::map<unsigned int, IPAStream> streamConfig;
|
||||
|
||||
if (data->mainPathActive_) {
|
||||
ret = mainPath_.video_->streamOn();
|
||||
ret = mainPath_.start();
|
||||
if (ret) {
|
||||
param_->streamOff();
|
||||
stat_->streamOff();
|
||||
data->ipa_->stop();
|
||||
freeBuffers(camera);
|
||||
|
||||
LOG(RkISP1, Error)
|
||||
<< "Failed to start main path " << camera->id();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -915,18 +890,13 @@ int PipelineHandlerRkISP1::start(Camera *camera)
|
||||
}
|
||||
|
||||
if (data->selfPathActive_) {
|
||||
ret = selfPath_.video_->streamOn();
|
||||
ret = selfPath_.start();
|
||||
if (ret) {
|
||||
if (data->mainPathActive_)
|
||||
mainPath_.video_->streamOff();
|
||||
|
||||
mainPath_.stop();
|
||||
param_->streamOff();
|
||||
stat_->streamOff();
|
||||
data->ipa_->stop();
|
||||
freeBuffers(camera);
|
||||
|
||||
LOG(RkISP1, Error)
|
||||
<< "Failed to start self path " << camera->id();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -963,21 +933,8 @@ void PipelineHandlerRkISP1::stop(Camera *camera)
|
||||
RkISP1CameraData *data = cameraData(camera);
|
||||
int ret;
|
||||
|
||||
if (data->selfPathActive_) {
|
||||
ret = selfPath_.video_->streamOff();
|
||||
if (ret)
|
||||
LOG(RkISP1, Warning)
|
||||
<< "Failed to stop self path for "
|
||||
<< camera->id();
|
||||
}
|
||||
|
||||
if (data->mainPathActive_) {
|
||||
ret = mainPath_.video_->streamOff();
|
||||
if (ret)
|
||||
LOG(RkISP1, Warning)
|
||||
<< "Failed to stop main path for "
|
||||
<< camera->id();
|
||||
}
|
||||
selfPath_.stop();
|
||||
mainPath_.stop();
|
||||
|
||||
ret = stat_->streamOff();
|
||||
if (ret)
|
||||
|
||||
@@ -20,9 +20,9 @@ LOG_DECLARE_CATEGORY(RkISP1)
|
||||
|
||||
RkISP1Path::RkISP1Path(const char *name, const Span<const PixelFormat> &formats,
|
||||
const Size &minResolution, const Size &maxResolution)
|
||||
: video_(nullptr), name_(name), formats_(formats),
|
||||
: name_(name), running_(false), formats_(formats),
|
||||
minResolution_(minResolution), maxResolution_(maxResolution),
|
||||
resizer_(nullptr)
|
||||
resizer_(nullptr), video_(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -149,6 +149,45 @@ int RkISP1Path::configure(const StreamConfiguration &config,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RkISP1Path::start()
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (running_)
|
||||
return -EBUSY;
|
||||
|
||||
/* \todo Make buffer count user configurable. */
|
||||
ret = video_->importBuffers(RKISP1_BUFFER_COUNT);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = video_->streamOn();
|
||||
if (ret) {
|
||||
LOG(RkISP1, Error)
|
||||
<< "Failed to start " << name_ << " path";
|
||||
|
||||
video_->releaseBuffers();
|
||||
return ret;
|
||||
}
|
||||
|
||||
running_ = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void RkISP1Path::stop()
|
||||
{
|
||||
if (!running_)
|
||||
return;
|
||||
|
||||
if (video_->streamOff())
|
||||
LOG(RkISP1, Warning) << "Failed to stop " << name_ << " path";
|
||||
|
||||
video_->releaseBuffers();
|
||||
|
||||
running_ = false;
|
||||
}
|
||||
|
||||
namespace {
|
||||
constexpr Size RKISP1_RSZ_MP_SRC_MIN{ 32, 16 };
|
||||
constexpr Size RKISP1_RSZ_MP_SRC_MAX{ 4416, 3312 };
|
||||
|
||||
@@ -45,22 +45,24 @@ public:
|
||||
return video_->exportBuffers(bufferCount, buffers);
|
||||
}
|
||||
|
||||
int start();
|
||||
void stop();
|
||||
|
||||
int queueBuffer(FrameBuffer *buffer) { return video_->queueBuffer(buffer); }
|
||||
Signal<FrameBuffer *> &bufferReady() { return video_->bufferReady; }
|
||||
|
||||
/* \todo Make video private. */
|
||||
V4L2VideoDevice *video_;
|
||||
|
||||
private:
|
||||
static constexpr unsigned int RKISP1_BUFFER_COUNT = 4;
|
||||
|
||||
const char *name_;
|
||||
bool running_;
|
||||
|
||||
const Span<const PixelFormat> formats_;
|
||||
const Size minResolution_;
|
||||
const Size maxResolution_;
|
||||
|
||||
V4L2Subdevice *resizer_;
|
||||
V4L2VideoDevice *video_;
|
||||
};
|
||||
|
||||
class RkISP1MainPath : public RkISP1Path
|
||||
|
||||
Reference in New Issue
Block a user