237 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  * Copyright (c) 2016-2017, 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
 | |
|  * <b>Libargus Extension: Bayer Average Map API</b>
 | |
|  *
 | |
|  * @b Description: This file defines the BayerAverageMap extension.
 | |
|  */
 | |
| 
 | |
| #ifndef _ARGUS_EXT_BAYER_AVERAGE_MAP_H
 | |
| #define _ARGUS_EXT_BAYER_AVERAGE_MAP_H
 | |
| 
 | |
| namespace Argus
 | |
| {
 | |
| 
 | |
| /**
 | |
|  * Generates local averages of a capture's raw Bayer data. These averages are generated for
 | |
|  * a number of small rectangles, called bins, that are evenly distributed across the image.
 | |
|  * These averages may be calculated before optical clipping to the output bit depth occurs, thus
 | |
|  * the working range of this averaging may extend beyond the optical range of the output pixels;
 | |
|  * this allows the averages to remain steady while the sensor freely modifies its optical range.
 | |
|  *
 | |
|  * Any pixel values outside of the working range are clipped with respect to this averaging.
 | |
|  * Specifically, the API excludes them from the average calculation and increments
 | |
|  * the clipped pixel counter for the containing region.
 | |
|  * @see Ext::IBayerAverageMap::getClipCounts()
 | |
|  *
 | |
|  * This extension introduces two new interfaces:
 | |
|  *   - Ext::IBayerAverageMapSettings enables average map generation in a capture Request.
 | |
|  *   - Ext::IBayerAverageMap exposes the average map values from the CaptureMetadata.
 | |
|  *
 | |
|  * @defgroup ArgusExtBayerAverageMap Ext::BayerAverageMap
 | |
|  * @ingroup ArgusExtensions
 | |
|  */
 | |
| DEFINE_UUID(ExtensionName, EXT_BAYER_AVERAGE_MAP, 12c3de20,64c5,11e6,bdf4,08,00,20,0c,9a,66);
 | |
| 
 | |
| namespace Ext
 | |
| {
 | |
| 
 | |
| /**
 | |
|  * @class IBayerAverageMapSettings
 | |
|  *
 | |
|  * Interface to Bayer average map settings.
 | |
|  *
 | |
|  * @ingroup ArgusRequest ArgusExtBayerAverageMap
 | |
|  */
 | |
| DEFINE_UUID(InterfaceID, IID_BAYER_AVERAGE_MAP_SETTINGS, 12c3de21,64c5,11e6,bdf4,08,00,20,0c,9a,66);
 | |
| class IBayerAverageMapSettings : public Interface
 | |
| {
 | |
| public:
 | |
|     static const InterfaceID& id() { return IID_BAYER_AVERAGE_MAP_SETTINGS; }
 | |
| 
 | |
|     /**
 | |
|      * Enables or disables Bayer average map generation. When enabled, CaptureMetadata
 | |
|      * returned by completed captures will expose the IBayerAverageMap interface.
 | |
|      *
 | |
|      * @param[in] enable whether or not Bayer average map generation is enabled.
 | |
|      */
 | |
|     virtual void setBayerAverageMapEnable(bool enable) = 0;
 | |
| 
 | |
|     /**
 | |
|      * @returns whether or not Bayer average map generation is enabled.
 | |
|      */
 | |
|     virtual bool getBayerAverageMapEnable() const = 0;
 | |
| 
 | |
| protected:
 | |
|     ~IBayerAverageMapSettings() {}
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @class IBayerAverageMap
 | |
|  *
 | |
|  * Interface to Bayer average map metadata.
 | |
|  *
 | |
|  * The Bayer average map provides local averages of the capture's raw pixels for a number
 | |
|  * of small rectangular regions, called bins, that are evenly distributed across the image.
 | |
|  * Each average is a floating-point value that is nomalized such that [0.0, 1.0] maps to the
 | |
|  * full optical range of the output pixels, but values outside this range may be included in
 | |
|  * the averages so long as they are within the working range of the average calculation.
 | |
|  * For pixels that have values outside the working range, the API excludes such pixels from the
 | |
|  * average calculation and increments the clipped pixel counter for the containing region.
 | |
|  * @see IBayerAverageMap::getWorkingRange()
 | |
|  * @see IBayerAverageMap::getClipCounts()
 | |
|  *
 | |
|  * The size and layout of the bins used to calculate the averages are determined by the Argus
 | |
|  * implementation and are illustrated in the following diagram. The bin size and interval are
 | |
|  * constant across the image, and are positioned such that the generated averages cover the
 | |
|  * majority of the full image. All dimensions are given in pixels.
 | |
|  *
 | |
|  * @code
 | |
|  *               start.x                     interval.width
 | |
|  *               _______                   _________________
 | |
|  *              |       |                 |                 |
 | |
|  *           _   ________________________________________________________
 | |
|  *          |   |                                                        |
 | |
|  *  start.y |   |                                                        |
 | |
|  *          |_  |        _____             _____             _____       | _
 | |
|  *              |       |     |           |     |           |     |      |  |
 | |
|  *              |       | 0,0 |           | 1,0 |           | 2,0 |      |  |
 | |
|  *              |       |_____|           |_____|           |_____|      |  |
 | |
|  *              |                                                        |  | interval.height
 | |
|  *              |                                                        |  |
 | |
|  *              |                                                        |  |
 | |
|  *              |        _____             _____             _____       | _|
 | |
|  *              |       |     |           |     |           |     |      |
 | |
|  *              |       | 0,1 |           | 1,1 |           | 2,1 |      |
 | |
|  *              |       |_____|           |_____|           |_____|      |
 | |
|  *              |                                                        |
 | |
|  *              |                                                        |
 | |
|  *              |                                                        |
 | |
|  *              |        _____             _____             _____       | _
 | |
|  *              |       |     |           |     |           |     |      |  |
 | |
|  *              |       | 0,2 |           | 1,2 |           | 2,2 |      |  | size.height
 | |
|  *              |       |_____|           |_____|           |_____|      | _|
 | |
|  *              |                                                        |
 | |
|  *              |                                                        |
 | |
|  *              |________________________________________________________|
 | |
|  *
 | |
|  *                                                          |_____|
 | |
|  *
 | |
|  *                                                         size.width
 | |
|  * @endcode
 | |
|  *
 | |
|  * @ingroup ArgusCaptureMetadata ArgusExtBayerAverageMap
 | |
|  */
 | |
| DEFINE_UUID(InterfaceID, IID_BAYER_AVERAGE_MAP, 12c3de22,64c5,11e6,bdf4,08,00,20,0c,9a,66);
 | |
| class IBayerAverageMap : public Interface
 | |
| {
 | |
| public:
 | |
|     static const InterfaceID& id() { return IID_BAYER_AVERAGE_MAP; }
 | |
| 
 | |
|     /**
 | |
|      * Returns the starting location of the first bin, in pixels, where the
 | |
|      * location is relative to the top-left corner of the image.
 | |
|      */
 | |
|     virtual Point2D<uint32_t> getBinStart() const = 0;
 | |
| 
 | |
|     /**
 | |
|      * Returns the size of each bin, in pixels.
 | |
|      */
 | |
|     virtual Size2D<uint32_t> getBinSize() const = 0;
 | |
| 
 | |
|     /**
 | |
|      * Returns the number of bins in both the horizontal (width) and vertical (height) directions.
 | |
|      * This size is equivalent to the array dimensions for the output from
 | |
|      * IBayerAverageMap::getAverages() or IBayerAverageMap::getClipCounts().
 | |
|      */
 | |
|     virtual Size2D<uint32_t> getBinCount() const = 0;
 | |
| 
 | |
|     /**
 | |
|      * Returns the bin intervals for both the x and y axis. These intervals are defined as the
 | |
|      * number of pixels between the first pixel of a bin and that of the immediate next bin.
 | |
|      */
 | |
|     virtual Size2D<uint32_t> getBinInterval() const = 0;
 | |
| 
 | |
|     /**
 | |
|      * Returns the working range of the averaging calculation. The working range is defined as
 | |
|      * the range of values that are included in the average calculation (e.g. not clipped),
 | |
|      * and may extend beyond the normalized [0.0, 1.0] range of the optical output. For example,
 | |
|      * if the working range is [-0.5, 1.5], this means that values in [-0.5, 0) and (1, 1.5] will
 | |
|      * still be included in the average calculation despite being clipped to [0.0, 1.0] in the
 | |
|      * output pixels. Any pixels outside this working range are excluded from average calculation
 | |
|      * and will increment the clip count.
 | |
|      * @see IBayerAverageMap::getClipCounts()
 | |
|      *
 | |
|      * @note When the bit depth available for averaging is equal to the optical bit depth of
 | |
|      * the output, the working range will be less than the full [0.0, 1.0] optical range. For
 | |
|      * example, when 10 bits of data are available, the raw output pixels in [0u, 1023u] will
 | |
|      * map to [0.0, 1.0]; however, the values of 0 and 1023 will be considered clipped for the
 | |
|      * sake of average calculation, and so the working range would be [1/1023.0, 1022/1023.0].
 | |
|      */
 | |
|     virtual Range<float> getWorkingRange() const = 0;
 | |
| 
 | |
|     /**
 | |
|      * Returns the average values for all bins. These values are normalized such that
 | |
|      * [0.0, 1.0] maps to the optical range of the output, but the range of possible values
 | |
|      * is determined by the working range. For input pixels that have values outside the
 | |
|      * working range, the API excludes such pixels from the average calculation and
 | |
|      * increments the clipped pixel counter for the containing region.
 | |
|      * @see IBayerAverageMap::getWorkingRange()
 | |
|      * @see IBayerAverageMap::getClipCounts()
 | |
|      *
 | |
|      * @param[out] averages The output array to store the averages for all bins. This
 | |
|      *             2-dimensional array is sized as returned by IBayerAverageMap::getBinCount(),
 | |
|      *             where each array element is a floating point BayerTuple containing the R,
 | |
|      *             G_EVEN, G_ODD, and B averages for that bin.
 | |
|      */
 | |
|     virtual Status getAverages(Array2D< BayerTuple<float> >* averages) const = 0;
 | |
| 
 | |
|     /**
 | |
|      * Returns the clipped pixel counts for all bins. This is the number of pixels in the bin
 | |
|      * whose value exceeds the working range and have been excluded from average calculation.
 | |
|      * @see IBayerAverageMap::getWorkingRange()
 | |
|      *
 | |
|      * @param[out] clipCounts The output array to store the clip counts for all bins. This
 | |
|      *             2-dimensional array is sized as returned by
 | |
|      *             Ext::IBayerAverageMap::getBinCount(), where each array element is an uint32_t
 | |
|      *             BayerTuple containing the R, G_EVEN, G_ODD, and B clip counts for that bin.
 | |
|      */
 | |
|     virtual Status getClipCounts(Array2D< BayerTuple<uint32_t> >* clipCounts) const = 0;
 | |
| 
 | |
| protected:
 | |
|     ~IBayerAverageMap() {}
 | |
| };
 | |
| 
 | |
| } // namespace Ext
 | |
| 
 | |
| } // namespace Argus
 | |
| 
 | |
| #endif // _ARGUS_EXT_BAYER_AVERAGE_MAP_H
 |