diff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp index a450583b..23e94da0 100644 --- a/src/libcamera/pipeline/rpi/pisp/pisp.cpp +++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp @@ -882,9 +882,9 @@ bool PipelineHandlerPiSP::match(DeviceEnumerator *enumerator) */ for (unsigned int i = 0; i < numCfeDevices; i++) { DeviceMatch cfe("rp1-cfe"); - cfe.add("rp1-cfe-fe-image0"); - cfe.add("rp1-cfe-fe-stats"); - cfe.add("rp1-cfe-fe-config"); + cfe.add("rp1-cfe-fe_image0"); + cfe.add("rp1-cfe-fe_stats"); + cfe.add("rp1-cfe-fe_config"); std::shared_ptr cfeDevice = acquireMediaDevice(enumerator, cfe); if (!cfeDevice) { @@ -1072,10 +1072,10 @@ int PipelineHandlerPiSP::platformRegister(std::unique_ptr &came PiSPCameraData *data = static_cast(cameraData.get()); int ret; - MediaEntity *cfeImage = cfe->getEntityByName("rp1-cfe-fe-image0"); - MediaEntity *cfeEmbedded = cfe->getEntityByName("rp1-cfe-csi2-ch1"); - MediaEntity *cfeStats = cfe->getEntityByName("rp1-cfe-fe-stats"); - MediaEntity *cfeConfig = cfe->getEntityByName("rp1-cfe-fe-config"); + MediaEntity *cfeImage = cfe->getEntityByName("rp1-cfe-fe_image0"); + MediaEntity *cfeEmbedded = cfe->getEntityByName("rp1-cfe-embedded"); + MediaEntity *cfeStats = cfe->getEntityByName("rp1-cfe-fe_stats"); + MediaEntity *cfeConfig = cfe->getEntityByName("rp1-cfe-fe_config"); MediaEntity *ispInput = isp->getEntityByName("pispbe-input"); MediaEntity *IpaPrepare = isp->getEntityByName("pispbe-config"); MediaEntity *ispOutput0 = isp->getEntityByName("pispbe-output0"); @@ -1630,26 +1630,12 @@ int PiSPCameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConf * Configure the CFE embedded data output format only if the sensor * supports it. */ - V4L2SubdeviceFormat embeddedFormat = sensor_->embeddedDataFormat(); + V4L2SubdeviceFormat embeddedFormat; if (sensorMetadata_) { - static const std::map metaFormats{ - { MEDIA_BUS_FMT_META_8, V4L2PixelFormat(V4L2_META_FMT_GENERIC_8) }, - { MEDIA_BUS_FMT_META_10, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_10) }, - { MEDIA_BUS_FMT_META_12, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_12) }, - { MEDIA_BUS_FMT_META_14, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_14) }, - }; - - const auto metaFormat = metaFormats.find(embeddedFormat.code); - if (metaFormat == metaFormats.end()) { - LOG(RPI, Error) - << "Unsupported metadata format " - << utils::hex(embeddedFormat.code, 4); - return -EINVAL; - } - + sensor_->device()->getFormat(1, &embeddedFormat); format = {}; - format.fourcc = metaFormat->second; - format.size = embeddedFormat.size; + format.fourcc = V4L2PixelFormat(V4L2_META_FMT_SENSOR_DATA); + format.planes[0].size = embeddedFormat.size.width * embeddedFormat.size.height; LOG(RPI, Debug) << "Setting embedded data format " << format; ret = cfe_[Cfe::Embedded].dev()->setFormat(&format); @@ -2174,8 +2160,9 @@ int PiSPCameraData::configureEntities(V4L2SubdeviceFormat sensorFormat, int ret = 0; constexpr unsigned int csiVideoSinkPad = 0; - constexpr unsigned int csiVideoSourcePad = 1; - constexpr unsigned int csiMetaSourcePad = 2; + constexpr unsigned int csiMetaSinkPad = 1; + constexpr unsigned int csiVideoSourcePad = 4; + constexpr unsigned int csiMetaSourcePad = 5; constexpr unsigned int feVideoSinkPad = 0; constexpr unsigned int feConfigSinkPad = 1; @@ -2187,7 +2174,7 @@ int PiSPCameraData::configureEntities(V4L2SubdeviceFormat sensorFormat, const MediaEntity *fe = feSubdev_->entity(); for (MediaLink *link : csi2->pads()[csiVideoSourcePad]->links()) { - if (link->sink()->entity()->name() == "rp1-cfe-csi2-ch0") + if (link->sink()->entity()->name() == "rp1-cfe-csi2_ch0") link->setEnabled(false); else if (link->sink()->entity()->name() == "pisp-fe") link->setEnabled(true); @@ -2200,34 +2187,16 @@ int PiSPCameraData::configureEntities(V4L2SubdeviceFormat sensorFormat, fe->pads()[feVideo1SourcePad]->links()[0]->setEnabled(false); fe->pads()[feStatsSourcePad]->links()[0]->setEnabled(true); - const V4L2Subdevice::Stream imageStream{ - csiVideoSinkPad, - sensor_->imageStream().stream - }; - const V4L2Subdevice::Stream embeddedDataStream{ - csiVideoSinkPad, - sensor_->embeddedDataStream().value_or(V4L2Subdevice::Stream{}).stream - }; - - V4L2Subdevice::Routing routing; - routing.emplace_back(imageStream, V4L2Subdevice::Stream{ csiVideoSourcePad, 0 }, - V4L2_SUBDEV_ROUTE_FL_ACTIVE); - - if (sensorMetadata_) - routing.emplace_back(embeddedDataStream, - V4L2Subdevice::Stream{ csiMetaSourcePad, 0 }, - V4L2_SUBDEV_ROUTE_FL_ACTIVE); - - ret = csi2Subdev_->setRouting(&routing); - if (ret) - return ret; - - ret = csi2Subdev_->setFormat(imageStream, &sensorFormat); + ret = csi2Subdev_->setFormat(csiVideoSinkPad, &sensorFormat); if (ret) return ret; if (sensorMetadata_) { - ret = csi2Subdev_->setFormat(embeddedDataStream, &embeddedFormat); + ret = csi2Subdev_->setFormat(csiMetaSinkPad, &embeddedFormat); + if (ret) + return ret; + + ret = csi2Subdev_->setFormat(csiMetaSourcePad, &embeddedFormat); if (ret) return ret; }