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 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 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 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 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 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 { 171 172 } 173 174 175 int CameraHAL3Base::hal3appCameraTestLoad() 176 { 177 int rc = HAL3_CAM_OK; 178 int numCam; 179 int32_t res = 0; 180 hal3_camera_test_obj_t *my_test_obj; 181 mLibHandle = new hal3_camera_lib_test; 182 memset(mLibHandle, 0, sizeof(hal3_camera_lib_handle)); 183 rc = hal3appTestLoad(&mLibHandle->app_obj); 184 camera_module_t *my_if_handle = mLibHandle->app_obj.hal3_lib.halModule_t; 185 if (HAL3_CAM_OK != rc) { 186 LOGE("hal3 err\n"); 187 goto EXIT; 188 } 189 190 numCam = my_if_handle->get_number_of_cameras(); 191 printf("\n Number of Cameras are : %d ", numCam); 192 if (my_if_handle->get_vendor_tag_ops) { 193 mLibHandle->app_obj.mVendorTagOps = vendor_tag_ops_t(); 194 my_if_handle->get_vendor_tag_ops(&(mLibHandle->app_obj.mVendorTagOps)); 195 196 res = set_camera_metadata_vendor_ops(&(mLibHandle->app_obj.mVendorTagOps)); 197 if (0 != res) { 198 printf("%s: Could not set vendor tag descriptor, " 199 "received error %s (%d). \n", __func__, 200 strerror(-res), res); 201 goto EXIT; 202 } 203 } 204 my_test_obj = &(mLibHandle->test_obj); 205 my_test_obj->module_cb.torch_mode_status_change = &torch_mode_status_change; 206 my_test_obj->module_cb.camera_device_status_change = &camera_device_status_change; 207 my_if_handle->set_callbacks(&(my_test_obj->module_cb)); 208 my_if_handle->get_camera_info(0, &(mLibHandle->test_obj.cam_info)); 209 camcap_info = mLibHandle->test_obj.cam_info; 210 hal3app_cam_settings = (camcap_info.static_camera_characteristics); 211 display_capability(); 212 return numCam; 213 EXIT: 214 return rc; 215 216 } 217 218 void CameraHAL3Base::display_capability() 219 { 220 ALOGE("Camera Here"); 221 int i,j; 222 int *available_ir_modes = NULL, *available_svhdr_mode = NULL, count_stream; 223 if(hal3app_cam_settings.exists(QCAMERA3_IR_AVAILABLE_MODES)) { 224 ALOGE("\n mrad check1 "); 225 entry_hal3app = hal3app_cam_settings.find(QCAMERA3_IR_AVAILABLE_MODES); 226 available_ir_modes = (int *) malloc((entry_hal3app.count)*sizeof(int )); 227 for(i =0;i < (int)entry_hal3app.count; i++){ 228 available_ir_modes[i] = entry_hal3app.data.i32[i]; 229 ALOGE("\n mrad cap %d ", available_ir_modes[i]); 230 231 } 232 } 233 } 234 235 int CameraHAL3Base::hal3appCameraLibOpen(int camid) 236 { 237 int rc; 238 rc = hal3appCamOpen(&mLibHandle->app_obj, (int)camid, &(mLibHandle->test_obj)); 239 if (rc != HAL3_CAM_OK) { 240 LOGE("hal3appCamOpen() camidx=%d, err=%d\n", 241 camid, rc); 242 goto EXIT; 243 } 244 rc = hal3appCamInitialize((int)camid, &mLibHandle->test_obj); 245 EXIT: 246 return rc; 247 } 248 249 int CameraHAL3Base::hal3appTestLoad(hal3_camera_app_t *my_hal3_app) 250 { 251 memset(&my_hal3_app->hal3_lib, 0, sizeof(hal3_interface_lib_t)); 252 printf("\nLibrary path is :%s", CAM_LIB(LIB_PATH)); 253 my_hal3_app->hal3_lib.ptr = dlopen(CAM_LIB(LIB_PATH), RTLD_NOW); 254 255 if (!my_hal3_app->hal3_lib.ptr) { 256 LOGE("Error opening HAL libraries %s\n", 257 dlerror()); 258 return -HAL3_CAM_E_GENERAL; 259 } 260 my_hal3_app->hal3_lib.halModule_t = 261 (camera_module_t*)dlsym(my_hal3_app->hal3_lib.ptr, HAL_MODULE_INFO_SYM_AS_STR); 262 if (my_hal3_app->hal3_lib.halModule_t == NULL) { 263 LOGE("Error opening HAL library %s\n", 264 dlerror()); 265 return -HAL3_CAM_E_GENERAL; 266 } 267 return HAL3_CAM_OK; 268 } 269 270 int CameraHAL3Base::hal3appCamOpen( 271 hal3_camera_app_t *my_hal3_app, 272 int camid, 273 hal3_camera_test_obj_t *my_test_obj) 274 { 275 camera_module_t *my_if_handle = my_hal3_app->hal3_lib.halModule_t; 276 my_if_handle->common.methods->open(&(my_if_handle->common), "0", 277 reinterpret_cast<hw_device_t**>(&(my_test_obj->device))); 278 printf("\n Camera ID %d Opened \n", camid); 279 return HAL3_CAM_OK; 280 } 281 282 int CameraHAL3Base::hal3appCamInitialize(int camid, hal3_camera_test_obj_t *my_test_obj) 283 { 284 int rc = 0; 285 camera3_device_t *device_handle = my_test_obj->device; 286 my_test_obj->callback_ops.notify = &Notify; 287 my_test_obj->callback_ops.process_capture_result = &ProcessCaptureResult; 288 rc = device_handle->ops->initialize(my_test_obj->device, &(my_test_obj->callback_ops)); 289 if (rc != HAL3_CAM_OK) { 290 LOGE("hal3appCamInitialize() camidx=%d, err=%d\n", 291 camid, rc); 292 goto EXIT; 293 } 294 EXIT: 295 return rc; 296 } 297 298 299 void CameraHAL3Base::hal3appCheckStream(int testcase, int camid) 300 { 301 if (testcase != MENU_START_PREVIEW) { 302 if (mPreviewtestCase != NULL) { 303 mPreviewtestCase->previewTestEnd(mLibHandle, camid); 304 delete mPreviewtestCase; 305 mPreviewtestCase = NULL; 306 } 307 } 308 if (testcase != MENU_START_VIDEO){ 309 if (mVideotestCase != NULL) { 310 mVideotestCase->videoTestEnd(mLibHandle, camid); 311 delete mVideotestCase; 312 mVideotestCase = NULL; 313 } 314 } 315 316 if (testcase != MENU_START_CAPTURE){ 317 if (mSnapshottestCase != NULL) { 318 delete mSnapshottestCase; 319 mSnapshottestCase = NULL; 320 } 321 } 322 323 if (testcase != MENU_START_RAW_CAPTURE) { 324 if (mRawSnapshottestCase != NULL) { 325 delete mRawSnapshottestCase; 326 mRawSnapshottestCase = NULL; 327 } 328 } 329 } 330 331 332 int CameraHAL3Base::hal3appCameraPreviewInit(int testcase, int camid, int w, int h) 333 { 334 extern int req_sent; 335 int testCaseEndComplete = 0; 336 if (w == 0 || h == 0) { 337 printf("\n Frame dimension is wrong"); 338 return -1; 339 } 340 if ( mPreviewtestCase != NULL) { 341 if(testcase == MENU_TOGGLE_IR_MODE) { 342 ALOGE("\n IR mode requested is :%d", ir_mode); 343 mPreviewtestCase->ir_mode = ir_mode; 344 } 345 if(testcase == MENU_TOGGLE_SVHDR_MODE) { 346 ALOGE("\n SVHDR mode requested is :%d", svhdr_mode); 347 mPreviewtestCase->svhdr_mode = svhdr_mode; 348 } 349 return 0; 350 } 351 else { 352 testCaseEndComplete = 0; 353 do { 354 if (mVideoRunning == 1) { 355 hal3appCheckStream(MENU_START_PREVIEW, camid); 356 } 357 pthread_mutex_lock(&TestAppLock); 358 mTestCaseSelected = MENU_START_PREVIEW; 359 if (mVideoRunning != 1) { 360 hal3appCheckStream(MENU_START_PREVIEW, camid); 361 } 362 mPreviewtestCase = new QCameraHAL3PreviewTest(0); 363 printf("\n\n Testing the Resolution : %d X %d", w, h); 364 req_sent = 0; 365 PreviewQueue.clear(); 366 capture_received = 0; mSecElapsed = 1; 367 snapshot_buffer = -1; mFrameCount = 0; 368 mPreviewtestCase->width = w; mPreviewtestCase->height = h; 369 mPreviewtestCase->ir_mode = 0; mPreviewtestCase->svhdr_mode = 0; 370 mPreviewtestCase->initTest(mLibHandle, 371 (int) MENU_START_PREVIEW, camid, w, h); 372 testCaseEndComplete = 1; 373 }while(testCaseEndComplete != 1); 374 } 375 return 0; 376 } 377 378 int CameraHAL3Base::hal3appCameraVideoInit(int testcase, int camid, int w, int h) 379 { 380 extern int req_sent; 381 int testCaseEndComplete = 0; 382 if (w == 0 || h == 0) { 383 printf("\n Frame dimension is wrong"); 384 return -1; 385 } 386 387 if (mVideotestCase != NULL) { 388 LOGD("testcase is : %d", testcase); 389 return 0; 390 } 391 else { 392 testCaseEndComplete = 0; 393 do { 394 if (mPreviewRunning == 1) { 395 hal3appCheckStream(MENU_START_VIDEO, camid); 396 } 397 pthread_mutex_lock(&TestAppLock); 398 mTestCaseSelected = MENU_START_VIDEO; 399 if (mPreviewRunning != 1) { 400 hal3appCheckStream(MENU_START_VIDEO, camid); 401 } 402 mVideotestCase = new QCameraHAL3VideoTest(0); 403 VideoQueue.clear(); 404 printf("\n\nTesting the Resolution : %d X %d", w, h); 405 req_sent = 0; 406 capture_received =0; mSecElapsed = 1; test_case_end = 0; 407 mVideotestCase->width = w; mVideotestCase->height = h; 408 snapshot_buffer = -1; mFrameCount = 0; 409 mVideotestCase->initTest(mLibHandle, 410 (int) MENU_START_VIDEO, camid, w, h); 411 testCaseEndComplete = 1; 412 }while(testCaseEndComplete !=1); 413 } 414 return 0; 415 } 416 417 418 int CameraHAL3Base::hal3appRawCaptureInit(hal3_camera_lib_test *handle, int camid, int req_cap) 419 { 420 int testCaseEndComplete = 0; 421 if(handle == NULL) { 422 LOGE("Camera Handle is NULL"); 423 } 424 if (mSnapShotRunning != 1) { 425 hal3appCheckStream(MENU_START_RAW_CAPTURE, camid); 426 } 427 testCaseEndComplete = 0; 428 do { 429 pthread_mutex_lock(&TestAppLock); 430 if (mSnapShotRunning == 1) { 431 hal3appCheckStream(MENU_START_RAW_CAPTURE, camid); 432 } 433 printf("\n capture:%d", req_cap); 434 mTestCaseSelected = MENU_START_RAW_CAPTURE; 435 mRawSnapshottestCase = new QCameraHAL3RawSnapshotTest(req_cap); 436 mRawSnapshottestCase->mRequestedCapture = req_cap; 437 mRawSnapshottestCase->initTest(mLibHandle, 438 (int) MENU_START_RAW_CAPTURE, camid, RAWSNAPSHOT_CAPTURE_WIDTH, 439 RAWSNAPSHOT_CAPTURE_HEIGHT); 440 testCaseEndComplete = 1; 441 }while(testCaseEndComplete !=1); 442 return 0; 443 } 444 445 int CameraHAL3Base::hal3appCameraCaptureInit(hal3_camera_lib_test *handle, 446 int camid, int req_cap) 447 { 448 int testCaseEndComplete = 0; 449 if(handle == NULL) { 450 LOGE("Camera Handle is NULL"); 451 } 452 if (mSnapShotRunning != 1) { 453 hal3appCheckStream(MENU_START_CAPTURE, camid); 454 } 455 testCaseEndComplete = 0; 456 do { 457 pthread_mutex_lock(&TestAppLock); 458 if (mSnapShotRunning == 1) { 459 hal3appCheckStream(MENU_START_CAPTURE, camid); 460 } 461 printf("\n capture:%d", req_cap); 462 mTestCaseSelected = MENU_START_CAPTURE; 463 mSnapshottestCase = new QCameraHAL3SnapshotTest(req_cap); 464 mSnapshottestCase->mRequestedCapture = req_cap; 465 mSnapshottestCase->initTest(mLibHandle, 466 (int) MENU_START_CAPTURE, camid, SNAPSHOT_CAPTURE_WIDTH, SNAPSHOT_CAPTURE_HEIGHT); 467 testCaseEndComplete = 1; 468 }while(testCaseEndComplete != 1); 469 return 0; 470 } 471 472 } 473 474