libcamera: pipeline: raspberrypi: Move configureIPA() to RPiCameraData

The PipelineHandlerRPi::configureIPA() function accesses plenty of
member data from the RPiCameraData class and no member from the
PipelineHandlerRPi class. Move it to RPiCameraData where it logically
belongs.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Laurent Pinchart 2020-06-29 00:03:44 +03:00
parent 44c4be5dba
commit c567ca70d0

View file

@ -310,6 +310,8 @@ public:
void frameStarted(uint32_t sequence); void frameStarted(uint32_t sequence);
int loadIPA(); int loadIPA();
int configureIPA();
void queueFrameAction(unsigned int frame, const IPAOperationData &action); void queueFrameAction(unsigned int frame, const IPAOperationData &action);
/* bufferComplete signal handlers. */ /* bufferComplete signal handlers. */
@ -394,8 +396,6 @@ private:
return static_cast<RPiCameraData *>(PipelineHandler::cameraData(camera)); return static_cast<RPiCameraData *>(PipelineHandler::cameraData(camera));
} }
int configureIPA(Camera *camera);
int queueAllBuffers(Camera *camera); int queueAllBuffers(Camera *camera);
int prepareBuffers(Camera *camera); int prepareBuffers(Camera *camera);
void freeBuffers(Camera *camera); void freeBuffers(Camera *camera);
@ -767,7 +767,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
crop.y = (sensorFormat.size.height - crop.height) >> 1; crop.y = (sensorFormat.size.height - crop.height) >> 1;
data->isp_[Isp::Input].dev()->setSelection(V4L2_SEL_TGT_CROP, &crop); data->isp_[Isp::Input].dev()->setSelection(V4L2_SEL_TGT_CROP, &crop);
ret = configureIPA(camera); ret = data->configureIPA();
if (ret) if (ret)
LOG(RPI, Error) << "Failed to configure the IPA: " << ret; LOG(RPI, Error) << "Failed to configure the IPA: " << ret;
@ -979,67 +979,6 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator)
return true; return true;
} }
int PipelineHandlerRPi::configureIPA(Camera *camera)
{
std::map<unsigned int, IPAStream> streamConfig;
std::map<unsigned int, const ControlInfoMap &> entityControls;
RPiCameraData *data = cameraData(camera);
/* Get the device format to pass to the IPA. */
V4L2DeviceFormat sensorFormat;
data->unicam_[Unicam::Image].dev()->getFormat(&sensorFormat);
/* Inform IPA of stream configuration and sensor controls. */
unsigned int i = 0;
for (auto const &stream : data->isp_) {
if (stream.isExternal()) {
streamConfig[i] = {
.pixelFormat = stream.configuration().pixelFormat,
.size = stream.configuration().size
};
}
}
entityControls.emplace(0, data->unicam_[Unicam::Image].dev()->controls());
entityControls.emplace(1, data->isp_[Isp::Input].dev()->controls());
/* Allocate the lens shading table via vcsm and pass to the IPA. */
if (!data->lsTable_) {
data->lsTable_ = data->vcsm_.alloc("ls_grid", MAX_LS_GRID_SIZE);
uintptr_t ptr = reinterpret_cast<uintptr_t>(data->lsTable_);
if (!data->lsTable_)
return -ENOMEM;
/*
* The vcsm allocation will always be in the memory region
* < 32-bits to allow Videocore to access the memory.
*
* \todo Sending a pointer to the IPA is a workaround for
* vc_sm_cma not yet supporting dmabuf. This will not work with
* IPA module isolation and should be reworked when vc_sma_cma
* will permit.
*/
IPAOperationData op;
op.operation = RPI_IPA_EVENT_LS_TABLE_ALLOCATION;
op.data = { static_cast<uint32_t>(ptr & 0xffffffff),
data->vcsm_.getVCHandle(data->lsTable_) };
data->ipa_->processEvent(op);
}
CameraSensorInfo sensorInfo = {};
int ret = data->sensor_->sensorInfo(&sensorInfo);
if (ret) {
LOG(RPI, Error) << "Failed to retrieve camera sensor info";
return ret;
}
/* Ready the IPA - it must know about the sensor resolution. */
IPAOperationData ipaConfig;
data->ipa_->configure(sensorInfo, streamConfig, entityControls,
ipaConfig, nullptr);
return 0;
}
int PipelineHandlerRPi::queueAllBuffers(Camera *camera) int PipelineHandlerRPi::queueAllBuffers(Camera *camera)
{ {
RPiCameraData *data = cameraData(camera); RPiCameraData *data = cameraData(camera);
@ -1177,6 +1116,66 @@ int RPiCameraData::loadIPA()
return ipa_->start(); return ipa_->start();
} }
int RPiCameraData::configureIPA()
{
std::map<unsigned int, IPAStream> streamConfig;
std::map<unsigned int, const ControlInfoMap &> entityControls;
/* Get the device format to pass to the IPA. */
V4L2DeviceFormat sensorFormat;
unicam_[Unicam::Image].dev()->getFormat(&sensorFormat);
/* Inform IPA of stream configuration and sensor controls. */
unsigned int i = 0;
for (auto const &stream : isp_) {
if (stream.isExternal()) {
streamConfig[i] = {
.pixelFormat = stream.configuration().pixelFormat,
.size = stream.configuration().size
};
}
}
entityControls.emplace(0, unicam_[Unicam::Image].dev()->controls());
entityControls.emplace(1, isp_[Isp::Input].dev()->controls());
/* Allocate the lens shading table via vcsm and pass to the IPA. */
if (!lsTable_) {
lsTable_ = vcsm_.alloc("ls_grid", MAX_LS_GRID_SIZE);
uintptr_t ptr = reinterpret_cast<uintptr_t>(lsTable_);
if (!lsTable_)
return -ENOMEM;
/*
* The vcsm allocation will always be in the memory region
* < 32-bits to allow Videocore to access the memory.
*
* \todo Sending a pointer to the IPA is a workaround for
* vc_sm_cma not yet supporting dmabuf. This will not work with
* IPA module isolation and should be reworked when vc_sma_cma
* will permit.
*/
IPAOperationData op;
op.operation = RPI_IPA_EVENT_LS_TABLE_ALLOCATION;
op.data = { static_cast<uint32_t>(ptr & 0xffffffff),
vcsm_.getVCHandle(lsTable_) };
ipa_->processEvent(op);
}
CameraSensorInfo sensorInfo = {};
int ret = sensor_->sensorInfo(&sensorInfo);
if (ret) {
LOG(RPI, Error) << "Failed to retrieve camera sensor info";
return ret;
}
/* Ready the IPA - it must know about the sensor resolution. */
IPAOperationData ipaConfig;
ipa_->configure(sensorInfo, streamConfig, entityControls, ipaConfig,
nullptr);
return 0;
}
void RPiCameraData::queueFrameAction(unsigned int frame, const IPAOperationData &action) void RPiCameraData::queueFrameAction(unsigned int frame, const IPAOperationData &action)
{ {
/* /*