Home | History | Annotate | Download | only in test
      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 
     38 QCameraHAL3RawSnapshotTest::QCameraHAL3RawSnapshotTest(int req_cap) :
     39     QCameraHAL3Test(0),
     40     mRawCaptureHandle(NULL),
     41     mRawSnapshotStream(NULL),
     42     mRequestedCapture(req_cap)
     43 {
     44 
     45 }
     46 
     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 
     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 
     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 
     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 
    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 
    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 
    168 void QCameraHAL3RawSnapshotTest::rawAllocateBuffers(int width, int height)
    169 {
    170     mRawCaptureHandle = allocateBuffers(width, height, &mRawCaptureMemInfo);
    171 }
    172 
    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 
    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 
    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 
    260 QCameraHAL3RawSnapshotTest::~QCameraHAL3RawSnapshotTest()
    261 {
    262 
    263 }
    264 
    265 }
    266