1 /*
2 * Copyright (C) Texas Instruments - http://www.ti.com/
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "CameraHal.h"
18
19 namespace Ti {
20 namespace Camera {
21
22 const char CameraHal::PARAMS_DELIMITER []= ",";
23
24 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
25
26 struct timeval CameraHal::ppm_start;
27
28 #endif
29
30 #if PPM_INSTRUMENTATION
31
32 /**
33 @brief PPM instrumentation
34
35 Dumps the current time offset. The time reference point
36 lies within the CameraHAL constructor.
37
38 @param str - log message
39 @return none
40
41 */
PPM(const char * str)42 void CameraHal::PPM(const char* str){
43 struct timeval ppm;
44
45 gettimeofday(&ppm, NULL);
46 ppm.tv_sec = ppm.tv_sec - ppm_start.tv_sec;
47 ppm.tv_sec = ppm.tv_sec * 1000000;
48 ppm.tv_sec = ppm.tv_sec + ppm.tv_usec - ppm_start.tv_usec;
49
50 CAMHAL_LOGI("PPM: %s :%ld.%ld ms", str, ( ppm.tv_sec /1000 ), ( ppm.tv_sec % 1000 ));
51 }
52
53 #elif PPM_INSTRUMENTATION_ABS
54
55 /**
56 @brief PPM instrumentation
57
58 Dumps the current time offset. The time reference point
59 lies within the CameraHAL constructor. This implemetation
60 will also dump the abosolute timestamp, which is useful when
61 post calculation is done with data coming from the upper
62 layers (Camera application etc.)
63
64 @param str - log message
65 @return none
66
67 */
PPM(const char * str)68 void CameraHal::PPM(const char* str){
69 struct timeval ppm;
70
71 unsigned long long elapsed, absolute;
72 gettimeofday(&ppm, NULL);
73 elapsed = ppm.tv_sec - ppm_start.tv_sec;
74 elapsed *= 1000000;
75 elapsed += ppm.tv_usec - ppm_start.tv_usec;
76 absolute = ppm.tv_sec;
77 absolute *= 1000;
78 absolute += ppm.tv_usec /1000;
79
80 CAMHAL_LOGI("PPM: %s :%llu.%llu ms : %llu ms", str, ( elapsed /1000 ), ( elapsed % 1000 ), absolute);
81 }
82
83 #endif
84
85 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
86
87 /**
88 @brief PPM instrumentation
89
90 Calculates and dumps the elapsed time using 'ppm_first' as
91 reference.
92
93 @param str - log message
94 @return none
95
96 */
PPM(const char * str,struct timeval * ppm_first,...)97 void CameraHal::PPM(const char* str, struct timeval* ppm_first, ...){
98 char temp_str[256];
99 struct timeval ppm;
100 unsigned long long absolute;
101 va_list args;
102
103 va_start(args, ppm_first);
104 vsprintf(temp_str, str, args);
105 gettimeofday(&ppm, NULL);
106 absolute = ppm.tv_sec;
107 absolute *= 1000;
108 absolute += ppm.tv_usec /1000;
109 ppm.tv_sec = ppm.tv_sec - ppm_first->tv_sec;
110 ppm.tv_sec = ppm.tv_sec * 1000000;
111 ppm.tv_sec = ppm.tv_sec + ppm.tv_usec - ppm_first->tv_usec;
112
113 CAMHAL_LOGI("PPM: %s :%ld.%ld ms : %llu ms", temp_str, ( ppm.tv_sec /1000 ), ( ppm.tv_sec % 1000 ), absolute);
114
115 va_end(args);
116 }
117
118 #endif
119
120
121 /** Common utility function definitions used all over the HAL */
122
getBPP(const char * format)123 unsigned int CameraHal::getBPP(const char* format) {
124 unsigned int bytesPerPixel;
125
126 // Calculate bytes per pixel based on the pixel format
127 if (strcmp(format, android::CameraParameters::PIXEL_FORMAT_YUV422I) == 0) {
128 bytesPerPixel = 2;
129 } else if (strcmp(format, android::CameraParameters::PIXEL_FORMAT_RGB565) == 0 ||
130 strcmp(format, android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) == 0) {
131 bytesPerPixel = 2;
132 } else if (strcmp(format, android::CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) {
133 bytesPerPixel = 1;
134 } else {
135 bytesPerPixel = 1;
136 }
137
138 return bytesPerPixel;
139 }
140
getXYFromOffset(unsigned int * x,unsigned int * y,unsigned int offset,unsigned int stride,const char * format)141 void CameraHal::getXYFromOffset(unsigned int *x, unsigned int *y,
142 unsigned int offset, unsigned int stride,
143 const char* format)
144 {
145 CAMHAL_ASSERT( x && y && format && (0U < stride) );
146
147 *x = (offset % stride) / getBPP(format);
148 *y = (offset / stride);
149 }
150
getPixelFormatConstant(const char * parametersFormat)151 const char* CameraHal::getPixelFormatConstant(const char* parametersFormat)
152 {
153 const char *pixelFormat = NULL;
154
155 if ( NULL != parametersFormat ) {
156 if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_YUV422I) ) {
157 CAMHAL_LOGVA("CbYCrY format selected");
158 pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_YUV422I;
159 } else if ( (0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_YUV420SP)) ||
160 (0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_YUV420P)) ) {
161 // TODO(XXX): We are treating YV12 the same as YUV420SP
162 CAMHAL_LOGVA("YUV420SP format selected");
163 pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_YUV420SP;
164 } else if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_RGB565) ) {
165 CAMHAL_LOGVA("RGB565 format selected");
166 pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_RGB565;
167 } else if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ) {
168 CAMHAL_LOGVA("BAYER format selected");
169 pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
170 } else if ( 0 == strcmp(parametersFormat, android::CameraParameters::PIXEL_FORMAT_JPEG) ) {
171 CAMHAL_LOGVA("JPEG format selected");
172 pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_JPEG;
173 } else {
174 CAMHAL_LOGEA("Invalid format, NV12 format selected as default");
175 pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_YUV420SP;
176 }
177 } else {
178 CAMHAL_LOGEA("Preview format is NULL, defaulting to NV12");
179 pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_YUV420SP;
180 }
181
182 return pixelFormat;
183 }
184
calculateBufferSize(const char * parametersFormat,int width,int height)185 size_t CameraHal::calculateBufferSize(const char* parametersFormat, int width, int height)
186 {
187 int bufferSize = -1;
188
189 if ( NULL != parametersFormat ) {
190 if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_YUV422I) ) {
191 bufferSize = width * height * 2;
192 } else if ( (0 == strcmp(parametersFormat, android::CameraParameters::PIXEL_FORMAT_YUV420SP)) ||
193 (0 == strcmp(parametersFormat, android::CameraParameters::PIXEL_FORMAT_YUV420P)) ) {
194 bufferSize = width * height * 3 / 2;
195 } else if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_RGB565) ) {
196 bufferSize = width * height * 2;
197 } else if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ) {
198 bufferSize = width * height * 2;
199 } else {
200 CAMHAL_LOGEA("Invalid format");
201 bufferSize = 0;
202 }
203 } else {
204 CAMHAL_LOGEA("Preview format is NULL");
205 bufferSize = 0;
206 }
207
208 return bufferSize;
209 }
210
211
212 } // namespace Camera
213 } // namespace Ti
214