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 309e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel#include "QCameraHAL3RawSnapshotTest.h" 319e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel#include "QCameraHAL3MainTestContext.h" 329e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 339e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelnamespace qcamera { 349e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelhal3_camera_lib_test *RawSnapshot_CamObj_handle; 359e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelextern int fcount_captured; 369e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelextern pthread_mutex_t TestAppLock; 379e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 389e74aae7331f3227542b3e646a0dd658d3467a31Thierry StrudelQCameraHAL3RawSnapshotTest::QCameraHAL3RawSnapshotTest(int req_cap) : 399e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel QCameraHAL3Test(0), 409e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawCaptureHandle(NULL), 419e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStream(NULL), 429e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequestedCapture(req_cap) 439e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 449e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 459e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 469e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 479e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3RawSnapshotTest::initTest(hal3_camera_lib_test *handle, 489e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int testcase, int camid, int w, int h) 499e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 509e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel RawSnapshot_CamObj_handle = handle; 5104e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGD("\n Raw buffer thread created for testcase : %d", testcase); 529e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel configureRawSnapshotStream(&(handle->test_obj), camid, w, h); 539e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel constructDefaultRequest(&(handle->test_obj), 0); 549e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\n Raw Snapshot Default stream setting read"); 559e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel rawProcessThreadCreate(MENU_START_RAW_CAPTURE, 569e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel rawProcessBuffers); 579e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.frame_number = 0; 589e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\nRaw Snapshot stream configured"); 599e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel rawProcessCaptureRequest(&(handle->test_obj), 0); 609e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\nRaw Snapshot Process Capture Request Sent"); 619e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 629e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 639e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3RawSnapshotTest::constructDefaultRequest( 649e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_test_obj_t *my_test_obj, int camid) 659e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 669e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel camera3_device_t *device_handle = my_test_obj->device; 6704e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGD("Camera ID : %d",camid); 689e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mMetaDataPtr[0] = device_handle->ops->construct_default_request_settings( 699e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel my_test_obj->device, CAMERA3_TEMPLATE_PREVIEW); 709e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mMetaDataPtr[1] = device_handle->ops->construct_default_request_settings( 719e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel my_test_obj->device, CAMERA3_TEMPLATE_STILL_CAPTURE); 729e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 739e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 749e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3RawSnapshotTest::configureRawSnapshotStream(hal3_camera_test_obj_t *my_test_obj, 759e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int camid, int w, int h) 769e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 779e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel camera3_device_t *device_handle = my_test_obj->device; 7804e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGD(" configureSnapshotStream testcase dim :%d X %d", w, h); 799e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mPreviewStream = new camera3_stream_t; 809e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStream = new camera3_stream_t; 819e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 829e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel memset(mPreviewStream, 0, sizeof(camera3_stream_t)); 839e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel memset(mRawSnapshotStream, 0, sizeof(camera3_stream_t)); 849e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 859e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mPreviewStream = initStream(CAMERA3_STREAM_OUTPUT, camid, PREVIEW_WIDTH, PREVIEW_HEIGHT, 0, 869e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, HAL3_DATASPACE_UNKNOWN); 879e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStream = initStream(CAMERA3_STREAM_OUTPUT, camid, RAWSNAPSHOT_CAPTURE_WIDTH, 889e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel RAWSNAPSHOT_CAPTURE_HEIGHT, 0, HAL_PIXEL_FORMAT_RAW16, HAL3_DATASPACE_ARBITRARY); 899e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotConfig = configureStream(CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, 2); 909e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 919e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotConfig.streams[0] = mPreviewStream; 929e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotConfig.streams[1] = mRawSnapshotStream; 939e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel device_handle->ops->configure_streams(my_test_obj->device, &(mRawSnapshotConfig)); 949e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 959e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 969e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 979e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3RawSnapshotTest::rawProcessCaptureRequest( 989e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_test_obj_t *my_test_obj, int camid) 999e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 1009e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int width, height; 1019e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 1029e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel camera3_device_t *device_handle = my_test_obj->device; 1039e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel width = mRawSnapshotStream->width; 1049e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel height = mRawSnapshotStream->height; 1059e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel rawAllocateBuffers(width, height); 1069e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.frame_number = 0; 1079e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.settings = mMetaDataPtr[1]; 1089e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.input_buffer = NULL; 1099e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.num_output_buffers = 1; 1109e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStreamBuffs.stream = mRawSnapshotStream; 1119e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStreamBuffs.status = 0; 1129e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStreamBuffs.buffer = (const native_handle_t**)&mRawCaptureHandle; 1139e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStreamBuffs.release_fence = -1; 1149e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStreamBuffs.acquire_fence = -1; 1159e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.output_buffers = &(mRawSnapshotStreamBuffs); 11604e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGD("Calling HAL3APP capture request for camid : %d", camid); 1179e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel device_handle->ops->process_capture_request(my_test_obj->device, &(mRequest)); 1189e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 1199e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 1209e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3RawSnapshotTest::rawProcessCaptureRequestRepeat( 1219e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_lib_test *my_hal3test_obj, int camid) 1229e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 1239e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_test_obj_t *my_test_obj = &(my_hal3test_obj->test_obj); 1249e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\nRaw Requested Capture : %d and Received Capture : %d", 1259e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequestedCapture, fcount_captured); 1269e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (mRequestedCapture == fcount_captured) { 1279e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\n Raw Snapshot is running successfully Ending test"); 1289e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel fflush(stdout); 1299e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("\n Capture Done , Recieved Frame : %d", fcount_captured); 1309e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel rawTestEnd(my_hal3test_obj, camid); 1319e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 1329e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel else { 1339e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel camera3_device_t *device_handle = my_test_obj->device; 1349e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel (mRequest.frame_number)++; 1359e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.settings = mMetaDataPtr[1]; 1369e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.input_buffer = NULL; 1379e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.num_output_buffers = 1; 1389e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStreamBuffs.stream = mRawSnapshotStream; 1399e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStreamBuffs.buffer = (const native_handle_t**)&mRawCaptureHandle; 1409e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStreamBuffs.release_fence = -1; 1419e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawSnapshotStreamBuffs.acquire_fence = -1; 1429e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRequest.output_buffers = &(mRawSnapshotStreamBuffs); 1439e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("Calling HAL3APP repeat capture request repeat "); 1449e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel device_handle->ops->process_capture_request(my_test_obj->device, &(mRequest)); 1459e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 1469e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 1479e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 1489e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3RawSnapshotTest::rawTestEnd( 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 /* Free the Allocated ION Memory */ 1589e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel ioctl(mRawCaptureMemInfo.ion_fd, ION_IOC_FREE, &mRawCaptureMemInfo.ion_handle); 1599e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel close(mRawCaptureMemInfo.ion_fd); 1609e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawCaptureMemInfo.ion_fd = -1; 1619e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel /* Close the Thread */ 1629e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel memset(&msg, 0, sizeof(buffer_thread_msg_t)); 1639e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel msg.stop_thread = 1; 1649e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel write(pfd[1], &msg, sizeof(buffer_thread_msg_t)); 1659e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 1669e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 1679e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 1689e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3RawSnapshotTest::rawAllocateBuffers(int width, int height) 1699e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 1709e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel mRawCaptureHandle = allocateBuffers(width, height, &mRawCaptureMemInfo); 1719e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 1729e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 1739e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelbool QCameraHAL3RawSnapshotTest::rawProcessThreadCreate(int testcase_id, 1749e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel void *(*hal3_thread_ops)(void *)) 1759e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 1769e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int32_t ret = 0; 1779e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel buffer_thread_t thread; 1789e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_attr_t attr; 1799e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (pipe(pfd) < 0) { 18004e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGE("%s:Test:%d Error in creating the pipe", __func__, testcase_id); 1819e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 1829e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_attr_init(&attr); 1839e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 1849e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_init(&thread.mutex, NULL); 1859e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_cond_init(&thread.cond, NULL); 1869e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel thread.is_thread_started = 0; 1879e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel thread.readfd = pfd[0]; 1889e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel thread.writefd = pfd[1]; 1899e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel thread.data_obj = this; 1909e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel ret = pthread_create(&thread.td, &attr, hal3_thread_ops, &thread ); 1919e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_setname_np(thread.td, "TestApp_Thread"); 1929e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (ret < 0) { 1939e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGE("Failed to create status thread"); 1949e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel return 0; 1959e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 1969e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_lock(&thread.mutex); 1979e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel while(thread.is_thread_started == 0) { 1989e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_cond_wait(&thread.cond, &thread.mutex); 1999e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2009e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_unlock(&thread.mutex); 2019e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel return 1; 2029e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 2039e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 2049e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid QCameraHAL3RawSnapshotTest::captureRequestRepeat( 2059e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_lib_test *my_hal3test_obj, int camid, int testcase) 2069e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 20704e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel if(my_hal3test_obj == NULL) { 20804e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel LOGD("camid :%d and testcase : %d handle is NULL", camid, testcase); 20904e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel } 2109e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 2119e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 2129e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudelvoid * rawProcessBuffers(void *data) { 2139e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel buffer_thread_t *thread = (buffer_thread_t*)data; 2149e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int32_t readfd, writefd; 2159e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_camera_lib_test *hal3_test_handle; 2169e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_lock(&thread->mutex); 2179e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel thread->is_thread_started = 1; 2189e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel readfd = thread->readfd; 2199e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel writefd = thread->writefd; 2209e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel QCameraHAL3RawSnapshotTest *obj; 2219e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel obj = (QCameraHAL3RawSnapshotTest *)thread->data_obj; 2229e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_cond_signal(&thread->cond); 2239e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_unlock(&thread->mutex); 2249e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel struct pollfd pollfds; 2259e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int32_t num_of_fds = 1; 2269e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel bool rthread_exit = 0; 2279e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel int32_t ready = 0; 2289e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pollfds.fd = readfd; 2299e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pollfds.events = POLLIN | POLLPRI; 2309e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel while(!rthread_exit) { 2319e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel ready = poll(&pollfds, (nfds_t)num_of_fds, -1); 2329e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (ready > 0) { 2339e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (pollfds.revents & (POLLIN | POLLPRI)) { 2349e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel ssize_t nread = 0; 2359e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel buffer_thread_msg_t msg; 2369e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel nread = read(pollfds.fd, &msg, sizeof(buffer_thread_msg_t)); 2379e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (nread < 0) { 2389e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGE("Unable to read the message"); 2399e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2409e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (msg.stop_thread) { 2419e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel break; 2429e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2439e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel hal3_test_handle = RawSnapshot_CamObj_handle; 2449e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel obj->rawProcessCaptureRequestRepeat(hal3_test_handle, 0); 2459e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2469e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2479e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel else { 2489e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGE("Unable to poll exiting the thread"); 2499e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel break; 2509e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2519e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 2529e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("Sensor thread is exiting"); 2539e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel close(readfd); 2549e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel close(writefd); 2559e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_mutex_unlock(&TestAppLock); 2569e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel pthread_exit(0); 2579e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel return NULL; 2589e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 2599e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 2609e74aae7331f3227542b3e646a0dd658d3467a31Thierry StrudelQCameraHAL3RawSnapshotTest::~QCameraHAL3RawSnapshotTest() 2619e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel{ 2629e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 2639e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 2649e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel 2659e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel} 266