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