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// System dependencies
3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <pthread.h>
3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <errno.h>
3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <fcntl.h>
34d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch#include <math.h>
3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define PRCTL_H <SYSTEM_HEADER_PREFIX/prctl.h>
3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include PRCTL_H
3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef LOAD_ADSP_RPC_LIB
3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <dlfcn.h>
4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdlib.h>
4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// JPEG dependencies
4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg_dbg.h"
4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg_interface.h"
4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg.h"
4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg_inlines.h"
4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define ENCODING_MODE_PARALLEL 1
5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define META_KEYFILE QCAMERA_DUMP_FRM_LOCATION"metadata.key"
5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/**
5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * minimal resolution needed for normal mode of ops
5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */
5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define MM_JPEG_MIN_NOM_RESOLUTION 7680000 /*8MP*/
5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef MM_JPEG_USE_PIPELINE
5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#undef MM_JPEG_CONCURRENT_SESSIONS_COUNT
6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define MM_JPEG_CONCURRENT_SESSIONS_COUNT 1
6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_ebd(OMX_HANDLETYPE hComponent,
6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_PTR pAppData,
6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_BUFFERHEADERTYPE* pBuffer);
6666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_fbd(OMX_HANDLETYPE hComponent,
6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_PTR pAppData,
6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_BUFFERHEADERTYPE* pBuffer);
6966f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_event_handler(OMX_HANDLETYPE hComponent,
7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_PTR pAppData,
7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_EVENTTYPE eEvent,
7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_U32 nData1,
7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_U32 nData2,
7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_PTR pEventData);
7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpegenc_destroy_job(mm_jpeg_job_session_t *p_session);
7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic void mm_jpegenc_job_done(mm_jpeg_job_session_t *p_session);
7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_by_dst_ptr(
7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_t* queue, void * dst_ptr);
8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic OMX_ERRORTYPE mm_jpeg_session_configure(mm_jpeg_job_session_t *p_session);
8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
82d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch/** mm_jpeg_get_comp_name:
83d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *
84d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *  Arguments:
85d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *       None
86d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *
87d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *  Return:
88d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *       Encoder component name
89d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *
90d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *  Description:
91d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *       Get the name of omx component to be used for jpeg encoding
92d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *
93d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch **/
94d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetschinline char* mm_jpeg_get_comp_name()
95d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch{
96d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch#ifdef MM_JPEG_USE_PIPELINE
97d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  return "OMX.qcom.image.jpeg.encoder_pipeline";
98d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch#else
99d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  return "OMX.qcom.image.jpeg.encoder";
100d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch#endif
101d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch}
102d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_send_buffers:
10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @data: job session
10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Send the buffers to OMX layer
11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
11566f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_session_send_buffers(void *data)
11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t i = 0;
11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t* p_session = (mm_jpeg_job_session_t *)data;
11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_BUFFER_INFO lbuffer_info;
12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_params_t *p_params = &p_session->params;
12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&lbuffer_info, 0x0, sizeof(QOMX_BUFFER_INFO));
12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_params->num_src_bufs; i++) {
12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Source buffer %d", i);
12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    lbuffer_info.fd = (OMX_U32)p_params->src_main_buf[i].fd;
12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_UseBuffer(p_session->omx_handle, &(p_session->p_in_omx_buf[i]), 0,
12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      &lbuffer_info, p_params->src_main_buf[i].buf_size,
12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_params->src_main_buf[i].buf_vaddr);
13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error %d", ret);
13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_params->num_tmb_bufs; i++) {
13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Source buffer %d", i);
13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    lbuffer_info.fd = (OMX_U32)p_params->src_thumb_buf[i].fd;
13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_UseBuffer(p_session->omx_handle,
14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        &(p_session->p_in_omx_thumb_buf[i]), 2,
14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        &lbuffer_info, p_params->src_thumb_buf[i].buf_size,
14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        p_params->src_thumb_buf[i].buf_vaddr);
14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error %d", ret);
14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_params->num_dst_bufs; i++) {
15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Dest buffer %d", i);
15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_UseBuffer(p_session->omx_handle, &(p_session->p_out_omx_buf[i]),
15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      1, NULL, p_params->dest_buf[i].buf_size,
15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_params->dest_buf[i].buf_vaddr);
15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error");
15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_free_buffers:
16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @data: job session
16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Free the buffers from OMX layer
17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
17566f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_session_free_buffers(void *data)
17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t i = 0;
17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t* p_session = (mm_jpeg_job_session_t *)data;
18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_params_t *p_params = &p_session->params;
18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_params->num_src_bufs; i++) {
18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Source buffer %d", i);
18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_FreeBuffer(p_session->omx_handle, 0, p_session->p_in_omx_buf[i]);
18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error %d", ret);
18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_params->num_tmb_bufs; i++) {
19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Source buffer %d", i);
19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_FreeBuffer(p_session->omx_handle, 2, p_session->p_in_omx_thumb_buf[i]);
19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error %d", ret);
19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_params->num_dst_bufs; i++) {
20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Dest buffer %d", i);
20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_FreeBuffer(p_session->omx_handle, 1, p_session->p_out_omx_buf[i]);
20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error");
20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_change_state:
21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @new_state: new state to be transitioned to
21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_exec: transition function
22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       This method is used for state transition
22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
22866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_session_change_state(mm_jpeg_job_session_t* p_session,
22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_STATETYPE new_state,
23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_transition_func_t p_exec)
23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_STATETYPE current_state;
23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("new_state %d p_exec %p",
23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    new_state, p_exec);
23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_GetState(p_session->omx_handle, &current_state);
24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (current_state == new_state) {
24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return OMX_ErrorNone;
25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->state_change_pending = OMX_TRUE;
25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SendCommand(p_session->omx_handle, OMX_CommandStateSet,
25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    new_state, NULL);
25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error %d", ret);
25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return OMX_ErrorIncorrectStateTransition;
26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((OMX_ErrorNone != p_session->error_flag) &&
26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (OMX_ErrorOverflow != p_session->error_flag)) {
26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error %d", p_session->error_flag);
26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return p_session->error_flag;
26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_exec) {
26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = p_exec(p_session);
27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error %d", ret);
27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      pthread_mutex_unlock(&p_session->lock);
27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_session->state_change_pending) {
27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGL("before wait");
27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_wait(&p_session->cond, &p_session->lock);
27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGL("after wait");
28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_create:
28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error types
29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Create a jpeg encode session
29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
29766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_session_create(mm_jpeg_job_session_t* p_session)
29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = OMX_ErrorNone;
30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_obj *my_obj = (mm_jpeg_obj *) p_session->jpeg_obj;
30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_init(&p_session->lock, NULL);
30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_cond_init(&p_session->cond, NULL);
30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  cirq_reset(&p_session->cb_q);
30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->state_change_pending = OMX_FALSE;
30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->abort_state = MM_JPEG_ABORT_NONE;
30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->error_flag = OMX_ErrorNone;
30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->ebd_count = 0;
30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->fbd_count = 0;
31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->encode_pid = -1;
31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->config = OMX_FALSE;
31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->exif_count_local = 0;
31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->auto_out_buf = OMX_FALSE;
31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->omx_callbacks.EmptyBufferDone = mm_jpeg_ebd;
31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->omx_callbacks.FillBufferDone = mm_jpeg_fbd;
31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->omx_callbacks.EventHandler = mm_jpeg_event_handler;
31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->thumb_from_main = 0;
32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef MM_JPEG_USE_PIPELINE
32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->thumb_from_main = !p_session->params.thumb_from_postview;
32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_GetHandle(&p_session->omx_handle,
325d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      mm_jpeg_get_comp_name(),
32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (void *)p_session,
32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      &p_session->omx_callbacks);
32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != rc) {
32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("OMX_GetHandle failed (%d)", rc);
33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  my_obj->num_sessions++;
33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_destroy:
34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       none
34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Destroy a jpeg encode session
35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_jpeg_session_destroy(mm_jpeg_job_session_t* p_session)
35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = OMX_ErrorNone;
35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_STATETYPE state;
35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_obj *my_obj = (mm_jpeg_obj *) p_session->jpeg_obj;
35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("E");
35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == p_session->omx_handle) {
36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid handle");
36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return;
36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_GetState(p_session->omx_handle, &state);
36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  //Check state before state transition
36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((state == OMX_StateExecuting) || (state == OMX_StatePause)) {
36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mm_jpeg_session_change_state(p_session, OMX_StateIdle, NULL);
36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc) {
37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error");
37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_GetState(p_session->omx_handle, &state);
37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (state == OMX_StateIdle) {
37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mm_jpeg_session_change_state(p_session, OMX_StateLoaded,
37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      mm_jpeg_session_free_buffers);
37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc) {
38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error");
38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3841687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan  /* If current session is the session in progress
3851687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan     set session in progress pointer to null*/
3861687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan  p_session->config = OMX_FALSE;
3871687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan  if (my_obj->p_session_inprogress == p_session) {
3881687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    my_obj->p_session_inprogress = NULL;
3891687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan  }
3901687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan
39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_FreeHandle(p_session->omx_handle);
39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("OMX_FreeHandle failed (%d)", rc);
39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->omx_handle = NULL;
39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_destroy(&p_session->lock);
39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_cond_destroy(&p_session->cond);
39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL != p_session->meta_enc_key) {
40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(p_session->meta_enc_key);
40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->meta_enc_key = NULL;
40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  my_obj->num_sessions--;
40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  // Destroy next session
40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_session->next_session) {
40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_session_destroy(p_session->next_session);
41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Session destroy successful. X");
41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_config_main_buffer_offset:
41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure the buffer offsets
42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
42966f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_session_config_main_buffer_offset(
43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t* p_session)
43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = 0;
43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_INDEXTYPE buffer_index;
43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_YUV_FRAME_INFO frame_info;
43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  size_t totalSize = 0;
43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_params_t *p_params = &p_session->params;
43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_buf_t *p_src_buf =
43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_params->src_main_buf[0];
44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&frame_info, 0x0, sizeof(QOMX_YUV_FRAME_INFO));
44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  frame_info.cbcrStartOffset[0] = p_src_buf->offset.mp[0].len;
44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  frame_info.cbcrStartOffset[1] = p_src_buf->offset.mp[1].len;
44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  frame_info.yOffset = p_src_buf->offset.mp[0].offset;
44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  frame_info.cbcrOffset[0] = p_src_buf->offset.mp[1].offset;
44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  frame_info.cbcrOffset[1] = p_src_buf->offset.mp[2].offset;
44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  totalSize = p_src_buf->buf_size;
44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_GetExtensionIndex(p_session->omx_handle,
45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QOMX_IMAGE_EXT_BUFFER_OFFSET_NAME, &buffer_index);
45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("yOffset = %d, cbcrOffset = (%d %d), totalSize = %zd,"
45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    "cbcrStartOffset = (%d %d)",
45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)frame_info.yOffset,
46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)frame_info.cbcrOffset[0],
46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)frame_info.cbcrOffset[1],
46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    totalSize,
46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)frame_info.cbcrStartOffset[0],
46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)frame_info.cbcrStartOffset[1]);
46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_SetParameter(p_session->omx_handle, buffer_index, &frame_info);
46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_encoding_mode:
47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure the serial or parallel encoding
48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       mode
48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
48766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_encoding_mode(
48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t* p_session)
48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = 0;
49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_INDEXTYPE indextype;
49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_ENCODING_MODE encoding_mode;
49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_GetExtensionIndex(p_session->omx_handle,
49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QOMX_IMAGE_EXT_ENCODING_MODE_NAME, &indextype);
49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ENCODING_MODE_PARALLEL) {
50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    encoding_mode = OMX_Parallel_Encoding;
50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  } else {
50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    encoding_mode = OMX_Serial_Encoding;
50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("encoding mode = %d ",
50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)encoding_mode);
50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_SetParameter(p_session->omx_handle, indextype, &encoding_mode);
50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_get_speed:
51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       ops speed type for jpeg
52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *      Configure normal or high speed jpeg
52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
52866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQOMX_JPEG_SPEED_MODE mm_jpeg_get_speed(
52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t* p_session)
53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_params_t *p_params = &p_session->params;
53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  cam_dimension_t *p_dim = &p_params->main_dim.src_dim;
53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_params->burst_mode ||
53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (MM_JPEG_MIN_NOM_RESOLUTION < (p_dim->width * p_dim->height))) {
53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return QOMX_JPEG_SPEED_MODE_HIGH;
53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return QOMX_JPEG_SPEED_MODE_NORMAL;
53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_speed_mode:
54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *      Configure normal or high speed jpeg
55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
55266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_speed_mode(
55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t* p_session)
55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = 0;
55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_INDEXTYPE indextype;
55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_JPEG_SPEED jpeg_speed;
55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_GetExtensionIndex(p_session->omx_handle,
56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QOMX_IMAGE_EXT_JPEG_SPEED_NAME, &indextype);
56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  jpeg_speed.speedMode = mm_jpeg_get_speed(p_session);
56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGH("speed %d", jpeg_speed.speedMode);
56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_SetParameter(p_session->omx_handle, indextype, &jpeg_speed);
57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_get_mem:
57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_out_buf : jpeg output buffer
58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_jpeg_session: job session
58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *      gets the jpeg output buffer
58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpeg_get_mem(
59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  omx_jpeg_ouput_buf_t *p_out_buf, void* p_jpeg_session)
59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = (mm_jpeg_job_session_t *)p_jpeg_session;
59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_params_t *p_params = NULL;
59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_job_t *p_encode_job = NULL;
59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (!p_session) {
59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Invalid input");
60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_params = &p_session->params;
60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_encode_job = &p_session->encode_job;
60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (!p_params || !p_encode_job || !p_params->get_memory) {
60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Invalid jpeg encode params");
60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_params->get_memory(p_out_buf);
60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_encode_job->ref_count++;
61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_encode_job->alloc_out_buffer = p_out_buf;
61166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("ref_count %d p_out_buf %p",
61266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_encode_job->ref_count, p_out_buf);
61366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
61466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
61566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
61666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_put_mem:
61766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
61866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
61966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_jpeg_session: job session
62066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
62166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
62266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
62366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
62466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
62566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *      releases the jpeg output buffer
62666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
62766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
62866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpeg_put_mem(void* p_jpeg_session)
62966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
63066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
63166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = (mm_jpeg_job_session_t *)p_jpeg_session;
63266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_params_t *p_params = NULL;
63366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_job_t *p_encode_job = NULL;
63466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
63566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (!p_session) {
63666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Invalid input");
63766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
63866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
63966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_params = &p_session->params;
64066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_encode_job = &p_session->encode_job;
64166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
64266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (!p_params->get_memory) {
64366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("get_mem not defined, ignore put mem");
64466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return 0;
64566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
64666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (!p_params || !p_encode_job || !p_params->put_memory) {
64766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Invalid jpeg encode params");
64866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
64966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
65066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((MM_JPEG_ABORT_NONE != p_session->abort_state) &&
65166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_encode_job->ref_count) {
65266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    omx_jpeg_ouput_buf_t *p_out_buf =
65366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      ( omx_jpeg_ouput_buf_t *) p_encode_job->alloc_out_buffer;
65466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_params->put_memory(p_out_buf);
65566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_encode_job->ref_count--;
65666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_encode_job->alloc_out_buffer = NULL;
65766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  } else if (p_encode_job->ref_count) {
65866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_encode_job->ref_count--;
65966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  } else {
66066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGW("Buffer already released %d", p_encode_job->ref_count);
66166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = -1;
66266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
66366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("ref_count %d p_out_buf %p",
66466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_encode_job->ref_count, p_encode_job->alloc_out_buffer);
66566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
66666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
66766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
66866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_mem_ops:
66966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
67066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
67166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
67266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
67366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
67466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
67566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
67666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
67766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure the serial or parallel encoding
67866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       mode
67966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
68066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
68166f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_mem_ops(
68266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t* p_session)
68366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
68466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = 0;
68566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_INDEXTYPE indextype;
68666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_MEM_OPS mem_ops;
68766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_params_t *p_params = &p_session->params;
68866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
68966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_params->get_memory) {
69066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mem_ops.get_memory = mm_jpeg_get_mem;
69166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  } else {
69266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mem_ops.get_memory = NULL;
69366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("HAL get_mem handler undefined");
69466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
69566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
69666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mem_ops.psession = p_session;
69766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_GetExtensionIndex(p_session->omx_handle,
69866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QOMX_IMAGE_EXT_MEM_OPS_NAME, &indextype);
69966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
70066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
70166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
70266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
70366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
70466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_SetParameter(p_session->omx_handle, indextype, &mem_ops);
70566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
70666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
70766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
70866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
70966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
71066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
71166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
71266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_metadata:
71366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
71466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
71566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
71666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
71766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
71866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
71966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
72066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
72166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Pass meta data
72266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
72366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
72466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_metadata(
72566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t* p_session)
72666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
72766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = OMX_ErrorNone;
72866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_INDEXTYPE indexType;
72966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_METADATA lMeta;
73066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
73166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_obj *my_obj = (mm_jpeg_obj *) p_session->jpeg_obj;
73266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
73366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_GetExtensionIndex(p_session->omx_handle,
73466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      QOMX_IMAGE_EXT_METADATA_NAME, &indexType);
73566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
73666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
73766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
73866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
73966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
74066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
74166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  lMeta.metadata = (OMX_U8 *)p_jobparams->p_metadata;
74266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  lMeta.metaPayloadSize = sizeof(*p_jobparams->p_metadata);
74366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  lMeta.mobicat_mask = p_jobparams->mobicat_mask;
74466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  lMeta.static_metadata = (OMX_U8 *)my_obj->jpeg_metadata;
74566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
74666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_SetConfig(p_session->omx_handle, indexType, &lMeta);
74766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
74866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
74966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
75066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
75166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return OMX_ErrorNone;
75266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
75366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
75466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_meta_enc_key:
75566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
75666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
75766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
75866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
75966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
76066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
76166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
76266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
76366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Pass metadata encrypt key
76466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
76566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
76666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_meta_enc_key(
76766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t* p_session)
76866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
76966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = OMX_ErrorNone;
77066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_INDEXTYPE indexType;
77166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_META_ENC_KEY lKey;
77266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
77366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  lKey.metaKey = p_session->meta_enc_key;
77466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  lKey.keyLen = p_session->meta_enc_keylen;
77566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
77666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((!lKey.metaKey) || (!lKey.keyLen)){
77766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Key is invalid");
77866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return OMX_ErrorNone;
77966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
78066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
78166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_GetExtensionIndex(p_session->omx_handle,
78266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      QOMX_IMAGE_EXT_META_ENC_KEY_NAME, &indexType);
78366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
78466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
78566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
78666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
78766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
78866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
78966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_SetConfig(p_session->omx_handle, indexType, &lKey);
79066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc != OMX_ErrorNone) {
79166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Failed");
79266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
79366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
79466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return OMX_ErrorNone;
79566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
79666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
79766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** map_jpeg_format:
79866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
79966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
80066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @color_fmt: color format
80166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
80266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
80366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX color format
80466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
80566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
80666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Map mmjpeg color format to OMX color format
80766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
80866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
80966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint map_jpeg_format(mm_jpeg_color_format color_fmt)
81066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
81166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  switch (color_fmt) {
81266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  case MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2:
81366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return (int)OMX_QCOM_IMG_COLOR_FormatYVU420SemiPlanar;
81466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  case MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V2:
81566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return (int)OMX_COLOR_FormatYUV420SemiPlanar;
81666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  case MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V1:
81766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return (int)OMX_QCOM_IMG_COLOR_FormatYVU422SemiPlanar;
81866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  case MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V1:
81966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return (int)OMX_COLOR_FormatYUV422SemiPlanar;
82066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  case MM_JPEG_COLOR_FORMAT_YCRCBLP_H1V2:
82166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return (int)OMX_QCOM_IMG_COLOR_FormatYVU422SemiPlanar_h1v2;
82266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  case MM_JPEG_COLOR_FORMAT_YCBCRLP_H1V2:
82366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return (int)OMX_QCOM_IMG_COLOR_FormatYUV422SemiPlanar_h1v2;
82466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  case MM_JPEG_COLOR_FORMAT_YCRCBLP_H1V1:
82566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return (int)OMX_QCOM_IMG_COLOR_FormatYVU444SemiPlanar;
82666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  case MM_JPEG_COLOR_FORMAT_YCBCRLP_H1V1:
82766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return (int)OMX_QCOM_IMG_COLOR_FormatYUV444SemiPlanar;
82866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  case MM_JPEG_COLOR_FORMAT_MONOCHROME:
82966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin     return (int)OMX_COLOR_FormatMonochrome;
83066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  default:
83166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGW("invalid format %d", color_fmt);
83266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return (int)OMX_QCOM_IMG_COLOR_FormatYVU420SemiPlanar;
83366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
83466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
83566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
83666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_config_port:
83766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
83866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
83966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
84066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
84166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
84266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
84366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
84466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
84566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure OMX ports
84666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
84766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
84866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_session_config_ports(mm_jpeg_job_session_t* p_session)
84966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
85066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
85166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_params_t *p_params = &p_session->params;
85266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_CONFIG_ROTATIONTYPE rotate;
85366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
85466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_buf_t *p_src_buf =
85566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_params->src_main_buf[0];
85666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
85766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.nPortIndex = 0;
85866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->outputPort.nPortIndex = 1;
85966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputTmbPort.nPortIndex = 2;
86066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
86166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_GetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
86266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_session->inputPort);
86366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
86466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("failed");
86566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
86666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
86766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
86866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_GetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
86966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_session->inputTmbPort);
87066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
87166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("failed");
87266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
87366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
87466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
87566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_GetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
87666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_session->outputPort);
87766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
87866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("failed");
87966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
88066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
88166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
88266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.format.image.nFrameWidth =
88366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (OMX_U32)p_params->main_dim.src_dim.width;
88466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.format.image.nFrameHeight =
88566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (OMX_U32)p_params->main_dim.src_dim.height;
88666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.format.image.nStride =
88766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_src_buf->offset.mp[0].stride;
88866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.format.image.nSliceHeight =
88966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (OMX_U32)p_src_buf->offset.mp[0].scanline;
89066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.format.image.eColorFormat =
89166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    map_jpeg_format(p_params->color_format);
89266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.nBufferSize =
89366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_params->src_main_buf[0/*p_jobparams->src_index*/].buf_size;
89466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.nBufferCountActual = (OMX_U32)p_params->num_src_bufs;
89566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
89666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_session->inputPort);
89766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
89866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("failed");
89966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
90066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
90166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
90266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_session->params.encode_thumbnail) {
90366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_buf_t *p_tmb_buf =
90466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      &p_params->src_thumb_buf[0];
90566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->inputTmbPort.format.image.nFrameWidth =
90666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (OMX_U32)p_params->thumb_dim.src_dim.width;
90766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->inputTmbPort.format.image.nFrameHeight =
90866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (OMX_U32)p_params->thumb_dim.src_dim.height;
90966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->inputTmbPort.format.image.nStride =
91066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_tmb_buf->offset.mp[0].stride;
91166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->inputTmbPort.format.image.nSliceHeight =
91266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (OMX_U32)p_tmb_buf->offset.mp[0].scanline;
91366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->inputTmbPort.format.image.eColorFormat =
91466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      map_jpeg_format(p_params->thumb_color_format);
91566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->inputTmbPort.nBufferSize =
91666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_params->src_thumb_buf[0].buf_size;
91766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->inputTmbPort.nBufferCountActual = (OMX_U32)p_params->num_tmb_bufs;
91866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
91966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_SetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
92066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      &p_session->inputTmbPort);
92166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
92266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
92366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("failed");
92466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
92566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
92666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
92766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Enable thumbnail port
92866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_SendCommand(p_session->omx_handle, OMX_CommandPortEnable,
92966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        p_session->inputTmbPort.nPortIndex, NULL);
93066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
93166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
93266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("failed");
93366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
93466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
93566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  } else {
93666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Disable thumbnail port
93766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_SendCommand(p_session->omx_handle, OMX_CommandPortDisable,
93866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        p_session->inputTmbPort.nPortIndex, NULL);
93966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
94066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
94166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("failed");
94266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
94366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
94466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
94566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
94666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->outputPort.nBufferSize =
94766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_params->dest_buf[0].buf_size;
94866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->outputPort.nBufferCountActual = (OMX_U32)p_params->num_dst_bufs;
94966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
95066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_session->outputPort);
95166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
95266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("failed");
95366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
95466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
95566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
95666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* set rotation */
95766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&rotate, 0, sizeof(rotate));
95866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rotate.nPortIndex = 1;
95966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rotate.nRotation = (OMX_S32)p_params->rotation;
96066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SetConfig(p_session->omx_handle, OMX_IndexConfigCommonRotate,
96166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      &rotate);
96266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
96366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error %d", ret);
96466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
96566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
96666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Set rotation to %d at port_idx = %d",
96766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (int)p_params->rotation, (int)rotate.nPortIndex);
96866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
96966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
97066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
97166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
972d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch/** mm_jpeg_update_thumbnail_crop
973d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *
974d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *  Arguments:
975d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *    @p_thumb_dim: thumbnail dimension
976d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *    @crop_width : flag indicating if width needs to be cropped
977d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *
978d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *  Return:
979d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *    OMX error values
980d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *
981d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *  Description:
982d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *    Updates thumbnail crop aspect ratio based on
983d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *    thumbnail destination aspect ratio.
984d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *
985d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch */
986d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve PfetschOMX_ERRORTYPE mm_jpeg_update_thumbnail_crop(mm_jpeg_dim_t *p_thumb_dim,
987d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  uint8_t crop_width)
988d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch{
989d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  OMX_ERRORTYPE ret = OMX_ErrorNone;
990d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  int32_t cropped_width = 0, cropped_height = 0;
991d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
992d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  if (crop_width) {
993d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    // Keep height constant
994d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    cropped_height = p_thumb_dim->crop.height;
995d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    cropped_width = floor((cropped_height * p_thumb_dim->dst_dim.width) /
996d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      p_thumb_dim->dst_dim.height);
997d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    if (cropped_width % 2) {
998d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      cropped_width -= 1;
999d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    }
1000d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  } else {
1001d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    // Keep width constant
1002d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    cropped_width = p_thumb_dim->crop.width;
1003d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    cropped_height = floor((cropped_width * p_thumb_dim->dst_dim.height) /
1004d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      p_thumb_dim->dst_dim.width);
1005d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    if (cropped_height % 2) {
1006d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      cropped_height -= 1;
1007d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    }
1008d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  }
1009d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  p_thumb_dim->crop.left = p_thumb_dim->crop.left +
1010d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    floor((p_thumb_dim->crop.width - cropped_width) / 2);
1011d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  if (p_thumb_dim->crop.left % 2) {
1012d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    p_thumb_dim->crop.left -= 1;
1013d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  }
1014d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  p_thumb_dim->crop.top = p_thumb_dim->crop.top +
1015d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    floor((p_thumb_dim->crop.height - cropped_height) / 2);
1016d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  if (p_thumb_dim->crop.top % 2) {
1017d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    p_thumb_dim->crop.top -= 1;
1018d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  }
1019d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  p_thumb_dim->crop.width = cropped_width;
1020d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  p_thumb_dim->crop.height = cropped_height;
1021d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
1022d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  LOGH("New thumbnail crop: left %d, top %d, crop width %d,"
1023d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    " crop height %d", p_thumb_dim->crop.left,
1024d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    p_thumb_dim->crop.top, p_thumb_dim->crop.width,
1025d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    p_thumb_dim->crop.height);
1026d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
1027d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  return ret;
1028d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch}
1029d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
103066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_omx_config_thumbnail:
103166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
103266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
103366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
103466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
103566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
103666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
103766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
103866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
103966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure OMX ports
104066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
104166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
104266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_session_config_thumbnail(mm_jpeg_job_session_t* p_session)
104366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
104466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
104566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_THUMBNAIL_INFO thumbnail_info;
104666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_INDEXTYPE thumb_indextype;
104766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_params_t *p_params = &p_session->params;
104866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
104966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_dim_t *p_thumb_dim = &p_jobparams->thumb_dim;
1050d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  mm_jpeg_dim_t *p_main_dim = &p_jobparams->main_dim;
105166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_YUV_FRAME_INFO *p_frame_info = &thumbnail_info.tmbOffset;
105266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_buf_t *p_tmb_buf = &p_params->src_thumb_buf[p_jobparams->thumb_index];
105366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
105466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGH("encode_thumbnail %u",
105566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_params->encode_thumbnail);
105666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_FALSE == p_params->encode_thumbnail) {
105766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
105866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
105966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
106066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((p_thumb_dim->dst_dim.width == 0) || (p_thumb_dim->dst_dim.height == 0)) {
106166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error invalid output dim for thumbnail");
106266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return OMX_ErrorBadParameter;
106366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
106466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
106566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((p_thumb_dim->src_dim.width == 0) || (p_thumb_dim->src_dim.height == 0)) {
106666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error invalid input dim for thumbnail");
106766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return OMX_ErrorBadParameter;
106866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
106966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
107066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((p_thumb_dim->crop.width == 0) || (p_thumb_dim->crop.height == 0)) {
107166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_thumb_dim->crop.width = p_thumb_dim->src_dim.width;
107266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_thumb_dim->crop.height = p_thumb_dim->src_dim.height;
107366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
107466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
107566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* check crop boundary */
107666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((p_thumb_dim->crop.width + p_thumb_dim->crop.left > p_thumb_dim->src_dim.width) ||
107766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (p_thumb_dim->crop.height + p_thumb_dim->crop.top > p_thumb_dim->src_dim.height)) {
107866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid crop boundary (%d, %d) offset (%d, %d) out of (%d, %d)",
107966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_thumb_dim->crop.width,
108066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_thumb_dim->crop.height,
108166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_thumb_dim->crop.left,
108266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_thumb_dim->crop.top,
108366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_thumb_dim->src_dim.width,
108466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_thumb_dim->src_dim.height);
108566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return OMX_ErrorBadParameter;
108666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
108766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
108866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&thumbnail_info, 0x0, sizeof(QOMX_THUMBNAIL_INFO));
108966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_GetExtensionIndex(p_session->omx_handle,
109066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QOMX_IMAGE_EXT_THUMBNAIL_NAME,
109166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &thumb_indextype);
109266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
109366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error %d", ret);
109466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
109566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
109666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
109766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* fill thumbnail info */
109866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  thumbnail_info.scaling_enabled = 1;
109966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  thumbnail_info.input_width = (OMX_U32)p_thumb_dim->src_dim.width;
110066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  thumbnail_info.input_height = (OMX_U32)p_thumb_dim->src_dim.height;
110166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  thumbnail_info.rotation = (OMX_U32)p_params->thumb_rotation;
110266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  thumbnail_info.quality = (OMX_U32)p_params->thumb_quality;
110366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  thumbnail_info.output_width = (OMX_U32)p_thumb_dim->dst_dim.width;
110466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  thumbnail_info.output_height = (OMX_U32)p_thumb_dim->dst_dim.height;
110566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
110666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_session->thumb_from_main) {
110766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((p_session->params.thumb_rotation == 90 ||
110866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->params.thumb_rotation == 270) &&
110966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (p_session->params.rotation == 0 ||
111066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->params.rotation == 180)) {
111166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
111266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      thumbnail_info.output_width = (OMX_U32)p_thumb_dim->dst_dim.height;
111366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      thumbnail_info.output_height = (OMX_U32)p_thumb_dim->dst_dim.width;
111466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      thumbnail_info.rotation = p_session->params.rotation;
111566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
1116d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    //Thumb FOV should be within main image FOV
1117d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    if (p_thumb_dim->crop.left < p_main_dim->crop.left) {
1118d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      p_thumb_dim->crop.left = p_main_dim->crop.left;
1119d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    }
1120d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
1121d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    if (p_thumb_dim->crop.top < p_main_dim->crop.top) {
1122d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      p_thumb_dim->crop.top = p_main_dim->crop.top;
1123d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    }
1124d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
1125d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    while ((p_thumb_dim->crop.left + p_thumb_dim->crop.width) >
1126d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      (p_main_dim->crop.left + p_main_dim->crop.width)) {
1127d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      if (p_thumb_dim->crop.left == p_main_dim->crop.left) {
1128d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch        p_thumb_dim->crop.width = p_main_dim->crop.width;
1129d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      } else {
1130d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch        p_thumb_dim->crop.left = p_main_dim->crop.left;
1131d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      }
1132d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    }
1133d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
1134d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    while ((p_thumb_dim->crop.top + p_thumb_dim->crop.height) >
1135d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      (p_main_dim->crop.top + p_main_dim->crop.height)) {
1136d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      if (p_thumb_dim->crop.top == p_main_dim->crop.top) {
1137d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch        p_thumb_dim->crop.height = p_main_dim->crop.height;
1138d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      } else {
1139d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch        p_thumb_dim->crop.top = p_main_dim->crop.top;
1140d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch      }
1141d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    }
114266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  } else if ((p_thumb_dim->dst_dim.width > p_thumb_dim->src_dim.width) ||
114366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (p_thumb_dim->dst_dim.height > p_thumb_dim->src_dim.height)) {
114466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Incorrect thumbnail dim %dx%d resetting to %dx%d", p_thumb_dim->dst_dim.width,
114566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_thumb_dim->dst_dim.height, p_thumb_dim->src_dim.width,
114666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_thumb_dim->src_dim.height);
114766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    thumbnail_info.output_width = (OMX_U32)p_thumb_dim->src_dim.width;
114866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    thumbnail_info.output_height = (OMX_U32)p_thumb_dim->src_dim.height;
114966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
115066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
1151d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  // If the thumbnail crop aspect ratio image and thumbnail dest aspect
1152d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  // ratio are different, reset the thumbnail crop
1153d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  double thumbcrop_aspect_ratio = (double)p_thumb_dim->crop.width /
1154d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    (double)p_thumb_dim->crop.height;
1155d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  double thumbdst_aspect_ratio = (double)p_thumb_dim->dst_dim.width /
1156d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    (double)p_thumb_dim->dst_dim.height;
1157d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  if ((thumbdst_aspect_ratio - thumbcrop_aspect_ratio) >
1158d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    ASPECT_TOLERANCE) {
1159d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    mm_jpeg_update_thumbnail_crop(p_thumb_dim, 0);
1160d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  } else if ((thumbcrop_aspect_ratio - thumbdst_aspect_ratio) >
1161d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    ASPECT_TOLERANCE) {
1162d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    mm_jpeg_update_thumbnail_crop(p_thumb_dim, 1);
1163d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  }
1164d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
1165d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  // Fill thumbnail crop info
1166d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  thumbnail_info.crop_info.nWidth = (OMX_U32)p_thumb_dim->crop.width;
1167d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  thumbnail_info.crop_info.nHeight = (OMX_U32)p_thumb_dim->crop.height;
1168d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  thumbnail_info.crop_info.nLeft = p_thumb_dim->crop.left;
1169d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  thumbnail_info.crop_info.nTop = p_thumb_dim->crop.top;
1170d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
117166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(p_frame_info, 0x0, sizeof(*p_frame_info));
117266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
117366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_frame_info->cbcrStartOffset[0] = p_tmb_buf->offset.mp[0].len;
117466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_frame_info->cbcrStartOffset[1] = p_tmb_buf->offset.mp[1].len;
117566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_frame_info->yOffset = p_tmb_buf->offset.mp[0].offset;
117666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_frame_info->cbcrOffset[0] = p_tmb_buf->offset.mp[1].offset;
117766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_frame_info->cbcrOffset[1] = p_tmb_buf->offset.mp[2].offset;
117866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
117966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SetConfig(p_session->omx_handle, thumb_indextype,
118066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &thumbnail_info);
118166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
118266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
118366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
118466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
118566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
118666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
118766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
118866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
118966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_config_main_crop:
119066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
119166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
119266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
119366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
119466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
119566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
119666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
119766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
119866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure main image crop
119966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
120066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
120166f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_session_config_main_crop(mm_jpeg_job_session_t *p_session)
120266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
120366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_CONFIG_RECTTYPE rect_type_in, rect_type_out;
120466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
120566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
120666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_dim_t *dim = &p_jobparams->main_dim;
120766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
120866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((dim->crop.width == 0) || (dim->crop.height == 0)) {
120966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    dim->crop.width = dim->src_dim.width;
121066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    dim->crop.height = dim->src_dim.height;
121166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
121266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* error check first */
121366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((dim->crop.width + dim->crop.left > dim->src_dim.width) ||
121466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (dim->crop.height + dim->crop.top > dim->src_dim.height)) {
121566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid crop boundary (%d, %d) out of (%d, %d)",
121666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      dim->crop.width + dim->crop.left,
121766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      dim->crop.height + dim->crop.top,
121866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      dim->src_dim.width,
121966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      dim->src_dim.height);
122066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return OMX_ErrorBadParameter;
122166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
122266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
122366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&rect_type_in, 0, sizeof(rect_type_in));
122466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&rect_type_out, 0, sizeof(rect_type_out));
122566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rect_type_in.nPortIndex = 0;
122666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rect_type_out.nPortIndex = 0;
122766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
122866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((dim->src_dim.width != dim->crop.width) ||
122966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (dim->src_dim.height != dim->crop.height) ||
123066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (dim->src_dim.width != dim->dst_dim.width) ||
123166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (dim->src_dim.height != dim->dst_dim.height)) {
123266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* Scaler information */
123366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rect_type_in.nWidth = CEILING2(dim->crop.width);
123466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rect_type_in.nHeight = CEILING2(dim->crop.height);
123566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rect_type_in.nLeft = dim->crop.left;
123666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rect_type_in.nTop = dim->crop.top;
123766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
123866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (dim->dst_dim.width && dim->dst_dim.height) {
123966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      rect_type_out.nWidth = (OMX_U32)dim->dst_dim.width;
124066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      rect_type_out.nHeight = (OMX_U32)dim->dst_dim.height;
124166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
124266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
124366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
124466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SetConfig(p_session->omx_handle, OMX_IndexConfigCommonInputCrop,
124566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &rect_type_in);
124666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
124766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
124866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
124966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
125066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
125166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGH("OMX_IndexConfigCommonInputCrop w = %d, h = %d, l = %d, t = %d,"
125266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    " port_idx = %d",
125366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)rect_type_in.nWidth, (int)rect_type_in.nHeight,
125466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)rect_type_in.nLeft, (int)rect_type_in.nTop,
125566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)rect_type_in.nPortIndex);
125666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
125766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SetConfig(p_session->omx_handle, OMX_IndexConfigCommonOutputCrop,
125866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &rect_type_out);
125966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
126066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
126166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
126266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
126366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("OMX_IndexConfigCommonOutputCrop w = %d, h = %d,"
126466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    " port_idx = %d",
126566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)rect_type_out.nWidth, (int)rect_type_out.nHeight,
126666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)rect_type_out.nPortIndex);
126766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
126866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
126966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
127066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
127166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_config_main:
127266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
127366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
127466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
127566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
127666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
127766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
127866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
127966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
128066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure main image
128166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
128266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
128366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_session_config_main(mm_jpeg_job_session_t *p_session)
128466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
128566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = OMX_ErrorNone;
128666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
128766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* config port */
128866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("config port");
128966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_session_config_ports(p_session);
129066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != rc) {
129166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config port failed");
129266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
129366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
129466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
129566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* config buffer offset */
129666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("config main buf offset");
129766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_session_config_main_buffer_offset(p_session);
129866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != rc) {
129966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config buffer offset failed");
130066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
130166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
130266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
130366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* set the encoding mode */
130466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_encoding_mode(p_session);
130566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != rc) {
130666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config encoding mode failed");
130766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
130866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
130966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
131066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* set the metadata encrypt key */
131166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_meta_enc_key(p_session);
131266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != rc) {
131366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config session failed");
131466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
131566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
131666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
131766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* set the mem ops */
131866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_mem_ops(p_session);
131966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != rc) {
132066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config mem ops failed");
132166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
132266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
132366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* set the jpeg speed mode */
132466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_speed_mode(p_session);
132566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != rc) {
132666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config speed mode failed");
132766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
132866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
132966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
133066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
133166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
133266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
133366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_config_common:
133466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
133566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
133666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
133766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
133866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
133966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
134066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
134166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
134266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure common parameters
134366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
134466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
134566f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_session_config_common(mm_jpeg_job_session_t *p_session)
134666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
134766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = OMX_ErrorNone;
134866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_INDEXTYPE exif_idx;
134966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_CONFIG_ROTATIONTYPE rotate;
135066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
135166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_EXIF_INFO exif_info;
135266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
135366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* set rotation */
135466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&rotate, 0, sizeof(rotate));
135566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rotate.nPortIndex = 1;
135666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rotate.nRotation = (OMX_S32)p_jobparams->rotation;
135766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_SetConfig(p_session->omx_handle, OMX_IndexConfigCommonRotate,
135866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &rotate);
135966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != rc) {
136066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error %d", rc);
136166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return rc;
136266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
136366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Set rotation to %d at port_idx = %d",
136466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)p_jobparams->rotation, (int)rotate.nPortIndex);
136566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
136666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* Set Exif data*/
136766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&p_session->exif_info_local[0], 0, sizeof(p_session->exif_info_local));
136866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_GetExtensionIndex(p_session->omx_handle, QOMX_IMAGE_EXT_EXIF_NAME,
136966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &exif_idx);
137066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != rc) {
137166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error %d", rc);
137266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
137366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
137466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
137566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Num of exif entries passed from HAL: %d",
137666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (int)p_jobparams->exif_info.numOfEntries);
137766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_jobparams->exif_info.numOfEntries > 0) {
137866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = OMX_SetConfig(p_session->omx_handle, exif_idx,
137966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        &p_jobparams->exif_info);
138066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (OMX_ErrorNone != rc) {
138166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error %d", rc);
138266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return rc;
138366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
138466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
138566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /*parse aditional exif data from the metadata*/
138666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  exif_info.numOfEntries = 0;
138766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  exif_info.exif_data = &p_session->exif_info_local[0];
138866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  process_meta_data(p_jobparams->p_metadata, &exif_info,
138966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_jobparams->cam_exif_params, p_jobparams->hal_version);
139066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* After Parse metadata */
139166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->exif_count_local = (int)exif_info.numOfEntries;
139266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
139366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (exif_info.numOfEntries > 0) {
139466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* set exif tags */
139566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("exif tags from metadata count %d",
139666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (int)exif_info.numOfEntries);
139766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
139866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = OMX_SetConfig(p_session->omx_handle, exif_idx,
139966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      &exif_info);
140066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (OMX_ErrorNone != rc) {
140166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error %d", rc);
140266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return rc;
140366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
140466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
140566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
140666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
140766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
140866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
140966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_abort:
141066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
141166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
141266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: jpeg session
141366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
141466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
141566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX_BOOL
141666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
141766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
141866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Abort ongoing job
141966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
142066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
142166f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_BOOL mm_jpeg_session_abort(mm_jpeg_job_session_t *p_session)
142266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
142366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
142466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int rc = 0;
142566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
142666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("E");
142766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
142866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (MM_JPEG_ABORT_NONE != p_session->abort_state) {
142966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
143066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("**** ALREADY ABORTED");
143166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return 0;
143266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
143366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->abort_state = MM_JPEG_ABORT_INIT;
143466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_TRUE == p_session->encoding) {
143566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->state_change_pending = OMX_TRUE;
143666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
143766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("**** ABORTING");
143866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
143966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
144066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_SendCommand(p_session->omx_handle, OMX_CommandStateSet,
144166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      OMX_StateIdle, NULL);
144266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
144366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret != OMX_ErrorNone) {
144466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("OMX_SendCommand returned error %d", ret);
144566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return 1;
144666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
144766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mm_jpegenc_destroy_job(p_session);
144866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != 0) {
144966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Destroy job returned error %d", rc);
145066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
145166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
145266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_lock(&p_session->lock);
145366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (MM_JPEG_ABORT_INIT == p_session->abort_state) {
145466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGL("before wait");
145566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      pthread_cond_wait(&p_session->cond, &p_session->lock);
145666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
145766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGL("after wait");
145866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
145966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->abort_state = MM_JPEG_ABORT_DONE;
146066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
146166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_put_mem((void *)p_session);
146266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
146366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
146466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
146566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  // Abort next session
146666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_session->next_session) {
146766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_session_abort(p_session->next_session);
146866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
146966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
147066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("X");
147166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return 0;
147266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
147366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
147466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_config_multi_image_info
147566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
147666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
147766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: encode session
147866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
147966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return: OMX_ERRORTYPE
148066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
148166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
148266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure multi image parameters
148366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
148466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
148566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic OMX_ERRORTYPE mm_jpeg_config_multi_image_info(
148666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session)
148766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
148866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
148966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_JPEG_MULTI_IMAGE_INFO multi_image_info;
149066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_INDEXTYPE multi_image_index;
149166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
149266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
149366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_jobparams->multi_image_info.type == MM_JPEG_TYPE_MPO) {
149466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_GetExtensionIndex(p_session->omx_handle,
149566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      QOMX_IMAGE_EXT_MULTI_IMAGE_NAME, &multi_image_index);
149666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
149766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error getting multi image info extention index %d", ret);
149866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
149966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
150066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&multi_image_info, 0, sizeof(multi_image_info));
150166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_jobparams->multi_image_info.type == MM_JPEG_TYPE_MPO) {
150266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      multi_image_info.image_type = QOMX_JPEG_IMAGE_TYPE_MPO;
150366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
150466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      multi_image_info.image_type = QOMX_JPEG_IMAGE_TYPE_JPEG;
150566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
150666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    multi_image_info.is_primary_image = p_jobparams->multi_image_info.is_primary;
150766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    multi_image_info.num_of_images = p_jobparams->multi_image_info.num_of_images;
150866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
150966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_SetConfig(p_session->omx_handle, multi_image_index,
151066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      &multi_image_info);
151166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
151266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error setting multi image config");
151366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
151466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
151566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
151666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
151766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
151866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
151966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_configure_params
152066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
152166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
152266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: encode session
152366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
152466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
152566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       none
152666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
152766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
152866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure the job specific params
152966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
153066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
153166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic OMX_ERRORTYPE mm_jpeg_configure_job_params(
153266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session)
153366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
153466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
153566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_IMAGE_PARAM_QFACTORTYPE q_factor;
153666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_WORK_BUFFER work_buffer;
153766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_INDEXTYPE work_buffer_index;
153866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_params_t *p_params = &p_session->params;
153966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
154066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int i;
154166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
154266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* common config */
154366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_session_config_common(p_session);
154466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
154566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config common failed");
154666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
154766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
154866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* config Main Image crop */
154966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("config main crop");
155066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_session_config_main_crop(p_session);
155166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
155266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config crop failed");
155366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
155466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
155566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
155666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* set quality */
155766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&q_factor, 0, sizeof(q_factor));
155866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  q_factor.nPortIndex = 0;
155966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  q_factor.nQFactor = p_params->quality;
156066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SetConfig(p_session->omx_handle, OMX_IndexParamQFactor, &q_factor);
156166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("config QFactor: %d", (int)q_factor.nQFactor);
156266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
156366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error setting Q factor %d", ret);
156466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
156566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
156666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
156766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* config thumbnail */
156866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_session_config_thumbnail(p_session);
156966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
157066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config thumbnail img failed");
157166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
157266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
157366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
157466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  //Pass the ION buffer to be used as o/p for HW
157566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&work_buffer, 0x0, sizeof(QOMX_WORK_BUFFER));
157666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_GetExtensionIndex(p_session->omx_handle,
157766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QOMX_IMAGE_EXT_WORK_BUFFER_NAME,
157866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &work_buffer_index);
157966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
158066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error getting work buffer index %d", ret);
158166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
158266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
158366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  work_buffer.fd = p_session->work_buffer.p_pmem_fd;
158466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  work_buffer.vaddr = p_session->work_buffer.addr;
158566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  work_buffer.length = (uint32_t)p_session->work_buffer.size;
158666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGH("Work buffer info %d %p WorkBufSize: %d invalidate",
158766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      work_buffer.fd, work_buffer.vaddr, work_buffer.length);
158866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
158966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  buffer_invalidate(&p_session->work_buffer);
159066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
159166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SetConfig(p_session->omx_handle, work_buffer_index,
159266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &work_buffer);
159366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
159466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
159566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
159666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
159766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
159866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* set metadata */
159966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_metadata(p_session);
160066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
160166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config makernote data failed");
160266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
160366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
160466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
160566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* set QTable */
160666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < QTABLE_MAX; i++) {
160766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_jobparams->qtable_set[i]) {
160866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      ret = OMX_SetConfig(p_session->omx_handle,
160966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        OMX_IndexParamQuantizationTable, &p_jobparams->qtable[i]);
161066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      if (OMX_ErrorNone != ret) {
161166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("set QTable Error");
161266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return ret;
161366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      }
161466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
161566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
161666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
161766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* Set multi image data*/
161866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_config_multi_image_info(p_session);
161966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
162066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config multi image data failed");
162166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
162266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
162366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
162466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
162566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
162666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
162766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_configure:
162866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
162966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
163066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @data: encode session
163166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
163266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
163366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       none
163466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
163566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
163666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure the session
163766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
163866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
163966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic OMX_ERRORTYPE mm_jpeg_session_configure(mm_jpeg_job_session_t *p_session)
164066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
164166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
164266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
164366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("E ");
164466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
164566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  MM_JPEG_CHK_ABORT(p_session, ret, error);
164666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
164766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* config main img */
164866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_session_config_main(p_session);
164966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
165066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config main img failed");
165166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
165266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
165366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_session_change_state(p_session, OMX_StateIdle,
165466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_session_send_buffers);
165566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
165666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("change state to idle failed %d", ret);
165766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
165866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
165966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
166066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_session_change_state(p_session, OMX_StateExecuting,
166166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    NULL);
166266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
166366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("change state to executing failed %d", ret);
166466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
166566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
166666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
166766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinerror:
166866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("X ret %d", ret);
166966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
167066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
167166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
167266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
167366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
167466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
167566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
167666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
167766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_encode:
167866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
167966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
168066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: encode session
168166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
168266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
168366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX_ERRORTYPE
168466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
168566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
168666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Start the encoding
168766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
168866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
168966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic OMX_ERRORTYPE mm_jpeg_session_encode(mm_jpeg_job_session_t *p_session)
169066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
169166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
169266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
16931687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan  mm_jpeg_obj *my_obj = (mm_jpeg_obj *) p_session->jpeg_obj;
169466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
169566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
169666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->abort_state = MM_JPEG_ABORT_NONE;
169766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->encoding = OMX_FALSE;
169866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
169966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
170066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_session->thumb_from_main) {
170166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 > p_jobparams->src_index) {
170266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error");
170366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      ret = OMX_ErrorUnsupportedIndex;
170466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      goto error;
170566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
170666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_jobparams->thumb_index = (uint32_t)p_jobparams->src_index;
170766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_jobparams->thumb_dim.crop = p_jobparams->main_dim.crop;
170866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
170966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
171066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_FALSE == p_session->config) {
17111687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    /* If another session in progress clear that sessions configuration */
17121687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    if (my_obj->p_session_inprogress != NULL) {
17131687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      OMX_STATETYPE state;
17141687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      mm_jpeg_job_session_t *p_session_inprogress = my_obj->p_session_inprogress;
17151687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan
17161687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      OMX_GetState(p_session_inprogress->omx_handle, &state);
17171687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan
17181687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      //Check state before state transition
17191687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      if ((state == OMX_StateExecuting) || (state == OMX_StatePause)) {
17201687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan        ret = mm_jpeg_session_change_state(p_session_inprogress,
17211687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan          OMX_StateIdle, NULL);
17221687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan        if (ret) {
17231687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan          LOGE("Error");
17241687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan          goto error;
17251687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan        }
17261687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      }
17271687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan
17281687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      OMX_GetState(p_session_inprogress->omx_handle, &state);
17291687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan
17301687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      if (state == OMX_StateIdle) {
17311687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan        ret = mm_jpeg_session_change_state(p_session_inprogress,
17321687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan          OMX_StateLoaded, mm_jpeg_session_free_buffers);
17331687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan        if (ret) {
17341687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan          LOGE("Error");
17351687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan          goto error;
17361687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan        }
17371687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      }
17381687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      p_session_inprogress->config = OMX_FALSE;
17391687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      my_obj->p_session_inprogress = NULL;
17401687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    }
17411687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan
174266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = mm_jpeg_session_configure(p_session);
174366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
174466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error");
174566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      goto error;
174666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
174766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->config = OMX_TRUE;
17481687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    my_obj->p_session_inprogress = p_session;
174966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
175066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
175166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_configure_job_params(p_session);
175266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
175366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error");
175466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      goto error;
175566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
175666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
175766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->encoding = OMX_TRUE;
175866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
175966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
176066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  MM_JPEG_CHK_ABORT(p_session, ret, error);
176166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
176266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef MM_JPEG_DUMP_INPUT
176366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  char filename[256];
176466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  snprintf(filename, sizeof(filename),
176566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      QCAMERA_DUMP_FRM_LOCATION"jpeg/mm_jpeg_int%d.yuv", p_session->ebd_count);
176666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  DUMP_TO_FILE(filename,
176766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->p_in_omx_buf[p_jobparams->src_index]->pBuffer,
176866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (size_t)p_session->p_in_omx_buf[p_jobparams->src_index]->nAllocLen);
176966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
177066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
177166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_EmptyThisBuffer(p_session->omx_handle,
177266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->p_in_omx_buf[p_jobparams->src_index]);
177366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
177466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
177566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
177666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
177766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
177866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_session->params.encode_thumbnail) {
177966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef MM_JPEG_DUMP_INPUT
178066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  char thumb_filename[FILENAME_MAX];
178166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  snprintf(thumb_filename, sizeof(thumb_filename),
178266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_DUMP_FRM_LOCATION"jpeg/mm_jpeg_int_t%d.yuv", p_session->ebd_count);
178366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  DUMP_TO_FILE(filename,
178466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->p_in_omx_thumb_buf[p_jobparams->thumb_index]->pBuffer,
178566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (size_t)p_session->p_in_omx_thumb_buf[p_jobparams->thumb_index]->nAllocLen);
178666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
178766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_EmptyThisBuffer(p_session->omx_handle,
178866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        p_session->p_in_omx_thumb_buf[p_jobparams->thumb_index]);
178966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
179066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error");
179166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      goto error;
179266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
179366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
179466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
179566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_FillThisBuffer(p_session->omx_handle,
179666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->p_out_omx_buf[p_jobparams->dst_index]);
179766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
179866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
179966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
180066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
180166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
180266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  MM_JPEG_CHK_ABORT(p_session, ret, error);
180366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
180466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinerror:
180566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
180666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("X ");
180766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
180866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
180966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
181066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_process_encoding_job:
181166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
181266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
181366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg client
181466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @job_node: job node
181566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
181666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
181766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success -1 otherwise
181866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
181966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
182066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Start the encoding job
182166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
182266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
182366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_process_encoding_job(mm_jpeg_obj *my_obj, mm_jpeg_job_q_node_t* job_node)
182466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
182566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_data_t qdata;
182666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
182766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
182866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = NULL;
182966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t buf_idx;
183066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
183166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* check if valid session */
183266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session = mm_jpeg_get_session(my_obj, job_node->enc_info.job_id);
183366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == p_session) {
183466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid job id %x",
183566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        job_node->enc_info.job_id);
183666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
183766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
183866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
183966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("before dequeue session %d", ret);
184066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
184166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* dequeue available omx handle */
184266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  qdata = mm_jpeg_queue_deq(p_session->session_handle_q);
184366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session = qdata.p;
184466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
184566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == p_session) {
184666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("No available sessions %d", ret);
184766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* No available handles */
184866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    qdata.p = job_node;
184966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_queue_enq_head(&my_obj->job_mgr.job_queue, qdata);
185066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
185166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("end enqueue %d", ret);
185266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
185366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
185466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
185566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
185666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->auto_out_buf = OMX_FALSE;
185766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (job_node->enc_info.encode_job.dst_index < 0) {
185866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* dequeue available output buffer idx */
185966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    qdata = mm_jpeg_queue_deq(p_session->out_buf_q);
186066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    buf_idx = qdata.u32;
186166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
186266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0U == buf_idx) {
186366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("No available output buffers %d", ret);
186466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return OMX_ErrorUndefined;
186566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
186666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
186766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    buf_idx--;
186866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
186966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    job_node->enc_info.encode_job.dst_index = (int32_t)buf_idx;
187066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->auto_out_buf = OMX_TRUE;
187166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
187266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
187366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* sent encode cmd to OMX, queue job into ongoing queue */
187466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  qdata.p = job_node;
187566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_queue_enq(&my_obj->ongoing_job_q, qdata);
187666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc) {
187766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("jpeg enqueue failed %d", ret);
187866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
187966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
188066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
188166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->encode_job = job_node->enc_info.encode_job;
188266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->jobId = job_node->enc_info.job_id;
188366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_session_encode(p_session);
188466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
188566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("encode session failed");
188666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
188766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
188866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
188966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGH("Success X ");
189066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
189166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
189266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinerror:
189366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
189466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((OMX_ErrorNone != ret) &&
189566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (NULL != p_session->params.jpeg_cb)) {
189666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->job_status = JPEG_JOB_STATUS_ERROR;
189766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("send jpeg error callback %d",
189866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->job_status);
189966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->params.jpeg_cb(p_session->job_status,
190066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->client_hdl,
190166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->jobId,
190266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      NULL,
190366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->params.userdata);
190466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
190566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
190666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /*remove the job*/
190766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpegenc_job_done(p_session);
190866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Error X ");
190966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
191066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
191166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
191266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
191366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
191466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
191566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_jobmgr_thread:
191666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
191766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
191866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
191966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
192066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
192166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
192266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
192366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
192466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       job manager thread main function
192566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
192666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
192766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic void *mm_jpeg_jobmgr_thread(void *data)
192866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
192966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_data_t qdata;
193066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int rc = 0;
193166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int running = 1;
193266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t num_ongoing_jobs = 0;
193366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_obj *my_obj = (mm_jpeg_obj*)data;
193466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_cmd_thread_t *cmd_thread = &my_obj->job_mgr;
193566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* node = NULL;
193666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  prctl(PR_SET_NAME, (unsigned long)"mm_jpeg_thread", 0, 0, 0);
193766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
193866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  do {
193966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    do {
194066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      rc = cam_sem_wait(&cmd_thread->job_sem);
194166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      if (rc != 0 && errno != EINVAL) {
194266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("cam_sem_wait error (%s)",
194366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           strerror(errno));
194466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
194566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      }
194666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } while (rc != 0);
194766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
194866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* check ongoing q size */
194966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    num_ongoing_jobs = mm_jpeg_queue_get_size(&my_obj->ongoing_job_q);
195066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
195166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("ongoing job  %d %d", num_ongoing_jobs, MM_JPEG_CONCURRENT_SESSIONS_COUNT);
195266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (num_ongoing_jobs >= MM_JPEG_CONCURRENT_SESSIONS_COUNT) {
195366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("ongoing job already reach max %d", num_ongoing_jobs);
195466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      continue;
195566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
195666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
195766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_lock(&my_obj->job_lock);
195866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* can go ahead with new work */
195966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    qdata = mm_jpeg_queue_deq(&cmd_thread->job_queue);
196066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node = (mm_jpeg_job_q_node_t*)qdata.p;
196166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (node != NULL) {
196266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      switch (node->type) {
196366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      case MM_JPEG_CMD_TYPE_JOB:
196466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mm_jpeg_process_encoding_job(my_obj, node);
196566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        break;
196666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      case MM_JPEG_CMD_TYPE_DECODE_JOB:
196766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mm_jpegdec_process_decoding_job(my_obj, node);
196866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        break;
196966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      case MM_JPEG_CMD_TYPE_EXIT:
197066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      default:
197166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        /* free node */
197266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        free(node);
197366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        /* set running flag to false */
197466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        running = 0;
197566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        break;
197666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      }
197766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
197866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&my_obj->job_lock);
197966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
198066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  } while (running);
198166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return NULL;
198266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
198366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
198466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_jobmgr_thread_launch:
198566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
198666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
198766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
198866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
198966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
199066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
199166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
199266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
199366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       launches the job manager thread
199466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
199566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
199666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_jobmgr_thread_launch(mm_jpeg_obj *my_obj)
199766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
199866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
199966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_cmd_thread_t *job_mgr = &my_obj->job_mgr;
200066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
200166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  cam_sem_init(&job_mgr->job_sem, 0);
200266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_init(&job_mgr->job_queue);
200366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
200466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* launch the thread */
200566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_create(&job_mgr->pid,
200666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    NULL,
200766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_jobmgr_thread,
200866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (void *)my_obj);
200966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_setname_np(job_mgr->pid, "CAM_jpeg_jobmgr");
201066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
201166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
201266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
201366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_jobmgr_thread_release:
201466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
201566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
201666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
201766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
201866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
201966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
202066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
202166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
202266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Releases the job manager thread
202366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
202466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
202566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_jobmgr_thread_release(mm_jpeg_obj * my_obj)
202666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
202766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_data_t qdata;
202866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
202966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_cmd_thread_t * cmd_thread = &my_obj->job_mgr;
203066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* node =
203166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (mm_jpeg_job_q_node_t *)malloc(sizeof(mm_jpeg_job_q_node_t));
203266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == node) {
203366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("No memory for mm_jpeg_job_q_node_t");
203466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
203566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
203666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
203766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(node, 0, sizeof(mm_jpeg_job_q_node_t));
203866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node->type = MM_JPEG_CMD_TYPE_EXIT;
203966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
204066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  qdata.p = node;
204166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_enq(&cmd_thread->job_queue, qdata);
204266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  cam_sem_post(&cmd_thread->job_sem);
204366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
204466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* wait until cmd thread exits */
204566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (pthread_join(cmd_thread->pid, NULL) != 0) {
204666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("pthread dead already");
204766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
204866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_deinit(&cmd_thread->job_queue);
204966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
205066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  cam_sem_destroy(&cmd_thread->job_sem);
205166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(cmd_thread, 0, sizeof(mm_jpeg_job_cmd_thread_t));
205266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
205366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
205466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
205566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_alloc_workbuffer:
205666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
205766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
205866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
205966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @work_bufs_need: number of work buffers required
206066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @work_buf_size: size of the work buffer
206166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
206266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
206366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       greater or equal to 0 for success else failure
206466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
206566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
206666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Allocates work buffer
206766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
206866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
206966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_alloc_workbuffer(mm_jpeg_obj *my_obj,
207066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t work_bufs_need,
207166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t work_buf_size)
207266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
207366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
207466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t i;
207566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGH("work_bufs_need %d work_buf_cnt %d",
207666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    work_bufs_need, my_obj->work_buf_cnt);
207766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = my_obj->work_buf_cnt; i < work_bufs_need; i++) {
207866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    my_obj->ionBuffer[i].size = CEILING32(work_buf_size);
207966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("Max picture size %d x %d, WorkBufSize = %zu",
208066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      my_obj->max_pic_w, my_obj->max_pic_h, my_obj->ionBuffer[i].size);
208166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    my_obj->ionBuffer[i].addr = (uint8_t *)buffer_allocate(&my_obj->ionBuffer[i], 1);
208266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == my_obj->ionBuffer[i].addr) {
208366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Ion allocation failed");
208466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      while (i--) {
208566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        buffer_deallocate(&my_obj->ionBuffer[i]);
208666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        my_obj->work_buf_cnt--;
208766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      }
208866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return -1;
208966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
209066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    my_obj->work_buf_cnt++;
209166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = i;
209266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
209366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("rc %d ", rc);
209466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
209566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
209666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
209766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_release_workbuffer:
209866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
209966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
210066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
210166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @work_bufs_need: number of work buffers allocated
210266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
210366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
210466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
210566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
210666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
210766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Releases the allocated work buffer
210866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
210966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
211066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_release_workbuffer(mm_jpeg_obj *my_obj,
211166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t work_bufs_need)
211266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
211366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
211466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t i;
211566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("release work_bufs %d ", work_bufs_need);
211666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = my_obj->work_buf_cnt; i < work_bufs_need; i++) {
211766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    buffer_deallocate(&my_obj->ionBuffer[i]);
211866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
211966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
212066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
212166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
212266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_init:
212366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
212466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
212566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
212666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
212766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
212866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
212966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
213066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
213166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Initializes the jpeg client
213266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
213366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
213466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_init(mm_jpeg_obj *my_obj)
213566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
213666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
213766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t work_buf_size;
213866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  unsigned int initial_workbufs_cnt = 1;
213966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
214066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* init locks */
214166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_init(&my_obj->job_lock, NULL);
214266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
214366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* init ongoing job queue */
214466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_queue_init(&my_obj->ongoing_job_q);
214566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
214666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
214766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_destroy(&my_obj->job_lock);
214866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
214966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
215066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
215166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
215266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* init job semaphore and launch jobmgr thread */
215366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Launch jobmgr thread rc %d", rc);
215466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_jobmgr_thread_launch(my_obj);
215566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
215666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
215766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_queue_deinit(&my_obj->ongoing_job_q);
215866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_destroy(&my_obj->job_lock);
215966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
216066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
216166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
216266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* set work buf size from max picture size */
216366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (my_obj->max_pic_w <= 0 || my_obj->max_pic_h <= 0) {
216466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Width and height are not valid "
216566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      "dimensions, cannot calc work buf size");
216666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_jobmgr_thread_release(my_obj);
216766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_queue_deinit(&my_obj->ongoing_job_q);
216866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_destroy(&my_obj->job_lock);
216966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
217066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
217166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
217266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* allocate work buffer if reproc source buffer is not supposed to be used */
217366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (!my_obj->reuse_reproc_buffer) {
217466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    work_buf_size = CEILING64((uint32_t)my_obj->max_pic_w) *
217566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin     CEILING64((uint32_t)my_obj->max_pic_h) * 3U / 2U;
217666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mm_jpeg_alloc_workbuffer(my_obj, initial_workbufs_cnt, work_buf_size);
217766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc == -1) {
217866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Work buffer allocation failure");
217966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return rc;
218066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
218166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
218266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
218366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* load OMX */
218466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != OMX_Init()) {
218566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* roll back in error case */
218666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("OMX_Init failed (%d)", rc);
218766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!my_obj->reuse_reproc_buffer) {
218866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      mm_jpeg_release_workbuffer(my_obj, initial_workbufs_cnt);
218966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
219066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_jobmgr_thread_release(my_obj);
219166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_queue_deinit(&my_obj->ongoing_job_q);
219266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_destroy(&my_obj->job_lock);
219366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
219466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
219566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef LOAD_ADSP_RPC_LIB
219666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  my_obj->adsprpc_lib_handle = dlopen("libadsprpc.so", RTLD_NOW);
219766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == my_obj->adsprpc_lib_handle) {
219866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Cannot load the library");
219966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* not returning error here bcoz even if this loading fails
220066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        we can go ahead with SW JPEG enc */
220166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
220266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
220366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
2204d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  // create dummy OMX handle to avoid dlopen latency
2205d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  OMX_GetHandle(&my_obj->dummy_handle, mm_jpeg_get_comp_name(), NULL, NULL);
2206d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
220766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
220866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
220966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
221066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_deinit:
221166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
221266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
221366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
221466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
221566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
221666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
221766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
221866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
221966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Deinits the jpeg client
222066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
222166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
222266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_deinit(mm_jpeg_obj *my_obj)
222366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
222466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
222566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t i = 0;
222666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
222766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* release jobmgr thread */
222866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_jobmgr_thread_release(my_obj);
222966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
223066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
223166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
223266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
2233d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  if (my_obj->dummy_handle) {
2234d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    OMX_FreeHandle(my_obj->dummy_handle);
2235d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch  }
2236d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
223766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* unload OMX engine */
223866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_Deinit();
223966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
224066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* deinit ongoing job and cb queue */
224166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_queue_deinit(&my_obj->ongoing_job_q);
224266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
224366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
224466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
224566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
224666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < my_obj->work_buf_cnt; i++) {
224766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /*Release the ION buffer*/
224866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = buffer_deallocate(&my_obj->ionBuffer[i]);
224966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 != rc) {
225066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error releasing ION buffer");
225166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
225266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
225366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  my_obj->work_buf_cnt = 0;
225466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  my_obj->jpeg_metadata = NULL;
225566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
225666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* destroy locks */
225766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_destroy(&my_obj->job_lock);
225866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
225966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
226066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
226166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
226266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_new_client:
226366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
226466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
226566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
226666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
226766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
226866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
226966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
227066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
227166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Create new jpeg client
227266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
227366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
227466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t mm_jpeg_new_client(mm_jpeg_obj *my_obj)
227566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
227666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t client_hdl = 0;
227766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint8_t idx;
227866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int i = 0;
227966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
228066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (my_obj->num_clients >= MAX_JPEG_CLIENT_NUM) {
228166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("num of clients reached limit");
228266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return client_hdl;
228366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
228466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
228566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (idx = 0; idx < MAX_JPEG_CLIENT_NUM; idx++) {
228666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 == my_obj->clnt_mgr[idx].is_used) {
228766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      break;
228866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
228966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
229066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
229166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (idx < MAX_JPEG_CLIENT_NUM) {
229266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* client session avail */
229366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* generate client handler by index */
229466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    client_hdl = mm_jpeg_util_generate_handler(idx);
229566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
229666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* update client session */
229766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    my_obj->clnt_mgr[idx].is_used = 1;
229866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    my_obj->clnt_mgr[idx].client_handle = client_hdl;
229966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
230066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_init(&my_obj->clnt_mgr[idx].lock, NULL);
230166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (i = 0; i < MM_JPEG_MAX_SESSION; i++) {
230266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      memset(&my_obj->clnt_mgr[idx].session[i], 0x0, sizeof(mm_jpeg_job_session_t));
230366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
230466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
230566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* increse client count */
230666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    my_obj->num_clients++;
230766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
230866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
230966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return client_hdl;
231066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
231166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
231266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_start_job:
231366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
231466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
231566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
231666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @client_hdl: client handle
231766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @job: pointer to encode job
231866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @jobId: job id
231966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
232066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
232166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
232266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
232366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
232466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Start the encoding job
232566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
232666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
232766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_start_job(mm_jpeg_obj *my_obj,
232866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_t *job,
232966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t *job_id)
233066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
233166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_data_t qdata;
233266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = -1;
233366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint8_t session_idx = 0;
233466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint8_t client_idx = 0;
233566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* node = NULL;
233666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = NULL;
233766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_job_t *p_jobparams  = NULL;
233866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t work_bufs_need;
233966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t work_buf_size;
234066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
234166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  *job_id = 0;
234266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
234366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (!job) {
234466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid job !!!");
234566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
234666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
234766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_jobparams = &job->encode_job;
234866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
234966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* check if valid session */
235066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  session_idx = GET_SESSION_IDX(p_jobparams->session_id);
235166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  client_idx = GET_CLIENT_IDX(p_jobparams->session_id);
235266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("session_idx %d client idx %d",
235366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    session_idx, client_idx);
235466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
235566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((session_idx >= MM_JPEG_MAX_SESSION) ||
235666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (client_idx >= MAX_JPEG_CLIENT_NUM)) {
235766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid session id %x",
235866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      job->encode_job.session_id);
235966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
236066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
236166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
236266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session = &my_obj->clnt_mgr[client_idx].session[session_idx];
236366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
236466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (my_obj->reuse_reproc_buffer) {
236566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->work_buffer.addr           = p_jobparams->work_buf.buf_vaddr;
236666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->work_buffer.size           = p_jobparams->work_buf.buf_size;
236766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->work_buffer.ion_info_fd.fd = p_jobparams->work_buf.fd;
236866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->work_buffer.p_pmem_fd      = p_jobparams->work_buf.fd;
236966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
237066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    work_bufs_need = my_obj->num_sessions + 1;
237166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (work_bufs_need > MM_JPEG_CONCURRENT_SESSIONS_COUNT) {
237266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      work_bufs_need = MM_JPEG_CONCURRENT_SESSIONS_COUNT;
237366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
237466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
237566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_session->work_buffer.addr) {
237666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      work_bufs_need--;
237766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGD("HAL passed the work buffer of size = %d; don't alloc internally",
237866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          p_session->work_buffer.size);
237966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
238066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->work_buffer = my_obj->ionBuffer[0];
238166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
238266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
238366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD(">>>> Work bufs need %d, %d",
238466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      work_bufs_need, my_obj->work_buf_cnt);
238566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (work_bufs_need) {
238666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      work_buf_size = CEILING64(my_obj->max_pic_w) *
238766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CEILING64(my_obj->max_pic_h) * 3 / 2;
238866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      rc = mm_jpeg_alloc_workbuffer(my_obj, work_bufs_need, work_buf_size);
238966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      if (rc == -1) {
239066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Work buffer allocation failure");
239166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
239266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      } else {
239366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        p_session->work_buffer = my_obj->ionBuffer[rc];
239466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      }
239566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
239666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
239766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
239866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_FALSE == p_session->active) {
239966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("session not active %x",
240066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      job->encode_job.session_id);
240166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
240266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
240366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
240466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((p_jobparams->src_index >= (int32_t)p_session->params.num_src_bufs) ||
240566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (p_jobparams->dst_index >= (int32_t)p_session->params.num_dst_bufs)) {
240666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid buffer indices");
240766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
240866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
240966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
241066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* enqueue new job into todo job queue */
241166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = (mm_jpeg_job_q_node_t *)malloc(sizeof(mm_jpeg_job_q_node_t));
241266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == node) {
241366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("No memory for mm_jpeg_job_q_node_t");
241466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
241566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
241666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
241766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  KPI_ATRACE_INT("Camera:JPEG",
241866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (int32_t)((uint32_t)session_idx<<16 | ++p_session->job_index));
241966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
242066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  *job_id = job->encode_job.session_id |
242166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (((uint32_t)p_session->job_hist++ % JOB_HIST_MAX) << 16);
242266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
242366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(node, 0, sizeof(mm_jpeg_job_q_node_t));
242466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node->enc_info.encode_job = job->encode_job;
242566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_session->thumb_from_main) {
242666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node->enc_info.encode_job.thumb_dim.src_dim =
242766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      node->enc_info.encode_job.main_dim.src_dim;
242866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node->enc_info.encode_job.thumb_dim.crop =
242966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      node->enc_info.encode_job.main_dim.crop;
243066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
243166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node->enc_info.job_id = *job_id;
243266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node->enc_info.client_handle = p_session->client_hdl;
243366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node->type = MM_JPEG_CMD_TYPE_JOB;
243466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
243566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
243666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
243766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  qdata.p = node;
243866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_queue_enq(&my_obj->job_mgr.job_queue, qdata);
243966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 == rc) {
244066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      cam_sem_post(&my_obj->job_mgr.job_sem);
244166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
244266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
244366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGH("session_idx %u client_idx %u job_id %d X",
244466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    session_idx, client_idx, *job_id);
244566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
244666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
244766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
244866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
244966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
245066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
245166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_abort_job:
245266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
245366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
245466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
245566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @client_hdl: client handle
245666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @jobId: job id
245766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
245866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
245966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
246066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
246166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
246266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Abort the encoding session
246366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
246466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
246566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_abort_job(mm_jpeg_obj *my_obj,
246666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t jobId)
246766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
246866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = -1;
246966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t *node = NULL;
247066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = NULL;
247166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
247266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&my_obj->job_lock);
247366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
247466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort job if in todo queue */
247566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_job_id(&my_obj->job_mgr.job_queue, jobId);
247666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL != node) {
247766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
247866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto abort_done;
247966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
248066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
248166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort job if in ongoing queue */
248266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_job_id(&my_obj->ongoing_job_q, jobId);
248366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL != node) {
248466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* find job that is OMX ongoing, ask OMX to abort the job */
248566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session = mm_jpeg_get_session(my_obj, node->enc_info.job_id);
248666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_session) {
248766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      mm_jpeg_session_abort(p_session);
248866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
248966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Invalid job id 0x%x",
249066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        node->enc_info.job_id);
249166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
249266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
249366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto abort_done;
249466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
249566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
249666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinabort_done:
249766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&my_obj->job_lock);
249866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
249966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
250066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
250166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
250266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
250366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef MM_JPEG_READ_META_KEYFILE
250466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpeg_read_meta_keyfile(mm_jpeg_job_session_t *p_session,
250566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    const char *filename)
250666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
250766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int rc = 0;
250866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  FILE *fp = NULL;
250966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  size_t file_size = 0;
251066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  fp = fopen(filename, "r");
251166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (!fp) {
251266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Key not present");
251366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
251466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
251566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  fseek(fp, 0, SEEK_END);
251666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  file_size = (size_t)ftell(fp);
251766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  fseek(fp, 0, SEEK_SET);
251866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
251966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->meta_enc_key = (uint8_t *) malloc((file_size + 1) * sizeof(uint8_t));
252066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
252166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (!p_session->meta_enc_key) {
252266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("error");
252366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
252466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
252566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
252666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  fread(p_session->meta_enc_key, 1, file_size, fp);
252766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  fclose(fp);
252866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
252966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->meta_enc_keylen = file_size;
253066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
253166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
253266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
253366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif // MM_JPEG_READ_META_KEYFILE
253466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
253566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_create_session:
253666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
253766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
253866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
253966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @client_hdl: client handle
254066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_params: pointer to encode params
254166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session_id: session id
254266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
254366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
254466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
254566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
254666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
254766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Start the encoding session
254866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
254966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
255066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_create_session(mm_jpeg_obj *my_obj,
255166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t client_hdl,
255266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_params_t *p_params,
255366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t* p_session_id)
255466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
255566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_data_t qdata;
255666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
255766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
255866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint8_t clnt_idx = 0;
255966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int session_idx = -1;
256066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = NULL;
256166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t * p_prev_session = NULL;
256266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  *p_session_id = 0;
256366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t i = 0;
256466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t num_omx_sessions = 1;
256566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t work_buf_size;
256666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_t *p_session_handle_q, *p_out_buf_q;
256766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t work_bufs_need;
256866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  char trace_tag[32];
256966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
257066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* validate the parameters */
257166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((p_params->num_src_bufs > MM_JPEG_MAX_BUF)
257266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    || (p_params->num_dst_bufs > MM_JPEG_MAX_BUF)) {
257366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid num buffers");
257466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
257566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
257666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
257766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* check if valid client */
257866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  clnt_idx = mm_jpeg_util_get_index_by_handler(client_hdl);
257966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (clnt_idx >= MAX_JPEG_CLIENT_NUM) {
258066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid client with handler (%d)", client_hdl);
258166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
258266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
258366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
258466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_params->burst_mode) {
258566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    num_omx_sessions = MM_JPEG_CONCURRENT_SESSIONS_COUNT;
258666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
258766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
258866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (!my_obj->reuse_reproc_buffer) {
258966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    work_bufs_need = num_omx_sessions;
259066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (work_bufs_need > MM_JPEG_CONCURRENT_SESSIONS_COUNT) {
259166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      work_bufs_need = MM_JPEG_CONCURRENT_SESSIONS_COUNT;
259266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
259366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD(">>>> Work bufs need %d", work_bufs_need);
259466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    work_buf_size = CEILING64(my_obj->max_pic_w) *
259566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      CEILING64(my_obj->max_pic_h) * 3 / 2;
259666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mm_jpeg_alloc_workbuffer(my_obj, work_bufs_need, work_buf_size);
259766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc == -1) {
259866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Work buffer allocation failure");
259966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return rc;
260066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
260166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
260266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
260366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
260466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* init omx handle queue */
260566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session_handle_q = (mm_jpeg_queue_t *) malloc(sizeof(*p_session_handle_q));
260666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == p_session_handle_q) {
260766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
260866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error1;
260966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
261066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_queue_init(p_session_handle_q);
261166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
261266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
261366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(p_session_handle_q);
261466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error1;
261566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
261666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
261766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* init output buf queue */
261866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_out_buf_q = (mm_jpeg_queue_t *) malloc(sizeof(*p_out_buf_q));
261966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == p_out_buf_q) {
262066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error: Cannot allocate memory\n");
262166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
262266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
262366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
262466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* init omx handle queue */
262566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_queue_init(p_out_buf_q);
262666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
262766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
262866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(p_out_buf_q);
262966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error1;
263066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
263166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
263266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < num_omx_sessions; i++) {
263366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t buf_idx = 0U;
263466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    session_idx = mm_jpeg_get_new_session_idx(my_obj, clnt_idx, &p_session);
263566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (session_idx < 0 || NULL == p_session) {
263666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("invalid session id (%d)", session_idx);
263766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      goto error2;
263866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
263966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
264066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    snprintf(trace_tag, sizeof(trace_tag), "Camera:JPEGsession%d", session_idx);
264166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_INT(trace_tag, 1);
264266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
264366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->job_index = 0;
264466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
264566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->next_session = NULL;
264666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
264766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_prev_session) {
264866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_prev_session->next_session = p_session;
264966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
265066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_prev_session = p_session;
265166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
265266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    buf_idx = i;
265366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (buf_idx < MM_JPEG_CONCURRENT_SESSIONS_COUNT) {
265466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->work_buffer = my_obj->ionBuffer[buf_idx];
265566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
265666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Invalid Index, Setting buffer add to null");
265766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->work_buffer.addr = NULL;
265866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->work_buffer.ion_fd = -1;
265966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->work_buffer.p_pmem_fd = -1;
266066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
266166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
266266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->jpeg_obj = (void*)my_obj; /* save a ptr to jpeg_obj */
266366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
266466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /*copy the params*/
266566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->params = *p_params;
266666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = mm_jpeg_session_create(p_session);
266766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (OMX_ErrorNone != ret) {
266866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->active = OMX_FALSE;
266966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("jpeg session create failed");
267066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      goto error2;
267166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
267266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
267366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t session_id = (JOB_ID_MAGICVAL << 24) |
267466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        ((uint32_t)session_idx << 8) | clnt_idx;
267566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
267666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!*p_session_id) {
267766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      *p_session_id = session_id;
267866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
267966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
268066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_session->thumb_from_main) {
268166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      memcpy(p_session->params.src_thumb_buf, p_session->params.src_main_buf,
268266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        sizeof(p_session->params.src_thumb_buf));
268366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->params.num_tmb_bufs =  p_session->params.num_src_bufs;
268466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      if (!p_session->params.encode_thumbnail) {
268566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         p_session->params.num_tmb_bufs = 0;
268666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      }
268766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->params.thumb_dim.src_dim = p_session->params.main_dim.src_dim;
268866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->params.thumb_dim.crop = p_session->params.main_dim.crop;
268966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
269066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->client_hdl = client_hdl;
269166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->sessionId = session_id;
269266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->session_handle_q = p_session_handle_q;
269366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->out_buf_q = p_out_buf_q;
269466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
269566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    qdata.p = p_session;
269666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_queue_enq(p_session_handle_q, qdata);
269766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
269866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->meta_enc_key = NULL;
269966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->meta_enc_keylen = 0;
270066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
270166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef MM_JPEG_READ_META_KEYFILE
270266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_read_meta_keyfile(p_session, META_KEYFILE);
270366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
270466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
27051687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    pthread_mutex_lock(&my_obj->job_lock);
27061687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    /* Configure session if not already configured and if
27071687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan       no other session configured*/
27081687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    if ((OMX_FALSE == p_session->config) &&
27091687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      (my_obj->p_session_inprogress == NULL)) {
271066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      rc = mm_jpeg_session_configure(p_session);
271166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      if (rc) {
271266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Error");
27131687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan        pthread_mutex_unlock(&my_obj->job_lock);
271466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        goto error2;
271566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      }
271666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->config = OMX_TRUE;
27171687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan      my_obj->p_session_inprogress = p_session;
271866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
27191687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    pthread_mutex_unlock(&my_obj->job_lock);
272066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->num_omx_sessions = num_omx_sessions;
272166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
272266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("session id %x thumb_from_main %d",
272366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      session_id, p_session->thumb_from_main);
272466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
272566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
272666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  // Queue the output buf indexes
272766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_params->num_dst_bufs; i++) {
272866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    qdata.u32 = i + 1;
272966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_queue_enq(p_out_buf_q, qdata);
273066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
273166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
273266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
273366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
273466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinerror1:
273566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = -1;
273666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinerror2:
273766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL != p_session) {
273866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_INT(trace_tag, 0);
273966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
274066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
274166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
274266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
274366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegenc_destroy_job
274466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
274566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
274666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: Session obj
274766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
274866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
274966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
275066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
275166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
275266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Destroy the job based paramenters
275366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
275466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
275566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpegenc_destroy_job(mm_jpeg_job_session_t *p_session)
275666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
275766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
275866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int i = 0, rc = 0;
275966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
276066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Exif entry count %d %d",
276166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)p_jobparams->exif_info.numOfEntries,
276266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)p_session->exif_count_local);
276366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_session->exif_count_local; i++) {
276466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = releaseExifEntry(&p_session->exif_info_local[i]);
276566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc) {
276666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Exif release failed (%d)", rc);
276766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
276866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
276966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->exif_count_local = 0;
277066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
277166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
277266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
277366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
277466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_encode:
277566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
277666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
277766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: encode session
277866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
277966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
278066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX_ERRORTYPE
278166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
278266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
278366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Start the encoding
278466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
278566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
278666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic void mm_jpegenc_job_done(mm_jpeg_job_session_t *p_session)
278766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
278866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_data_t qdata;
278966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_obj *my_obj = (mm_jpeg_obj *)p_session->jpeg_obj;
279066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t *node = NULL;
279166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
279266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /*Destroy job related params*/
279366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpegenc_destroy_job(p_session);
279466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
279566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /*remove the job*/
279666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_job_id(&my_obj->ongoing_job_q,
279766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->jobId);
279866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (node) {
279966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
280066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
280166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->encoding = OMX_FALSE;
280266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
280366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  // Queue to available sessions
280466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  qdata.p = p_session;
280566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_enq(p_session->session_handle_q, qdata);
280666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
280766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_session->auto_out_buf) {
280866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //Queue out buf index
280966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    qdata.u32 = (uint32_t)(p_session->encode_job.dst_index + 1);
281066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_queue_enq(p_session->out_buf_q, qdata);
281166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
281266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
281366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* wake up jobMgr thread to work on new job if there is any */
281466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  cam_sem_post(&my_obj->job_mgr.job_sem);
281566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
281666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
281766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_destroy_session:
281866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
281966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
282066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
282166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @session_id: session index
282266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
282366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
282466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
282566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
282666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
282766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Destroy the encoding session
282866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
282966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
283066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_destroy_session(mm_jpeg_obj *my_obj,
283166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session)
283266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
283366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_data_t qdata;
283466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
283566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t *node = NULL;
283666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t session_id = 0;
283766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_cur_sess;
283866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  char trace_tag[32];
283966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
284066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == p_session) {
284166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid session");
284266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
284366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
284466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
284566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  session_id = p_session->sessionId;
284666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
284766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&my_obj->job_lock);
284866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
284966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort job if in todo queue */
285066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("abort todo jobs");
285166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->job_mgr.job_queue, session_id);
285266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while (NULL != node) {
285366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
285466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->job_mgr.job_queue, session_id);
285566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
285666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
285766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort job if in ongoing queue */
285866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("abort ongoing jobs");
285966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->ongoing_job_q, session_id);
286066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while (NULL != node) {
286166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
286266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->ongoing_job_q, session_id);
286366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
286466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
286566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort the current session */
286666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_session_abort(p_session);
286766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_session_destroy(p_session);
286866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
286966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_cur_sess = p_session;
287066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
287166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  do {
287266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_remove_session_idx(my_obj, p_cur_sess->sessionId);
287366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  } while (NULL != (p_cur_sess = p_cur_sess->next_session));
287466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
287566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
287666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&my_obj->job_lock);
287766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
287866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while (1) {
287966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    qdata = mm_jpeg_queue_deq(p_session->session_handle_q);
288066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == qdata.p)
288166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      break;
288266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
288366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_deinit(p_session->session_handle_q);
288466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  free(p_session->session_handle_q);
288566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->session_handle_q = NULL;
288666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
288766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while (1) {
288866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    qdata = mm_jpeg_queue_deq(p_session->out_buf_q);
288966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0U == qdata.u32)
289066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      break;
289166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
289266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_deinit(p_session->out_buf_q);
289366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  free(p_session->out_buf_q);
289466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->out_buf_q = NULL;
289566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
289666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
289766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* wake up jobMgr thread to work on new job if there is any */
289866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  cam_sem_post(&my_obj->job_mgr.job_sem);
289966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
290066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  snprintf(trace_tag, sizeof(trace_tag), "Camera:JPEGsession%d", GET_SESSION_IDX(session_id));
290166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ATRACE_INT(trace_tag, 0);
290266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
290366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGH("destroy session successful. X");
290466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
290566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
290666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
290766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
290866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
290966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
291066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
291166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_destroy_session:
291266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
291366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
291466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
291566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @session_id: session index
291666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
291766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
291866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
291966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
292066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
292166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Destroy the encoding session
292266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
292366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
292466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_destroy_session_unlocked(mm_jpeg_obj *my_obj,
292566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session)
292666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
292766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = -1;
292866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t *node = NULL;
292966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t session_id = 0;
293066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == p_session) {
293166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid session");
293266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
293366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
293466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
293566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  session_id = p_session->sessionId;
293666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
293766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort job if in todo queue */
293866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("abort todo jobs");
293966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->job_mgr.job_queue, session_id);
294066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while (NULL != node) {
294166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
294266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->job_mgr.job_queue, session_id);
294366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
294466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
294566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort job if in ongoing queue */
294666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("abort ongoing jobs");
294766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->ongoing_job_q, session_id);
294866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while (NULL != node) {
294966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
295066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->ongoing_job_q, session_id);
295166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
295266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
295366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort the current session */
295466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_session_abort(p_session);
295566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  //mm_jpeg_remove_session_idx(my_obj, session_id);
295666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
295766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
295866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
295966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
296066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_destroy_session:
296166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
296266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
296366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
296466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @session_id: session index
296566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
296666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
296766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
296866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
296966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
297066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Destroy the encoding session
297166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
297266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
297366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_destroy_session_by_id(mm_jpeg_obj *my_obj, uint32_t session_id)
297466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
297566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = mm_jpeg_get_session(my_obj, session_id);
297666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
297766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return mm_jpeg_destroy_session(my_obj, p_session);
297866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
297966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
298066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
298166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
298266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_close:
298366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
298466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
298566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
298666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @client_hdl: client handle
298766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
298866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
298966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
299066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
299166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
299266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Close the jpeg client
299366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
299466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
299566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpeg_close(mm_jpeg_obj *my_obj, uint32_t client_hdl)
299666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
299766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = -1;
299866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint8_t clnt_idx = 0;
299966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int i = 0;
300066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
300166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* check if valid client */
300266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  clnt_idx = mm_jpeg_util_get_index_by_handler(client_hdl);
300366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (clnt_idx >= MAX_JPEG_CLIENT_NUM) {
300466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid client with handler (%d)", client_hdl);
300566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
300666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
300766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
300866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("E");
300966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
301066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort all jobs from the client */
301166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&my_obj->job_lock);
301266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
301366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < MM_JPEG_MAX_SESSION; i++) {
301466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (OMX_TRUE == my_obj->clnt_mgr[clnt_idx].session[i].active)
301566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      mm_jpeg_destroy_session_unlocked(my_obj,
301666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        &my_obj->clnt_mgr[clnt_idx].session[i]);
301766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
301866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
301966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef LOAD_ADSP_RPC_LIB
302066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL != my_obj->adsprpc_lib_handle) {
302166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    dlclose(my_obj->adsprpc_lib_handle);
302266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    my_obj->adsprpc_lib_handle = NULL;
302366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
302466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
302566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
302666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&my_obj->job_lock);
302766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
302866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* invalidate client session */
302966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_destroy(&my_obj->clnt_mgr[clnt_idx].lock);
303066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&my_obj->clnt_mgr[clnt_idx], 0, sizeof(mm_jpeg_client_t));
303166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
303266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = 0;
303366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("X");
303466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
303566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
303666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
303766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_ebd(OMX_HANDLETYPE hComponent,
303866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_PTR pAppData,
303966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_BUFFERHEADERTYPE *pBuffer)
304066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
304166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = (mm_jpeg_job_session_t *) pAppData;
304266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
304366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGH("count %d ", p_session->ebd_count);
304466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
304566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->ebd_count++;
304666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
304766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return 0;
304866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
304966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
305066f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_fbd(OMX_HANDLETYPE hComponent,
305166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_PTR pAppData,
305266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_BUFFERHEADERTYPE *pBuffer)
305366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
305466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
305566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = (mm_jpeg_job_session_t *) pAppData;
305666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_output_t output_buf;
305766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGI("count %d ", p_session->fbd_count);
305866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGI("KPI Perf] : PROFILE_JPEG_FBD");
305966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
306066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
306166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  KPI_ATRACE_INT("Camera:JPEG",
306266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (int32_t)((uint32_t)GET_SESSION_IDX(
306366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        p_session->sessionId)<<16 | --p_session->job_index));
306466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (MM_JPEG_ABORT_NONE != p_session->abort_state) {
306566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
306666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
306766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
306866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef MM_JPEG_DUMP_OUT_BS
306966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  char filename[256];
307066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  static int bsc;
307166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  snprintf(filename, sizeof(filename),
307266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      QCAMERA_DUMP_FRM_LOCATION"jpeg/mm_jpeg_bs%d.jpg", bsc++);
307366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  DUMP_TO_FILE(filename,
307466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pBuffer->pBuffer,
307566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (size_t)(uint32_t)pBuffer->nFilledLen);
307666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
307766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
307866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->fbd_count++;
307966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL != p_session->params.jpeg_cb) {
308066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
308166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->job_status = JPEG_JOB_STATUS_DONE;
308266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    output_buf.buf_filled_len = (uint32_t)pBuffer->nFilledLen;
308366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    output_buf.buf_vaddr = pBuffer->pBuffer;
308466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    output_buf.fd = -1;
308566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("send jpeg callback %d buf 0x%p len %u JobID %u",
308666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->job_status, pBuffer->pBuffer,
308766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      (unsigned int)pBuffer->nFilledLen, p_session->jobId);
308866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->params.jpeg_cb(p_session->job_status,
308966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->client_hdl,
309066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->jobId,
309166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      &output_buf,
309266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->params.userdata);
309366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
309466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpegenc_job_done(p_session);
309566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
309666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_put_mem((void *)p_session);
309766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
309866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
309966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
310066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
310166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
310266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
310366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
310466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
310566f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpeg_event_handler(OMX_HANDLETYPE hComponent,
310666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_PTR pAppData,
310766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_EVENTTYPE eEvent,
310866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_U32 nData1,
310966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_U32 nData2,
311066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_PTR pEventData)
311166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
311266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = (mm_jpeg_job_session_t *) pAppData;
311366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
311466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("%d %d %d state %d", eEvent, (int)nData1,
311566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)nData2, p_session->abort_state);
311666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
311766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
311866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
311966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (MM_JPEG_ABORT_INIT == p_session->abort_state) {
312066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->abort_state = MM_JPEG_ABORT_DONE;
312166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_signal(&p_session->cond);
312266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
312366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return OMX_ErrorNone;
312466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
312566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
312666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (eEvent == OMX_EventError) {
312766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->error_flag = nData2;
312866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_session->encoding == OMX_TRUE) {
312966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error during encoding");
313066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
313166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      /* send jpeg callback */
313266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      if (NULL != p_session->params.jpeg_cb) {
313366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        p_session->job_status = JPEG_JOB_STATUS_ERROR;
313466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("send jpeg error callback %d",
313566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          p_session->job_status);
313666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        p_session->params.jpeg_cb(p_session->job_status,
313766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          p_session->client_hdl,
313866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          p_session->jobId,
313966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          NULL,
314066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          p_session->params.userdata);
314166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      }
314266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
314366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      /* remove from ready queue */
314466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      mm_jpegenc_job_done(p_session);
314566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
314666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_signal(&p_session->cond);
314766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  } else if (eEvent == OMX_EventCmdComplete) {
314866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_session->state_change_pending == OMX_TRUE) {
314966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->state_change_pending = OMX_FALSE;
315066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      pthread_cond_signal(&p_session->cond);
315166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
315266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
315366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
315466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
315566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return OMX_ErrorNone;
315666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
315766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
315866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
315966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
316066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* remove the first job from the queue with matching client handle */
316166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_by_client_id(
316266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_t* queue, uint32_t client_hdl)
316366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
316466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_node_t* node = NULL;
316566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* data = NULL;
316666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* job_node = NULL;
316766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  struct cam_list *head = NULL;
316866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  struct cam_list *pos = NULL;
316966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
317066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&queue->lock);
317166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  head = &queue->head.list;
317266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pos = head->next;
317366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while(pos != head) {
317466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node = member_of(pos, mm_jpeg_q_node_t, list);
317566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    data = (mm_jpeg_job_q_node_t *)node->data.p;
317666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
317766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (data && (data->enc_info.client_handle == client_hdl)) {
317866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGH("found matching client handle");
317966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      job_node = data;
318066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      cam_list_del_node(&node->list);
318166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      queue->size--;
318266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      free(node);
318366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGH("queue size = %d", queue->size);
318466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      break;
318566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
318666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pos = pos->next;
318766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
318866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
318966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&queue->lock);
319066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
319166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return job_node;
319266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
319366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
319466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* remove the first job from the queue with matching session id */
319566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_by_session_id(
319666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_t* queue, uint32_t session_id)
319766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
319866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_node_t* node = NULL;
319966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* data = NULL;
320066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* job_node = NULL;
320166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  struct cam_list *head = NULL;
320266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  struct cam_list *pos = NULL;
320366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
320466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&queue->lock);
320566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  head = &queue->head.list;
320666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pos = head->next;
320766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while(pos != head) {
320866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node = member_of(pos, mm_jpeg_q_node_t, list);
320966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    data = (mm_jpeg_job_q_node_t *)node->data.p;
321066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
321166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (data && (data->enc_info.encode_job.session_id == session_id)) {
321266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGH("found matching session id");
321366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      job_node = data;
321466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      cam_list_del_node(&node->list);
321566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      queue->size--;
321666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      free(node);
321766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGH("queue size = %d", queue->size);
321866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      break;
321966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
322066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pos = pos->next;
322166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
322266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
322366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&queue->lock);
322466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
322566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return job_node;
322666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
322766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
322866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* remove job from the queue with matching job id */
322966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_by_job_id(
323066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_t* queue, uint32_t job_id)
323166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
323266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_node_t* node = NULL;
323366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* data = NULL;
323466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* job_node = NULL;
323566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  struct cam_list *head = NULL;
323666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  struct cam_list *pos = NULL;
323766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t lq_job_id;
323866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
323966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&queue->lock);
324066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  head = &queue->head.list;
324166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pos = head->next;
324266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while(pos != head) {
324366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node = member_of(pos, mm_jpeg_q_node_t, list);
324466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    data = (mm_jpeg_job_q_node_t *)node->data.p;
324566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
324666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(NULL == data) {
324766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Data is NULL");
324866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      pthread_mutex_unlock(&queue->lock);
324966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return NULL;
325066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
325166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
325266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (data->type == MM_JPEG_CMD_TYPE_DECODE_JOB) {
325366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      lq_job_id = data->dec_info.job_id;
325466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
325566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      lq_job_id = data->enc_info.job_id;
325666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
325766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
325866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (data && (lq_job_id == job_id)) {
325966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGD("found matching job id");
326066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      job_node = data;
326166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      cam_list_del_node(&node->list);
326266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      queue->size--;
326366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      free(node);
326466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      break;
326566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
326666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pos = pos->next;
326766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
326866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
326966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&queue->lock);
327066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
327166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return job_node;
327266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
327366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
327466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* remove job from the queue with matching job id */
327566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_unlk(
327666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_queue_t* queue, uint32_t job_id)
327766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
327866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_node_t* node = NULL;
327966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* data = NULL;
328066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* job_node = NULL;
328166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  struct cam_list *head = NULL;
328266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  struct cam_list *pos = NULL;
328366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
328466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  head = &queue->head.list;
328566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pos = head->next;
328666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while(pos != head) {
328766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node = member_of(pos, mm_jpeg_q_node_t, list);
328866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    data = (mm_jpeg_job_q_node_t *)node->data.p;
328966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
329066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (data && (data->enc_info.job_id == job_id)) {
329166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      job_node = data;
329266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      cam_list_del_node(&node->list);
329366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      queue->size--;
329466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      free(node);
329566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      break;
329666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
329766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pos = pos->next;
329866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
329966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
330066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return job_node;
330166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
3302