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 #include "QCameraHAL3MainTestContext.h"
31 #include "QCameraHAL3SnapshotTest.h"
32 #include "QCameraHAL3RawSnapshotTest.h"
33 #include "QCameraHAL3PreviewTest.h"
34
35 #ifdef QCAMERA_HAL3_SUPPORT
36 #define LIB_PATH /usr/lib/hw/camera.msm8953.so
37 #else
38 #define LIB_PATH /system/lib/hw/camera.msm8953.so
39 #endif
40
41 extern "C" {
42 extern int set_camera_metadata_vendor_ops(const vendor_tag_ops_t *query_ops);
43 }
44
45 /*#ifdef CAMERA_CHIPSET_8953
46 #define CHIPSET_LIB lib/hw/camera.msm8953.so
47 #else
48 #define CHIPSET_LIB lib/hw/camera.msm8937.so
49 #endif*/
50
51 #define CAM_LIB(s) STR_LIB_PATH(s)
52 #define STR_LIB_PATH(s) #s
53
54 namespace qcamera {
55
56 QCameraHAL3PreviewTest *mPreviewtestCase = NULL;
57 QCameraHAL3VideoTest *mVideotestCase = NULL;
58 QCameraHAL3SnapshotTest *mSnapshottestCase = NULL;
59 QCameraHAL3RawSnapshotTest *mRawSnapshottestCase = NULL;
60
61 struct timeval start_time;
62 int capture_received;
63 int pfd[2];
64 extern int test_case_end;
65 extern int snapshot_buffer;
66
67 pthread_cond_t mRequestAppCond;
68 std::list<uint32_t> PreviewQueue;
69 std::list<uint32_t> VideoQueue;
70
71 pthread_mutex_t TestAppLock = PTHREAD_MUTEX_INITIALIZER;
72 pthread_mutex_t mCaptureRequestLock = PTHREAD_MUTEX_INITIALIZER;
73
74
75
camera_device_status_change(const struct camera_module_callbacks * callbacks,int camera_id,int new_status)76 static void camera_device_status_change(
77 const struct camera_module_callbacks* callbacks,
78 int camera_id, int new_status)
79 {
80 /* Stub function */
81 if (callbacks == NULL) {
82 LOGD("Parameters are NULL %d %d", camera_id, new_status);
83 }
84 }
85
torch_mode_status_change(const struct camera_module_callbacks * callbacks,const char * camera_id,int new_status)86 static void torch_mode_status_change(
87 const struct camera_module_callbacks* callbacks,
88 const char* camera_id, int new_status)
89 {
90 /* Stub function */
91 if((callbacks == NULL) || (camera_id == NULL)) {
92 LOGD("Parameters are NULL %d", new_status);
93 }
94 }
95
Notify(const camera3_callback_ops * cb,const camera3_notify_msg * msg)96 static void Notify(
97 const camera3_callback_ops *cb,
98 const camera3_notify_msg *msg)
99 {
100 /* Stub function */
101 if((cb == NULL) || (msg == NULL)) {
102 LOGD("Parameters are NULL ");
103 }
104 }
105
ProcessCaptureResult(const camera3_callback_ops * cb,const camera3_capture_result * result)106 static void ProcessCaptureResult(
107 const camera3_callback_ops *cb,
108 const camera3_capture_result *result)
109 {
110 buffer_thread_msg_t msg;
111 extern CameraHAL3Base *mCamHal3Base;
112 int frame_num;
113 extern int req_sent;
114 extern int preview_buffer_allocated;
115 extern int video_buffer_allocated;
116 int num;
117 if(cb == NULL) {
118 LOGD("callback returned is NULL");
119 }
120 LOGD("Cam Capture Result Callback %d and %d",
121 result->num_output_buffers, mCamHal3Base->mFrameCount);
122 if (mCamHal3Base->mTestCaseSelected == MENU_START_PREVIEW ||
123 mCamHal3Base->mTestCaseSelected == MENU_START_VIDEO) {
124 if (result->num_output_buffers == 1) {
125 frame_num = result->frame_number;
126 LOGD("Frame width:%d and height:%d and format:%d",
127 result->output_buffers->stream->width,
128 result->output_buffers->stream->height,
129 result->output_buffers->stream->format);
130 (mCamHal3Base->mFrameCount)++;
131 LOGD("Preview/Video Capture Result %d and fcount: %d and req_Sent:%d and %d ",
132 result->num_output_buffers, mCamHal3Base->mFrameCount, req_sent, result->frame_number);
133 if (test_case_end == 0) {
134 if (mCamHal3Base->mTestCaseSelected == MENU_START_PREVIEW) {
135 num = (result->frame_number)%preview_buffer_allocated;
136 PreviewQueue.push_back(num);
137 }
138 else {
139 num = (result->frame_number)%video_buffer_allocated;
140 VideoQueue.push_back(num);
141 }
142 pthread_cond_signal(&mRequestAppCond);
143 memset(&msg, 0, sizeof(buffer_thread_msg_t));
144 }
145 }
146 }
147 else {
148 extern int fcount_captured;
149 if (result->num_output_buffers == 1) {
150 LOGD("snapshot/Raw Capture1 Result Callback %d and %d",
151 result->num_output_buffers, fcount_captured);
152 (mCamHal3Base->mFrameCount)++;
153 fcount_captured++;
154 LOGD("\n Capture %d done preparing for capture ", fcount_captured);
155 memset(&msg, 0, sizeof(buffer_thread_msg_t));
156 write(pfd[1], &msg, sizeof(buffer_thread_msg_t));
157 }
158 }
159 }
160
CameraHAL3Base(int cameraIndex)161 CameraHAL3Base::CameraHAL3Base(int cameraIndex) :
162 mCameraIndex(cameraIndex),
163 mLibHandle(NULL),
164 mFrameCount(0),
165 mSecElapsed(1),
166 mTestCaseSelected(0),
167 mPreviewRunning(0),
168 mVideoRunning(0),
169 mSnapShotRunning(0),
170 binning_mode(0)
171 {
172
173 }
174
175
hal3appCameraTestLoad()176 int CameraHAL3Base::hal3appCameraTestLoad()
177 {
178 int rc = HAL3_CAM_OK;
179 int numCam;
180 int32_t res = 0;
181 hal3_camera_test_obj_t *my_test_obj;
182 mLibHandle = new hal3_camera_lib_test;
183 memset(mLibHandle, 0, sizeof(hal3_camera_lib_handle));
184 rc = hal3appTestLoad(&mLibHandle->app_obj);
185 camera_module_t *my_if_handle = mLibHandle->app_obj.hal3_lib.halModule_t;
186 if (HAL3_CAM_OK != rc) {
187 LOGE("hal3 err\n");
188 goto EXIT;
189 }
190
191 numCam = my_if_handle->get_number_of_cameras();
192 printf("\n Number of Cameras are : %d ", numCam);
193 if (my_if_handle->get_vendor_tag_ops) {
194 mLibHandle->app_obj.mVendorTagOps = vendor_tag_ops_t();
195 my_if_handle->get_vendor_tag_ops(&(mLibHandle->app_obj.mVendorTagOps));
196
197 res = set_camera_metadata_vendor_ops(&(mLibHandle->app_obj.mVendorTagOps));
198 if (0 != res) {
199 printf("%s: Could not set vendor tag descriptor, "
200 "received error %s (%d). \n", __func__,
201 strerror(-res), res);
202 goto EXIT;
203 }
204 }
205 my_test_obj = &(mLibHandle->test_obj);
206 my_test_obj->module_cb.torch_mode_status_change = &torch_mode_status_change;
207 my_test_obj->module_cb.camera_device_status_change = &camera_device_status_change;
208 my_if_handle->set_callbacks(&(my_test_obj->module_cb));
209 my_if_handle->get_camera_info(0, &(mLibHandle->test_obj.cam_info));
210 camcap_info = mLibHandle->test_obj.cam_info;
211 hal3app_cam_settings = (camcap_info.static_camera_characteristics);
212 display_capability();
213 return numCam;
214 EXIT:
215 return rc;
216
217 }
218
display_capability()219 void CameraHAL3Base::display_capability()
220 {
221 ALOGE("Camera Here");
222 int i;
223 int *available_ir_modes = NULL;
224 if(hal3app_cam_settings.exists(QCAMERA3_IR_AVAILABLE_MODES)) {
225 ALOGE("\n mrad check1 ");
226 entry_hal3app = hal3app_cam_settings.find(QCAMERA3_IR_AVAILABLE_MODES);
227 available_ir_modes = (int *) malloc((entry_hal3app.count)*sizeof(int ));
228 for(i =0;i < (int)entry_hal3app.count; i++){
229 available_ir_modes[i] = entry_hal3app.data.i32[i];
230 ALOGE("\n mrad cap %d ", available_ir_modes[i]);
231
232 }
233 }
234 }
235
hal3appCameraLibOpen(int camid)236 int CameraHAL3Base::hal3appCameraLibOpen(int camid)
237 {
238 int rc;
239 rc = hal3appCamOpen(&mLibHandle->app_obj, (int)camid, &(mLibHandle->test_obj));
240 if (rc != HAL3_CAM_OK) {
241 LOGE("hal3appCamOpen() camidx=%d, err=%d\n",
242 camid, rc);
243 goto EXIT;
244 }
245 rc = hal3appCamInitialize((int)camid, &mLibHandle->test_obj);
246 EXIT:
247 return rc;
248 }
249
hal3appTestLoad(hal3_camera_app_t * my_hal3_app)250 int CameraHAL3Base::hal3appTestLoad(hal3_camera_app_t *my_hal3_app)
251 {
252 memset(&my_hal3_app->hal3_lib, 0, sizeof(hal3_interface_lib_t));
253 printf("\nLibrary path is :%s", CAM_LIB(LIB_PATH));
254 my_hal3_app->hal3_lib.ptr = dlopen(CAM_LIB(LIB_PATH), RTLD_NOW);
255
256 if (!my_hal3_app->hal3_lib.ptr) {
257 LOGE("Error opening HAL libraries %s\n",
258 dlerror());
259 return -HAL3_CAM_E_GENERAL;
260 }
261 my_hal3_app->hal3_lib.halModule_t =
262 (camera_module_t*)dlsym(my_hal3_app->hal3_lib.ptr, HAL_MODULE_INFO_SYM_AS_STR);
263 if (my_hal3_app->hal3_lib.halModule_t == NULL) {
264 LOGE("Error opening HAL library %s\n",
265 dlerror());
266 return -HAL3_CAM_E_GENERAL;
267 }
268 return HAL3_CAM_OK;
269 }
270
hal3appCamOpen(hal3_camera_app_t * my_hal3_app,int camid,hal3_camera_test_obj_t * my_test_obj)271 int CameraHAL3Base::hal3appCamOpen(
272 hal3_camera_app_t *my_hal3_app,
273 int camid,
274 hal3_camera_test_obj_t *my_test_obj)
275 {
276 camera_module_t *my_if_handle = my_hal3_app->hal3_lib.halModule_t;
277 my_if_handle->common.methods->open(&(my_if_handle->common), "0",
278 reinterpret_cast<hw_device_t**>(&(my_test_obj->device)));
279 printf("\n Camera ID %d Opened \n", camid);
280 return HAL3_CAM_OK;
281 }
282
hal3appCamInitialize(int camid,hal3_camera_test_obj_t * my_test_obj)283 int CameraHAL3Base::hal3appCamInitialize(int camid, hal3_camera_test_obj_t *my_test_obj)
284 {
285 int rc = 0;
286 camera3_device_t *device_handle = my_test_obj->device;
287 my_test_obj->callback_ops.notify = &Notify;
288 my_test_obj->callback_ops.process_capture_result = &ProcessCaptureResult;
289 rc = device_handle->ops->initialize(my_test_obj->device, &(my_test_obj->callback_ops));
290 if (rc != HAL3_CAM_OK) {
291 LOGE("hal3appCamInitialize() camidx=%d, err=%d\n",
292 camid, rc);
293 goto EXIT;
294 }
295 EXIT:
296 return rc;
297 }
298
299
hal3appCheckStream(int testcase,int camid)300 void CameraHAL3Base::hal3appCheckStream(int testcase, int camid)
301 {
302 if (testcase != MENU_START_PREVIEW) {
303 if (mPreviewtestCase != NULL) {
304 mPreviewtestCase->previewTestEnd(mLibHandle, camid);
305 delete mPreviewtestCase;
306 mPreviewtestCase = NULL;
307 }
308 }
309 if (testcase != MENU_START_VIDEO){
310 if (mVideotestCase != NULL) {
311 mVideotestCase->videoTestEnd(mLibHandle, camid);
312 delete mVideotestCase;
313 mVideotestCase = NULL;
314 }
315 }
316
317 if (testcase != MENU_START_CAPTURE){
318 if (mSnapshottestCase != NULL) {
319 delete mSnapshottestCase;
320 mSnapshottestCase = NULL;
321 }
322 }
323
324 if (testcase != MENU_START_RAW_CAPTURE) {
325 if (mRawSnapshottestCase != NULL) {
326 delete mRawSnapshottestCase;
327 mRawSnapshottestCase = NULL;
328 }
329 }
330 }
331
332
hal3appCameraPreviewInit(int testcase,int camid,int w,int h)333 int CameraHAL3Base::hal3appCameraPreviewInit(int testcase, int camid, int w, int h)
334 {
335 extern int req_sent;
336 int testCaseEndComplete = 0;
337 if (w == 0 || h == 0) {
338 printf("\n Frame dimension is wrong");
339 return -1;
340 }
341 if ( mPreviewtestCase != NULL) {
342 if(testcase == MENU_TOGGLE_IR_MODE) {
343 ALOGE("\n IR mode requested is :%d", ir_mode);
344 mPreviewtestCase->ir_mode = ir_mode;
345 }
346 if(testcase == MENU_TOGGLE_SVHDR_MODE) {
347 ALOGE("\n SVHDR mode requested is :%d", svhdr_mode);
348 mPreviewtestCase->svhdr_mode = svhdr_mode;
349 }
350 return 0;
351 }
352 else {
353 testCaseEndComplete = 0;
354 do {
355 if (mVideoRunning == 1) {
356 hal3appCheckStream(MENU_START_PREVIEW, camid);
357 }
358 pthread_mutex_lock(&TestAppLock);
359 mTestCaseSelected = MENU_START_PREVIEW;
360 if (mVideoRunning != 1) {
361 hal3appCheckStream(MENU_START_PREVIEW, camid);
362 }
363 mPreviewtestCase = new QCameraHAL3PreviewTest(0);
364 printf("\n\n Testing the Resolution : %d X %d", w, h);
365 req_sent = 0;
366 PreviewQueue.clear();
367 capture_received = 0; mSecElapsed = 1;
368 snapshot_buffer = -1; mFrameCount = 0;
369 mPreviewtestCase->width = w; mPreviewtestCase->height = h;
370 mPreviewtestCase->ir_mode = 0; mPreviewtestCase->svhdr_mode = 0;
371 mPreviewtestCase->initTest(mLibHandle,
372 (int) MENU_START_PREVIEW, camid, w, h);
373 testCaseEndComplete = 1;
374 }while(testCaseEndComplete != 1);
375 }
376 return 0;
377 }
378
hal3appCameraVideoInit(int testcase,int camid,int w,int h)379 int CameraHAL3Base::hal3appCameraVideoInit(int testcase, int camid, int w, int h)
380 {
381 extern int req_sent;
382 int testCaseEndComplete = 0;
383 if (w == 0 || h == 0) {
384 printf("\n Frame dimension is wrong");
385 return -1;
386 }
387
388 if (mVideotestCase != NULL) {
389 if(testcase == MENU_TOGGLE_BINNING_CORRECTION) {
390 ALOGE("\n Binning Mode Requested is :%d", binning_mode);
391 mVideotestCase->binning_mode = binning_mode;
392 }
393 return 0;
394 }
395 else {
396 testCaseEndComplete = 0;
397 do {
398 if (mPreviewRunning == 1) {
399 hal3appCheckStream(MENU_START_VIDEO, camid);
400 }
401 pthread_mutex_lock(&TestAppLock);
402 mTestCaseSelected = MENU_START_VIDEO;
403 if (mPreviewRunning != 1) {
404 hal3appCheckStream(MENU_START_VIDEO, camid);
405 }
406 mVideotestCase = new QCameraHAL3VideoTest(0);
407 VideoQueue.clear();
408 printf("\n\nTesting the Resolution : %d X %d", w, h);
409 req_sent = 0;
410 capture_received =0; mSecElapsed = 1; test_case_end = 0;
411 mVideotestCase->width = w; mVideotestCase->height = h;
412 snapshot_buffer = -1; mFrameCount = 0;
413 mVideotestCase->initTest(mLibHandle,
414 (int) MENU_START_VIDEO, camid, w, h);
415 testCaseEndComplete = 1;
416 }while(testCaseEndComplete !=1);
417 }
418 return 0;
419 }
420
421
hal3appRawCaptureInit(hal3_camera_lib_test * handle,int camid,int req_cap)422 int CameraHAL3Base::hal3appRawCaptureInit(hal3_camera_lib_test *handle, int camid, int req_cap)
423 {
424 int testCaseEndComplete = 0;
425 if(handle == NULL) {
426 LOGE("Camera Handle is NULL");
427 }
428 if (mSnapShotRunning != 1) {
429 hal3appCheckStream(MENU_START_RAW_CAPTURE, camid);
430 }
431 testCaseEndComplete = 0;
432 do {
433 pthread_mutex_lock(&TestAppLock);
434 if (mSnapShotRunning == 1) {
435 hal3appCheckStream(MENU_START_RAW_CAPTURE, camid);
436 }
437 printf("\n capture:%d", req_cap);
438 mTestCaseSelected = MENU_START_RAW_CAPTURE;
439 mRawSnapshottestCase = new QCameraHAL3RawSnapshotTest(req_cap);
440 mRawSnapshottestCase->mRequestedCapture = req_cap;
441 mRawSnapshottestCase->initTest(mLibHandle,
442 (int) MENU_START_RAW_CAPTURE, camid, RAWSNAPSHOT_CAPTURE_WIDTH,
443 RAWSNAPSHOT_CAPTURE_HEIGHT);
444 testCaseEndComplete = 1;
445 }while(testCaseEndComplete !=1);
446 return 0;
447 }
448
hal3appCameraCaptureInit(hal3_camera_lib_test * handle,int camid,int req_cap)449 int CameraHAL3Base::hal3appCameraCaptureInit(hal3_camera_lib_test *handle,
450 int camid, int req_cap)
451 {
452 int testCaseEndComplete = 0;
453 if(handle == NULL) {
454 LOGE("Camera Handle is NULL");
455 }
456 if (mSnapShotRunning != 1) {
457 hal3appCheckStream(MENU_START_CAPTURE, camid);
458 }
459 testCaseEndComplete = 0;
460 do {
461 pthread_mutex_lock(&TestAppLock);
462 if (mSnapShotRunning == 1) {
463 hal3appCheckStream(MENU_START_CAPTURE, camid);
464 }
465 printf("\n capture:%d", req_cap);
466 mTestCaseSelected = MENU_START_CAPTURE;
467 mSnapshottestCase = new QCameraHAL3SnapshotTest(req_cap);
468 mSnapshottestCase->mRequestedCapture = req_cap;
469 mSnapshottestCase->initTest(mLibHandle,
470 (int) MENU_START_CAPTURE, camid, SNAPSHOT_CAPTURE_WIDTH, SNAPSHOT_CAPTURE_HEIGHT);
471 testCaseEndComplete = 1;
472 }while(testCaseEndComplete != 1);
473 return 0;
474 }
475
476 }
477
478