/** jpegdec_open: * * Arguments: * @ops: ops table pointer * * Return: * 0 failure, success otherwise * * Description: * Open a jpeg client * **/ uint32_t jpegdec_open(mm_jpegdec_ops_t *ops) { int32_t rc = 0; uint32_t clnt_hdl = 0; mm_jpeg_obj* jpeg_obj = NULL; pthread_mutex_lock(&g_dec_intf_lock); /* first time open */ if(NULL == g_jpegdec_obj) { jpeg_obj = (mm_jpeg_obj *)malloc(sizeof(mm_jpeg_obj)); if(NULL == jpeg_obj) { LOGE("no mem"); pthread_mutex_unlock(&g_dec_intf_lock); return clnt_hdl; } /* initialize jpeg obj */ memset(jpeg_obj, 0, sizeof(mm_jpeg_obj)); rc = mm_jpegdec_init(jpeg_obj); if(0 != rc) { LOGE("mm_jpeg_init err = %d", rc); free(jpeg_obj); pthread_mutex_unlock(&g_dec_intf_lock); return clnt_hdl; } /* remember in global variable */ g_jpegdec_obj = jpeg_obj; } /* open new client */ clnt_hdl = mm_jpeg_new_client(g_jpegdec_obj); if (clnt_hdl > 0) { /* valid client */ if (NULL != ops) { /* fill in ops tbl if ptr not NULL */ ops->start_job = mm_jpegdec_intf_start_job; ops->abort_job = mm_jpegdec_intf_abort_job; ops->create_session = mm_jpegdec_intf_create_session; ops->destroy_session = mm_jpegdec_intf_destroy_session; ops->close = mm_jpegdec_intf_close; } } else { /* failed new client */ LOGE("mm_jpeg_new_client failed"); if (0 == g_jpegdec_obj->num_clients) { /* no client, close jpeg */ mm_jpegdec_deinit(g_jpegdec_obj); free(g_jpegdec_obj); g_jpegdec_obj = NULL; } } pthread_mutex_unlock(&g_dec_intf_lock); return clnt_hdl; }
/** jpeg_open: * * Arguments: * @ops: ops table pointer * @mpo_ops: mpo ops table ptr * @picture_size: Max available dim * @calibration_data: Static calibration data * * Return: * 0 failure, success otherwise * * Description: * Open a jpeg client. Calibration data will be cached * but memory manegement has to be done by the cient. * **/ uint32_t jpeg_open(mm_jpeg_ops_t *ops, mm_jpeg_mpo_ops_t *mpo_ops, mm_dimension picture_size, cam_related_system_calibration_data_t *calibration_data) { int32_t rc = 0; uint32_t clnt_hdl = 0; mm_jpeg_obj* jpeg_obj = NULL; char prop[PROPERTY_VALUE_MAX]; uint32_t globalLogLevel = 0; memset(prop, 0x0, sizeof(prop)); property_get("persist.camera.hal.debug", prop, "0"); int val = atoi(prop); if (0 <= val) { gMmJpegIntfLogLevel = (uint32_t)val; } property_get("persist.camera.global.debug", prop, "0"); val = atoi(prop); if (0 <= val) { globalLogLevel = (uint32_t)val; } property_get("persist.camera.kpi.debug", prop, "0"); gKpiDebugLevel = atoi(prop); /* Highest log level among hal.logs and global.logs is selected */ if (gMmJpegIntfLogLevel < globalLogLevel) gMmJpegIntfLogLevel = globalLogLevel; if (gMmJpegIntfLogLevel < MINIMUM_JPEG_LOG_LEVEL) gMmJpegIntfLogLevel = MINIMUM_JPEG_LOG_LEVEL; pthread_mutex_lock(&g_intf_lock); /* first time open */ if(NULL == g_jpeg_obj) { jpeg_obj = (mm_jpeg_obj *)malloc(sizeof(mm_jpeg_obj)); if(NULL == jpeg_obj) { CDBG_ERROR("%s:%d] no mem", __func__, __LINE__); pthread_mutex_unlock(&g_intf_lock); return clnt_hdl; } /* initialize jpeg obj */ memset(jpeg_obj, 0, sizeof(mm_jpeg_obj)); /* by default reuse reproc source buffer if available */ if (mpo_ops == NULL) { jpeg_obj->reuse_reproc_buffer = 1; } else { jpeg_obj->reuse_reproc_buffer = 0; } CDBG_HIGH("%s, %d] reuse_reproc_buffer %d ", __func__, __LINE__, jpeg_obj->reuse_reproc_buffer); /* used for work buf calculation */ jpeg_obj->max_pic_w = picture_size.w; jpeg_obj->max_pic_h = picture_size.h; /*Cache OTP Data for the session*/ if (NULL != calibration_data) { jpeg_obj->calibration_data = calibration_data; } rc = mm_jpeg_init(jpeg_obj); if(0 != rc) { CDBG_ERROR("%s:%d] mm_jpeg_init err = %d", __func__, __LINE__, rc); free(jpeg_obj); pthread_mutex_unlock(&g_intf_lock); return clnt_hdl; } /* remember in global variable */ g_jpeg_obj = jpeg_obj; } /* open new client */ clnt_hdl = mm_jpeg_new_client(g_jpeg_obj); if (clnt_hdl > 0) { /* valid client */ if (NULL != ops) { /* fill in ops tbl if ptr not NULL */ ops->start_job = mm_jpeg_intf_start_job; ops->abort_job = mm_jpeg_intf_abort_job; ops->create_session = mm_jpeg_intf_create_session; ops->destroy_session = mm_jpeg_intf_destroy_session; ops->close = mm_jpeg_intf_close; } if (NULL != mpo_ops) { mpo_ops->compose_mpo = mm_jpeg_intf_compose_mpo; } } else { /* failed new client */ CDBG_ERROR("%s:%d] mm_jpeg_new_client failed", __func__, __LINE__); if (0 == g_jpeg_obj->num_clients) { /* no client, close jpeg */ mm_jpeg_deinit(g_jpeg_obj); free(g_jpeg_obj); g_jpeg_obj = NULL; } } pthread_mutex_unlock(&g_intf_lock); return clnt_hdl; }
/** jpeg_open: * * Arguments: * @ops: ops table pointer * * Return: * 0 failure, success otherwise * * Description: * Open a jpeg client * **/ uint32_t jpeg_open(mm_jpeg_ops_t *ops, mm_dimension picture_size) { int32_t rc = 0; uint32_t clnt_hdl = 0; mm_jpeg_obj* jpeg_obj = NULL; pthread_mutex_lock(&g_intf_lock); /* first time open */ if(NULL == g_jpeg_obj) { jpeg_obj = (mm_jpeg_obj *)malloc(sizeof(mm_jpeg_obj)); if(NULL == jpeg_obj) { CDBG_ERROR("%s:%d] no mem", __func__, __LINE__); pthread_mutex_unlock(&g_intf_lock); return clnt_hdl; } /* initialize jpeg obj */ memset(jpeg_obj, 0, sizeof(mm_jpeg_obj)); /* used for work buf calculation */ jpeg_obj->max_pic_w = picture_size.w; jpeg_obj->max_pic_h = picture_size.h; rc = mm_jpeg_init(jpeg_obj); if(0 != rc) { CDBG_ERROR("%s:%d] mm_jpeg_init err = %d", __func__, __LINE__, rc); free(jpeg_obj); pthread_mutex_unlock(&g_intf_lock); return clnt_hdl; } /* remember in global variable */ g_jpeg_obj = jpeg_obj; } /* open new client */ clnt_hdl = mm_jpeg_new_client(g_jpeg_obj); if (clnt_hdl > 0) { /* valid client */ if (NULL != ops) { /* fill in ops tbl if ptr not NULL */ ops->start_job = mm_jpeg_intf_start_job; ops->abort_job = mm_jpeg_intf_abort_job; ops->create_session = mm_jpeg_intf_create_session; ops->destroy_session = mm_jpeg_intf_destroy_session; ops->close = mm_jpeg_intf_close; } } else { /* failed new client */ CDBG_ERROR("%s:%d] mm_jpeg_new_client failed", __func__, __LINE__); if (0 == g_jpeg_obj->num_clients) { /* no client, close jpeg */ mm_jpeg_deinit(g_jpeg_obj); free(g_jpeg_obj); g_jpeg_obj = NULL; } } pthread_mutex_unlock(&g_intf_lock); return clnt_hdl; }