blob: 7e46a5dec6757c3b9b96ae774b03cb3919fa583f [file] [log] [blame]
/* Copyright (c) 2016, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
// Camera dependencies
#include "QCameraTrace.h"
#define CAMSCOPE_MEMSTORE_SIZE 0x00100000 // 1MB
volatile uint32_t kpi_camscope_flags = 0;
volatile uint32_t kpi_camscope_frame_count = 0;
static const char * camscope_filenames[CAMSCOPE_SECTION_SIZE] = {
"/data/misc/camera/camscope_mmcamera.bin",
"/data/misc/camera/camscope_hal.bin",
"/data/misc/camera/camscope_jpeg.bin"
};
static FILE * camscope_fd[CAMSCOPE_SECTION_SIZE];
static uint32_t camscope_num_bytes_stored[CAMSCOPE_SECTION_SIZE];
static char * camscope_memstore[CAMSCOPE_SECTION_SIZE];
static pthread_mutex_t camscope_mutex[CAMSCOPE_SECTION_SIZE];
/* camscope_init:
*
* @camscope_section: camscope section where this function is occurring
*
* Initializes the CameraScope tool functionality
*
* Return: N/A
*/
void camscope_init(camscope_section_type camscope_section) {
pthread_mutex_init(&(camscope_mutex[camscope_section]), NULL);
if (camscope_fd[camscope_section] == NULL) {
if(camscope_memstore[camscope_section] == NULL) {
camscope_memstore[camscope_section] =
(char *)malloc(CAMSCOPE_MEMSTORE_SIZE);
if (camscope_memstore[camscope_section] == NULL) {
CLOGE(CAM_NO_MODULE, "Failed to allocate camscope memstore"
"with size %d\n", CAMSCOPE_MEMSTORE_SIZE);
}
}
camscope_fd[camscope_section] =
fopen(camscope_filenames[camscope_section], "ab");
}
}
/* camscope_flush:
*
* @camscope_section: camscope section where this function is occurring
*
* Flushes the camscope memstore to the file system
*
* Return: N/A
*/
static void camscope_flush(camscope_section_type camscope_section) {
if (camscope_fd[camscope_section] != NULL &&
camscope_memstore[camscope_section] != NULL) {
fwrite(camscope_memstore[camscope_section], sizeof(char),
camscope_num_bytes_stored[camscope_section],
camscope_fd[camscope_section]);
camscope_num_bytes_stored[camscope_section] = 0;
}
}
/* camscope_destroy:
*
* @camscope_section: camscope section where this function is occurring
*
* Flushes any remaining data to the file system and cleans up CameraScope
*
* Return: N/A
*/
void camscope_destroy(camscope_section_type camscope_section) {
if (camscope_fd[camscope_section] != NULL) {
pthread_mutex_lock(&(camscope_mutex[camscope_section]));
if(camscope_memstore[camscope_section] != NULL) {
camscope_flush(camscope_section);
free(camscope_memstore[camscope_section]);
camscope_memstore[camscope_section] = NULL;
}
fclose(camscope_fd[camscope_section]);
camscope_fd[camscope_section] = NULL;
pthread_mutex_unlock(&(camscope_mutex[camscope_section]));
}
pthread_mutex_destroy(&(camscope_mutex[camscope_section]));
}
/* camscope_reserve:
*
* @camscope_section: camscope section where this function is occurring
* @num_bytes_to_reserve: number in bytes to reserve on the memstore
*
* Reserves a number of bytes on the memstore flushing to the
* file system if remaining space is insufficient
*
* Return: number of bytes successfully reserved on the memstore
*/
uint32_t camscope_reserve(camscope_section_type camscope_section,
uint32_t num_bytes_to_reserve) {
uint32_t bytes_reserved = 0;
if (camscope_fd[camscope_section] != NULL &&
num_bytes_to_reserve <= CAMSCOPE_MEMSTORE_SIZE) {
int32_t size = CAMSCOPE_MEMSTORE_SIZE -
camscope_num_bytes_stored[camscope_section] -
num_bytes_to_reserve;
if (size < 0) {
camscope_flush(camscope_section);
}
bytes_reserved = num_bytes_to_reserve;
}
return bytes_reserved;
}
/* camscope_store_data:
*
* @camscope_section: camscope section where this function is occurring
* @data: data to be stored
* @size: size of data to be stored
*
* Store the data to the memstore and calculate remaining space
*
* Return: N/A
*/
void camscope_store_data(camscope_section_type camscope_section,
void* data, uint32_t size) {
if(camscope_memstore[camscope_section] != NULL) {
memcpy(camscope_memstore[camscope_section] +
camscope_num_bytes_stored[camscope_section], (char*)data, size);
camscope_num_bytes_stored[camscope_section] += size;
}
}
/* camscope_mutex_lock:
*
* @camscope_section: camscope section where this function is occurring
*
* Lock the camscope mutex lock for the given camscope section
*
* Return: N/A
*/
void camscope_mutex_lock(camscope_section_type camscope_section) {
pthread_mutex_lock(&(camscope_mutex[camscope_section]));
}
/* camscope_mutex_unlock:
*
* @camscope_section: camscope section where this function is occurring
*
* Unlock the camscope mutex lock for the given camscope section
*
* Return: N/A
*/
void camscope_mutex_unlock(camscope_section_type camscope_section) {
pthread_mutex_unlock(&(camscope_mutex[camscope_section]));
}