Home | History | Annotate | Download | only in HAL3
      1 /* Copyright (c) 2015, The Linux Foundataion. All rights reserved.
      2 *
      3 * Redistribution and use in source and binary forms, with or without
      4 * modification, are permitted provided that the following conditions are
      5 * met:
      6 *     * Redistributions of source code must retain the above copyright
      7 *       notice, this list of conditions and the following disclaimer.
      8 *     * Redistributions in binary form must reproduce the above
      9 *       copyright notice, this list of conditions and the following
     10 *       disclaimer in the documentation and/or other materials provided
     11 *       with the distribution.
     12 *     * Neither the name of The Linux Foundation nor the names of its
     13 *       contributors may be used to endorse or promote products derived
     14 *       from this software without specific prior written permission.
     15 *
     16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 *
     28 */
     29 
     30 
     31 #define ATRACE_TAG ATRACE_TAG_CAMERA
     32 #define LOG_TAG "QCamera3CropRegionMapper"
     33 
     34 #include "QCamera3CropRegionMapper.h"
     35 #include "QCamera3HWI.h"
     36 
     37 using namespace android;
     38 
     39 namespace qcamera {
     40 
     41 /*===========================================================================
     42  * FUNCTION   : QCamera3CropRegionMapper
     43  *
     44  * DESCRIPTION: Constructor
     45  *
     46  * PARAMETERS : None
     47  *
     48  * RETURN     : None
     49  *==========================================================================*/
     50 QCamera3CropRegionMapper::QCamera3CropRegionMapper()
     51         : mSensorW(0),
     52           mSensorH(0),
     53           mActiveArrayW(0),
     54           mActiveArrayH(0)
     55 {
     56 }
     57 
     58 /*===========================================================================
     59  * FUNCTION   : ~QCamera3CropRegionMapper
     60  *
     61  * DESCRIPTION: destructor
     62  *
     63  * PARAMETERS : none
     64  *
     65  * RETURN     : none
     66  *==========================================================================*/
     67 
     68 QCamera3CropRegionMapper::~QCamera3CropRegionMapper()
     69 {
     70 }
     71 
     72 /*===========================================================================
     73  * FUNCTION   : update
     74  *
     75  * DESCRIPTION: update sensor active array size and sensor output size
     76  *
     77  * PARAMETERS :
     78  *   @active_array_w : active array width
     79  *   @active_array_h : active array height
     80  *   @sensor_w       : sensor output width
     81  *   @sensor_h       : sensor output height
     82  *
     83  * RETURN     : none
     84  *==========================================================================*/
     85 void QCamera3CropRegionMapper::update(uint32_t active_array_w,
     86         uint32_t active_array_h, uint32_t sensor_w,
     87         uint32_t sensor_h)
     88 {
     89     // Sanity check
     90     if (active_array_w == 0 || active_array_h == 0 ||
     91             sensor_w == 0 || sensor_h == 0) {
     92         ALOGE("%s: active_array size and sensor output size must be non zero",
     93                 __func__);
     94         return;
     95     }
     96     if (active_array_w < sensor_w || active_array_h < sensor_h) {
     97         ALOGE("%s: invalid input: active_array [%d, %d], sensor size [%d, %d]",
     98                 __func__, active_array_w, active_array_h, sensor_w, sensor_h);
     99         return;
    100     }
    101     mSensorW = sensor_w;
    102     mSensorH = sensor_h;
    103     mActiveArrayW = active_array_w;
    104     mActiveArrayH = active_array_h;
    105 
    106     ALOGI("%s: active_array: %d x %d, sensor size %d x %d", __func__,
    107             mActiveArrayW, mActiveArrayH, mSensorW, mSensorH);
    108 }
    109 
    110 /*===========================================================================
    111  * FUNCTION   : toActiveArray
    112  *
    113  * DESCRIPTION: Map crop rectangle from sensor output space to active array space
    114  *
    115  * PARAMETERS :
    116  *   @crop_left   : x coordinate of top left corner of rectangle
    117  *   @crop_top    : y coordinate of top left corner of rectangle
    118  *   @crop_width  : width of rectangle
    119  *   @crop_height : height of rectangle
    120  *
    121  * RETURN     : none
    122  *==========================================================================*/
    123 void QCamera3CropRegionMapper::toActiveArray(int32_t& crop_left, int32_t& crop_top,
    124         int32_t& crop_width, int32_t& crop_height)
    125 {
    126     if (mSensorW == 0 || mSensorH == 0 ||
    127             mActiveArrayW == 0 || mActiveArrayH == 0) {
    128         ALOGE("%s: sensor/active array sizes are not initialized!", __func__);
    129         return;
    130     }
    131 
    132     crop_left = crop_left * mActiveArrayW / mSensorW;
    133     crop_top = crop_top * mActiveArrayH / mSensorH;
    134     crop_width = crop_width * mActiveArrayW / mSensorW;
    135     crop_height = crop_height * mActiveArrayH / mSensorH;
    136 
    137     boundToSize(crop_left, crop_top, crop_width, crop_height,
    138             mActiveArrayW, mActiveArrayH);
    139 }
    140 
    141 /*===========================================================================
    142  * FUNCTION   : toSensor
    143  *
    144  * DESCRIPTION: Map crop rectangle from active array space to sensor output space
    145  *
    146  * PARAMETERS :
    147  *   @crop_left   : x coordinate of top left corner of rectangle
    148  *   @crop_top    : y coordinate of top left corner of rectangle
    149  *   @crop_width  : width of rectangle
    150  *   @crop_height : height of rectangle
    151  *
    152  * RETURN     : none
    153  *==========================================================================*/
    154 
    155 void QCamera3CropRegionMapper::toSensor(int32_t& crop_left, int32_t& crop_top,
    156         int32_t& crop_width, int32_t& crop_height)
    157 {
    158     if (mSensorW == 0 || mSensorH == 0 ||
    159             mActiveArrayW == 0 || mActiveArrayH == 0) {
    160         ALOGE("%s: sensor/active array sizes are not initialized!", __func__);
    161         return;
    162     }
    163 
    164     crop_left = crop_left * mSensorW / mActiveArrayW;
    165     crop_top = crop_top * mSensorH / mActiveArrayH;
    166     crop_width = crop_width * mSensorW / mActiveArrayW;
    167     crop_height = crop_height * mSensorH / mActiveArrayH;
    168 
    169     CDBG("%s: before bounding left %d, top %d, width %d, height %d",
    170         __func__, crop_left, crop_top, crop_width, crop_height);
    171     boundToSize(crop_left, crop_top, crop_width, crop_height,
    172             mSensorW, mSensorH);
    173     CDBG("%s: after bounding left %d, top %d, width %d, height %d",
    174         __func__, crop_left, crop_top, crop_width, crop_height);
    175 }
    176 
    177 /*===========================================================================
    178  * FUNCTION   : boundToSize
    179  *
    180  * DESCRIPTION: Bound a particular rectangle inside a bounding box
    181  *
    182  * PARAMETERS :
    183  *   @left    : x coordinate of top left corner of rectangle
    184  *   @top     : y coordinate of top left corner of rectangle
    185  *   @width   : width of rectangle
    186  *   @height  : height of rectangle
    187  *   @bound_w : width of bounding box
    188  *   @bound_y : height of bounding box
    189  *
    190  * RETURN     : none
    191  *==========================================================================*/
    192 void QCamera3CropRegionMapper::boundToSize(int32_t& left, int32_t& top,
    193             int32_t& width, int32_t& height, int32_t bound_w, int32_t bound_h)
    194 {
    195     if (left < 0) {
    196         left = 0;
    197     }
    198     if (top < 0) {
    199         top = 0;
    200     }
    201 
    202     if ((left + width) > bound_w) {
    203         width = bound_w - left;
    204     }
    205     if ((top + height) > bound_h) {
    206         height = bound_h - top;
    207     }
    208 }
    209 
    210 /*===========================================================================
    211  * FUNCTION   : toActiveArray
    212  *
    213  * DESCRIPTION: Map co-ordinate from sensor output space to active array space
    214  *
    215  * PARAMETERS :
    216  *   @x   : x coordinate
    217  *   @y   : y coordinate
    218  *
    219  * RETURN     : none
    220  *==========================================================================*/
    221 void QCamera3CropRegionMapper::toActiveArray(uint32_t& x, uint32_t& y)
    222 {
    223     if (mSensorW == 0 || mSensorH == 0 ||
    224             mActiveArrayW == 0 || mActiveArrayH == 0) {
    225         ALOGE("%s: sensor/active array sizes are not initialized!", __func__);
    226         return;
    227     }
    228     if ((x > static_cast<uint32_t>(mSensorW)) ||
    229             (y > static_cast<uint32_t>(mSensorH))) {
    230         ALOGE("%s: invalid co-ordinate (%d, %d) in (0, 0, %d, %d) space",
    231                 __func__, x, y, mSensorW, mSensorH);
    232         return;
    233     }
    234     x = x * mActiveArrayW / mSensorW;
    235     y = y * mActiveArrayH / mSensorH;
    236 }
    237 
    238 /*===========================================================================
    239  * FUNCTION   : toSensor
    240  *
    241  * DESCRIPTION: Map co-ordinate from active array space to sensor output space
    242  *
    243  * PARAMETERS :
    244  *   @x   : x coordinate
    245  *   @y   : y coordinate
    246  *
    247  * RETURN     : none
    248  *==========================================================================*/
    249 
    250 void QCamera3CropRegionMapper::toSensor(uint32_t& x, uint32_t& y)
    251 {
    252     if (mSensorW == 0 || mSensorH == 0 ||
    253             mActiveArrayW == 0 || mActiveArrayH == 0) {
    254         ALOGE("%s: sensor/active array sizes are not initialized!", __func__);
    255         return;
    256     }
    257 
    258     if ((x > static_cast<uint32_t>(mActiveArrayW)) ||
    259             (y > static_cast<uint32_t>(mActiveArrayH))) {
    260         ALOGE("%s: invalid co-ordinate (%d, %d) in (0, 0, %d, %d) space",
    261                 __func__, x, y, mSensorW, mSensorH);
    262         return;
    263     }
    264     x = x * mSensorW / mActiveArrayW;
    265     y = y * mSensorH / mActiveArrayH;
    266 }
    267 
    268 }; //end namespace android
    269