19e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel/* Copyright (c) 2016, The Linux Foundation. All rights reserved. 29e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* 39e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* Redistribution and use in source and binary forms, with or without 49e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* modification, are permitted provided that the following conditions are 59e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* met: 69e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* * Redistributions of source code must retain the above copyright 79e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* notice, this list of conditions and the following disclaimer. 89e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* * Redistributions in binary form must reproduce the above 99e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* copyright notice, this list of conditions and the following 109e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* disclaimer in the documentation and/or other materials provided 119e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* with the distribution. 129e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* * Neither the name of The Linux Foundation nor the names of its 139e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* contributors may be used to endorse or promote products derived 149e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* from this software without specific prior written permission. 159e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* 169e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 179e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 189e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 199e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 209e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 219e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 229e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 239e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 249e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 259e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 269e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel* 289e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel*/ 299e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel#include "QCameraHAL3SnapshotTest.h" 309e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel#include "QCameraHAL3MainTestContext.h" 319e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 329e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 339e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelnamespace qcamera { 349e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 359e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelhal3_camera_lib_test *Snapshot_CamObj_handle; 369e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelint fcount_captured; 379e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelextern pthread_mutex_t TestAppLock; 389e74aae7331f3227542b3e646a0dd658d3467a31Thierry StrudelQCameraHAL3SnapshotTest::QCameraHAL3SnapshotTest(int req_cap) : 399e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel QCameraHAL3Test(0), 409e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mCaptureHandle(NULL), 419e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStream(NULL), 429e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequestedCapture(req_cap) 439e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 449e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 459e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 469e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 479e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3SnapshotTest::initTest(hal3_camera_lib_test *handle, 489e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int testcase, int camid, int w, int h) 499e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 509e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel fcount_captured = 0; 519e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel Snapshot_CamObj_handle = handle; 5204e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGD("\ntestcase %d %d and %d ",testcase, w, h); 539e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel configureSnapshotStream(&(handle->test_obj), camid, w, h); 549e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 559e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel constructDefaultRequest(&(handle->test_obj), 0); 569e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\n Snapshot Default stream setting read"); 579e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 589e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\n Snapshot stream configured"); 599e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel snapshotThreadCreate(MENU_START_CAPTURE, hal3appSnapshotProcessBuffers); 609e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel (mRequest.frame_number) = 0; 619e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel snapshotProcessCaptureRequest(&(handle->test_obj), 0); 629e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\n Snapshot Process Capture Request Sent"); 639e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 649e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 659e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3SnapshotTest::constructDefaultRequest( 669e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_test_obj_t *my_test_obj, int camid) 679e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 689e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel camera3_device_t *device_handle = my_test_obj->device; 6904e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGD("Camera ID : %d",camid); 709e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mMetaDataPtr[0]= device_handle->ops->construct_default_request_settings(my_test_obj->device, 719e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel CAMERA3_TEMPLATE_PREVIEW); 729e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mMetaDataPtr[1] = device_handle->ops->construct_default_request_settings(my_test_obj->device, 739e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel CAMERA3_TEMPLATE_STILL_CAPTURE); 749e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 759e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 769e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3SnapshotTest::configureSnapshotStream(hal3_camera_test_obj_t *my_test_obj, 779e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int camid, int w, int h) 789e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 799e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel camera3_device_t *device_handle = my_test_obj->device; 8004e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGD(" configureSnapshotStream testcase dim :%d X %d", w, h); 819e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mPreviewStream = new camera3_stream_t; 829e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStream = new camera3_stream_t; 839e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 849e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel memset(mPreviewStream, 0, sizeof(camera3_stream_t)); 859e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel memset(mSnapshotStream, 0, sizeof(camera3_stream_t)); 869e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mPreviewStream = initStream(CAMERA3_STREAM_OUTPUT, camid, PREVIEW_WIDTH, PREVIEW_HEIGHT, 0, 879e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, HAL3_DATASPACE_UNKNOWN); 889e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStream = initStream(CAMERA3_STREAM_OUTPUT, camid, SNAPSHOT_CAPTURE_WIDTH, 899e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel SNAPSHOT_CAPTURE_HEIGHT, 0, HAL_PIXEL_FORMAT_BLOB, HAL3_DATASPACE_JFIF); 909e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 919e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotConfig = configureStream(CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, 2); 929e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotConfig.streams[0] = mPreviewStream; 939e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotConfig.streams[1] = mSnapshotStream; 949e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel device_handle->ops->configure_streams(my_test_obj->device, &(mSnapshotConfig)); 959e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 969e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 979e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3SnapshotTest::snapshotProcessCaptureRequest( 989e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_test_obj_t *my_test_obj, int camid) 999e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 1009e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int width, height; 1019e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel camera3_device_t *device_handle = my_test_obj->device; 1029e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel width = mSnapshotStream->width; 1039e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel height = mSnapshotStream->height; 1049e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel snapshotAllocateBuffers(width, height); 1059e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.settings = mMetaDataPtr[1]; 1069e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.input_buffer = NULL; 1079e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.num_output_buffers = 1; 1089e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStreamBuffs.stream = mSnapshotStream; 1099e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStreamBuffs.status = 0; 1109e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStreamBuffs.buffer = (const native_handle_t**)&mCaptureHandle; 1119e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStreamBuffs.release_fence = -1; 1129e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStreamBuffs.acquire_fence = -1; 1139e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.output_buffers = &(mSnapshotStreamBuffs); 11404e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGD("Calling HAL3APP capture request for camid : %d", camid); 1159e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel device_handle->ops->process_capture_request(my_test_obj->device, &(mRequest)); 1169e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel (mRequest.frame_number)++; 1179e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 1189e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 1199e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3SnapshotTest::snapshotProcessCaptureRequestRepeat( 1209e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_lib_test *my_hal3test_obj, int camid) 1219e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 1229e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_test_obj_t *my_test_obj = &(my_hal3test_obj->test_obj); 1239e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\nSnapshot Requested Capture : %d and Received Capture : %d", 1249e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequestedCapture, fcount_captured); 1259e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (mRequestedCapture == fcount_captured) { 1269e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\n Snapshot is running successfully Ending test"); 1279e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel fflush(stdout); 1289e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\n Capture Done , Recieved Frame : %d", fcount_captured); 1299e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel snapshotTestEnd(my_hal3test_obj, camid); 1309e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 1319e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel else { 1329e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel camera3_device_t *device_handle = my_test_obj->device; 1339e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.settings = mMetaDataPtr[1]; 1349e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.input_buffer = NULL; 1359e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.num_output_buffers = 1; 1369e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStreamBuffs.stream = mSnapshotStream; 1379e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStreamBuffs.buffer = (const native_handle_t**)&mCaptureHandle; 1389e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStreamBuffs.release_fence = -1; 1399e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mSnapshotStreamBuffs.acquire_fence = -1; 1409e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.output_buffers = &(mSnapshotStreamBuffs); 1419e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("Calling HAL3APP repeat capture request repeat %d and %d", 1429e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequestedCapture, fcount_captured); 1439e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel device_handle->ops->process_capture_request(my_test_obj->device, &(mRequest)); 1449e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel (mRequest.frame_number)++; 1459e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 1469e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 1479e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 1489e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3SnapshotTest::snapshotTestEnd( 1499e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_lib_test *my_hal3test_obj, int camid) 1509e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 1519e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel buffer_thread_msg_t msg; 1529e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel extern pthread_mutex_t gCamLock; 1539e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_test_obj_t *my_test_obj = &(my_hal3test_obj->test_obj); 1549e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel camera3_device_t *device_handle = my_test_obj->device; 1559e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel device_handle->ops->flush(my_test_obj->device); 15604e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGD("%s Closing Camera %d", __func__, camid); 1579e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel ioctl(mCaptureMemInfo.ion_fd, ION_IOC_FREE, &mCaptureMemInfo.ion_handle); 1589e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel close(mCaptureMemInfo.ion_fd); 1599e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mCaptureMemInfo.ion_fd = -1; 1609e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel memset(&msg, 0, sizeof(buffer_thread_msg_t)); 1619e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel msg.stop_thread = 1; 1629e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel write(pfd[1], &msg, sizeof(buffer_thread_msg_t)); 1639e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 1649e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 1659e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3SnapshotTest::snapshotAllocateBuffers(int width, int height) 1669e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 1679e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mCaptureHandle= allocateBuffers(width, height, &mCaptureMemInfo); 1689e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 1699e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 1709e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelbool QCameraHAL3SnapshotTest::snapshotThreadCreate(int testcase_id, 1719e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel void *(*hal3_thread_ops)(void *)) 1729e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 1739e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int32_t ret = 0; 1749e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel buffer_thread_t thread; 1759e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_attr_t attr; 1769e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (pipe(pfd) < 0) { 17704e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGE("%s:Test:%d Error in creating the pipe", __func__, testcase_id); 1789e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 1799e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_attr_init(&attr); 1809e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 1819e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_init(&thread.mutex, NULL); 1829e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_cond_init(&thread.cond, NULL); 1839e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel thread.is_thread_started = 0; 1849e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel thread.readfd = pfd[0]; 1859e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel thread.writefd = pfd[1]; 1869e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel thread.data_obj = this; 1879e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel ret = pthread_create(&thread.td, &attr, hal3_thread_ops, &thread ); 1889e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_setname_np(thread.td, "TestApp_Thread"); 1899e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (ret < 0) { 1909e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGE("Failed to create status thread"); 1919e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel return 0; 1929e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 1939e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_lock(&thread.mutex); 1949e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel while(thread.is_thread_started == 0) { 1959e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_cond_wait(&thread.cond, &thread.mutex); 1969e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 1979e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_unlock(&thread.mutex); 1989e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel return 1; 1999e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 2009e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 2019e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid * hal3appSnapshotProcessBuffers(void *data) 2029e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 2039e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel buffer_thread_t *thread = (buffer_thread_t*)data; 2049e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int32_t readfd, writefd; 2059e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_lib_test *hal3_test_handle; 2069e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_lock(&thread->mutex); 2079e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel thread->is_thread_started = 1; 2089e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel readfd = thread->readfd; 2099e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel writefd = thread->writefd; 2109e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel QCameraHAL3SnapshotTest *obj; 2119e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel obj = (QCameraHAL3SnapshotTest *)thread->data_obj; 2129e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_cond_signal(&thread->cond); 2139e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_unlock(&thread->mutex); 2149e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel struct pollfd pollfds; 2159e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int32_t num_of_fds = 1; 2169e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel bool sthread_exit = 0; 2179e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int32_t ready = 0; 2189e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pollfds.fd = readfd; 2199e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pollfds.events = POLLIN | POLLPRI; 2209e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel while(!sthread_exit) { 2219e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel ready = poll(&pollfds, (nfds_t)num_of_fds, -1); 2229e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (ready > 0) { 2239e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("Got some events"); 2249e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (pollfds.revents & (POLLIN | POLLPRI)) { 2259e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel ssize_t nread = 0; 2269e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel buffer_thread_msg_t msg; 2279e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel nread = read(pollfds.fd, &msg, sizeof(buffer_thread_msg_t)); 2289e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (nread < 0) { 2299e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGE("Unable to read the message"); 2309e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2319e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (msg.stop_thread) { 2329e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel break; 2339e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2349e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_test_handle = Snapshot_CamObj_handle; 2359e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel obj->snapshotProcessCaptureRequestRepeat(hal3_test_handle, 0); 2369e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2379e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2389e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel else { 2399e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGE("Unable to poll exiting the thread"); 2409e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel break; 2419e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2429e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2439e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("Sensor thread is exiting"); 2449e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel close(readfd); 2459e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel close(writefd); 2469e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_unlock(&TestAppLock); 2479e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_exit(0); 2489e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel return NULL; 2499e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 2509e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 2519e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3SnapshotTest::captureRequestRepeat( 2529e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_lib_test *my_hal3test_obj, int camid, int testcase) 2539e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 25404e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel if(my_hal3test_obj == NULL) { 25504e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGD("camid :%d and testcase : %d handle is NULL", camid, testcase); 25604e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel } 2579e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 2589e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 2599e74aae7331f3227542b3e646a0dd658d3467a31Thierry StrudelQCameraHAL3SnapshotTest::~QCameraHAL3SnapshotTest() 2609e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 2619e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 2629e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 2639e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 2649e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 265