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