Message ID | 20210130111651.1073981-1-naush@raspberrypi.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Naush On Sat, Jan 30, 2021 at 11:16:51AM +0000, Naushir Patuck wrote: > Rename the enum values to indicate pipeline handler -> IPA actions > (IPA_CONFIG_*) and IPA -> pipeline handler return results (IPA_RESULT_*). > Additionally, provide more descriptive names for these values. This part is ok, make naming more clear Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> > > Fixup logic when handling IPA_RESULT_SENSOR_PARAMS where we must > overwrite the parameters if provided by IPA. In the current codebase, > this only happens once on startup, so there is no effective functional > difference. But this change allows the option for the IPA to request new > sensor parameters per-mode if required. This seems it's worth a separate patch, as it does not depends on renaming but it's rather a change in behaviour which it would probably better be separate. If I got this right you refer to 'parameters' in the commit message here to indicate the controls delay could be overwritten at each configureIPA() am I right ? Out of curiosity, how does the sensor mode change impact on the control delay ? Thanks j > > Signed-off-by: Naushir Patuck <naush@raspberrypi.com> > --- > include/libcamera/ipa/raspberrypi.h | 10 +++--- > src/ipa/raspberrypi/raspberrypi.cpp | 18 +++++------ > .../pipeline/raspberrypi/raspberrypi.cpp | 31 +++++++++---------- > 3 files changed, 28 insertions(+), 31 deletions(-) > > diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h > index 5a9433825d5a..970b9e931188 100644 > --- a/include/libcamera/ipa/raspberrypi.h > +++ b/include/libcamera/ipa/raspberrypi.h > @@ -20,11 +20,11 @@ namespace RPi { > > enum ConfigParameters { > IPA_CONFIG_LS_TABLE = (1 << 0), > - IPA_CONFIG_STAGGERED_WRITE = (1 << 1), > - IPA_CONFIG_SENSOR = (1 << 2), > - IPA_CONFIG_DROP_FRAMES = (1 << 3), > - IPA_CONFIG_FAILED = (1 << 4), > - IPA_CONFIG_STARTUP = (1 << 5), > + IPA_CONFIG_STARTUP_CTRLS = (1 << 1), > + IPA_RESULT_CONFIG_FAILED = (1 << 2), > + IPA_RESULT_SENSOR_PARAMS = (1 << 3), > + IPA_RESULT_SENSOR_CTRLS = (1 << 4), > + IPA_RESULT_DROP_FRAMES = (1 << 5), > }; > > enum Operations { > diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp > index 681ab9211b7c..fea1ea3957bb 100644 > --- a/src/ipa/raspberrypi/raspberrypi.cpp > +++ b/src/ipa/raspberrypi/raspberrypi.cpp > @@ -170,7 +170,7 @@ int IPARPi::start(const IPAOperationData &data, IPAOperationData *result) > > ASSERT(result); > result->operation = 0; > - if (data.operation & RPi::IPA_CONFIG_STARTUP) { > + if (data.operation & RPi::IPA_CONFIG_STARTUP_CTRLS) { > /* We have been given some controls to action before start. */ > queueRequest(data.controls[0]); > } > @@ -188,7 +188,7 @@ int IPARPi::start(const IPAOperationData &data, IPAOperationData *result) > ControlList ctrls(sensorCtrls_); > applyAGC(&agcStatus, ctrls); > result->controls.emplace_back(ctrls); > - result->operation |= RPi::IPA_CONFIG_SENSOR; > + result->operation |= RPi::IPA_RESULT_SENSOR_CTRLS; > } > > /* > @@ -236,7 +236,7 @@ int IPARPi::start(const IPAOperationData &data, IPAOperationData *result) > } > > result->data.push_back(dropFrame); > - result->operation |= RPi::IPA_CONFIG_DROP_FRAMES; > + result->operation |= RPi::IPA_RESULT_DROP_FRAMES; > > firstStart_ = false; > > @@ -289,7 +289,7 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo, > { > if (entityControls.size() != 2) { > LOG(IPARPI, Error) << "No ISP or sensor controls found."; > - result->operation = RPi::IPA_CONFIG_FAILED; > + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; > return; > } > > @@ -300,13 +300,13 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo, > > if (!validateSensorControls()) { > LOG(IPARPI, Error) << "Sensor control validation failed."; > - result->operation = RPi::IPA_CONFIG_FAILED; > + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; > return; > } > > if (!validateIspControls()) { > LOG(IPARPI, Error) << "ISP control validation failed."; > - result->operation = RPi::IPA_CONFIG_FAILED; > + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; > return; > } > > @@ -325,7 +325,7 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo, > if (!helper_) { > LOG(IPARPI, Error) << "Could not create camera helper for " > << cameraName; > - result->operation = RPi::IPA_CONFIG_FAILED; > + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; > return; > } > > @@ -342,7 +342,7 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo, > result->data.push_back(exposureDelay); /* For VBLANK ctrl */ > result->data.push_back(sensorMetadata); > > - result->operation |= RPi::IPA_CONFIG_STAGGERED_WRITE; > + result->operation |= RPi::IPA_RESULT_SENSOR_PARAMS; > } > > /* Re-assemble camera mode using the sensor info. */ > @@ -395,7 +395,7 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo, > applyAGC(&agcStatus, ctrls); > > result->controls.emplace_back(ctrls); > - result->operation |= RPi::IPA_CONFIG_SENSOR; > + result->operation |= RPi::IPA_RESULT_SENSOR_CTRLS; > } > > lastMode_ = mode_; > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp > index 5ad12d99638f..c44cb437a596 100644 > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp > @@ -753,7 +753,7 @@ int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *cont > IPAOperationData ipaData = {}; > IPAOperationData result = {}; > if (controls) { > - ipaData.operation = RPi::IPA_CONFIG_STARTUP; > + ipaData.operation = RPi::IPA_CONFIG_STARTUP_CTRLS; > ipaData.controls.emplace_back(*controls); > } > ret = data->ipa_->start(ipaData, &result); > @@ -765,12 +765,12 @@ int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *cont > } > > /* Apply any gain/exposure settings that the IPA may have passed back. */ > - if (result.operation & RPi::IPA_CONFIG_SENSOR) { > + if (result.operation & RPi::IPA_RESULT_SENSOR_CTRLS) { > ControlList &ctrls = result.controls[0]; > data->unicam_[Unicam::Image].dev()->setControls(&ctrls); > } > > - if (result.operation & RPi::IPA_CONFIG_DROP_FRAMES) { > + if (result.operation & RPi::IPA_RESULT_DROP_FRAMES) { > /* Configure the number of dropped frames required on startup. */ > data->dropFrameCount_ = result.data[0]; > } > @@ -1213,31 +1213,28 @@ int RPiCameraData::configureIPA(const CameraConfiguration *config) > ipa_->configure(sensorInfo_, streamConfig, entityControls, ipaConfig, > &result); > > - if (result.operation & RPi::IPA_CONFIG_FAILED) { > + if (result.operation & RPi::IPA_RESULT_CONFIG_FAILED) { > LOG(RPI, Error) << "IPA configuration failed!"; > return -EPIPE; > } > > unsigned int resultIdx = 0; > - if (result.operation & RPi::IPA_CONFIG_STAGGERED_WRITE) { > + if (result.operation & RPi::IPA_RESULT_SENSOR_PARAMS) { > /* > * Setup our delayed control writer with the sensor default > * gain and exposure delays. > */ > - if (!delayedCtrls_) { > - std::unordered_map<uint32_t, unsigned int> delays = { > - { V4L2_CID_ANALOGUE_GAIN, result.data[resultIdx++] }, > - { V4L2_CID_EXPOSURE, result.data[resultIdx++] }, > - { V4L2_CID_VBLANK, result.data[resultIdx++] } > - }; > - > - delayedCtrls_ = std::make_unique<DelayedControls>(unicam_[Unicam::Image].dev(), delays); > - > - sensorMetadata_ = result.data[resultIdx++]; > - } > + std::unordered_map<uint32_t, unsigned int> delays = { > + { V4L2_CID_ANALOGUE_GAIN, result.data[resultIdx++] }, > + { V4L2_CID_EXPOSURE, result.data[resultIdx++] }, > + { V4L2_CID_VBLANK, result.data[resultIdx++] } > + }; > + > + delayedCtrls_ = std::make_unique<DelayedControls>(unicam_[Unicam::Image].dev(), delays); > + sensorMetadata_ = result.data[resultIdx++]; > } > > - if (result.operation & RPi::IPA_CONFIG_SENSOR) { > + if (result.operation & RPi::IPA_RESULT_SENSOR_CTRLS) { > ControlList &ctrls = result.controls[0]; > unicam_[Unicam::Image].dev()->setControls(&ctrls); > } > -- > 2.25.1 > > _______________________________________________ > libcamera-devel mailing list > libcamera-devel@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel
Hi Jacopo, Thank you for your review feedback. On Mon, 1 Feb 2021 at 10:53, Jacopo Mondi <jacopo@jmondi.org> wrote: > Hi Naush > > On Sat, Jan 30, 2021 at 11:16:51AM +0000, Naushir Patuck wrote: > > Rename the enum values to indicate pipeline handler -> IPA actions > > (IPA_CONFIG_*) and IPA -> pipeline handler return results (IPA_RESULT_*). > > Additionally, provide more descriptive names for these values. > > This part is ok, make naming more clear > Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> > > > > > Fixup logic when handling IPA_RESULT_SENSOR_PARAMS where we must > > overwrite the parameters if provided by IPA. In the current codebase, > > this only happens once on startup, so there is no effective functional > > difference. But this change allows the option for the IPA to request new > > sensor parameters per-mode if required. > > This seems it's worth a separate patch, as it does not depends on > renaming but it's rather a change in behaviour which it would probably > better be separate. > Ack. I can separate these out into 2 patches. Will post an update shortly. > > If I got this right you refer to 'parameters' in the commit message > here to indicate the controls delay could be overwritten at each > configureIPA() am I right ? Out of curiosity, how does the sensor mode > change impact on the control delay ? > In almost all cases it won't. However, I have sensors that will disable embedded data in certain modes, but again, this is very rare. Regards, Naush > > Thanks > j > > > > > > Signed-off-by: Naushir Patuck <naush@raspberrypi.com> > > --- > > include/libcamera/ipa/raspberrypi.h | 10 +++--- > > src/ipa/raspberrypi/raspberrypi.cpp | 18 +++++------ > > .../pipeline/raspberrypi/raspberrypi.cpp | 31 +++++++++---------- > > 3 files changed, 28 insertions(+), 31 deletions(-) > > > > diff --git a/include/libcamera/ipa/raspberrypi.h > b/include/libcamera/ipa/raspberrypi.h > > index 5a9433825d5a..970b9e931188 100644 > > --- a/include/libcamera/ipa/raspberrypi.h > > +++ b/include/libcamera/ipa/raspberrypi.h > > @@ -20,11 +20,11 @@ namespace RPi { > > > > enum ConfigParameters { > > IPA_CONFIG_LS_TABLE = (1 << 0), > > - IPA_CONFIG_STAGGERED_WRITE = (1 << 1), > > - IPA_CONFIG_SENSOR = (1 << 2), > > - IPA_CONFIG_DROP_FRAMES = (1 << 3), > > - IPA_CONFIG_FAILED = (1 << 4), > > - IPA_CONFIG_STARTUP = (1 << 5), > > + IPA_CONFIG_STARTUP_CTRLS = (1 << 1), > > + IPA_RESULT_CONFIG_FAILED = (1 << 2), > > + IPA_RESULT_SENSOR_PARAMS = (1 << 3), > > + IPA_RESULT_SENSOR_CTRLS = (1 << 4), > > + IPA_RESULT_DROP_FRAMES = (1 << 5), > > }; > > > > enum Operations { > > diff --git a/src/ipa/raspberrypi/raspberrypi.cpp > b/src/ipa/raspberrypi/raspberrypi.cpp > > index 681ab9211b7c..fea1ea3957bb 100644 > > --- a/src/ipa/raspberrypi/raspberrypi.cpp > > +++ b/src/ipa/raspberrypi/raspberrypi.cpp > > @@ -170,7 +170,7 @@ int IPARPi::start(const IPAOperationData &data, > IPAOperationData *result) > > > > ASSERT(result); > > result->operation = 0; > > - if (data.operation & RPi::IPA_CONFIG_STARTUP) { > > + if (data.operation & RPi::IPA_CONFIG_STARTUP_CTRLS) { > > /* We have been given some controls to action before > start. */ > > queueRequest(data.controls[0]); > > } > > @@ -188,7 +188,7 @@ int IPARPi::start(const IPAOperationData &data, > IPAOperationData *result) > > ControlList ctrls(sensorCtrls_); > > applyAGC(&agcStatus, ctrls); > > result->controls.emplace_back(ctrls); > > - result->operation |= RPi::IPA_CONFIG_SENSOR; > > + result->operation |= RPi::IPA_RESULT_SENSOR_CTRLS; > > } > > > > /* > > @@ -236,7 +236,7 @@ int IPARPi::start(const IPAOperationData &data, > IPAOperationData *result) > > } > > > > result->data.push_back(dropFrame); > > - result->operation |= RPi::IPA_CONFIG_DROP_FRAMES; > > + result->operation |= RPi::IPA_RESULT_DROP_FRAMES; > > > > firstStart_ = false; > > > > @@ -289,7 +289,7 @@ void IPARPi::configure(const CameraSensorInfo > &sensorInfo, > > { > > if (entityControls.size() != 2) { > > LOG(IPARPI, Error) << "No ISP or sensor controls found."; > > - result->operation = RPi::IPA_CONFIG_FAILED; > > + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; > > return; > > } > > > > @@ -300,13 +300,13 @@ void IPARPi::configure(const CameraSensorInfo > &sensorInfo, > > > > if (!validateSensorControls()) { > > LOG(IPARPI, Error) << "Sensor control validation failed."; > > - result->operation = RPi::IPA_CONFIG_FAILED; > > + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; > > return; > > } > > > > if (!validateIspControls()) { > > LOG(IPARPI, Error) << "ISP control validation failed."; > > - result->operation = RPi::IPA_CONFIG_FAILED; > > + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; > > return; > > } > > > > @@ -325,7 +325,7 @@ void IPARPi::configure(const CameraSensorInfo > &sensorInfo, > > if (!helper_) { > > LOG(IPARPI, Error) << "Could not create camera > helper for " > > << cameraName; > > - result->operation = RPi::IPA_CONFIG_FAILED; > > + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; > > return; > > } > > > > @@ -342,7 +342,7 @@ void IPARPi::configure(const CameraSensorInfo > &sensorInfo, > > result->data.push_back(exposureDelay); /* For VBLANK ctrl > */ > > result->data.push_back(sensorMetadata); > > > > - result->operation |= RPi::IPA_CONFIG_STAGGERED_WRITE; > > + result->operation |= RPi::IPA_RESULT_SENSOR_PARAMS; > > } > > > > /* Re-assemble camera mode using the sensor info. */ > > @@ -395,7 +395,7 @@ void IPARPi::configure(const CameraSensorInfo > &sensorInfo, > > applyAGC(&agcStatus, ctrls); > > > > result->controls.emplace_back(ctrls); > > - result->operation |= RPi::IPA_CONFIG_SENSOR; > > + result->operation |= RPi::IPA_RESULT_SENSOR_CTRLS; > > } > > > > lastMode_ = mode_; > > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp > b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp > > index 5ad12d99638f..c44cb437a596 100644 > > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp > > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp > > @@ -753,7 +753,7 @@ int PipelineHandlerRPi::start(Camera *camera, > [[maybe_unused]] ControlList *cont > > IPAOperationData ipaData = {}; > > IPAOperationData result = {}; > > if (controls) { > > - ipaData.operation = RPi::IPA_CONFIG_STARTUP; > > + ipaData.operation = RPi::IPA_CONFIG_STARTUP_CTRLS; > > ipaData.controls.emplace_back(*controls); > > } > > ret = data->ipa_->start(ipaData, &result); > > @@ -765,12 +765,12 @@ int PipelineHandlerRPi::start(Camera *camera, > [[maybe_unused]] ControlList *cont > > } > > > > /* Apply any gain/exposure settings that the IPA may have passed > back. */ > > - if (result.operation & RPi::IPA_CONFIG_SENSOR) { > > + if (result.operation & RPi::IPA_RESULT_SENSOR_CTRLS) { > > ControlList &ctrls = result.controls[0]; > > data->unicam_[Unicam::Image].dev()->setControls(&ctrls); > > } > > > > - if (result.operation & RPi::IPA_CONFIG_DROP_FRAMES) { > > + if (result.operation & RPi::IPA_RESULT_DROP_FRAMES) { > > /* Configure the number of dropped frames required on > startup. */ > > data->dropFrameCount_ = result.data[0]; > > } > > @@ -1213,31 +1213,28 @@ int RPiCameraData::configureIPA(const > CameraConfiguration *config) > > ipa_->configure(sensorInfo_, streamConfig, entityControls, > ipaConfig, > > &result); > > > > - if (result.operation & RPi::IPA_CONFIG_FAILED) { > > + if (result.operation & RPi::IPA_RESULT_CONFIG_FAILED) { > > LOG(RPI, Error) << "IPA configuration failed!"; > > return -EPIPE; > > } > > > > unsigned int resultIdx = 0; > > - if (result.operation & RPi::IPA_CONFIG_STAGGERED_WRITE) { > > + if (result.operation & RPi::IPA_RESULT_SENSOR_PARAMS) { > > /* > > * Setup our delayed control writer with the sensor default > > * gain and exposure delays. > > */ > > - if (!delayedCtrls_) { > > - std::unordered_map<uint32_t, unsigned int> delays > = { > > - { V4L2_CID_ANALOGUE_GAIN, > result.data[resultIdx++] }, > > - { V4L2_CID_EXPOSURE, > result.data[resultIdx++] }, > > - { V4L2_CID_VBLANK, > result.data[resultIdx++] } > > - }; > > - > > - delayedCtrls_ = > std::make_unique<DelayedControls>(unicam_[Unicam::Image].dev(), delays); > > - > > - sensorMetadata_ = result.data[resultIdx++]; > > - } > > + std::unordered_map<uint32_t, unsigned int> delays = { > > + { V4L2_CID_ANALOGUE_GAIN, result.data[resultIdx++] > }, > > + { V4L2_CID_EXPOSURE, result.data[resultIdx++] }, > > + { V4L2_CID_VBLANK, result.data[resultIdx++] } > > + }; > > + > > + delayedCtrls_ = > std::make_unique<DelayedControls>(unicam_[Unicam::Image].dev(), delays); > > + sensorMetadata_ = result.data[resultIdx++]; > > } > > > > - if (result.operation & RPi::IPA_CONFIG_SENSOR) { > > + if (result.operation & RPi::IPA_RESULT_SENSOR_CTRLS) { > > ControlList &ctrls = result.controls[0]; > > unicam_[Unicam::Image].dev()->setControls(&ctrls); > > } > > -- > > 2.25.1 > > > > _______________________________________________ > > libcamera-devel mailing list > > libcamera-devel@lists.libcamera.org > > https://lists.libcamera.org/listinfo/libcamera-devel >
diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h index 5a9433825d5a..970b9e931188 100644 --- a/include/libcamera/ipa/raspberrypi.h +++ b/include/libcamera/ipa/raspberrypi.h @@ -20,11 +20,11 @@ namespace RPi { enum ConfigParameters { IPA_CONFIG_LS_TABLE = (1 << 0), - IPA_CONFIG_STAGGERED_WRITE = (1 << 1), - IPA_CONFIG_SENSOR = (1 << 2), - IPA_CONFIG_DROP_FRAMES = (1 << 3), - IPA_CONFIG_FAILED = (1 << 4), - IPA_CONFIG_STARTUP = (1 << 5), + IPA_CONFIG_STARTUP_CTRLS = (1 << 1), + IPA_RESULT_CONFIG_FAILED = (1 << 2), + IPA_RESULT_SENSOR_PARAMS = (1 << 3), + IPA_RESULT_SENSOR_CTRLS = (1 << 4), + IPA_RESULT_DROP_FRAMES = (1 << 5), }; enum Operations { diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index 681ab9211b7c..fea1ea3957bb 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -170,7 +170,7 @@ int IPARPi::start(const IPAOperationData &data, IPAOperationData *result) ASSERT(result); result->operation = 0; - if (data.operation & RPi::IPA_CONFIG_STARTUP) { + if (data.operation & RPi::IPA_CONFIG_STARTUP_CTRLS) { /* We have been given some controls to action before start. */ queueRequest(data.controls[0]); } @@ -188,7 +188,7 @@ int IPARPi::start(const IPAOperationData &data, IPAOperationData *result) ControlList ctrls(sensorCtrls_); applyAGC(&agcStatus, ctrls); result->controls.emplace_back(ctrls); - result->operation |= RPi::IPA_CONFIG_SENSOR; + result->operation |= RPi::IPA_RESULT_SENSOR_CTRLS; } /* @@ -236,7 +236,7 @@ int IPARPi::start(const IPAOperationData &data, IPAOperationData *result) } result->data.push_back(dropFrame); - result->operation |= RPi::IPA_CONFIG_DROP_FRAMES; + result->operation |= RPi::IPA_RESULT_DROP_FRAMES; firstStart_ = false; @@ -289,7 +289,7 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo, { if (entityControls.size() != 2) { LOG(IPARPI, Error) << "No ISP or sensor controls found."; - result->operation = RPi::IPA_CONFIG_FAILED; + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; return; } @@ -300,13 +300,13 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo, if (!validateSensorControls()) { LOG(IPARPI, Error) << "Sensor control validation failed."; - result->operation = RPi::IPA_CONFIG_FAILED; + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; return; } if (!validateIspControls()) { LOG(IPARPI, Error) << "ISP control validation failed."; - result->operation = RPi::IPA_CONFIG_FAILED; + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; return; } @@ -325,7 +325,7 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo, if (!helper_) { LOG(IPARPI, Error) << "Could not create camera helper for " << cameraName; - result->operation = RPi::IPA_CONFIG_FAILED; + result->operation = RPi::IPA_RESULT_CONFIG_FAILED; return; } @@ -342,7 +342,7 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo, result->data.push_back(exposureDelay); /* For VBLANK ctrl */ result->data.push_back(sensorMetadata); - result->operation |= RPi::IPA_CONFIG_STAGGERED_WRITE; + result->operation |= RPi::IPA_RESULT_SENSOR_PARAMS; } /* Re-assemble camera mode using the sensor info. */ @@ -395,7 +395,7 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo, applyAGC(&agcStatus, ctrls); result->controls.emplace_back(ctrls); - result->operation |= RPi::IPA_CONFIG_SENSOR; + result->operation |= RPi::IPA_RESULT_SENSOR_CTRLS; } lastMode_ = mode_; diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index 5ad12d99638f..c44cb437a596 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -753,7 +753,7 @@ int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *cont IPAOperationData ipaData = {}; IPAOperationData result = {}; if (controls) { - ipaData.operation = RPi::IPA_CONFIG_STARTUP; + ipaData.operation = RPi::IPA_CONFIG_STARTUP_CTRLS; ipaData.controls.emplace_back(*controls); } ret = data->ipa_->start(ipaData, &result); @@ -765,12 +765,12 @@ int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *cont } /* Apply any gain/exposure settings that the IPA may have passed back. */ - if (result.operation & RPi::IPA_CONFIG_SENSOR) { + if (result.operation & RPi::IPA_RESULT_SENSOR_CTRLS) { ControlList &ctrls = result.controls[0]; data->unicam_[Unicam::Image].dev()->setControls(&ctrls); } - if (result.operation & RPi::IPA_CONFIG_DROP_FRAMES) { + if (result.operation & RPi::IPA_RESULT_DROP_FRAMES) { /* Configure the number of dropped frames required on startup. */ data->dropFrameCount_ = result.data[0]; } @@ -1213,31 +1213,28 @@ int RPiCameraData::configureIPA(const CameraConfiguration *config) ipa_->configure(sensorInfo_, streamConfig, entityControls, ipaConfig, &result); - if (result.operation & RPi::IPA_CONFIG_FAILED) { + if (result.operation & RPi::IPA_RESULT_CONFIG_FAILED) { LOG(RPI, Error) << "IPA configuration failed!"; return -EPIPE; } unsigned int resultIdx = 0; - if (result.operation & RPi::IPA_CONFIG_STAGGERED_WRITE) { + if (result.operation & RPi::IPA_RESULT_SENSOR_PARAMS) { /* * Setup our delayed control writer with the sensor default * gain and exposure delays. */ - if (!delayedCtrls_) { - std::unordered_map<uint32_t, unsigned int> delays = { - { V4L2_CID_ANALOGUE_GAIN, result.data[resultIdx++] }, - { V4L2_CID_EXPOSURE, result.data[resultIdx++] }, - { V4L2_CID_VBLANK, result.data[resultIdx++] } - }; - - delayedCtrls_ = std::make_unique<DelayedControls>(unicam_[Unicam::Image].dev(), delays); - - sensorMetadata_ = result.data[resultIdx++]; - } + std::unordered_map<uint32_t, unsigned int> delays = { + { V4L2_CID_ANALOGUE_GAIN, result.data[resultIdx++] }, + { V4L2_CID_EXPOSURE, result.data[resultIdx++] }, + { V4L2_CID_VBLANK, result.data[resultIdx++] } + }; + + delayedCtrls_ = std::make_unique<DelayedControls>(unicam_[Unicam::Image].dev(), delays); + sensorMetadata_ = result.data[resultIdx++]; } - if (result.operation & RPi::IPA_CONFIG_SENSOR) { + if (result.operation & RPi::IPA_RESULT_SENSOR_CTRLS) { ControlList &ctrls = result.controls[0]; unicam_[Unicam::Image].dev()->setControls(&ctrls); }
Rename the enum values to indicate pipeline handler -> IPA actions (IPA_CONFIG_*) and IPA -> pipeline handler return results (IPA_RESULT_*). Additionally, provide more descriptive names for these values. Fixup logic when handling IPA_RESULT_SENSOR_PARAMS where we must overwrite the parameters if provided by IPA. In the current codebase, this only happens once on startup, so there is no effective functional difference. But this change allows the option for the IPA to request new sensor parameters per-mode if required. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> --- include/libcamera/ipa/raspberrypi.h | 10 +++--- src/ipa/raspberrypi/raspberrypi.cpp | 18 +++++------ .../pipeline/raspberrypi/raspberrypi.cpp | 31 +++++++++---------- 3 files changed, 28 insertions(+), 31 deletions(-)