1/* Copyright (c) 2016, The Linux Foundation. All rights reserved.
2*
3* Redistribution and use in source and binary forms, with or without
4* modification, are permitted provided that the following conditions are
5* met:
6*     * Redistributions of source code must retain the above copyright
7*       notice, this list of conditions and the following disclaimer.
8*     * Redistributions in binary form must reproduce the above
9*       copyright notice, this list of conditions and the following
10*       disclaimer in the documentation and/or other materials provided
11*       with the distribution.
12*     * Neither the name of The Linux Foundation nor the names of its
13*       contributors may be used to endorse or promote products derived
14*       from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*
28*/
29
30#include "QCameraHAL3PreviewTest.h"
31#include "QCameraHAL3MainTestContext.h"
32
33namespace qcamera {
34extern hal3_camera_lib_test *CamObj_handle;
35int req_sent;
36extern pthread_cond_t mRequestAppCond;
37int test_case_end;
38bool thread_exit;
39extern std::list<uint32_t> PreviewQueue;
40int preview_buffer_allocated;
41extern pthread_mutex_t TestAppLock, mCaptureRequestLock;
42int snapshot_buffer = -1;
43
44
45QCameraHAL3PreviewTest::QCameraHAL3PreviewTest(int camid) :
46    QCameraHAL3Test(0),
47    mPreviewHandle(NULL),
48    mCaptureHandle(NULL),
49    mPreviewStream(NULL),
50    nobuffer(0),
51    mCamId(camid),
52    ir_mode(0),
53    svhdr_mode(0)
54{
55
56}
57
58void QCameraHAL3PreviewTest::initTest(hal3_camera_lib_test *handle,
59                                int testcase, int camid, int w, int h)
60{
61    int i;
62    CamObj_handle = handle; thread_exit = 0; test_case_end = 0;
63    LOGD("\n buffer thread created for testcase %d  %d and %d ",testcase, w, h);
64    configurePreviewStream(&(handle->test_obj) , camid, w, h);
65    LOGD("\n preview stream configured");
66    constructDefaultRequest(&(handle->test_obj), camid);
67    LOGD("Default stream setting read ");
68    printf("\npipeline_depth is %d", mPipelineDepthPreview);
69    mPreviewHandle = new native_handle_t *[mPipelineDepthPreview];
70    for (i = 0; i < mPipelineDepthPreview; i++)
71        mPreviewHandle[i] = new native_handle_t;
72    for (i = 0, req_sent = 1; i < mPipelineDepthPreview; i++, req_sent++) {
73        previewAllocateBuffers(width, height, i);
74        PreviewQueue.push_back(i);
75    }
76    LOGD(" Request Number is preview : %d ",mRequest.frame_number);
77    mRequest.frame_number = 0;
78    previewProcessThreadCreate(handle);
79}
80
81void QCameraHAL3PreviewTest::snapshotCaptureRequest(hal3_camera_lib_test *handle,
82        int testcase, int camid, int w, int h)
83{
84    LOGD("Requested Capture Sizes for testcase:%d are :%d  X %d",testcase, w, h);
85    captureRequestRepeat(handle, camid, MENU_START_CAPTURE);
86    pthread_mutex_unlock(&mCaptureRequestLock);
87}
88
89void QCameraHAL3PreviewTest::configurePreviewStream(hal3_camera_test_obj_t *my_test_obj,
90                                int camid, int w, int h)
91{
92    camera3_device_t *device_handle = my_test_obj->device;
93    mPreviewStream =  new camera3_stream_t;
94    memset(mPreviewStream, 0, sizeof(camera3_stream_t));
95    mPreviewStream = initStream(CAMERA3_STREAM_OUTPUT, camid, w, h, 0,
96            HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, HAL3_DATASPACE_UNKNOWN);
97
98    mPreviewConfig = configureStream(CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, 1);
99    mPreviewConfig.streams[0] = mPreviewStream;
100    device_handle->ops->configure_streams(my_test_obj->device, &(mPreviewConfig));
101    mPipelineDepthPreview = mPreviewConfig.streams[0]->max_buffers;
102    preview_buffer_allocated = mPipelineDepthPreview;
103}
104
105void QCameraHAL3PreviewTest::constructDefaultRequest(
106        hal3_camera_test_obj_t *my_test_obj, int camid)
107{
108    camera3_device_t *device_handle = my_test_obj->device;
109    LOGD("Camera ID : %d",camid);
110    mMetaDataPtr[0]= device_handle->ops->construct_default_request_settings(my_test_obj->device,
111            CAMERA3_TEMPLATE_PREVIEW);
112    mMetaDataPtr[1] = device_handle->ops->construct_default_request_settings(my_test_obj->device,
113            CAMERA3_TEMPLATE_STILL_CAPTURE);
114}
115
116void QCameraHAL3PreviewTest::captureRequestRepeat(
117        hal3_camera_lib_test *my_hal3test_obj, int camid, int testcase)
118{
119    int num1, num2;
120    int ir_mode_changed;
121    int svhdr_mode_changed;
122    int32_t set_svhdr_mode;
123    int32_t set_ir_mode;
124    hal3_camera_test_obj_t *my_test_obj = &(my_hal3test_obj->test_obj);
125    camera3_device_t *device_handle = my_test_obj->device;
126
127    if (testcase == MENU_START_PREVIEW) {
128        if (PreviewQueue.empty()) {
129            LOGE("no preview buffer for CamID : %d", camid);
130        }
131        else {
132            if (test_case_end == 0) {
133                LOGD(" Request Number is preview : %d ",mRequest.frame_number);
134                pthread_mutex_lock(&mCaptureRequestLock);
135                num2 = PreviewQueue.front();
136                PreviewQueue.pop_front();
137                num1 = mRequest.frame_number;
138                ir_mode_changed = get_ir_mode(ir_mode);
139                svhdr_mode_changed = get_svhdr_mode(svhdr_mode);
140                ALOGE("setting IR mode :%d",ir_mode_changed);
141                ALOGE("setting SVHDR mode :%d",svhdr_mode_changed);
142                if (num1 < 1) {
143                    (mRequest).settings = mMetaDataPtr[0];
144                }
145                else if(ir_mode_changed == 1) {
146                    hal3app_preview_settings = mMetaDataPtr[0];
147                    if(ir_mode == 0) {
148                        ALOGE("setting IR mode off");
149                        set_ir_mode = (int32_t)QCAMERA3_IR_MODE_OFF;
150                    }
151                    else {
152                        ALOGE("setting IR mode On");
153                        set_ir_mode = (int32_t)QCAMERA3_IR_MODE_ON;
154                    }
155                    hal3app_preview_settings.update(QCAMERA3_IR_MODE, &set_ir_mode, 1);
156                    (mRequest).settings = hal3app_preview_settings.release();
157                }
158                else if(svhdr_mode_changed == 1) {
159                    hal3app_preview_settings = mMetaDataPtr[0];
160                    if(svhdr_mode == 0) {
161                        ALOGE("setting HDR mode off");
162                        set_svhdr_mode = (int32_t)QCAMERA3_VIDEO_HDR_MODE_OFF;
163                    }
164                    else {
165                        ALOGE("setting HDR mode On");
166                        set_svhdr_mode = (int32_t)QCAMERA3_VIDEO_HDR_MODE_ON;
167                    }
168                    hal3app_preview_settings.update(QCAMERA3_VIDEO_HDR_MODE, &set_svhdr_mode, 1);
169                    (mRequest).settings = hal3app_preview_settings.release();
170                }
171                else {
172                    (mRequest).settings = NULL;
173                }
174                (mRequest).input_buffer = NULL;
175                (mRequest).num_output_buffers = 1;
176                mPreviewStreamBuffs.stream = mPreviewStream;
177                mPreviewStreamBuffs.status = 0;
178                mPreviewStreamBuffs.buffer =
179                        (const native_handle_t**)&mPreviewHandle[num2];
180                mPreviewStreamBuffs.release_fence = -1;
181                mPreviewStreamBuffs.acquire_fence = -1;
182                (mRequest).output_buffers = &(mPreviewStreamBuffs);
183                LOGD("Calling HAL3APP repeat capture request %d and %d and free buffer :%d "
184                        , num1, num2, PreviewQueue.size());
185
186                device_handle->ops->process_capture_request(my_test_obj->device, &(mRequest));
187                (mRequest.frame_number)++;
188                pthread_mutex_unlock(&mCaptureRequestLock);
189            }
190        }
191    }
192    else {
193        snapshot_buffer = mRequest.frame_number;
194        (mRequest).settings = mMetaDataPtr[1];
195        mSnapshotStreamBuffs = hal3appGetStreamBuffs(mSnapshotStream);
196        mSnapshotStreamBuffs.buffer = (const native_handle_t**)&mCaptureHandle;
197        mRequest = hal3appGetRequestSettings(&mSnapshotStreamBuffs, 1);
198        LOGD("Calling snap HAL3APP repeat capture request repeat %d  ", snapshot_buffer);
199        device_handle->ops->process_capture_request(my_test_obj->device, &(mRequest));
200        (mRequest.frame_number)++;
201    }
202}
203
204void QCameraHAL3PreviewTest::previewTestEnd(
205        hal3_camera_lib_test *my_hal3test_obj, int camid)
206{
207    test_case_end = 1;
208    hal3_camera_test_obj_t *my_test_obj = &(my_hal3test_obj->test_obj);
209    camera3_device_t *device_handle = my_test_obj->device;
210    device_handle->ops->flush(my_test_obj->device);
211    LOGD("%s Closing Camera %d", __func__, camid);
212    ioctl(mPreviewMeminfo.ion_fd, ION_IOC_FREE, &mPreviewMeminfo.ion_handle);
213    close(mPreviewMeminfo.ion_fd);
214    mPreviewMeminfo.ion_fd = -1;
215    LOGD("%s Closing thread", __func__);
216    thread_exit = 1;
217}
218
219void QCameraHAL3PreviewTest::previewAllocateBuffers(int width, int height, int num)
220{
221    mPreviewHandle[num] = allocateBuffers(width, height, &mPreviewMeminfo);
222}
223
224void QCameraHAL3PreviewTest::snapshotAllocateBuffers(int width, int height)
225{
226    mCaptureHandle = allocateBuffers(width, height, &mCaptureMemInfo);
227}
228
229bool QCameraHAL3PreviewTest::previewProcessThreadCreate(
230        hal3_camera_lib_test *handle)
231{
232    if(handle == NULL) {
233        LOGD("Camera Hanle is NULL");
234    }
235    processThreadCreate(this, MENU_START_PREVIEW);
236    return 1;
237}
238
239int QCameraHAL3PreviewTest::get_ir_mode(int ir_mode)
240{
241    static int prev_irmode;
242    if(ir_mode == prev_irmode)
243        return 0;
244    else {
245        prev_irmode = ir_mode;
246        return 1;
247    }
248}
249
250int QCameraHAL3PreviewTest::get_svhdr_mode(int hdr_mode)
251{
252    static int prev_hdrmode;
253    if(hdr_mode == prev_hdrmode)
254        return 0;
255    else {
256        prev_hdrmode = hdr_mode;
257        return 1;
258    }
259}
260
261QCameraHAL3PreviewTest::~QCameraHAL3PreviewTest()
262{
263
264}
265
266}
267