• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "QCameraHAL3RawSnapshotTest.h"
31 #include "QCameraHAL3MainTestContext.h"
32 
33 namespace qcamera {
34 hal3_camera_lib_test *RawSnapshot_CamObj_handle;
35 extern int fcount_captured;
36 extern pthread_mutex_t TestAppLock;
37 
QCameraHAL3RawSnapshotTest(int req_cap)38 QCameraHAL3RawSnapshotTest::QCameraHAL3RawSnapshotTest(int req_cap) :
39     QCameraHAL3Test(0),
40     mRawCaptureHandle(NULL),
41     mRawSnapshotStream(NULL),
42     mRequestedCapture(req_cap)
43 {
44 
45 }
46 
initTest(hal3_camera_lib_test * handle,int testcase,int camid,int w,int h)47 void QCameraHAL3RawSnapshotTest::initTest(hal3_camera_lib_test *handle,
48         int testcase, int camid, int w, int h)
49 {
50     RawSnapshot_CamObj_handle = handle;
51     LOGD("\n Raw buffer thread created for testcase : %d", testcase);
52     configureRawSnapshotStream(&(handle->test_obj), camid, w, h);
53     constructDefaultRequest(&(handle->test_obj), 0);
54     LOGD("\n Raw Snapshot Default stream setting read");
55     rawProcessThreadCreate(MENU_START_RAW_CAPTURE,
56             rawProcessBuffers);
57     mRequest.frame_number = 0;
58     LOGD("\nRaw  Snapshot stream configured");
59     rawProcessCaptureRequest(&(handle->test_obj), 0);
60     LOGD("\nRaw  Snapshot Process Capture Request Sent");
61 }
62 
constructDefaultRequest(hal3_camera_test_obj_t * my_test_obj,int camid)63 void QCameraHAL3RawSnapshotTest::constructDefaultRequest(
64         hal3_camera_test_obj_t *my_test_obj, int camid)
65 {
66     camera3_device_t *device_handle = my_test_obj->device;
67     LOGD("Camera ID : %d",camid);
68     mMetaDataPtr[0] = device_handle->ops->construct_default_request_settings(
69             my_test_obj->device, CAMERA3_TEMPLATE_PREVIEW);
70     mMetaDataPtr[1] = device_handle->ops->construct_default_request_settings(
71             my_test_obj->device, CAMERA3_TEMPLATE_STILL_CAPTURE);
72 }
73 
configureRawSnapshotStream(hal3_camera_test_obj_t * my_test_obj,int camid,int w,int h)74 void QCameraHAL3RawSnapshotTest::configureRawSnapshotStream(hal3_camera_test_obj_t *my_test_obj,
75                                     int camid, int w, int h)
76 {
77     camera3_device_t *device_handle = my_test_obj->device;
78     LOGD(" configureSnapshotStream testcase dim :%d  X %d", w, h);
79     mPreviewStream = new camera3_stream_t;
80     mRawSnapshotStream = new camera3_stream_t;
81 
82     memset(mPreviewStream, 0, sizeof(camera3_stream_t));
83     memset(mRawSnapshotStream, 0, sizeof(camera3_stream_t));
84 
85     mPreviewStream = initStream(CAMERA3_STREAM_OUTPUT, camid, PREVIEW_WIDTH, PREVIEW_HEIGHT, 0,
86             HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, HAL3_DATASPACE_UNKNOWN);
87     mRawSnapshotStream = initStream(CAMERA3_STREAM_OUTPUT, camid, RAWSNAPSHOT_CAPTURE_WIDTH,
88             RAWSNAPSHOT_CAPTURE_HEIGHT, 0, HAL_PIXEL_FORMAT_RAW16, HAL3_DATASPACE_ARBITRARY);
89     mRawSnapshotConfig = configureStream(CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE, 2);
90 
91     mRawSnapshotConfig.streams[0] = mPreviewStream;
92     mRawSnapshotConfig.streams[1] = mRawSnapshotStream;
93     device_handle->ops->configure_streams(my_test_obj->device, &(mRawSnapshotConfig));
94 }
95 
96 
rawProcessCaptureRequest(hal3_camera_test_obj_t * my_test_obj,int camid)97 void QCameraHAL3RawSnapshotTest::rawProcessCaptureRequest(
98         hal3_camera_test_obj_t *my_test_obj, int camid)
99 {
100     int width, height;
101 
102     camera3_device_t *device_handle = my_test_obj->device;
103     width = mRawSnapshotStream->width;
104     height = mRawSnapshotStream->height;
105     rawAllocateBuffers(width, height);
106     mRequest.frame_number = 0;
107     mRequest.settings = mMetaDataPtr[1];
108     mRequest.input_buffer = NULL;
109     mRequest.num_output_buffers = 1;
110     mRawSnapshotStreamBuffs.stream = mRawSnapshotStream;
111     mRawSnapshotStreamBuffs.status = 0;
112     mRawSnapshotStreamBuffs.buffer = (const native_handle_t**)&mRawCaptureHandle;
113     mRawSnapshotStreamBuffs.release_fence = -1;
114     mRawSnapshotStreamBuffs.acquire_fence = -1;
115     mRequest.output_buffers = &(mRawSnapshotStreamBuffs);
116     LOGD("Calling HAL3APP capture request for camid : %d", camid);
117     device_handle->ops->process_capture_request(my_test_obj->device, &(mRequest));
118 }
119 
rawProcessCaptureRequestRepeat(hal3_camera_lib_test * my_hal3test_obj,int camid)120 void QCameraHAL3RawSnapshotTest::rawProcessCaptureRequestRepeat(
121         hal3_camera_lib_test *my_hal3test_obj, int camid)
122 {
123     hal3_camera_test_obj_t *my_test_obj = &(my_hal3test_obj->test_obj);
124     LOGD("\nRaw Requested Capture : %d and Received Capture : %d",
125             mRequestedCapture, fcount_captured);
126     if (mRequestedCapture == fcount_captured) {
127         LOGD("\n Raw Snapshot is running successfully Ending test");
128         fflush(stdout);
129         LOGD("\n Capture Done , Recieved Frame : %d", fcount_captured);
130         rawTestEnd(my_hal3test_obj, camid);
131     }
132     else {
133         camera3_device_t *device_handle = my_test_obj->device;
134         (mRequest.frame_number)++;
135         mRequest.settings = mMetaDataPtr[1];
136         mRequest.input_buffer = NULL;
137         mRequest.num_output_buffers = 1;
138         mRawSnapshotStreamBuffs.stream = mRawSnapshotStream;
139         mRawSnapshotStreamBuffs.buffer = (const native_handle_t**)&mRawCaptureHandle;
140         mRawSnapshotStreamBuffs.release_fence = -1;
141         mRawSnapshotStreamBuffs.acquire_fence = -1;
142         mRequest.output_buffers = &(mRawSnapshotStreamBuffs);
143         LOGD("Calling HAL3APP repeat capture request repeat ");
144         device_handle->ops->process_capture_request(my_test_obj->device, &(mRequest));
145     }
146 }
147 
rawTestEnd(hal3_camera_lib_test * my_hal3test_obj,int camid)148 void QCameraHAL3RawSnapshotTest::rawTestEnd(
149         hal3_camera_lib_test *my_hal3test_obj, int camid)
150 {
151     buffer_thread_msg_t msg;
152     extern pthread_mutex_t gCamLock;
153     hal3_camera_test_obj_t *my_test_obj = &(my_hal3test_obj->test_obj);
154     camera3_device_t *device_handle = my_test_obj->device;
155     device_handle->ops->flush(my_test_obj->device);
156     LOGD("%s Closing Camera %d", __func__, camid);
157     /* Free the Allocated ION Memory */
158     ioctl(mRawCaptureMemInfo.ion_fd, ION_IOC_FREE, &mRawCaptureMemInfo.ion_handle);
159     close(mRawCaptureMemInfo.ion_fd);
160     mRawCaptureMemInfo.ion_fd = -1;
161     /* Close the Thread */
162     memset(&msg, 0, sizeof(buffer_thread_msg_t));
163     msg.stop_thread = 1;
164     write(pfd[1], &msg, sizeof(buffer_thread_msg_t));
165 }
166 
167 
rawAllocateBuffers(int width,int height)168 void QCameraHAL3RawSnapshotTest::rawAllocateBuffers(int width, int height)
169 {
170     mRawCaptureHandle = allocateBuffers(width, height, &mRawCaptureMemInfo);
171 }
172 
rawProcessThreadCreate(int testcase_id,void * (* hal3_thread_ops)(void *))173 bool QCameraHAL3RawSnapshotTest::rawProcessThreadCreate(int testcase_id,
174         void *(*hal3_thread_ops)(void *))
175 {
176     int32_t ret = 0;
177     buffer_thread_t thread;
178     pthread_attr_t attr;
179     if (pipe(pfd) < 0) {
180         LOGE("%s:Test:%d Error in creating the pipe", __func__, testcase_id);
181     }
182     pthread_attr_init(&attr);
183     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
184     pthread_mutex_init(&thread.mutex, NULL);
185     pthread_cond_init(&thread.cond, NULL);
186     thread.is_thread_started = 0;
187     thread.readfd = pfd[0];
188     thread.writefd = pfd[1];
189     thread.data_obj = this;
190     ret = pthread_create(&thread.td, &attr, hal3_thread_ops, &thread );
191     pthread_setname_np(thread.td, "TestApp_Thread");
192     if (ret < 0) {
193         LOGE("Failed to create status thread");
194         return 0;
195     }
196     pthread_mutex_lock(&thread.mutex);
197     while(thread.is_thread_started == 0) {
198         pthread_cond_wait(&thread.cond, &thread.mutex);
199     }
200     pthread_mutex_unlock(&thread.mutex);
201     return 1;
202 }
203 
captureRequestRepeat(hal3_camera_lib_test * my_hal3test_obj,int camid,int testcase)204 void QCameraHAL3RawSnapshotTest::captureRequestRepeat(
205         hal3_camera_lib_test *my_hal3test_obj, int camid, int testcase)
206 {
207     if(my_hal3test_obj == NULL) {
208         LOGD("camid :%d and testcase : %d handle is NULL", camid, testcase);
209     }
210 }
211 
rawProcessBuffers(void * data)212 void * rawProcessBuffers(void *data) {
213     buffer_thread_t *thread = (buffer_thread_t*)data;
214     int32_t readfd, writefd;
215     hal3_camera_lib_test *hal3_test_handle;
216     pthread_mutex_lock(&thread->mutex);
217     thread->is_thread_started = 1;
218     readfd = thread->readfd;
219     writefd = thread->writefd;
220     QCameraHAL3RawSnapshotTest *obj;
221     obj = (QCameraHAL3RawSnapshotTest *)thread->data_obj;
222     pthread_cond_signal(&thread->cond);
223     pthread_mutex_unlock(&thread->mutex);
224     struct pollfd pollfds;
225     int32_t num_of_fds = 1;
226     bool rthread_exit = 0;
227     int32_t ready = 0;
228     pollfds.fd = readfd;
229     pollfds.events = POLLIN | POLLPRI;
230     while(!rthread_exit) {
231         ready = poll(&pollfds, (nfds_t)num_of_fds, -1);
232         if (ready > 0) {
233             if (pollfds.revents & (POLLIN | POLLPRI)) {
234                 ssize_t nread = 0;
235                 buffer_thread_msg_t msg;
236                 nread = read(pollfds.fd, &msg, sizeof(buffer_thread_msg_t));
237                 if (nread < 0) {
238                     LOGE("Unable to read the message");
239                 }
240                 if (msg.stop_thread) {
241                     break;
242                 }
243                 hal3_test_handle = RawSnapshot_CamObj_handle;
244                 obj->rawProcessCaptureRequestRepeat(hal3_test_handle, 0);
245             }
246         }
247         else {
248             LOGE("Unable to poll exiting the thread");
249             break;
250         }
251     }
252     LOGD("Sensor thread is exiting");
253     close(readfd);
254     close(writefd);
255     pthread_mutex_unlock(&TestAppLock);
256     pthread_exit(0);
257     return NULL;
258 }
259 
~QCameraHAL3RawSnapshotTest()260 QCameraHAL3RawSnapshotTest::~QCameraHAL3RawSnapshotTest()
261 {
262 
263 }
264 
265 }
266