13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Redistribution and use in source and binary forms, with or without 43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * modification, are permitted provided that the following conditions are 53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * met: 63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * * Redistributions of source code must retain the above copyright 73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * notice, this list of conditions and the following disclaimer. 83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * * Redistributions in binary form must reproduce the above 93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * copyright notice, this list of conditions and the following 103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * disclaimer in the documentation and/or other materials provided 113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * with the distribution. 123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * * Neither the name of The Linux Foundation nor the names of its 133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * contributors may be used to endorse or promote products derived 143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * from this software without specific prior written permission. 153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */ 293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// To remove 313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <cutils/properties.h> 323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies 343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdlib.h> 353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <pthread.h> 363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// JPEG dependencies 383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_jpeg_dbg.h" 393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_jpeg_interface.h" 403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_jpeg.h" 413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_jpeg_mpo.h" 423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic pthread_mutex_t g_intf_lock = PTHREAD_MUTEX_INITIALIZER; 443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic mm_jpeg_obj* g_jpeg_obj = NULL; 453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic pthread_mutex_t g_handler_lock = PTHREAD_MUTEX_INITIALIZER; 473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic uint16_t g_handler_history_count = 0; /* history count for handler */ 483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvolatile uint32_t gKpiDebugLevel = 0; 493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_util_generate_handler: 513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Arguments: 533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @index: client index 543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return: 563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * handle value 573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: 593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * utility function to generate handler 603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/ 623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeluint32_t mm_jpeg_util_generate_handler(uint8_t index) 633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t handler = 0; 653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&g_handler_lock); 663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel g_handler_history_count++; 673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (0 == g_handler_history_count) { 683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel g_handler_history_count++; 693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel handler = g_handler_history_count; 713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel handler = (handler<<8) | index; 723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_handler_lock); 733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return handler; 743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_util_get_index_by_handler: 773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Arguments: 793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @handler: handle value 803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return: 823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * client index 833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: 853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * get client index 863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/ 883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeluint8_t mm_jpeg_util_get_index_by_handler(uint32_t handler) 893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return (handler & 0x000000ff); 913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_intf_start_job: 943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Arguments: 963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @client_hdl: client handle 973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @job: jpeg job object 983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @jobId: job id 993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return: 1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 0 success, failure otherwise 1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: 1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * start the jpeg job 1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/ 1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int32_t mm_jpeg_intf_start_job(mm_jpeg_job_t* job, uint32_t* job_id) 1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = -1; 1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == job || 1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel NULL == job_id) { 1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("invalid parameters for job or jobId"); 1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&g_intf_lock); 1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == g_jpeg_obj) { 1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* mm_jpeg obj not exists, return error */ 1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mm_jpeg is not opened yet"); 1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_jpeg_start_job(g_jpeg_obj, job, job_id); 1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_intf_create_session: 1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Arguments: 1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @client_hdl: client handle 1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @p_params: encode parameters 1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @p_session_id: session id 1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return: 1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 0 success, failure otherwise 1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: 1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Create new jpeg session 1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/ 1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int32_t mm_jpeg_intf_create_session(uint32_t client_hdl, 1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_jpeg_encode_params_t *p_params, 1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t *p_session_id) 1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = -1; 1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (0 == client_hdl || NULL == p_params || NULL == p_session_id) { 1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("invalid client_hdl or jobId"); 1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&g_intf_lock); 1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == g_jpeg_obj) { 1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* mm_jpeg obj not exists, return error */ 1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mm_jpeg is not opened yet"); 1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_jpeg_create_session(g_jpeg_obj, client_hdl, p_params, p_session_id); 1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_intf_destroy_session: 1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Arguments: 1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @session_id: session id 1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return: 1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 0 success, failure otherwise 1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: 1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Destroy jpeg session 1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/ 1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int32_t mm_jpeg_intf_destroy_session(uint32_t session_id) 1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = -1; 1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (0 == session_id) { 1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("invalid client_hdl or jobId"); 1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&g_intf_lock); 1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == g_jpeg_obj) { 1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* mm_jpeg obj not exists, return error */ 1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mm_jpeg is not opened yet"); 1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_jpeg_destroy_session_by_id(g_jpeg_obj, session_id); 1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_intf_abort_job: 2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Arguments: 2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @jobId: job id 2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return: 2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 0 success, failure otherwise 2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: 2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Abort the jpeg job 2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/ 2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int32_t mm_jpeg_intf_abort_job(uint32_t job_id) 2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = -1; 2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (0 == job_id) { 2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("invalid jobId"); 2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&g_intf_lock); 2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == g_jpeg_obj) { 2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* mm_jpeg obj not exists, return error */ 2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mm_jpeg is not opened yet"); 2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_jpeg_abort_job(g_jpeg_obj, job_id); 2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_intf_close: 2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Arguments: 2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @client_hdl: client handle 2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return: 2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 0 success, failure otherwise 2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: 2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Close the jpeg job 2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/ 2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int32_t mm_jpeg_intf_close(uint32_t client_hdl) 2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = -1; 2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (0 == client_hdl) { 2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("invalid client_hdl"); 2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&g_intf_lock); 2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == g_jpeg_obj) { 2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* mm_jpeg obj not exists, return error */ 2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mm_jpeg is not opened yet"); 2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_jpeg_close(g_jpeg_obj, client_hdl); 2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel g_jpeg_obj->num_clients--; 2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(0 == rc) { 2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (0 == g_jpeg_obj->num_clients) { 2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* No client, close jpeg internally */ 2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_jpeg_deinit(g_jpeg_obj); 2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(g_jpeg_obj); 2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel g_jpeg_obj = NULL; 2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_intf_compose_mpo: 2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Arguments: 2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @mpo_info : MPO Information 2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return: 2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 0 success, failure otherwise 2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: 2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Compose MPO image from jpeg images 2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/ 2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int32_t mm_jpeg_intf_compose_mpo(mm_jpeg_mpo_info_t *mpo_info) 2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = -1; 2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mpo_info) { 2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid input"); 2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mpo_info->num_of_images > MM_JPEG_MAX_MPO_IMAGES) { 3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Num of images exceeds max supported images in MPO"); 3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Call MPo composition 3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_jpeg_mpo_compose(mpo_info); 3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** jpeg_open: 3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Arguments: 3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @ops: ops table pointer 3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @mpo_ops: mpo ops table ptr 3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @picture_size: Max available dim 3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @jpeg_metadata: Jpeg meta data 3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return: 3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 0 failure, success otherwise 3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: 3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Open a jpeg client. Jpeg meta data will be cached 3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * but memory manegement has to be done by the cient. 3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/ 3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeluint32_t jpeg_open(mm_jpeg_ops_t *ops, mm_jpeg_mpo_ops_t *mpo_ops, 3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_dimension picture_size, 3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_jpeg_metadata_t *jpeg_metadata) 3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = 0; 3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t clnt_hdl = 0; 3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_jpeg_obj* jpeg_obj = NULL; 3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char prop[PROPERTY_VALUE_MAX]; 3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.kpi.debug", prop, "0"); 3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel gKpiDebugLevel = atoi(prop); 3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&g_intf_lock); 3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* first time open */ 3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(NULL == g_jpeg_obj) { 3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpeg_obj = (mm_jpeg_obj *)malloc(sizeof(mm_jpeg_obj)); 3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(NULL == jpeg_obj) { 3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("no mem"); 3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return clnt_hdl; 3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* initialize jpeg obj */ 3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(jpeg_obj, 0, sizeof(mm_jpeg_obj)); 3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* by default reuse reproc source buffer if available */ 3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mpo_ops == NULL) { 3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpeg_obj->reuse_reproc_buffer = 1; 3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpeg_obj->reuse_reproc_buffer = 0; 3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("reuse_reproc_buffer %d ", 3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpeg_obj->reuse_reproc_buffer); 3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* used for work buf calculation */ 3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpeg_obj->max_pic_w = picture_size.w; 3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpeg_obj->max_pic_h = picture_size.h; 3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /*Cache OTP Data for the session*/ 3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != jpeg_metadata) { 3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpeg_obj->jpeg_metadata = jpeg_metadata; 3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_jpeg_init(jpeg_obj); 3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(0 != rc) { 3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mm_jpeg_init err = %d", rc); 3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(jpeg_obj); 3723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return clnt_hdl; 3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* remember in global variable */ 3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel g_jpeg_obj = jpeg_obj; 3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* open new client */ 3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel clnt_hdl = mm_jpeg_new_client(g_jpeg_obj); 3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (clnt_hdl > 0) { 3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* valid client */ 3843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != ops) { 3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* fill in ops tbl if ptr not NULL */ 3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ops->start_job = mm_jpeg_intf_start_job; 3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ops->abort_job = mm_jpeg_intf_abort_job; 3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ops->create_session = mm_jpeg_intf_create_session; 3893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ops->destroy_session = mm_jpeg_intf_destroy_session; 3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ops->close = mm_jpeg_intf_close; 3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != mpo_ops) { 3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mpo_ops->compose_mpo = mm_jpeg_intf_compose_mpo; 3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* failed new client */ 3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mm_jpeg_new_client failed"); 3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (0 == g_jpeg_obj->num_clients) { 4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* no client, close jpeg */ 4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_jpeg_deinit(g_jpeg_obj); 4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(g_jpeg_obj); 4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel g_jpeg_obj = NULL; 4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&g_intf_lock); 4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return clnt_hdl; 4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 410