• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2016, The Linux Foundation. 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 #define LOG_TAG "QCameraCommon"
31 
32 // System dependencies
33 #include <utils/Errors.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <utils/Log.h>
37 
38 // Camera dependencies
39 #include "QCameraCommon.h"
40 
41 using namespace android;
42 
43 namespace qcamera {
44 
45 #ifndef TRUE
46 #define TRUE 1
47 #endif
48 
49 #ifndef FALSE
50 #define FALSE 0
51 #endif
52 
53 /*===========================================================================
54  * FUNCTION   : QCameraCommon
55  *
56  * DESCRIPTION: default constructor of QCameraCommon
57  *
58  * PARAMETERS : None
59  *
60  * RETURN     : None
61  *==========================================================================*/
QCameraCommon()62 QCameraCommon::QCameraCommon() :
63     m_pCapability(NULL)
64 {
65 }
66 
67 /*===========================================================================
68  * FUNCTION   : ~QCameraCommon
69  *
70  * DESCRIPTION: destructor of QCameraCommon
71  *
72  * PARAMETERS : None
73  *
74  * RETURN     : None
75  *==========================================================================*/
~QCameraCommon()76 QCameraCommon::~QCameraCommon()
77 {
78 }
79 
80 /*===========================================================================
81  * FUNCTION   : init
82  *
83  * DESCRIPTION: Init function for QCameraCommon
84  *
85  * PARAMETERS :
86  *   @pCapability : Capabilities
87  *
88  * RETURN     : int32_t type of status
89  *              NO_ERROR  -- success
90  *              none-zero failure code
91  *==========================================================================*/
init(cam_capability_t * pCapability)92 int32_t QCameraCommon::init(cam_capability_t *pCapability)
93 {
94     m_pCapability = pCapability;
95 
96     return NO_ERROR;
97 }
98 
99 /*===========================================================================
100  * FUNCTION   : calculateLCM
101  *
102  * DESCRIPTION: Get the LCM of 2 numbers
103  *
104  * PARAMETERS :
105  *   @num1   : First number
106  *   @num2   : second number
107  *
108  * RETURN     : int32_t type (LCM)
109  *
110  *==========================================================================*/
calculateLCM(int32_t num1,int32_t num2)111 uint32_t QCameraCommon::calculateLCM(int32_t num1, int32_t num2)
112 {
113    uint32_t lcm = 0;
114    uint32_t temp = 0;
115 
116    if ((num1 < 1) && (num2 < 1)) {
117        return 0;
118    } else if (num1 < 1) {
119        return num2;
120    } else if (num2 < 1) {
121        return num1;
122    }
123 
124    if (num1 > num2) {
125        lcm = num1;
126    } else {
127        lcm = num2;
128    }
129    temp = lcm;
130 
131    while (1) {
132        if (((lcm % num1) == 0) && ((lcm % num2) == 0)) {
133            break;
134        }
135        lcm += temp;
136    }
137    return lcm;
138 }
139 
140 /*===========================================================================
141  * FUNCTION   : getAnalysisInfo
142  *
143  * DESCRIPTION: Get the Analysis information based on
144  *     current mode and feature mask
145  *
146  * PARAMETERS :
147  *   @fdVideoEnabled : Whether fdVideo enabled currently
148  *   @hal3           : Whether hal3 or hal1
149  *   @featureMask    : Feature mask
150  *   @pAnalysis_info : Analysis info to be filled
151  *
152  * RETURN     : int32_t type of status
153  *              NO_ERROR  -- success
154  *              none-zero failure code
155  *==========================================================================*/
getAnalysisInfo(bool fdVideoEnabled,bool hal3,cam_feature_mask_t featureMask,cam_analysis_info_t * pAnalysisInfo)156 int32_t QCameraCommon::getAnalysisInfo(
157         bool fdVideoEnabled,
158         bool hal3,
159         cam_feature_mask_t featureMask,
160         cam_analysis_info_t *pAnalysisInfo)
161 {
162     if (!pAnalysisInfo) {
163         return BAD_VALUE;
164     }
165 
166     pAnalysisInfo->valid = 0;
167 
168     if ((fdVideoEnabled == TRUE) && (hal3 == FALSE) &&
169             (m_pCapability->analysis_info[CAM_ANALYSIS_INFO_FD_VIDEO].hw_analysis_supported) &&
170             (m_pCapability->analysis_info[CAM_ANALYSIS_INFO_FD_VIDEO].valid)) {
171         *pAnalysisInfo =
172                 m_pCapability->analysis_info[CAM_ANALYSIS_INFO_FD_VIDEO];
173     } else if (m_pCapability->analysis_info[CAM_ANALYSIS_INFO_FD_STILL].valid) {
174         *pAnalysisInfo =
175                 m_pCapability->analysis_info[CAM_ANALYSIS_INFO_FD_STILL];
176         if (hal3 == TRUE) {
177             pAnalysisInfo->analysis_max_res = pAnalysisInfo->analysis_recommended_res;
178         }
179     }
180 
181     if ((featureMask & CAM_QCOM_FEATURE_PAAF) &&
182       (m_pCapability->analysis_info[CAM_ANALYSIS_INFO_PAAF].valid)) {
183         cam_analysis_info_t *pPaafInfo =
184           &m_pCapability->analysis_info[CAM_ANALYSIS_INFO_PAAF];
185 
186         if (!pAnalysisInfo->valid) {
187             *pAnalysisInfo = *pPaafInfo;
188         } else {
189             pAnalysisInfo->analysis_max_res.width =
190                 MAX(pAnalysisInfo->analysis_max_res.width,
191                 pPaafInfo->analysis_max_res.width);
192             pAnalysisInfo->analysis_max_res.height =
193                 MAX(pAnalysisInfo->analysis_max_res.height,
194                 pPaafInfo->analysis_max_res.height);
195             pAnalysisInfo->analysis_padding_info.height_padding =
196                 calculateLCM(pAnalysisInfo->analysis_padding_info.height_padding,
197                 pPaafInfo->analysis_padding_info.height_padding);
198             pAnalysisInfo->analysis_padding_info.width_padding =
199                 calculateLCM(pAnalysisInfo->analysis_padding_info.width_padding,
200                 pPaafInfo->analysis_padding_info.width_padding);
201             pAnalysisInfo->analysis_padding_info.plane_padding =
202                 calculateLCM(pAnalysisInfo->analysis_padding_info.plane_padding,
203                 pPaafInfo->analysis_padding_info.plane_padding);
204             pAnalysisInfo->analysis_padding_info.min_stride =
205                 MAX(pAnalysisInfo->analysis_padding_info.min_stride,
206                 pPaafInfo->analysis_padding_info.min_stride);
207             pAnalysisInfo->analysis_padding_info.min_stride =
208                 ALIGN(pAnalysisInfo->analysis_padding_info.min_stride,
209                 pAnalysisInfo->analysis_padding_info.width_padding);
210 
211             pAnalysisInfo->analysis_padding_info.min_scanline =
212                 MAX(pAnalysisInfo->analysis_padding_info.min_scanline,
213                 pPaafInfo->analysis_padding_info.min_scanline);
214             pAnalysisInfo->analysis_padding_info.min_scanline =
215                 ALIGN(pAnalysisInfo->analysis_padding_info.min_scanline,
216                 pAnalysisInfo->analysis_padding_info.height_padding);
217 
218             pAnalysisInfo->hw_analysis_supported |=
219                 pPaafInfo->hw_analysis_supported;
220         }
221     }
222 
223     return pAnalysisInfo->valid ? NO_ERROR : BAD_VALUE;
224 }
225 
226 }; // namespace qcamera
227