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