Home | History | Annotate | Download | only in util
      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 // Camera dependencies
     31 #include <stdlib.h>
     32 #include <string.h>
     33 #include <pthread.h>
     34 
     35 #include "QCameraTrace.h"
     36 
     37 #define CAMSCOPE_MEMSTORE_SIZE 0x00100000 // 1MB
     38 
     39 volatile uint32_t kpi_camscope_flags = 0;
     40 volatile uint32_t kpi_camscope_frame_count = 0;
     41 
     42 static const char * camscope_filenames[CAMSCOPE_SECTION_SIZE] = {
     43     "/data/misc/camera/camscope_mmcamera.bin",
     44     "/data/misc/camera/camscope_hal.bin",
     45     "/data/misc/camera/camscope_jpeg.bin"
     46 };
     47 
     48 static FILE * camscope_fd[CAMSCOPE_SECTION_SIZE];
     49 static uint32_t camscope_num_bytes_stored[CAMSCOPE_SECTION_SIZE];
     50 static char * camscope_memstore[CAMSCOPE_SECTION_SIZE];
     51 static pthread_mutex_t camscope_mutex[CAMSCOPE_SECTION_SIZE];
     52 
     53 /* camscope_init:
     54  *
     55  *  @camscope_section: camscope section where this function is occurring
     56  *
     57  *  Initializes the CameraScope tool functionality
     58  *
     59  *  Return: N/A
     60  */
     61 void camscope_init(camscope_section_type camscope_section) {
     62     pthread_mutex_init(&(camscope_mutex[camscope_section]), NULL);
     63     if (camscope_fd[camscope_section] == NULL) {
     64         if(camscope_memstore[camscope_section] == NULL) {
     65             camscope_memstore[camscope_section] =
     66                 (char *)malloc(CAMSCOPE_MEMSTORE_SIZE);
     67             if (camscope_memstore[camscope_section] == NULL) {
     68               CLOGE(CAM_NO_MODULE, "Failed to allocate camscope memstore"
     69                     "with size %d\n", CAMSCOPE_MEMSTORE_SIZE);
     70             }
     71         }
     72         camscope_fd[camscope_section] =
     73             fopen(camscope_filenames[camscope_section], "ab");
     74     }
     75 }
     76 
     77 /* camscope_flush:
     78  *
     79  *  @camscope_section: camscope section where this function is occurring
     80  *
     81  *  Flushes the camscope memstore to the file system
     82  *
     83  *  Return: N/A
     84  */
     85 static void camscope_flush(camscope_section_type camscope_section) {
     86     if (camscope_fd[camscope_section] != NULL &&
     87         camscope_memstore[camscope_section] != NULL) {
     88         fwrite(camscope_memstore[camscope_section], sizeof(char),
     89                camscope_num_bytes_stored[camscope_section],
     90                camscope_fd[camscope_section]);
     91         camscope_num_bytes_stored[camscope_section] = 0;
     92     }
     93 }
     94 
     95 /* camscope_destroy:
     96  *
     97  *  @camscope_section: camscope section where this function is occurring
     98  *
     99  *  Flushes any remaining data to the file system and cleans up CameraScope
    100  *
    101  *  Return: N/A
    102  */
    103 void camscope_destroy(camscope_section_type camscope_section) {
    104     if (camscope_fd[camscope_section] != NULL) {
    105         pthread_mutex_lock(&(camscope_mutex[camscope_section]));
    106         if(camscope_memstore[camscope_section] != NULL) {
    107             camscope_flush(camscope_section);
    108             free(camscope_memstore[camscope_section]);
    109             camscope_memstore[camscope_section] = NULL;
    110         }
    111         fclose(camscope_fd[camscope_section]);
    112         camscope_fd[camscope_section] = NULL;
    113         pthread_mutex_unlock(&(camscope_mutex[camscope_section]));
    114     }
    115     pthread_mutex_destroy(&(camscope_mutex[camscope_section]));
    116 }
    117 
    118 /* camscope_reserve:
    119  *
    120  *  @camscope_section:     camscope section where this function is occurring
    121  *  @num_bytes_to_reserve: number in bytes to reserve on the memstore
    122  *
    123  *  Reserves a number of bytes on the memstore flushing to the
    124  *  file system if remaining space is insufficient
    125  *
    126  *  Return: number of bytes successfully reserved on the memstore
    127  */
    128 uint32_t camscope_reserve(camscope_section_type camscope_section,
    129                                  uint32_t num_bytes_to_reserve) {
    130     uint32_t bytes_reserved = 0;
    131     if (camscope_fd[camscope_section] != NULL &&
    132         num_bytes_to_reserve <= CAMSCOPE_MEMSTORE_SIZE) {
    133         int32_t size = CAMSCOPE_MEMSTORE_SIZE -
    134                camscope_num_bytes_stored[camscope_section] -
    135                num_bytes_to_reserve;
    136         if (size < 0) {
    137             camscope_flush(camscope_section);
    138         }
    139         bytes_reserved = num_bytes_to_reserve;
    140     }
    141     return bytes_reserved;
    142 }
    143 
    144 /* camscope_store_data:
    145  *
    146  *  @camscope_section: camscope section where this function is occurring
    147  *  @data:             data to be stored
    148  *  @size:             size of data to be stored
    149  *
    150  *  Store the data to the memstore and calculate remaining space
    151  *
    152  *  Return: N/A
    153  */
    154 void camscope_store_data(camscope_section_type camscope_section,
    155                        void* data, uint32_t size) {
    156     if(camscope_memstore[camscope_section] != NULL) {
    157         memcpy(camscope_memstore[camscope_section] +
    158                camscope_num_bytes_stored[camscope_section], (char*)data, size);
    159         camscope_num_bytes_stored[camscope_section] += size;
    160     }
    161 }
    162 
    163 /* camscope_mutex_lock:
    164  *
    165  *  @camscope_section: camscope section where this function is occurring
    166  *
    167  *  Lock the camscope mutex lock for the given camscope section
    168  *
    169  *  Return: N/A
    170  */
    171 void camscope_mutex_lock(camscope_section_type camscope_section) {
    172     pthread_mutex_lock(&(camscope_mutex[camscope_section]));
    173 }
    174 
    175 /* camscope_mutex_unlock:
    176  *
    177  *  @camscope_section: camscope section where this function is occurring
    178  *
    179  *  Unlock the camscope mutex lock for the given camscope section
    180  *
    181  *  Return: N/A
    182  */
    183 void camscope_mutex_unlock(camscope_section_type camscope_section) {
    184     pthread_mutex_unlock(&(camscope_mutex[camscope_section]));
    185 }
    186