166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Redistribution and use in source and binary forms, with or without 466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * modification, are permitted provided that the following conditions are 566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * met: 666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * * Redistributions of source code must retain the above copyright 766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * notice, this list of conditions and the following disclaimer. 866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * * Redistributions in binary form must reproduce the above 966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * copyright notice, this list of conditions and the following 1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * disclaimer in the documentation and/or other materials provided 1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * with the distribution. 1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * * Neither the name of The Linux Foundation nor the names of its 1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * contributors may be used to endorse or promote products derived 1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * from this software without specific prior written permission. 1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */ 2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// To remove 3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <cutils/properties.h> 3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies 3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdlib.h> 3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <pthread.h> 3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// JPEG dependencies 3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg_dbg.h" 3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg_interface.h" 4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg.h" 4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg_mpo.h" 4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic pthread_mutex_t g_intf_lock = PTHREAD_MUTEX_INITIALIZER; 4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic mm_jpeg_obj* g_jpeg_obj = NULL; 4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic pthread_mutex_t g_handler_lock = PTHREAD_MUTEX_INITIALIZER; 4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic uint16_t g_handler_history_count = 0; /* history count for handler */ 4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvolatile uint32_t gKpiDebugLevel = 0; 4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_util_generate_handler: 5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Arguments: 5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @index: client index 5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Return: 5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * handle value 5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Description: 5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * utility function to generate handler 6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/ 6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t mm_jpeg_util_generate_handler(uint8_t index) 6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t handler = 0; 6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&g_handler_lock); 6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin g_handler_history_count++; 6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 == g_handler_history_count) { 6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin g_handler_history_count++; 6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin handler = g_handler_history_count; 7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin handler = (handler<<8) | index; 7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_handler_lock); 7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return handler; 7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_util_get_index_by_handler: 7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Arguments: 7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @handler: handle value 8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Return: 8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * client index 8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Description: 8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * get client index 8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/ 8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint8_t mm_jpeg_util_get_index_by_handler(uint32_t handler) 8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return (handler & 0x000000ff); 9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_intf_start_job: 9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Arguments: 9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @client_hdl: client handle 9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @job: jpeg job object 9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @jobId: job id 9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Return: 10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 success, failure otherwise 10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Description: 10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * start the jpeg job 10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/ 10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpeg_intf_start_job(mm_jpeg_job_t* job, uint32_t* job_id) 10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == job || 11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL == job_id) { 11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("invalid parameters for job or jobId"); 11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&g_intf_lock); 11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == g_jpeg_obj) { 11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* mm_jpeg obj not exists, return error */ 12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("mm_jpeg is not opened yet"); 12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_jpeg_start_job(g_jpeg_obj, job, job_id); 12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_intf_create_session: 13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Arguments: 13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @client_hdl: client handle 13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @p_params: encode parameters 13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @p_session_id: session id 13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Return: 13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 success, failure otherwise 13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Description: 14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Create new jpeg session 14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/ 14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpeg_intf_create_session(uint32_t client_hdl, 14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_jpeg_encode_params_t *p_params, 14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t *p_session_id) 14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 == client_hdl || NULL == p_params || NULL == p_session_id) { 15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("invalid client_hdl or jobId"); 15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&g_intf_lock); 15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == g_jpeg_obj) { 15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* mm_jpeg obj not exists, return error */ 15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("mm_jpeg is not opened yet"); 15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_jpeg_create_session(g_jpeg_obj, client_hdl, p_params, p_session_id); 16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_intf_destroy_session: 16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Arguments: 17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @session_id: session id 17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Return: 17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 success, failure otherwise 17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Description: 17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Destroy jpeg session 17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/ 17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpeg_intf_destroy_session(uint32_t session_id) 18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 == session_id) { 18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("invalid client_hdl or jobId"); 18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&g_intf_lock); 18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == g_jpeg_obj) { 19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* mm_jpeg obj not exists, return error */ 19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("mm_jpeg is not opened yet"); 19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_jpeg_destroy_session_by_id(g_jpeg_obj, session_id); 19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_intf_abort_job: 20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Arguments: 20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @jobId: job id 20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Return: 20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 success, failure otherwise 20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Description: 21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Abort the jpeg job 21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/ 21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpeg_intf_abort_job(uint32_t job_id) 21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 == job_id) { 21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("invalid jobId"); 21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&g_intf_lock); 22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == g_jpeg_obj) { 22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* mm_jpeg obj not exists, return error */ 22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("mm_jpeg is not opened yet"); 22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_jpeg_abort_job(g_jpeg_obj, job_id); 23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_intf_close: 23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Arguments: 23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @client_hdl: client handle 23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Return: 24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 success, failure otherwise 24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Description: 24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Close the jpeg job 24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/ 24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpeg_intf_close(uint32_t client_hdl) 24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 == client_hdl) { 25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("invalid client_hdl"); 25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&g_intf_lock); 25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == g_jpeg_obj) { 25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* mm_jpeg obj not exists, return error */ 25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("mm_jpeg is not opened yet"); 26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_jpeg_close(g_jpeg_obj, client_hdl); 26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin g_jpeg_obj->num_clients--; 26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(0 == rc) { 26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 == g_jpeg_obj->num_clients) { 26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* No client, close jpeg internally */ 26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_jpeg_deinit(g_jpeg_obj); 27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(g_jpeg_obj); 27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin g_jpeg_obj = NULL; 27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_intf_compose_mpo: 28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Arguments: 28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @mpo_info : MPO Information 28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Return: 28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 success, failure otherwise 28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Description: 28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Compose MPO image from jpeg images 28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/ 29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpeg_intf_compose_mpo(mm_jpeg_mpo_info_t *mpo_info) 29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mpo_info) { 29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid input"); 29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mpo_info->num_of_images > MM_JPEG_MAX_MPO_IMAGES) { 30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Num of images exceeds max supported images in MPO"); 30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Call MPo composition 30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_jpeg_mpo_compose(mpo_info); 30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** jpeg_open: 31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Arguments: 31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ops: ops table pointer 31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @mpo_ops: mpo ops table ptr 31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @picture_size: Max available dim 31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @jpeg_metadata: Jpeg meta data 31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Return: 31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 failure, success otherwise 31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Description: 32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Open a jpeg client. Jpeg meta data will be cached 32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * but memory manegement has to be done by the cient. 32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/ 32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t jpeg_open(mm_jpeg_ops_t *ops, mm_jpeg_mpo_ops_t *mpo_ops, 32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_dimension picture_size, 32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_jpeg_metadata_t *jpeg_metadata) 32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t clnt_hdl = 0; 33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_jpeg_obj* jpeg_obj = NULL; 33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char prop[PROPERTY_VALUE_MAX]; 33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.kpi.debug", prop, "0"); 33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gKpiDebugLevel = atoi(prop); 33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&g_intf_lock); 33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* first time open */ 33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(NULL == g_jpeg_obj) { 34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_obj = (mm_jpeg_obj *)malloc(sizeof(mm_jpeg_obj)); 34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(NULL == jpeg_obj) { 34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem"); 34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return clnt_hdl; 34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* initialize jpeg obj */ 34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(jpeg_obj, 0, sizeof(mm_jpeg_obj)); 34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* by default reuse reproc source buffer if available */ 35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mpo_ops == NULL) { 35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_obj->reuse_reproc_buffer = 1; 35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_obj->reuse_reproc_buffer = 0; 35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("reuse_reproc_buffer %d ", 35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_obj->reuse_reproc_buffer); 35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* used for work buf calculation */ 36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_obj->max_pic_w = picture_size.w; 36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_obj->max_pic_h = picture_size.h; 36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*Cache OTP Data for the session*/ 36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != jpeg_metadata) { 36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_obj->jpeg_metadata = jpeg_metadata; 36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_jpeg_init(jpeg_obj); 36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(0 != rc) { 37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("mm_jpeg_init err = %d", rc); 37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(jpeg_obj); 37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return clnt_hdl; 37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* remember in global variable */ 37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin g_jpeg_obj = jpeg_obj; 37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* open new client */ 38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin clnt_hdl = mm_jpeg_new_client(g_jpeg_obj); 38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (clnt_hdl > 0) { 38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* valid client */ 38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != ops) { 38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* fill in ops tbl if ptr not NULL */ 38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ops->start_job = mm_jpeg_intf_start_job; 38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ops->abort_job = mm_jpeg_intf_abort_job; 38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ops->create_session = mm_jpeg_intf_create_session; 38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ops->destroy_session = mm_jpeg_intf_destroy_session; 39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ops->close = mm_jpeg_intf_close; 39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != mpo_ops) { 39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mpo_ops->compose_mpo = mm_jpeg_intf_compose_mpo; 39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* failed new client */ 39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("mm_jpeg_new_client failed"); 39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 == g_jpeg_obj->num_clients) { 40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* no client, close jpeg */ 40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_jpeg_deinit(g_jpeg_obj); 40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(g_jpeg_obj); 40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin g_jpeg_obj = NULL; 40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&g_intf_lock); 40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return clnt_hdl; 40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 410