/* * Copyright (c) 2016-2020, NVIDIA CORPORATION. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of NVIDIA CORPORATION nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @file * Libargus API: Settings API * * @b Description: This file defines the settings that control the sensor module. */ #ifndef _ARGUS_SETTINGS_H #define _ARGUS_SETTINGS_H namespace Argus { /** * @class ISourceSettings * * Interface to the source settings (provided by IRequest::getSourceSettings()). * * @ingroup ArgusSourceSettings */ DEFINE_UUID(InterfaceID, IID_SOURCE_SETTINGS, eb7ae38c,3c62,4161,a92a,a6,4f,ba,c6,38,83); class ISourceSettings : public Interface { public: static const InterfaceID& id() { return IID_SOURCE_SETTINGS; } /** * Sets the exposure time range of the source, in nanoseconds. * If the exposure range is outside of the available range, the capture's exposure time * will be as close as possible to the exposure range specified. * @param[in] exposureTimeRange Exposure time range, in nanoseconds. * @see ISensorMode::getExposureTimeRange() * @todo Document implications of quantization. * * @returns success/status of the call. */ virtual Status setExposureTimeRange(const Range& exposureTimeRange) = 0; /** * Returns the exposure time range of the source, in nanoseconds. */ virtual Range getExposureTimeRange() const = 0; /** * Sets the focus position, in focuser units. If the position * is set outside of the focuser limits, the position will be clamped. * @param[in] position The new focus position, in focuser units. * @see ICameraProperties::getFocusPositionRange() * * @returns success/status of the call. */ virtual Status setFocusPosition(int32_t position) = 0; /** * Returns the focus position, in focuser units. */ virtual int32_t getFocusPosition() const = 0; /** * Sets the aperture position. If the position is not valid, * error will be returned. * @param[in] position The new aperture position. * @see ICameraProperties::getAperturePositionRange() * * @returns success/status of the call. */ virtual Status setAperturePosition(int32_t position) = 0; /** * Returns the aperture position. */ virtual int32_t getAperturePosition() const = 0; /** * Sets the aperture motor speed in motor steps/second. If the speed * is set outside of the speed limits, the speed will be clamped. * @param[in] speed The new speed. * @see ICameraProperties::getApertureMotorSpeedRange() * * @returns success/status of the call. */ virtual Status setApertureMotorSpeed(float speed) = 0; /** * Returns the aperture motor speed in motor steps/second. */ virtual float getApertureMotorSpeed() const = 0; /** * Sets the aperture f-number. If the f-number is not valid, * error will be returned. * @param[in] fnumber The new f-number. * * @returns success/status of the call. */ virtual Status setApertureFNumber(float fnumber) = 0; /** * Returns the aperture f-number. */ virtual float getApertureFNumber() const = 0; /** * Sets the frame duration range, in nanoseconds. * If frame range is out of bounds of the current sensor mode, * the capture's frame duration will be as close as possible to the range specified. * @param[in] frameDurationRange Frame duration range, in nanoseconds * @see ISensorMode::getFrameDurationRange() * * @returns success/status of the call. */ virtual Status setFrameDurationRange(const Range& frameDurationRange) = 0; /** * Returns the frame duration range, in nanoseconds. */ virtual Range getFrameDurationRange() const = 0; /** * Sets the gain range for the sensor. * The range has to be within the max and min reported in the CameraProperties * Otherwise the range will be clipped. * @param[in] gainRange scalar gain range * @see ISensorMode::getAnalogGainRange() * * @returns success/status of the call. */ virtual Status setGainRange(const Range& gainRange) = 0; /** * Returns the gain range. */ virtual Range getGainRange() const = 0; /** * Sets the sensor mode. * Note that changing sensor mode from one capture to the next may result in * multiple sensor frames being dropped between the two captures. * @param[in] mode Desired sensor mode for the capture. * @see ICameraProperties::getAllSensorModes() * * @returns success/status of the call. */ virtual Status setSensorMode(SensorMode* mode) = 0; /** * Returns the sensor mode. */ virtual SensorMode* getSensorMode() const = 0; /** * Sets the user-specified optical black levels. * These values will be ignored unless getOpticalBlackEnable() == true * Values are floating point in the range [0,1) normalized based on sensor bit depth. * @param[in] opticalBlackLevels opticalBlack levels in range [0,1) per bayer phase * * @returns success/status of the call. */ virtual Status setOpticalBlack(const BayerTuple& opticalBlackLevels) = 0; /** * Returns user-specified opticalBlack level per bayer phase. * * @returns opticalBlackLevels */ virtual BayerTuple getOpticalBlack() const = 0; /** * Sets whether or not user-provided optical black levels are used. * @param[in] enable If @c true, Argus will use the user-specified optical black levels. * @see setOpticalBlack() * If @c false, the Argus implementation will choose the optical black values. * * @returns success/status of the call. */ virtual Status setOpticalBlackEnable(bool enable) = 0; /** * Returns whether user-specified optical black levels are enabled. * If false, the Argus implementation will choose the optical black values. * @see setOpticalBlackEnable() * * @returns enable */ virtual bool getOpticalBlackEnable() const = 0; protected: ~ISourceSettings() {} }; /** * @class IAutoControlSettings * * Interface to the auto control settings (provided by IRequest::getAutoControlSettings()). * * @ingroup ArgusAutoControlSettings */ DEFINE_UUID(InterfaceID, IID_AUTO_CONTROL_SETTINGS, 1f2ad1c6,cb13,440b,bc95,3f,fd,0d,19,91,db); class IAutoControlSettings : public Interface { public: static const InterfaceID& id() { return IID_AUTO_CONTROL_SETTINGS; } /** * Sets the AE antibanding mode. * @param[in] mode The requested antibanding mode. * * @returns success/status of the call. */ virtual Status setAeAntibandingMode(const AeAntibandingMode& mode) = 0; /** * Returns the AE antibanding mode. */ virtual AeAntibandingMode getAeAntibandingMode() const = 0; /** * Sets the AE lock. When locked, AE will maintain constant exposure. * @param[in] lock If @c true, locks AE at its current exposure. * * @returns success/status of the call. */ virtual Status setAeLock(bool lock) = 0; /** * Returns the AE lock. */ virtual bool getAeLock() const = 0; /** * Sets the AE regions of interest. * If no regions are specified, the region of interest will be determined by device * and obtain by CameraMetadata::getAeRegions. * @param[in] regions The AE regions of interest. * The maximum number of regions is returned by @c ICameraProperties::getMaxAeRegions(). * The minimum supported size of resultatnt region is returned by * @c ICameraProperties::getMinAeRegionSize(). * * @returns success/status of the call. */ virtual Status setAeRegions(const std::vector& regions) = 0; /** * Returns the AE regions of interest. * @param[out] regions A vector that will be populated with the AE regions of interest. * * @returns success/status of the call. */ virtual Status getAeRegions(std::vector* regions) const = 0; /** * Sets the bayer histogram region of interest. * If no region is specified, the entire image is the region of interest. * @param[in] region The bayer histogram region of interest. * * @returns success/status of the call. */ virtual Status setBayerHistogramRegion(const Rectangle& region) = 0; /** * Returns the rectangle of the bayer histogram region of interest. */ virtual Rectangle getBayerHistogramRegion() const = 0; /** * Sets the AWB lock. * @param[in] lock If @c true, locks AWB at its current state. * * @returns success/status of the call. */ virtual Status setAwbLock(bool lock) = 0; /** * Returns the AWB lock. */ virtual bool getAwbLock() const = 0; /** * Sets the AWB mode. * @param[in] mode The new AWB mode. * * @returns success/status of the call. */ virtual Status setAwbMode(const AwbMode& mode) = 0; /** * Returns the AWB mode. */ virtual AwbMode getAwbMode() const = 0; /** * Sets the AWB regions of interest. * If no regions are specified, the region of interest will be determined by device * and obtain by CameraMetadata::getAwbRegions. * @param[in] regions The AWB regions of interest. * The maximum number of regions is returned by @c ICameraProperties::getMaxAwbRegions(). * * @returns success/status of the call. */ virtual Status setAwbRegions(const std::vector& regions) = 0; /** * Returns the AWB regions of interest. * @param[out] regions A vector that will be populated with the AWB regions of interest. * * @returns success/status of the call. */ virtual Status getAwbRegions(std::vector* regions) const = 0; /** * Sets the AF regions of interest. * If no regions are specified, the region of interest will be determined by device * and obtain by CameraMetadata::getAfRegions. * @param[in] regions The AF regions of interest. * The maximum number of regions is returned by @c ICameraProperties::getMaxAfRegions(). * * @returns success/status of the call. */ virtual Status setAfRegions(const std::vector& regions) = 0; /** * Returns the AF regions of interest. * @param[out] regions A vector that will be populated with the AF regions of interest. * * @returns success/status of the call. */ virtual Status getAfRegions(std::vector* regions) const = 0; /** * Sets the Manual White Balance gains. * @param[in] gains The Manual White Balance Gains * * @returns success/status of the call. */ virtual Status setWbGains(const BayerTuple& gains) = 0; /** * Returns the Manual White Balance gains. * * @returns Manual White Balance Gains structure */ virtual BayerTuple getWbGains() const = 0; /** * Returns the size of the color correction matrix. */ virtual Size2D getColorCorrectionMatrixSize() const = 0; /** * Sets the user-specified color correction matrix. * This matrix will be ignored unless getColorCorrectionMatrixEnable() == true. * The active color correction matrix used for image processing may be internally modified * to account for the active color saturation value (either user-specified or automatically * generated, after biasing, @see setColorSaturation and @see setColorSaturationBias). * @param[in] matrix A color correction matrix that maps sensor RGB to linear sRGB. This matrix * is given in row-major order and must have the size w*h, where w and h are * the width and height of the Size returned by getColorCorrectionMatrixSize() * * @returns success/status of the call. */ virtual Status setColorCorrectionMatrix(const std::vector& matrix) = 0; /** * Returns the user-specified color correction matrix. * @param[out] matrix A matrix that will be populated with the CCM. * * @returns success/status of the call. */ virtual Status getColorCorrectionMatrix(std::vector* matrix) const = 0; /** * Enables the user-specified color correction matrix. * @param[in] enable If @c true, libargus uses the user-specified matrix. * @see setColorCorrectionMatrix() * * @returns success/status of the call. */ virtual Status setColorCorrectionMatrixEnable(bool enable) = 0; /** * Returns the enable for the user-specified color correction matrix. */ virtual bool getColorCorrectionMatrixEnable() const = 0; /** * Sets the user-specified absolute color saturation. This must be enabled via * @see setColorSaturationEnable, otherwise saturation will be determined automatically. * This saturation value may be used to modify the color correction matrix used * for processing (@see setColorCorrectionMatrix), and these changes will be reflected * in the color correction matrix output to the capture metadata. * @param[in] saturation The absolute color saturation. Acceptable values are in * [0.0, 2.0], and the default value is 1.0. * @returns success/status of the call. */ virtual Status setColorSaturation(float saturation) = 0; /** * Returns the user-specified absolute color saturation (@see setColorSaturation). */ virtual float getColorSaturation() const = 0; /** * Enables the user-specified absolute color saturation. * @param[in] enable If @c true, libargus uses the user-specified color saturation. * @see setColorSaturation() * * @returns success/status of the call. */ virtual Status setColorSaturationEnable(bool enable) = 0; /** * Returns the enable for the user-specified color saturation. */ virtual bool getColorSaturationEnable() const = 0; /** * Sets the color saturation bias. This bias is used to multiply the active saturation * value, either the user-specified or the automatically generated value depending on the state * of @see getColorSaturationEnable, and produces the final saturation value to use for * capture processing. This is used primarily to tweak automatically generated saturation * values when the application prefers more or less saturation than what the implementation * or hardware generates by default. The final saturation value (after biasing) may affect the * color correction matrix used for processing (@see setColorCorrectionMatrix). * @param[in] bias The color saturation bias. Acceptable values are in [0.0, 2.0], where * 1.0 does not modify the saturation (default), 0.0 is fully desaturated * (greyscale), and 2.0 is highly saturated. * * @returns success/status of the call. */ virtual Status setColorSaturationBias(float bias) = 0; /** * Returns the color saturation bias. */ virtual float getColorSaturationBias() const = 0; /** * Sets the exposure compensation. * Exposure compensation is applied after AE is solved. * @param[in] ev The exposure adjustment step in stops. * * @returns success/status of the call. */ virtual Status setExposureCompensation(float ev) = 0; /** * Returns the exposure compensation. */ virtual float getExposureCompensation() const = 0; /** * Returns the number of elements required for the tone map curve. * @param[in] channel The color channel the curve size corresponds to. */ virtual uint32_t getToneMapCurveSize(RGBChannel channel) const = 0; /** * Sets the user-specified tone map curve for a channel on the stream. * The user-specified tone map will be ignored unless getToneMapCurveEnable() == true. * @param[in] channel The color the curve corresponds to. * @param[in] curve A float vector that describes the LUT. * The number of elements must match the number of elements * returned from getToneMapCurve() of the same channel. * * @returns success/status of the call. */ virtual Status setToneMapCurve(RGBChannel channel, const std::vector& curve) = 0; /** * Returns the user-specified tone map curve for a channel on the stream. * @param[in] channel The color the curve corresponds to. * @param[out] curve A vector that will be populated by the tone map curve for the specified * color channel. * * @returns success/status of the call. */ virtual Status getToneMapCurve(RGBChannel channel, std::vector* curve) const = 0; /** * Enables the user-specified tone map. * @param[in] enable If @c true, libargus uses the user-specified tone map. * * @returns success/status of the call. */ virtual Status setToneMapCurveEnable(bool enable) = 0; /** * Returns the enable for the user-specified tone map. */ virtual bool getToneMapCurveEnable() const = 0; /** * Sets the user-specified Isp Digital gain range. * @param[in] gain The user-specified Isp Digital gain. * * @returns success/status of the call. */ virtual Status setIspDigitalGainRange(const Range& gain) = 0; /** * Returns the user-specified Isp Digital gain range. * * @returns Isp Digital gain */ virtual Range getIspDigitalGainRange() const = 0; protected: ~IAutoControlSettings() {} }; /** * @class IStreamSettings * * Interface to per-stream settings (provided by IRequest::getStreamSettings()). * * @ingroup ArgusStreamSettings */ DEFINE_UUID(InterfaceID, IID_STREAM_SETTINGS, c477aeaf,9cc8,4467,a834,c7,07,d7,b6,9f,a4); class IStreamSettings : public Interface { public: static const InterfaceID& id() { return IID_STREAM_SETTINGS; } /** * Sets the clip rectangle for the stream. * A clip rectangle is a normalized rectangle * with valid coordinates contained in the [0.0,1.0] range. * @param[in] clipRect The clip rectangle. * * @returns success/status of the call. */ virtual Status setSourceClipRect(const Rectangle& clipRect) = 0; /** * Returns the clip rectangle for the stream. */ virtual Rectangle getSourceClipRect() const = 0; /** * Sets whether or not post-processing is enabled for this stream. * Post-processing features are controlled on a per-Request basis and all streams share the * same post-processing control values, but this enable allows certain streams to be excluded * from all post-processing. The current controls defined to be a part of "post-processing" * includes (but may not be limited to): * - Denoise * Default value is true. */ virtual void setPostProcessingEnable(bool enable) = 0; /** * Returns the post-processing enable for the stream. */ virtual bool getPostProcessingEnable() const = 0; protected: ~IStreamSettings() {} }; /** * @class IDenoiseSettings * * Interface to denoise settings. * * @ingroup ArgusRequest */ DEFINE_UUID(InterfaceID, IID_DENOISE_SETTINGS, 7A461D20,6AE1,11E6,BDF4,08,00,20,0C,9A,66); class IDenoiseSettings : public Interface { public: static const InterfaceID& id() { return IID_DENOISE_SETTINGS; } /** * Sets the denoise (noise reduction) mode for the request. * @param[in] mode The denoise mode: * OFF: Denoise algorithms are disabled. * FAST: Noise reduction will be enabled, but it will not slow down * the capture rate. * HIGH_QUALITY: Maximum noise reduction will be enabled to achieve * the highest quality, but may slow down the capture rate. * @returns success/status of the call. */ virtual Status setDenoiseMode(const DenoiseMode& mode) = 0; /** * Returns the denoise mode for the request. */ virtual DenoiseMode getDenoiseMode() const = 0; /** * Sets the strength for the denoise operation. * @param[in] strength The denoise strength. This must be within the range [0.0, 1.0], where * 0.0 is the least and 1.0 is the most amount of noise reduction that can be * applied. This denoise strength is relative to the current noise reduction mode; * using a FAST denoise mode with a full strength of 1.0 may not perform as well * as using a HIGH_QUALITY mode with a lower relative strength. * @returns success/status of the call. */ virtual Status setDenoiseStrength(float strength) = 0; /** * Returns the denoise strength. */ virtual float getDenoiseStrength() const = 0; protected: ~IDenoiseSettings() {} }; /** * @class IEdgeEnhanceSettings * * Interface to edge enhancement settings. * * @ingroup ArgusRequest */ DEFINE_UUID(InterfaceID, IID_EDGE_ENHANCE_SETTINGS, 7A461D21,6AE1,11E6,BDF4,08,00,20,0C,9A,66); class IEdgeEnhanceSettings : public Interface { public: static const InterfaceID& id() { return IID_EDGE_ENHANCE_SETTINGS; } /** * Sets the edge enhancement mode for the request. * @param[in] mode The edge enhancement mode: * OFF: Edge enhancement algorithms are disabled. * FAST: Edge enhancement will be enabled, but it will not slow down * the capture rate. * HIGH_QUALITY: Maximum edge enhancement will be enabled to achieve * the highest quality, but may slow down the capture rate. * @returns success/status of the call. */ virtual Status setEdgeEnhanceMode(const EdgeEnhanceMode& mode) = 0; /** * Returns the edge enhancement mode for the request. */ virtual EdgeEnhanceMode getEdgeEnhanceMode() const = 0; /** * Sets the strength for the edge enhancement operation. * @param[in] strength The edge enhancement strength. This must be within the range [0.0, 1.0], * where 0.0 is the least and 1.0 is the most amount of edge enhancement that can be * applied. This strength is relative to the current edge enhancement mode; using * a FAST edge enhancement mode with a full strength of 1.0 may not perform as well * as using a HIGH_QUALITY mode with a lower relative strength. * @returns success/status of the call. */ virtual Status setEdgeEnhanceStrength(float strength) = 0; /** * Returns the edge enhancement strength. */ virtual float getEdgeEnhanceStrength() const = 0; protected: ~IEdgeEnhanceSettings() {} }; } // namespace Argus #endif // _ARGUS_SETTINGS_H