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 "QCameraHAL3VideoTest.h"
31#include "QCameraHAL3MainTestContext.h"
32
33namespace qcamera {
34
35extern hal3_camera_lib_test *CamObj_handle;
36buffer_thread_t Video_thread;
37int video_req_sent;
38extern pthread_cond_t mRequestAppCond;
39
40extern int test_case_end;
41extern bool thread_exit;
42extern std::list<uint32_t> VideoQueue;
43int video_buffer_allocated;
44extern pthread_mutex_t TestAppLock, mCaptureRequestLock;
45extern int snapshot_buffer;
46
47
48QCameraHAL3VideoTest::QCameraHAL3VideoTest(int camid) :
49    QCameraHAL3Test(0),
50    mVideoHandle(NULL),
51    mCaptureHandle(NULL),
52    mVideoStream(NULL),
53    mCameraId(camid),
54    binning_mode(0)
55{
56
57}
58
59void QCameraHAL3VideoTest::initTest(hal3_camera_lib_test *handle,
60        int testcase, int camid, int w, int h)
61{
62    int i;
63    CamObj_handle = handle; thread_exit = 0;
64    test_case_end = 0;
65    LOGD("\n buffer thread created for testcase %d  %d and %d ",testcase, w, h);
66    configureVideoStream(&(handle->test_obj), camid, w, h);
67    LOGD("\n video stream configured");
68    constructDefaultRequest(&(handle->test_obj), camid);
69    LOGD("pipeline_depth is %d", mPipelineDepthVideo);
70    mVideoHandle = new native_handle_t *[mPipelineDepthVideo];
71    for (i = 0; i < mPipelineDepthVideo; i++) {
72        mVideoHandle[i] = new native_handle_t;
73    }
74
75    for (i = 0, video_req_sent = 1; i < mPipelineDepthVideo; i++, video_req_sent++) {
76        vidoeAllocateBuffers(width, height, i);
77        VideoQueue.push_back(i);
78    }
79    LOGD(" Request Number is : %d ",mRequest.frame_number);
80    mRequest.frame_number = 0;
81    videoProcessThreadCreate(handle);
82}
83
84
85void QCameraHAL3VideoTest::snapshotCaptureRequest(hal3_camera_lib_test *handle,
86        int testcase, int camid, int w, int h)
87{
88    LOGD("Requested Capture Sizes for testcase:%d are :%d  X %d",testcase, w, h);
89    captureRequestRepeat(handle, camid, MENU_START_CAPTURE);
90    pthread_mutex_unlock(&mCaptureRequestLock);
91}
92
93
94void QCameraHAL3VideoTest::configureVideoStream(hal3_camera_test_obj_t *my_test_obj,
95        int camid, int w, int h)
96{
97    camera3_device_t *device_handle = my_test_obj->device;
98    mVideoStream = new camera3_stream_t;
99    memset(mVideoStream, 0, sizeof(camera3_stream_t));
100    mVideoStream = initStream(CAMERA3_STREAM_OUTPUT, camid, w, h, FLAGS_VIDEO_ENCODER,
101            HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, HAL3_DATASPACE_UNKNOWN);
102    mVideoConfig = configureStream(CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, 1);
103    mVideoConfig.streams[0] = mVideoStream;
104
105    device_handle->ops->configure_streams(my_test_obj->device, &(mVideoConfig));
106    mPipelineDepthVideo = mVideoConfig.streams[0]->max_buffers;
107    video_buffer_allocated = mPipelineDepthVideo;
108}
109
110void QCameraHAL3VideoTest::constructDefaultRequest(
111        hal3_camera_test_obj_t *my_test_obj, int camid)
112{
113    camera3_device_t *device_handle = my_test_obj->device;
114    LOGD("Camera ID : %d",camid);
115    mMetaDataPtr[0] = device_handle->ops->construct_default_request_settings(
116            my_test_obj->device, CAMERA3_TEMPLATE_VIDEO_RECORD);
117    mMetaDataPtr[1] = device_handle->ops->construct_default_request_settings(my_test_obj->device,
118            CAMERA3_TEMPLATE_STILL_CAPTURE);
119}
120
121
122
123void QCameraHAL3VideoTest::captureRequestRepeat(
124        hal3_camera_lib_test *my_hal3test_obj, int camid, int testcase)
125{
126    int num1, num2;
127    int binning_mode_changed;
128    hal3_camera_test_obj_t *my_test_obj = &(my_hal3test_obj->test_obj);
129    camera3_device_t *device_handle = my_test_obj->device;
130    if (testcase == MENU_START_VIDEO) {
131        if (VideoQueue.empty()) {
132            LOGE("no Video buffer for CamID : %d", camid);
133        }
134        else {
135            if (test_case_end == 0) {
136                LOGD(" Request Number is : %d ", mRequest.frame_number);
137                pthread_mutex_lock(&mCaptureRequestLock);
138                num2 = VideoQueue.front();
139                VideoQueue.pop_front();
140                num1 = mRequest.frame_number;
141                binning_mode_changed = get_binning_mode(binning_mode);
142                if (num1 < 1) {
143                    (mRequest).settings = mMetaDataPtr[0];
144                }
145                else if(binning_mode_changed == 1) {
146                    hal3app_video_settings = mMetaDataPtr[0];
147                    hal3app_video_settings.update(QCAMERA3_BINNING_CORRECTION_MODE,
148                            &binning_mode, 1);
149                    (mRequest).settings = hal3app_video_settings.release();
150                }
151                else {
152                    (mRequest).settings = NULL;
153                }
154                (mRequest).input_buffer = NULL;
155                (mRequest).num_output_buffers = 1;
156                mVideoStreamBuffs.stream = mVideoStream;
157                mVideoStreamBuffs.status = 0;
158                mVideoStreamBuffs.buffer =
159                        (const native_handle_t**)&mVideoHandle[num2];
160                mVideoStreamBuffs.release_fence = -1;
161                mVideoStreamBuffs.acquire_fence = -1;
162                (mRequest).output_buffers = &(mVideoStreamBuffs);
163                LOGD("Calling HAL3APP repeat capture request %d and %d and free buffer :%d "
164                        , num1, num2, VideoQueue.size());
165                device_handle->ops->process_capture_request(my_test_obj->device, &(mRequest));
166                        (mRequest.frame_number)++;
167                pthread_mutex_unlock(&mCaptureRequestLock);
168            }
169        }
170    }
171    else {
172        snapshot_buffer = mRequest.frame_number;
173        (mRequest).settings = mMetaDataPtr[1];
174        mSnapshotStreamBuffs = hal3appGetStreamBuffs(mSnapshotStream);
175        mSnapshotStreamBuffs.buffer = (const native_handle_t**)&mCaptureHandle;
176        mRequest = hal3appGetRequestSettings(&mSnapshotStreamBuffs, 1);
177        LOGD("Calling snap HAL3APP repeat capture request repeat %d  ", snapshot_buffer);
178        device_handle->ops->process_capture_request(my_test_obj->device, &(mRequest));
179        (mRequest.frame_number)++;
180    }
181}
182
183void QCameraHAL3VideoTest::videoTestEnd(
184                    hal3_camera_lib_test *my_hal3test_obj, int camid)
185{
186    test_case_end = 1;
187    hal3_camera_test_obj_t *my_test_obj = &(my_hal3test_obj->test_obj);
188    camera3_device_t *device_handle = my_test_obj->device;
189    device_handle->ops->flush(my_test_obj->device);
190    LOGD("%s Closing Camera %d", __func__, camid);
191    ioctl(mVideoMeminfo.ion_fd, ION_IOC_FREE, &mVideoMeminfo.ion_handle);
192    close(mVideoMeminfo.ion_fd);
193    mVideoMeminfo.ion_fd = -1;
194    LOGD("%s Closing thread", __func__);
195    thread_exit = 1;
196}
197
198void QCameraHAL3VideoTest::vidoeAllocateBuffers(int height, int width, int num)
199{
200    mVideoHandle[num] = allocateBuffers(width, height, &mVideoMeminfo);
201}
202
203void QCameraHAL3VideoTest::snapshotAllocateBuffers(int width, int height)
204{
205    mCaptureHandle = allocateBuffers(width, height, &mCaptureMemInfo);
206}
207
208int QCameraHAL3VideoTest::get_binning_mode(int32_t binning_mode)
209{
210    static int prev_binning;
211    if(binning_mode == prev_binning)
212        return 0;
213    else {
214        ALOGE("setting binning mode in video:%d", binning_mode);
215        prev_binning = binning_mode;
216        return 1;
217    }
218}
219
220bool QCameraHAL3VideoTest::videoProcessThreadCreate(
221                    hal3_camera_lib_test *handle) {
222    if(handle == NULL) {
223        LOGD("Camera Hanle is NULL");
224    }
225    processThreadCreate(this, MENU_START_VIDEO);
226    return 1;
227}
228
229QCameraHAL3VideoTest::~QCameraHAL3VideoTest()
230{
231
232}
233
234}
235