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