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