166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2013-2014, 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
3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// JPEG dependencies
3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg_dbg.h"
3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg_interface.h"
3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg.h"
3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg_inlines.h"
3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3966f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpegdec_ebd(OMX_HANDLETYPE hComponent,
4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_PTR pAppData,
4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_BUFFERHEADERTYPE *pBuffer);
4266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpegdec_fbd(OMX_HANDLETYPE hComponent,
4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_PTR pAppData,
4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_BUFFERHEADERTYPE* pBuffer);
4566f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpegdec_event_handler(OMX_HANDLETYPE hComponent,
4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_PTR pAppData,
4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_EVENTTYPE eEvent,
4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_U32 nData1,
4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_U32 nData2,
5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_PTR pEventData);
5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_destroy_job
5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: Session obj
5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Destroy the job based paramenters
6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_jpegdec_destroy_job(mm_jpeg_job_session_t *p_session)
6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_job_done:
7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: decode session
7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX_ERRORTYPE
7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Finalize the job
8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic void mm_jpegdec_job_done(mm_jpeg_job_session_t *p_session)
8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_obj *my_obj = (mm_jpeg_obj *)p_session->jpeg_obj;
8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t *node = NULL;
8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /*Destroy job related params*/
9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpegdec_destroy_job(p_session);
9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /*remove the job*/
9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_job_id(&my_obj->ongoing_job_q,
9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->jobId);
9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (node) {
9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->encoding = OMX_FALSE;
9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* wake up jobMgr thread to work on new job if there is any */
10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  cam_sem_post(&my_obj->job_mgr.job_sem);
10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_session_send_buffers:
10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @data: job session
10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Send the buffers to OMX layer
11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
11766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpegdec_session_send_buffers(void *data)
11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t i = 0;
12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t* p_session = (mm_jpeg_job_session_t *)data;
12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_BUFFER_INFO lbuffer_info;
12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_decode_params_t *p_params = &p_session->dec_params;
12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&lbuffer_info, 0x0, sizeof(QOMX_BUFFER_INFO));
12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_params->num_src_bufs; i++) {
12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Source buffer %d", i);
12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    lbuffer_info.fd = (OMX_U32)p_params->src_main_buf[i].fd;
12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_UseBuffer(p_session->omx_handle, &(p_session->p_in_omx_buf[i]), 0,
13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      &lbuffer_info, p_params->src_main_buf[i].buf_size,
13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_params->src_main_buf[i].buf_vaddr);
13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error %d", ret);
13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Exit");
13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_free_buffers:
14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @data: job session
14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Free the buffers from OMX layer
15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
15466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpegdec_session_free_buffers(void *data)
15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t i = 0;
15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t* p_session = (mm_jpeg_job_session_t *)data;
15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_decode_params_t *p_params = &p_session->dec_params;
16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_params->num_src_bufs; i++) {
16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Source buffer %d", i);
16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_FreeBuffer(p_session->omx_handle, 0, p_session->p_in_omx_buf[i]);
16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error %d", ret);
16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_params->num_dst_bufs; i++) {
17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Dest buffer %d", i);
17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_FreeBuffer(p_session->omx_handle, 1, p_session->p_out_omx_buf[i]);
17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error");
17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Exit");
17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_session_create:
18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error types
18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Create a jpeg encode session
19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
19466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpegdec_session_create(mm_jpeg_job_session_t* p_session)
19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = OMX_ErrorNone;
19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_init(&p_session->lock, NULL);
19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_cond_init(&p_session->cond, NULL);
20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  cirq_reset(&p_session->cb_q);
20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->state_change_pending = OMX_FALSE;
20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->abort_state = MM_JPEG_ABORT_NONE;
20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->error_flag = OMX_ErrorNone;
20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->ebd_count = 0;
20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->fbd_count = 0;
20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->encode_pid = -1;
20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->config = OMX_FALSE;
20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->omx_callbacks.EmptyBufferDone = mm_jpegdec_ebd;
21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->omx_callbacks.FillBufferDone = mm_jpegdec_fbd;
21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->omx_callbacks.EventHandler = mm_jpegdec_event_handler;
21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->exif_count_local = 0;
21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_GetHandle(&p_session->omx_handle,
21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    "OMX.qcom.image.jpeg.decoder",
21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (void *)p_session,
21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_session->omx_callbacks);
21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != rc) {
22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("OMX_GetHandle failed (%d)", rc);
22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_session_destroy:
22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       none
23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Destroy a jpeg encode session
23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_jpegdec_session_destroy(mm_jpeg_job_session_t* p_session)
23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = OMX_ErrorNone;
24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("E");
24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == p_session->omx_handle) {
24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid handle");
24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return;
24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_session_change_state(p_session, OMX_StateIdle, NULL);
24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc) {
25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_session_change_state(p_session, OMX_StateLoaded,
25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpegdec_session_free_buffers);
25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc) {
25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = OMX_FreeHandle(p_session->omx_handle);
26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("OMX_FreeHandle failed (%d)", rc);
26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->omx_handle = NULL;
26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_destroy(&p_session->lock);
26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_cond_destroy(&p_session->cond);
26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("X");
26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_config_port:
27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure OMX ports
28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
28366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpegdec_session_config_ports(mm_jpeg_job_session_t* p_session)
28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_decode_params_t *p_params = &p_session->dec_params;
28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_decode_job_t *p_jobparams = &p_session->decode_job;
28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_buf_t *p_src_buf =
29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_params->src_main_buf[p_jobparams->src_index];
29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.nPortIndex = 0;
29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->outputPort.nPortIndex = 1;
29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_GetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_session->inputPort);
29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("failed");
30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_GetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_session->outputPort);
30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("failed");
30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.format.image.nFrameWidth =
31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (OMX_U32)p_jobparams->main_dim.src_dim.width;
31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.format.image.nFrameHeight =
31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (OMX_U32)p_jobparams->main_dim.src_dim.height;
31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.format.image.nStride =
31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_src_buf->offset.mp[0].stride;
31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.format.image.nSliceHeight =
31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (OMX_U32)p_src_buf->offset.mp[0].scanline;
31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.format.image.eColorFormat =
31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    map_jpeg_format(p_params->color_format);
32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.nBufferSize =
32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_params->src_main_buf[p_jobparams->src_index].buf_size;
32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->inputPort.nBufferCountActual = (OMX_U32)p_params->num_src_bufs;
32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    &p_session->inputPort);
32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("failed");
32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_session_config_main:
33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: job session
33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX error values
34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure main image
34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
34666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpegdec_session_config_main(mm_jpeg_job_session_t *p_session)
34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE rc = OMX_ErrorNone;
34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* config port */
35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("config port");
35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpegdec_session_config_ports(p_session);
35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != rc) {
35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config port failed");
35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* TODO: config crop */
36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_session_configure:
36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @data: encode session
36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       none
37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Configure the session
37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic OMX_ERRORTYPE mm_jpegdec_session_configure(mm_jpeg_job_session_t *p_session)
37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("E ");
38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  MM_JPEG_CHK_ABORT(p_session, ret, error);
38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* config main img */
38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpegdec_session_config_main(p_session);
38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("config main img failed");
38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* TODO: common config (if needed) */
39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_session_change_state(p_session, OMX_StateIdle,
39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpegdec_session_send_buffers);
39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("change state to idle failed %d", ret);
39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpeg_session_change_state(p_session, OMX_StateExecuting,
40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    NULL);
40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("change state to executing failed %d", ret);
40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinerror:
40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("X ret %d", ret);
40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic OMX_ERRORTYPE mm_jpeg_session_port_enable(
41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_job_session_t *p_session,
41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_U32 nPortIndex,
41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_BOOL wait)
41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_EVENTTYPE lEvent;
41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->event_pending = OMX_TRUE;
42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SendCommand(p_session->omx_handle, OMX_CommandPortEnable,
42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      nPortIndex, NULL);
42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("failed");
42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (wait == OMX_TRUE) {
43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Wait for cmd complete
43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_lock(&p_session->lock);
43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_session->event_pending == OMX_TRUE) {
43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGD("before wait");
43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      pthread_cond_wait(&p_session->cond, &p_session->lock);
43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      lEvent = p_session->omxEvent;
43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGD("after wait");
44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    lEvent = p_session->omxEvent;
44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (lEvent != OMX_EventCmdComplete) {
44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGD("Unexpected event %d",lEvent);
44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return OMX_ErrorUndefined;
44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return OMX_ErrorNone;
45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic OMX_ERRORTYPE mm_jpeg_session_port_disable(
45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_job_session_t *p_session,
45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_U32 nPortIndex,
45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OMX_BOOL wait)
45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_EVENTTYPE lEvent;
45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->event_pending = OMX_TRUE;
46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_SendCommand(p_session->omx_handle, OMX_CommandPortDisable,
46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      nPortIndex, NULL);
46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("failed");
46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (wait == OMX_TRUE) {
47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Wait for cmd complete
47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_lock(&p_session->lock);
47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_session->event_pending == OMX_TRUE) {
47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGD("before wait");
47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      pthread_cond_wait(&p_session->cond, &p_session->lock);
47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGD("after wait");
47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    lEvent = p_session->omxEvent;
48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (lEvent != OMX_EventCmdComplete) {
48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGD("Unexpected event %d",lEvent);
48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return OMX_ErrorUndefined;
48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return OMX_ErrorNone;
48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_session_decode:
49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session: encode session
49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       OMX_ERRORTYPE
49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Start the encoding
50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic OMX_ERRORTYPE mm_jpegdec_session_decode(mm_jpeg_job_session_t *p_session)
50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_decode_params_t *p_params = &p_session->dec_params;
50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_decode_job_t *p_jobparams = &p_session->decode_job;
50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_EVENTTYPE lEvent;
51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t i;
51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QOMX_BUFFER_INFO lbuffer_info;
51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->abort_state = MM_JPEG_ABORT_NONE;
51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->encoding = OMX_FALSE;
51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_FALSE == p_session->config) {
51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = mm_jpegdec_session_configure(p_session);
52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error");
52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      goto error;
52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->config = OMX_TRUE;
52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->encoding = OMX_TRUE;
52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  MM_JPEG_CHK_ABORT(p_session, ret, error);
53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->event_pending = OMX_TRUE;
53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_EmptyThisBuffer(p_session->omx_handle,
53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->p_in_omx_buf[p_jobparams->src_index]);
53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  // Wait for port settings changed
54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_session->event_pending == OMX_TRUE) {
54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("before wait");
54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_wait(&p_session->cond, &p_session->lock);
54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  lEvent = p_session->omxEvent;
54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("after wait");
55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (lEvent != OMX_EventPortSettingsChanged) {
55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Unexpected event %d",lEvent);
55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  // Disable output port (wait)
55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_session_port_disable(p_session,
55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->outputPort.nPortIndex,
56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      OMX_TRUE);
56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  // Get port definition
56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_GetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      &p_session->outputPort);
56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("failed");
56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  // Set port definition
57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->outputPort.format.image.nFrameWidth =
57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (OMX_U32)p_jobparams->main_dim.dst_dim.width;
57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->outputPort.format.image.nFrameHeight =
57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (OMX_U32)p_jobparams->main_dim.dst_dim.height;
57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->outputPort.format.image.eColorFormat =
57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    map_jpeg_format(p_params->color_format);
57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->outputPort.nBufferSize =
57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin     p_params->dest_buf[p_jobparams->dst_index].buf_size;
58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   p_session->outputPort.nBufferCountActual = (OMX_U32)p_params->num_dst_bufs;
58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   p_session->outputPort.format.image.nSliceHeight =
58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       (OMX_U32)
58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       p_params->dest_buf[p_jobparams->dst_index].offset.mp[0].scanline;
58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   p_session->outputPort.format.image.nStride =
58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       p_params->dest_buf[p_jobparams->dst_index].offset.mp[0].stride;
58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   ret = OMX_SetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin     &p_session->outputPort);
59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   if (ret) {
59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin     LOGE("failed");
59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin     return ret;
59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   }
59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  // Enable port (no wait)
59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_session_port_enable(p_session,
59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->outputPort.nPortIndex,
59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      OMX_FALSE);
59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(&lbuffer_info, 0x0, sizeof(QOMX_BUFFER_INFO));
60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  // Use buffers
60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  for (i = 0; i < p_params->num_dst_bufs; i++) {
60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    lbuffer_info.fd = (OMX_U32)p_params->dest_buf[i].fd;
60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Dest buffer %d", (unsigned int)i);
60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ret = OMX_UseBuffer(p_session->omx_handle, &(p_session->p_out_omx_buf[i]),
60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        1, &lbuffer_info, p_params->dest_buf[i].buf_size,
60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        p_params->dest_buf[i].buf_vaddr);
60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ret) {
60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Error");
61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      return ret;
61166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
61266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
61366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
61466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  // Wait for port enable completion
61566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
61666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (p_session->event_pending == OMX_TRUE) {
61766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("before wait");
61866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_wait(&p_session->cond, &p_session->lock);
61966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    lEvent = p_session->omxEvent;
62066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("after wait");
62166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
62266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  lEvent = p_session->omxEvent;
62366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
62466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
62566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (lEvent != OMX_EventCmdComplete) {
62666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Unexpected event %d",lEvent);
62766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
62866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
62966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
63066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = OMX_FillThisBuffer(p_session->omx_handle,
63166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->p_out_omx_buf[p_jobparams->dst_index]);
63266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
63366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
63466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
63566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
63666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
63766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  MM_JPEG_CHK_ABORT(p_session, ret, error);
63866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
63966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinerror:
64066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
64166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("X ");
64266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
64366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
64466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
64566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_process_decoding_job:
64666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
64766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
64866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg client
64966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @job_node: job node
65066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
65166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
65266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success -1 otherwise
65366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
65466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
65566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Start the encoding job
65666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
65766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
65866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpegdec_process_decoding_job(mm_jpeg_obj *my_obj, mm_jpeg_job_q_node_t* job_node)
65966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
66066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_data_t qdata;
66166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
66266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
66366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = NULL;
66466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
66566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* check if valid session */
66666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session = mm_jpeg_get_session(my_obj, job_node->dec_info.job_id);
66766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == p_session) {
66866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid job id %x",
66966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      job_node->dec_info.job_id);
67066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
67166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
67266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
67366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* sent encode cmd to OMX, queue job into ongoing queue */
67466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  qdata.p = job_node;
67566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_queue_enq(&my_obj->ongoing_job_q, qdata);
67666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (rc) {
67766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("jpeg enqueue failed %d", ret);
67866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
67966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
68066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
68166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->decode_job = job_node->dec_info.decode_job;
68266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->jobId = job_node->dec_info.job_id;
68366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpegdec_session_decode(p_session);
68466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (ret) {
68566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("encode session failed");
68666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto error;
68766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
68866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
68966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Success X ");
69066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
69166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
69266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinerror:
69366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
69466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((OMX_ErrorNone != ret) &&
69566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (NULL != p_session->dec_params.jpeg_cb)) {
69666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->job_status = JPEG_JOB_STATUS_ERROR;
69766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("send jpeg error callback %d",
69866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->job_status);
69966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->dec_params.jpeg_cb(p_session->job_status,
70066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->client_hdl,
70166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->jobId,
70266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      NULL,
70366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->dec_params.userdata);
70466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
70566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
70666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /*remove the job*/
70766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpegdec_job_done(p_session);
70866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Error X ");
70966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
71066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
71166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
71266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
71366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpeg_start_decode_job:
71466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
71566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
71666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
71766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @client_hdl: client handle
71866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @job: pointer to encode job
71966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @jobId: job id
72066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
72166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
72266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
72366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
72466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
72566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Start the encoding job
72666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
72766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
72866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpegdec_start_decode_job(mm_jpeg_obj *my_obj,
72966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_t *job,
73066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t *job_id)
73166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
73266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_q_data_t qdata;
73366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = -1;
73466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint8_t session_idx = 0;
73566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint8_t client_idx = 0;
73666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t* node = NULL;
73766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = NULL;
73866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_decode_job_t *p_jobparams  = &job->decode_job;
73966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
74066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  *job_id = 0;
74166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
74266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* check if valid session */
74366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  session_idx = GET_SESSION_IDX(p_jobparams->session_id);
74466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  client_idx = GET_CLIENT_IDX(p_jobparams->session_id);
74566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("session_idx %d client idx %d",
74666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    session_idx, client_idx);
74766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
74866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((session_idx >= MM_JPEG_MAX_SESSION) ||
74966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (client_idx >= MAX_JPEG_CLIENT_NUM)) {
75066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid session id %x",
75166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      job->decode_job.session_id);
75266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
75366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
75466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
75566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session = &my_obj->clnt_mgr[client_idx].session[session_idx];
75666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_FALSE == p_session->active) {
75766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("session not active %x",
75866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      job->decode_job.session_id);
75966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
76066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
76166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
76266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((p_jobparams->src_index >= (int32_t)p_session->dec_params.num_src_bufs) ||
76366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (p_jobparams->dst_index >= (int32_t)p_session->dec_params.num_dst_bufs)) {
76466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid buffer indices");
76566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
76666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
76766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
76866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* enqueue new job into todo job queue */
76966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = (mm_jpeg_job_q_node_t *)malloc(sizeof(mm_jpeg_job_q_node_t));
77066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == node) {
77166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("No memory for mm_jpeg_job_q_node_t");
77266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
77366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
77466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
77566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  *job_id = job->decode_job.session_id |
77666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ((p_session->job_hist++ % JOB_HIST_MAX) << 16);
77766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
77866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  memset(node, 0, sizeof(mm_jpeg_job_q_node_t));
77966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node->dec_info.decode_job = job->decode_job;
78066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node->dec_info.job_id = *job_id;
78166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node->dec_info.client_handle = p_session->client_hdl;
78266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node->type = MM_JPEG_CMD_TYPE_DECODE_JOB;
78366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
78466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  qdata.p = node;
78566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_queue_enq(&my_obj->job_mgr.job_queue, qdata);
78666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 == rc) {
78766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_sem_post(&my_obj->job_mgr.job_sem);
78866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
78966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
79066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
79166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
79266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
79366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_create_session:
79466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
79566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
79666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
79766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @client_hdl: client handle
79866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_params: pointer to encode params
79966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @p_session_id: session id
80066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
80166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
80266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
80366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
80466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
80566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Start the encoding session
80666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
80766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
80866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpegdec_create_session(mm_jpeg_obj *my_obj,
80966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t client_hdl,
81066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_decode_params_t *p_params,
81166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t* p_session_id)
81266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
81366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
81466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
81566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint8_t clnt_idx = 0;
81666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int session_idx = -1;
81766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = NULL;
81866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  *p_session_id = 0;
81966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
82066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* validate the parameters */
82166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if ((p_params->num_src_bufs > MM_JPEG_MAX_BUF)
82266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    || (p_params->num_dst_bufs > MM_JPEG_MAX_BUF)) {
82366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid num buffers");
82466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
82566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
82666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
82766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* check if valid client */
82866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  clnt_idx = mm_jpeg_util_get_index_by_handler(client_hdl);
82966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (clnt_idx >= MAX_JPEG_CLIENT_NUM) {
83066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid client with handler (%d)", client_hdl);
83166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
83266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
83366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
83466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  session_idx = mm_jpeg_get_new_session_idx(my_obj, clnt_idx, &p_session);
83566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (session_idx < 0) {
83666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid session id (%d)", session_idx);
83766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
83866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
83966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
84066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  ret = mm_jpegdec_session_create(p_session);
84166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != ret) {
84266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->active = OMX_FALSE;
84366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("jpeg session create failed");
84466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
84566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
84666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
84766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  *p_session_id = (JOB_ID_MAGICVAL << 24) |
84866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ((unsigned)session_idx << 8) | clnt_idx;
84966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
85066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /*copy the params*/
85166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->dec_params = *p_params;
85266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->client_hdl = client_hdl;
85366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->sessionId = *p_session_id;
85466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->jpeg_obj = (void*)my_obj; /* save a ptr to jpeg_obj */
85566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("session id %x", *p_session_id);
85666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
85766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
85866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
85966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
86066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_destroy_session:
86166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
86266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
86366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
86466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @session_id: session index
86566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
86666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
86766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
86866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
86966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
87066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Destroy the encoding session
87166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
87266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
87366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpegdec_destroy_session(mm_jpeg_obj *my_obj,
87466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session)
87566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
87666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
87766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t *node = NULL;
87866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
87966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == p_session) {
88066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("invalid session");
88166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
88266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
88366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t session_id = p_session->sessionId;
88466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&my_obj->job_lock);
88566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
88666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort job if in todo queue */
88766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("abort todo jobs");
88866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->job_mgr.job_queue, session_id);
88966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while (NULL != node) {
89066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
89166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->job_mgr.job_queue, session_id);
89266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
89366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
89466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort job if in ongoing queue */
89566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("abort ongoing jobs");
89666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->ongoing_job_q, session_id);
89766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  while (NULL != node) {
89866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
89966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->ongoing_job_q, session_id);
90066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
90166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
90266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort the current session */
90366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_session_abort(p_session);
90466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpegdec_session_destroy(p_session);
90566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_remove_session_idx(my_obj, session_id);
90666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&my_obj->job_lock);
90766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
90866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* wake up jobMgr thread to work on new job if there is any */
90966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  cam_sem_post(&my_obj->job_mgr.job_sem);
91066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("X");
91166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
91266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
91366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
91466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
91566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_destroy_session_by_id:
91666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
91766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
91866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
91966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @session_id: session index
92066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
92166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
92266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
92366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
92466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
92566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Destroy the encoding session
92666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
92766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
92866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpegdec_destroy_session_by_id(mm_jpeg_obj *my_obj, uint32_t session_id)
92966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
93066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
93166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = mm_jpeg_get_session(my_obj, session_id);
93266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
93366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL == p_session) {
93466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("session is not valid");
93566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
93666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
93766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
93866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return mm_jpegdec_destroy_session(my_obj, p_session);
93966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
94066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
94166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
94266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
94366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpegdec_ebd(OMX_HANDLETYPE hComponent,
94466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_PTR pAppData,
94566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_BUFFERHEADERTYPE *pBuffer)
94666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
94766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = (mm_jpeg_job_session_t *) pAppData;
94866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
94966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("count %d ", p_session->ebd_count);
95066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
95166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->ebd_count++;
95266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
95366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return 0;
95466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
95566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
95666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpegdec_fbd(OMX_HANDLETYPE hComponent,
95766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_PTR pAppData,
95866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_BUFFERHEADERTYPE *pBuffer)
95966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
96066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_ERRORTYPE ret = OMX_ErrorNone;
96166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = (mm_jpeg_job_session_t *) pAppData;
96266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_output_t output_buf;
96366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
96466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("count %d ", p_session->fbd_count);
96566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
96666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
96766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
96866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (MM_JPEG_ABORT_NONE != p_session->abort_state) {
96966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
97066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ret;
97166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
97266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
97366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->fbd_count++;
97466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL != p_session->dec_params.jpeg_cb) {
97566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->job_status = JPEG_JOB_STATUS_DONE;
97666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    output_buf.buf_filled_len = (uint32_t)pBuffer->nFilledLen;
97766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    output_buf.buf_vaddr = pBuffer->pBuffer;
97866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    output_buf.fd = -1;
97966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("send jpeg callback %d",
98066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->job_status);
98166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->dec_params.jpeg_cb(p_session->job_status,
98266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->client_hdl,
98366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->jobId,
98466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      &output_buf,
98566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      p_session->dec_params.userdata);
98666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
98766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* remove from ready queue */
98866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpegdec_job_done(p_session);
98966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
99066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
99166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Exit");
99266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
99366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return ret;
99466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
99566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
99666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOMX_ERRORTYPE mm_jpegdec_event_handler(OMX_HANDLETYPE hComponent,
99766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_PTR pAppData,
99866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_EVENTTYPE eEvent,
99966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_U32 nData1,
100066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_U32 nData2,
100166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_PTR pEventData)
100266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
100366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = (mm_jpeg_job_session_t *) pAppData;
100466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
100566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("%d %d %d state %d", eEvent, (int)nData1,
100666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    (int)nData2, p_session->abort_state);
100766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
100866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("AppData=%p ", pAppData);
100966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
101066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&p_session->lock);
101166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  p_session->omxEvent = eEvent;
101266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (MM_JPEG_ABORT_INIT == p_session->abort_state) {
101366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->abort_state = MM_JPEG_ABORT_DONE;
101466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_signal(&p_session->cond);
101566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_unlock(&p_session->lock);
101666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return OMX_ErrorNone;
101766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
101866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
101966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (eEvent == OMX_EventError) {
102066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_session->encoding == OMX_TRUE) {
102166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGD("Error during encoding");
102266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
102366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      /* send jpeg callback */
102466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      if (NULL != p_session->dec_params.jpeg_cb) {
102566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        p_session->job_status = JPEG_JOB_STATUS_ERROR;
102666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGD("send jpeg error callback %d",
102766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          p_session->job_status);
102866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        p_session->dec_params.jpeg_cb(p_session->job_status,
102966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          p_session->client_hdl,
103066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          p_session->jobId,
103166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          NULL,
103266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          p_session->dec_params.userdata);
103366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      }
103466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
103566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      /* remove from ready queue */
103666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      mm_jpegdec_job_done(p_session);
103766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
103866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_signal(&p_session->cond);
103966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  } else if (eEvent == OMX_EventCmdComplete) {
104066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->state_change_pending = OMX_FALSE;
104166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->event_pending = OMX_FALSE;
104266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_signal(&p_session->cond);
104366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }  else if (eEvent == OMX_EventPortSettingsChanged) {
104466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session->event_pending = OMX_FALSE;
104566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_signal(&p_session->cond);
104666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
104766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
104866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&p_session->lock);
104966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Exit");
105066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return OMX_ErrorNone;
105166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
105266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
105366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_abort_job:
105466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
105566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
105666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
105766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @client_hdl: client handle
105866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @jobId: job id
105966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
106066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
106166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
106266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
106366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
106466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Abort the encoding session
106566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
106666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
106766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpegdec_abort_job(mm_jpeg_obj *my_obj,
106866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  uint32_t jobId)
106966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
107066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = -1;
107166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_q_node_t *node = NULL;
107266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  mm_jpeg_job_session_t *p_session = NULL;
107366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
107466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Enter");
107566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_lock(&my_obj->job_lock);
107666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
107766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort job if in todo queue */
107866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_job_id(&my_obj->job_mgr.job_queue, jobId);
107966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL != node) {
108066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
108166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto abort_done;
108266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
108366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
108466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* abort job if in ongoing queue */
108566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  node = mm_jpeg_queue_remove_job_by_job_id(&my_obj->ongoing_job_q, jobId);
108666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (NULL != node) {
108766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* find job that is OMX ongoing, ask OMX to abort the job */
108866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    p_session = mm_jpeg_get_session(my_obj, node->dec_info.job_id);
108966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (p_session) {
109066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      mm_jpeg_session_abort(p_session);
109166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
109266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Invalid job id 0x%x",
109366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        node->dec_info.job_id);
109466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
109566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(node);
109666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    goto abort_done;
109766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
109866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
109966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinabort_done:
110066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_unlock(&my_obj->job_lock);
110166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
110266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
110366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
110466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_init:
110566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
110666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
110766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
110866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
110966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
111066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
111166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
111266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
111366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Initializes the jpeg client
111466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
111566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
111666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpegdec_init(mm_jpeg_obj *my_obj)
111766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
111866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
111966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
112066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* init locks */
112166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_init(&my_obj->job_lock, NULL);
112266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
112366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* init ongoing job queue */
112466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_queue_init(&my_obj->ongoing_job_q);
112566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
112666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
112766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
112866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
112966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
113066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* init job semaphore and launch jobmgr thread */
113166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  LOGD("Launch jobmgr thread rc %d", rc);
113266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_jobmgr_thread_launch(my_obj);
113366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
113466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
113566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return -1;
113666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
113766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
113866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* load OMX */
113966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (OMX_ErrorNone != OMX_Init()) {
114066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* roll back in error case */
114166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("OMX_Init failed (%d)", rc);
114266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_jobmgr_thread_release(my_obj);
114366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_queue_deinit(&my_obj->ongoing_job_q);
114466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_destroy(&my_obj->job_lock);
114566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
114666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
114766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
114866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
114966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
115066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/** mm_jpegdec_deinit:
115166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
115266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Arguments:
115366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @my_obj: jpeg object
115466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
115566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Return:
115666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       0 for success else failure
115766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
115866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  Description:
115966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       Deinits the jpeg client
116066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
116166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin **/
116266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_jpegdec_deinit(mm_jpeg_obj *my_obj)
116366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
116466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t rc = 0;
116566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
116666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* release jobmgr thread */
116766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_jobmgr_thread_release(my_obj);
116866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
116966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
117066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
117166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
117266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* unload OMX engine */
117366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  OMX_Deinit();
117466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
117566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* deinit ongoing job and cb queue */
117666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  rc = mm_jpeg_queue_deinit(&my_obj->ongoing_job_q);
117766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (0 != rc) {
117866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE("Error");
117966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
118066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
118166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  /* destroy locks */
118266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  pthread_mutex_destroy(&my_obj->job_lock);
118366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
118466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
118566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
1186