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