summaryrefslogtreecommitdiff
path: root/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg.c')
-rwxr-xr-xcamera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg.c2845
1 files changed, 0 insertions, 2845 deletions
diff --git a/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg.c b/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg.c
deleted file mode 100755
index 805f626..0000000
--- a/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg.c
+++ /dev/null
@@ -1,2845 +0,0 @@
-/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#define ATRACE_TAG ATRACE_TAG_CAMERA
-
-#include <pthread.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/prctl.h>
-#include <fcntl.h>
-#include <poll.h>
-#include <cutils/trace.h>
-
-#include "mm_jpeg_dbg.h"
-#include "mm_jpeg_interface.h"
-#include "mm_jpeg.h"
-#include "mm_jpeg_inlines.h"
-
-#ifdef LOAD_ADSP_RPC_LIB
-#include <dlfcn.h>
-#include <stdlib.h>
-#endif
-
-#define ENCODING_MODE_PARALLEL 1
-#define NUM_OMX_SESSIONS 1;
-
-#define META_KEYFILE "/data/metadata.key"
-
-#define MM_JPG_USE_TURBO_CLOCK (0)
-
-OMX_ERRORTYPE mm_jpeg_ebd(OMX_HANDLETYPE hComponent,
- OMX_PTR pAppData,
- OMX_BUFFERHEADERTYPE* pBuffer);
-OMX_ERRORTYPE mm_jpeg_fbd(OMX_HANDLETYPE hComponent,
- OMX_PTR pAppData,
- OMX_BUFFERHEADERTYPE* pBuffer);
-OMX_ERRORTYPE mm_jpeg_event_handler(OMX_HANDLETYPE hComponent,
- OMX_PTR pAppData,
- OMX_EVENTTYPE eEvent,
- OMX_U32 nData1,
- OMX_U32 nData2,
- OMX_PTR pEventData);
-
-static int32_t mm_jpegenc_destroy_job(mm_jpeg_job_session_t *p_session);
-static void mm_jpegenc_job_done(mm_jpeg_job_session_t *p_session);
-mm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_by_dst_ptr(
- mm_jpeg_queue_t* queue, void * dst_ptr);
-static OMX_ERRORTYPE mm_jpeg_session_configure(mm_jpeg_job_session_t *p_session);
-
-/** mm_jpeg_session_send_buffers:
- *
- * Arguments:
- * @data: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Send the buffers to OMX layer
- *
- **/
-OMX_ERRORTYPE mm_jpeg_session_send_buffers(void *data)
-{
- uint32_t i = 0;
- mm_jpeg_job_session_t* p_session = (mm_jpeg_job_session_t *)data;
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- QOMX_BUFFER_INFO lbuffer_info;
- mm_jpeg_encode_params_t *p_params = &p_session->params;
-
- memset(&lbuffer_info, 0x0, sizeof(QOMX_BUFFER_INFO));
- for (i = 0; i < p_params->num_src_bufs; i++) {
- CDBG("%s:%d] Source buffer %d", __func__, __LINE__, i);
- lbuffer_info.fd = (OMX_U32)p_params->src_main_buf[i].fd;
- ret = OMX_UseBuffer(p_session->omx_handle, &(p_session->p_in_omx_buf[i]), 0,
- &lbuffer_info, p_params->src_main_buf[i].buf_size,
- p_params->src_main_buf[i].buf_vaddr);
- if (ret) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, ret);
- return ret;
- }
- }
-
- for (i = 0; i < p_params->num_tmb_bufs; i++) {
- CDBG("%s:%d] Source buffer %d", __func__, __LINE__, i);
- lbuffer_info.fd = (OMX_U32)p_params->src_thumb_buf[i].fd;
- ret = OMX_UseBuffer(p_session->omx_handle,
- &(p_session->p_in_omx_thumb_buf[i]), 2,
- &lbuffer_info, p_params->src_thumb_buf[i].buf_size,
- p_params->src_thumb_buf[i].buf_vaddr);
- if (ret) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, ret);
- return ret;
- }
- }
-
- for (i = 0; i < p_params->num_dst_bufs; i++) {
- CDBG("%s:%d] Dest buffer %d", __func__, __LINE__, i);
- ret = OMX_UseBuffer(p_session->omx_handle, &(p_session->p_out_omx_buf[i]),
- 1, NULL, p_params->dest_buf[i].buf_size,
- p_params->dest_buf[i].buf_vaddr);
- if (ret) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- return ret;
- }
- }
- CDBG("%s:%d]", __func__, __LINE__);
- return ret;
-}
-
-
-/** mm_jpeg_session_free_buffers:
- *
- * Arguments:
- * @data: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Free the buffers from OMX layer
- *
- **/
-OMX_ERRORTYPE mm_jpeg_session_free_buffers(void *data)
-{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- uint32_t i = 0;
- mm_jpeg_job_session_t* p_session = (mm_jpeg_job_session_t *)data;
- mm_jpeg_encode_params_t *p_params = &p_session->params;
-
- for (i = 0; i < p_params->num_src_bufs; i++) {
- CDBG("%s:%d] Source buffer %d", __func__, __LINE__, i);
- ret = OMX_FreeBuffer(p_session->omx_handle, 0, p_session->p_in_omx_buf[i]);
- if (ret) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, ret);
- return ret;
- }
- }
-
- for (i = 0; i < p_params->num_tmb_bufs; i++) {
- CDBG("%s:%d] Source buffer %d", __func__, __LINE__, i);
- ret = OMX_FreeBuffer(p_session->omx_handle, 2, p_session->p_in_omx_thumb_buf[i]);
- if (ret) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, ret);
- return ret;
- }
- }
-
- for (i = 0; i < p_params->num_dst_bufs; i++) {
- CDBG("%s:%d] Dest buffer %d", __func__, __LINE__, i);
- ret = OMX_FreeBuffer(p_session->omx_handle, 1, p_session->p_out_omx_buf[i]);
- if (ret) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- return ret;
- }
- }
- CDBG("%s:%d]", __func__, __LINE__);
- return ret;
-}
-
-
-
-
-/** mm_jpeg_session_change_state:
- *
- * Arguments:
- * @p_session: job session
- * @new_state: new state to be transitioned to
- * @p_exec: transition function
- *
- * Return:
- * OMX error values
- *
- * Description:
- * This method is used for state transition
- *
- **/
-OMX_ERRORTYPE mm_jpeg_session_change_state(mm_jpeg_job_session_t* p_session,
- OMX_STATETYPE new_state,
- mm_jpeg_transition_func_t p_exec)
-{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- OMX_STATETYPE current_state;
- CDBG("%s:%d] new_state %d p_exec %p", __func__, __LINE__,
- new_state, p_exec);
-
-
- pthread_mutex_lock(&p_session->lock);
-
- ret = OMX_GetState(p_session->omx_handle, &current_state);
-
- if (ret) {
- pthread_mutex_unlock(&p_session->lock);
- return ret;
- }
-
- if (current_state == new_state) {
- pthread_mutex_unlock(&p_session->lock);
- return OMX_ErrorNone;
- }
-
- p_session->state_change_pending = OMX_TRUE;
- pthread_mutex_unlock(&p_session->lock);
- ret = OMX_SendCommand(p_session->omx_handle, OMX_CommandStateSet,
- new_state, NULL);
- pthread_mutex_lock(&p_session->lock);
- if (ret) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, ret);
- pthread_mutex_unlock(&p_session->lock);
- return OMX_ErrorIncorrectStateTransition;
- }
- CDBG("%s:%d] ", __func__, __LINE__);
- if ((OMX_ErrorNone != p_session->error_flag) &&
- (OMX_ErrorOverflow != p_session->error_flag)) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, p_session->error_flag);
- pthread_mutex_unlock(&p_session->lock);
- return p_session->error_flag;
- }
- if (p_exec) {
- ret = p_exec(p_session);
- if (ret) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, ret);
- pthread_mutex_unlock(&p_session->lock);
- return ret;
- }
- }
- CDBG("%s:%d] ", __func__, __LINE__);
- if (p_session->state_change_pending) {
- CDBG("%s:%d] before wait", __func__, __LINE__);
- pthread_cond_wait(&p_session->cond, &p_session->lock);
- CDBG("%s:%d] after wait", __func__, __LINE__);
- }
- pthread_mutex_unlock(&p_session->lock);
- CDBG("%s:%d] ", __func__, __LINE__);
- return ret;
-}
-
-/** mm_jpeg_session_create:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error types
- *
- * Description:
- * Create a jpeg encode session
- *
- **/
-OMX_ERRORTYPE mm_jpeg_session_create(mm_jpeg_job_session_t* p_session)
-{
- OMX_ERRORTYPE rc = OMX_ErrorNone;
- mm_jpeg_obj *my_obj = (mm_jpeg_obj *) p_session->jpeg_obj;
-
- pthread_mutex_init(&p_session->lock, NULL);
- pthread_cond_init(&p_session->cond, NULL);
- cirq_reset(&p_session->cb_q);
- p_session->state_change_pending = OMX_FALSE;
- p_session->abort_state = MM_JPEG_ABORT_NONE;
- p_session->error_flag = OMX_ErrorNone;
- p_session->ebd_count = 0;
- p_session->fbd_count = 0;
- p_session->encode_pid = -1;
- p_session->config = OMX_FALSE;
- p_session->exif_count_local = 0;
- p_session->auto_out_buf = OMX_FALSE;
-
- p_session->omx_callbacks.EmptyBufferDone = mm_jpeg_ebd;
- p_session->omx_callbacks.FillBufferDone = mm_jpeg_fbd;
- p_session->omx_callbacks.EventHandler = mm_jpeg_event_handler;
-
-
- rc = OMX_GetHandle(&p_session->omx_handle,
- "OMX.qcom.image.jpeg.encoder",
- (void *)p_session,
- &p_session->omx_callbacks);
- if (OMX_ErrorNone != rc) {
- CDBG_ERROR("%s:%d] OMX_GetHandle failed (%d)", __func__, __LINE__, rc);
- return rc;
- }
-
- my_obj->num_sessions++;
-
- return rc;
-}
-
-
-
-/** mm_jpeg_session_destroy:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * none
- *
- * Description:
- * Destroy a jpeg encode session
- *
- **/
-void mm_jpeg_session_destroy(mm_jpeg_job_session_t* p_session)
-{
- OMX_ERRORTYPE rc = OMX_ErrorNone;
- OMX_STATETYPE state;
- mm_jpeg_obj *my_obj = (mm_jpeg_obj *) p_session->jpeg_obj;
-
- CDBG("%s:%d] E", __func__, __LINE__);
- if (NULL == p_session->omx_handle) {
- CDBG_ERROR("%s:%d] invalid handle", __func__, __LINE__);
- return;
- }
-
- rc = OMX_GetState(p_session->omx_handle, &state);
-
- //Check state before state transition
- if ((state == OMX_StateExecuting) || (state == OMX_StatePause)) {
- rc = mm_jpeg_session_change_state(p_session, OMX_StateIdle, NULL);
- if (rc) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- }
- }
-
- rc = OMX_GetState(p_session->omx_handle, &state);
-
- if (state == OMX_StateIdle) {
- rc = mm_jpeg_session_change_state(p_session, OMX_StateLoaded,
- mm_jpeg_session_free_buffers);
- if (rc) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- }
- }
-
- rc = OMX_FreeHandle(p_session->omx_handle);
- if (0 != rc) {
- CDBG_ERROR("%s:%d] OMX_FreeHandle failed (%d)", __func__, __LINE__, rc);
- }
- p_session->omx_handle = NULL;
-
- pthread_mutex_destroy(&p_session->lock);
- pthread_cond_destroy(&p_session->cond);
-
- if (NULL != p_session->meta_enc_key) {
- free(p_session->meta_enc_key);
- p_session->meta_enc_key = NULL;
- }
-
- my_obj->num_sessions--;
-
- // Destroy next session
- if (p_session->next_session) {
- mm_jpeg_session_destroy(p_session->next_session);
- }
-
- CDBG("%s:%d] X", __func__, __LINE__);
-}
-
-
-
-/** mm_jpeg_session_config_main_buffer_offset:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Configure the buffer offsets
- *
- **/
-OMX_ERRORTYPE mm_jpeg_session_config_main_buffer_offset(
- mm_jpeg_job_session_t* p_session)
-{
- OMX_ERRORTYPE rc = 0;
- OMX_INDEXTYPE buffer_index;
- QOMX_YUV_FRAME_INFO frame_info;
- size_t totalSize = 0;
- mm_jpeg_encode_params_t *p_params = &p_session->params;
-
- mm_jpeg_buf_t *p_src_buf =
- &p_params->src_main_buf[0];
-
- memset(&frame_info, 0x0, sizeof(QOMX_YUV_FRAME_INFO));
-
- frame_info.cbcrStartOffset[0] = p_src_buf->offset.mp[0].len;
- frame_info.cbcrStartOffset[1] = p_src_buf->offset.mp[1].len;
- frame_info.yOffset = p_src_buf->offset.mp[0].offset;
- frame_info.cbcrOffset[0] = p_src_buf->offset.mp[1].offset;
- frame_info.cbcrOffset[1] = p_src_buf->offset.mp[2].offset;
- totalSize = p_src_buf->buf_size;
-
- rc = OMX_GetExtensionIndex(p_session->omx_handle,
- QOMX_IMAGE_EXT_BUFFER_OFFSET_NAME, &buffer_index);
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
-
- CDBG_HIGH("%s:%d] yOffset = %d, cbcrOffset = (%d %d), totalSize = %zu,"
- "cbcrStartOffset = (%d %d)", __func__, __LINE__,
- (int)frame_info.yOffset,
- (int)frame_info.cbcrOffset[0],
- (int)frame_info.cbcrOffset[1],
- totalSize,
- (int)frame_info.cbcrStartOffset[0],
- (int)frame_info.cbcrStartOffset[1]);
-
- rc = OMX_SetParameter(p_session->omx_handle, buffer_index, &frame_info);
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
- return rc;
-}
-
-/** mm_jpeg_encoding_mode:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Configure the serial or parallel encoding
- * mode
- *
- **/
-OMX_ERRORTYPE mm_jpeg_encoding_mode(
- mm_jpeg_job_session_t* p_session)
-{
- OMX_ERRORTYPE rc = 0;
- OMX_INDEXTYPE indextype;
- QOMX_ENCODING_MODE encoding_mode;
-
- rc = OMX_GetExtensionIndex(p_session->omx_handle,
- QOMX_IMAGE_EXT_ENCODING_MODE_NAME, &indextype);
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
-
- if (ENCODING_MODE_PARALLEL) {
- encoding_mode = OMX_Parallel_Encoding;
- } else {
- encoding_mode = OMX_Serial_Encoding;
- }
- CDBG_HIGH("%s:%d] encoding mode = %d ", __func__, __LINE__,
- (int)encoding_mode);
- rc = OMX_SetParameter(p_session->omx_handle, indextype, &encoding_mode);
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
- return rc;
-}
-
-/** mm_jpeg_speed_mode:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Configure normal or high speed jpeg
- *
- **/
-OMX_ERRORTYPE mm_jpeg_speed_mode(
- mm_jpeg_job_session_t* p_session)
-{
- OMX_ERRORTYPE rc = 0;
- OMX_INDEXTYPE indextype;
- QOMX_JPEG_SPEED jpeg_speed;
-
- rc = OMX_GetExtensionIndex(p_session->omx_handle,
- QOMX_IMAGE_EXT_JPEG_SPEED_NAME, &indextype);
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
-
- if (MM_JPG_USE_TURBO_CLOCK) {
- jpeg_speed.speedMode = QOMX_JPEG_SPEED_MODE_HIGH;
- } else {
- jpeg_speed.speedMode = QOMX_JPEG_SPEED_MODE_NORMAL;
- }
-
- rc = OMX_SetParameter(p_session->omx_handle, indextype, &jpeg_speed);
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
- return rc;
-}
-
-
-/** mm_jpeg_mem_ops:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Configure the serial or parallel encoding
- * mode
- *
- **/
-OMX_ERRORTYPE mm_jpeg_mem_ops(
- mm_jpeg_job_session_t* p_session)
-{
- OMX_ERRORTYPE rc = 0;
- OMX_INDEXTYPE indextype;
- QOMX_MEM_OPS mem_ops;
- mm_jpeg_encode_params_t *p_params = &p_session->params;
-
- mem_ops.get_memory = p_params->get_memory;
-
- rc = OMX_GetExtensionIndex(p_session->omx_handle,
- QOMX_IMAGE_EXT_MEM_OPS_NAME, &indextype);
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
-
- rc = OMX_SetParameter(p_session->omx_handle, indextype, &mem_ops);
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
- return rc;
-}
-
-/** mm_jpeg_metadata:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Pass meta data
- *
- **/
-OMX_ERRORTYPE mm_jpeg_metadata(
- mm_jpeg_job_session_t* p_session)
-{
- OMX_ERRORTYPE rc = OMX_ErrorNone;
- OMX_INDEXTYPE indexType;
- mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
- QOMX_METADATA lMeta;
-
- rc = OMX_GetExtensionIndex(p_session->omx_handle,
- QOMX_IMAGE_EXT_METADATA_NAME, &indexType);
-
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
-
- lMeta.metadata = (OMX_U8 *)p_jobparams->p_metadata;
- lMeta.metaPayloadSize = sizeof(*p_jobparams->p_metadata);
-
- rc = OMX_SetConfig(p_session->omx_handle, indexType, &lMeta);
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
- return OMX_ErrorNone;
-}
-
-/** mm_jpeg_meta_enc_key:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Pass metadata encrypt key
- *
- **/
-OMX_ERRORTYPE mm_jpeg_meta_enc_key(
- mm_jpeg_job_session_t* p_session)
-{
- OMX_ERRORTYPE rc = OMX_ErrorNone;
- OMX_INDEXTYPE indexType;
- QOMX_META_ENC_KEY lKey;
-
- lKey.metaKey = p_session->meta_enc_key;
- lKey.keyLen = p_session->meta_enc_keylen;
-
- if ((!lKey.metaKey) || (!lKey.keyLen)){
- CDBG_ERROR("%s:%d] Key is invalid", __func__, __LINE__);
- return OMX_ErrorNone;
- }
-
- rc = OMX_GetExtensionIndex(p_session->omx_handle,
- QOMX_IMAGE_EXT_META_ENC_KEY_NAME, &indexType);
-
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
-
- rc = OMX_SetConfig(p_session->omx_handle, indexType, &lKey);
- if (rc != OMX_ErrorNone) {
- CDBG_ERROR("%s:%d] Failed", __func__, __LINE__);
- return rc;
- }
- return OMX_ErrorNone;
-}
-
-/** map_jpeg_format:
- *
- * Arguments:
- * @color_fmt: color format
- *
- * Return:
- * OMX color format
- *
- * Description:
- * Map mmjpeg color format to OMX color format
- *
- **/
-int map_jpeg_format(mm_jpeg_color_format color_fmt)
-{
- switch (color_fmt) {
- case MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2:
- return (int)OMX_QCOM_IMG_COLOR_FormatYVU420SemiPlanar;
- case MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V2:
- return (int)OMX_COLOR_FormatYUV420SemiPlanar;
- case MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V1:
- return (int)OMX_QCOM_IMG_COLOR_FormatYVU422SemiPlanar;
- case MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V1:
- return (int)OMX_COLOR_FormatYUV422SemiPlanar;
- case MM_JPEG_COLOR_FORMAT_YCRCBLP_H1V2:
- return (int)OMX_QCOM_IMG_COLOR_FormatYVU422SemiPlanar_h1v2;
- case MM_JPEG_COLOR_FORMAT_YCBCRLP_H1V2:
- return (int)OMX_QCOM_IMG_COLOR_FormatYUV422SemiPlanar_h1v2;
- case MM_JPEG_COLOR_FORMAT_YCRCBLP_H1V1:
- return (int)OMX_QCOM_IMG_COLOR_FormatYVU444SemiPlanar;
- case MM_JPEG_COLOR_FORMAT_YCBCRLP_H1V1:
- return (int)OMX_QCOM_IMG_COLOR_FormatYUV444SemiPlanar;
- case MM_JPEG_COLOR_FORMAT_MONOCHROME:
- return (int)OMX_COLOR_FormatMonochrome;
- default:
- CDBG_ERROR("%s:%d] invalid format %d", __func__, __LINE__, color_fmt);
- return (int)OMX_QCOM_IMG_COLOR_FormatYVU420SemiPlanar;
- }
-}
-
-/** mm_jpeg_session_config_port:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Configure OMX ports
- *
- **/
-OMX_ERRORTYPE mm_jpeg_session_config_ports(mm_jpeg_job_session_t* p_session)
-{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- mm_jpeg_encode_params_t *p_params = &p_session->params;
- OMX_CONFIG_ROTATIONTYPE rotate;
-
- mm_jpeg_buf_t *p_src_buf =
- &p_params->src_main_buf[0];
-
- p_session->inputPort.nPortIndex = 0;
- p_session->outputPort.nPortIndex = 1;
- p_session->inputTmbPort.nPortIndex = 2;
-
- ret = OMX_GetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
- &p_session->inputPort);
- if (ret) {
- CDBG_ERROR("%s:%d] failed", __func__, __LINE__);
- return ret;
- }
-
- ret = OMX_GetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
- &p_session->inputTmbPort);
- if (ret) {
- CDBG_ERROR("%s:%d] failed", __func__, __LINE__);
- return ret;
- }
-
- ret = OMX_GetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
- &p_session->outputPort);
- if (ret) {
- CDBG_ERROR("%s:%d] failed", __func__, __LINE__);
- return ret;
- }
-
- p_session->inputPort.format.image.nFrameWidth =
- (OMX_U32)p_params->main_dim.src_dim.width;
- p_session->inputPort.format.image.nFrameHeight =
- (OMX_U32)p_params->main_dim.src_dim.height;
- p_session->inputPort.format.image.nStride =
- p_src_buf->offset.mp[0].stride;
- p_session->inputPort.format.image.nSliceHeight =
- (OMX_U32)p_src_buf->offset.mp[0].scanline;
- p_session->inputPort.format.image.eColorFormat =
- map_jpeg_format(p_params->color_format);
- p_session->inputPort.nBufferSize =
- p_params->src_main_buf[0/*p_jobparams->src_index*/].buf_size;
- p_session->inputPort.nBufferCountActual = (OMX_U32)p_params->num_src_bufs;
- ret = OMX_SetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
- &p_session->inputPort);
- if (ret) {
- CDBG_ERROR("%s:%d] failed", __func__, __LINE__);
- return ret;
- }
-
- if (p_session->params.encode_thumbnail) {
- mm_jpeg_buf_t *p_tmb_buf =
- &p_params->src_thumb_buf[0];
- p_session->inputTmbPort.format.image.nFrameWidth =
- (OMX_U32)p_params->thumb_dim.src_dim.width;
- p_session->inputTmbPort.format.image.nFrameHeight =
- (OMX_U32)p_params->thumb_dim.src_dim.height;
- p_session->inputTmbPort.format.image.nStride =
- p_tmb_buf->offset.mp[0].stride;
- p_session->inputTmbPort.format.image.nSliceHeight =
- (OMX_U32)p_tmb_buf->offset.mp[0].scanline;
- p_session->inputTmbPort.format.image.eColorFormat =
- map_jpeg_format(p_params->thumb_color_format);
- p_session->inputTmbPort.nBufferSize =
- p_params->src_thumb_buf[0].buf_size;
- p_session->inputTmbPort.nBufferCountActual = (OMX_U32)p_params->num_tmb_bufs;
- ret = OMX_SetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
- &p_session->inputTmbPort);
-
- if (ret) {
- CDBG_ERROR("%s:%d] failed", __func__, __LINE__);
- return ret;
- }
-
- // Enable thumbnail port
- ret = OMX_SendCommand(p_session->omx_handle, OMX_CommandPortEnable,
- p_session->inputTmbPort.nPortIndex, NULL);
-
- if (ret) {
- CDBG_ERROR("%s:%d] failed", __func__, __LINE__);
- return ret;
- }
- } else {
- // Disable thumbnail port
- ret = OMX_SendCommand(p_session->omx_handle, OMX_CommandPortDisable,
- p_session->inputTmbPort.nPortIndex, NULL);
-
- if (ret) {
- CDBG_ERROR("%s:%d] failed", __func__, __LINE__);
- return ret;
- }
- }
-
- p_session->outputPort.nBufferSize =
- p_params->dest_buf[0].buf_size;
- p_session->outputPort.nBufferCountActual = (OMX_U32)p_params->num_dst_bufs;
- ret = OMX_SetParameter(p_session->omx_handle, OMX_IndexParamPortDefinition,
- &p_session->outputPort);
- if (ret) {
- CDBG_ERROR("%s:%d] failed", __func__, __LINE__);
- return ret;
- }
-
- /* set rotation */
- memset(&rotate, 0, sizeof(rotate));
- rotate.nPortIndex = 1;
- rotate.nRotation = (OMX_S32)p_params->rotation;
- ret = OMX_SetConfig(p_session->omx_handle, OMX_IndexConfigCommonRotate,
- &rotate);
- if (OMX_ErrorNone != ret) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, ret);
- return ret;
- }
- CDBG("%s:%d] Set rotation to %d at port_idx = %d", __func__, __LINE__,
- (int)p_params->rotation, (int)rotate.nPortIndex);
-
- return ret;
-}
-
-/** mm_jpeg_omx_config_thumbnail:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Configure OMX ports
- *
- **/
-OMX_ERRORTYPE mm_jpeg_session_config_thumbnail(mm_jpeg_job_session_t* p_session)
-{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- QOMX_THUMBNAIL_INFO thumbnail_info;
- OMX_INDEXTYPE thumb_indextype;
- mm_jpeg_encode_params_t *p_params = &p_session->params;
- mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
- mm_jpeg_dim_t *p_thumb_dim = &p_jobparams->thumb_dim;
- QOMX_YUV_FRAME_INFO *p_frame_info = &thumbnail_info.tmbOffset;
- mm_jpeg_buf_t *p_tmb_buf = &p_params->src_thumb_buf[p_jobparams->thumb_index];
-
- CDBG_HIGH("%s:%d] encode_thumbnail %u", __func__, __LINE__,
- p_params->encode_thumbnail);
- if (OMX_FALSE == p_params->encode_thumbnail) {
- return ret;
- }
-
- if ((p_thumb_dim->dst_dim.width == 0) || (p_thumb_dim->dst_dim.height == 0)) {
- CDBG_ERROR("%s:%d] Error invalid output dim for thumbnail",
- __func__, __LINE__);
- return OMX_ErrorBadParameter;
- }
-
- if ((p_thumb_dim->src_dim.width == 0) || (p_thumb_dim->src_dim.height == 0)) {
- CDBG_ERROR("%s:%d] Error invalid input dim for thumbnail",
- __func__, __LINE__);
- return OMX_ErrorBadParameter;
- }
-
- if ((p_thumb_dim->crop.width == 0) || (p_thumb_dim->crop.height == 0)) {
- p_thumb_dim->crop.width = p_thumb_dim->src_dim.width;
- p_thumb_dim->crop.height = p_thumb_dim->src_dim.height;
- }
-
- /* check crop boundary */
- if ((p_thumb_dim->crop.width + p_thumb_dim->crop.left > p_thumb_dim->src_dim.width) ||
- (p_thumb_dim->crop.height + p_thumb_dim->crop.top > p_thumb_dim->src_dim.height)) {
- CDBG_ERROR("%s:%d] invalid crop boundary (%d, %d) offset (%d, %d) out of (%d, %d)",
- __func__, __LINE__,
- p_thumb_dim->crop.width,
- p_thumb_dim->crop.height,
- p_thumb_dim->crop.left,
- p_thumb_dim->crop.top,
- p_thumb_dim->src_dim.width,
- p_thumb_dim->src_dim.height);
- return OMX_ErrorBadParameter;
- }
-
- memset(&thumbnail_info, 0x0, sizeof(QOMX_THUMBNAIL_INFO));
- ret = OMX_GetExtensionIndex(p_session->omx_handle,
- QOMX_IMAGE_EXT_THUMBNAIL_NAME,
- &thumb_indextype);
- if (ret) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, ret);
- return ret;
- }
-
- /* fill thumbnail info */
- thumbnail_info.scaling_enabled = 1;
- thumbnail_info.input_width = (OMX_U32)p_thumb_dim->src_dim.width;
- thumbnail_info.input_height = (OMX_U32)p_thumb_dim->src_dim.height;
- thumbnail_info.crop_info.nWidth = (OMX_U32)p_thumb_dim->crop.width;
- thumbnail_info.crop_info.nHeight = (OMX_U32)p_thumb_dim->crop.height;
- thumbnail_info.crop_info.nLeft = p_thumb_dim->crop.left;
- thumbnail_info.crop_info.nTop = p_thumb_dim->crop.top;
- thumbnail_info.rotation = (OMX_U32)p_params->thumb_rotation;
-
- if ((p_thumb_dim->dst_dim.width > p_thumb_dim->src_dim.width)
- || (p_thumb_dim->dst_dim.height > p_thumb_dim->src_dim.height)) {
- CDBG_ERROR("%s:%d] Incorrect thumbnail dim %dx%d resetting to %dx%d",
- __func__, __LINE__,
- p_thumb_dim->dst_dim.width,
- p_thumb_dim->dst_dim.height,
- p_thumb_dim->src_dim.width,
- p_thumb_dim->src_dim.height);
- thumbnail_info.output_width = (OMX_U32)p_thumb_dim->src_dim.width;
- thumbnail_info.output_height = (OMX_U32)p_thumb_dim->src_dim.height;
- } else {
- thumbnail_info.output_width = (OMX_U32)p_thumb_dim->dst_dim.width;
- thumbnail_info.output_height = (OMX_U32)p_thumb_dim->dst_dim.height;
- }
-
- memset(p_frame_info, 0x0, sizeof(*p_frame_info));
-
- p_frame_info->cbcrStartOffset[0] = p_tmb_buf->offset.mp[0].len;
- p_frame_info->cbcrStartOffset[1] = p_tmb_buf->offset.mp[1].len;
- p_frame_info->yOffset = p_tmb_buf->offset.mp[0].offset;
- p_frame_info->cbcrOffset[0] = p_tmb_buf->offset.mp[1].offset;
- p_frame_info->cbcrOffset[1] = p_tmb_buf->offset.mp[2].offset;
-
- ret = OMX_SetConfig(p_session->omx_handle, thumb_indextype,
- &thumbnail_info);
- if (ret) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- return ret;
- }
-
- return ret;
-}
-
-/** mm_jpeg_session_config_main_crop:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Configure main image crop
- *
- **/
-OMX_ERRORTYPE mm_jpeg_session_config_main_crop(mm_jpeg_job_session_t *p_session)
-{
- OMX_CONFIG_RECTTYPE rect_type_in, rect_type_out;
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
- mm_jpeg_dim_t *dim = &p_jobparams->main_dim;
-
- if ((dim->crop.width == 0) || (dim->crop.height == 0)) {
- dim->crop.width = dim->src_dim.width;
- dim->crop.height = dim->src_dim.height;
- }
- /* error check first */
- if ((dim->crop.width + dim->crop.left > dim->src_dim.width) ||
- (dim->crop.height + dim->crop.top > dim->src_dim.height)) {
- CDBG_ERROR("%s:%d] invalid crop boundary (%d, %d) out of (%d, %d)",
- __func__, __LINE__,
- dim->crop.width + dim->crop.left,
- dim->crop.height + dim->crop.top,
- dim->src_dim.width,
- dim->src_dim.height);
- return OMX_ErrorBadParameter;
- }
-
- memset(&rect_type_in, 0, sizeof(rect_type_in));
- memset(&rect_type_out, 0, sizeof(rect_type_out));
- rect_type_in.nPortIndex = 0;
- rect_type_out.nPortIndex = 0;
-
- if ((dim->src_dim.width != dim->crop.width) ||
- (dim->src_dim.height != dim->crop.height) ||
- (dim->src_dim.width != dim->dst_dim.width) ||
- (dim->src_dim.height != dim->dst_dim.height)) {
- /* Scaler information */
- rect_type_in.nWidth = CEILING2(dim->crop.width);
- rect_type_in.nHeight = CEILING2(dim->crop.height);
- rect_type_in.nLeft = dim->crop.left;
- rect_type_in.nTop = dim->crop.top;
-
- if (dim->dst_dim.width && dim->dst_dim.height) {
- rect_type_out.nWidth = (OMX_U32)dim->dst_dim.width;
- rect_type_out.nHeight = (OMX_U32)dim->dst_dim.height;
- }
- }
-
- ret = OMX_SetConfig(p_session->omx_handle, OMX_IndexConfigCommonInputCrop,
- &rect_type_in);
- if (OMX_ErrorNone != ret) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- return ret;
- }
-
- CDBG("%s:%d] OMX_IndexConfigCommonInputCrop w = %d, h = %d, l = %d, t = %d,"
- " port_idx = %d", __func__, __LINE__,
- (int)rect_type_in.nWidth, (int)rect_type_in.nHeight,
- (int)rect_type_in.nLeft, (int)rect_type_in.nTop,
- (int)rect_type_in.nPortIndex);
-
- ret = OMX_SetConfig(p_session->omx_handle, OMX_IndexConfigCommonOutputCrop,
- &rect_type_out);
- if (OMX_ErrorNone != ret) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- return ret;
- }
- CDBG("%s:%d] OMX_IndexConfigCommonOutputCrop w = %d, h = %d,"
- " port_idx = %d", __func__, __LINE__,
- (int)rect_type_out.nWidth, (int)rect_type_out.nHeight,
- (int)rect_type_out.nPortIndex);
-
- return ret;
-}
-
-/** mm_jpeg_session_config_main:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Configure main image
- *
- **/
-OMX_ERRORTYPE mm_jpeg_session_config_main(mm_jpeg_job_session_t *p_session)
-{
- OMX_ERRORTYPE rc = OMX_ErrorNone;
-
- /* config port */
- CDBG("%s:%d] config port", __func__, __LINE__);
- rc = mm_jpeg_session_config_ports(p_session);
- if (OMX_ErrorNone != rc) {
- CDBG_ERROR("%s: config port failed", __func__);
- return rc;
- }
-
- /* config buffer offset */
- CDBG("%s:%d] config main buf offset", __func__, __LINE__);
- rc = mm_jpeg_session_config_main_buffer_offset(p_session);
- if (OMX_ErrorNone != rc) {
- CDBG_ERROR("%s: config buffer offset failed", __func__);
- return rc;
- }
-
- /* set the encoding mode */
- rc = mm_jpeg_encoding_mode(p_session);
- if (OMX_ErrorNone != rc) {
- CDBG_ERROR("%s: config encoding mode failed", __func__);
- return rc;
- }
-
- /* set the metadata encrypt key */
- rc = mm_jpeg_meta_enc_key(p_session);
- if (OMX_ErrorNone != rc) {
- CDBG_ERROR("%s: config session failed", __func__);
- return rc;
- }
-
- /* set the mem ops */
- rc = mm_jpeg_mem_ops(p_session);
- if (OMX_ErrorNone != rc) {
- CDBG_ERROR("%s: config mem ops failed", __func__);
- return rc;
- }
- /* set the jpeg speed mode */
- rc = mm_jpeg_speed_mode(p_session);
- if (OMX_ErrorNone != rc) {
- CDBG_ERROR("%s: config speed mode failed", __func__);
- return rc;
- }
-
- return rc;
-}
-
-/** mm_jpeg_session_config_common:
- *
- * Arguments:
- * @p_session: job session
- *
- * Return:
- * OMX error values
- *
- * Description:
- * Configure common parameters
- *
- **/
-OMX_ERRORTYPE mm_jpeg_session_config_common(mm_jpeg_job_session_t *p_session)
-{
- OMX_ERRORTYPE rc = OMX_ErrorNone;
- OMX_INDEXTYPE exif_idx;
- OMX_CONFIG_ROTATIONTYPE rotate;
- mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
- QOMX_EXIF_INFO exif_info;
-
- /* set rotation */
- memset(&rotate, 0, sizeof(rotate));
- rotate.nPortIndex = 1;
- rotate.nRotation = (OMX_S32)p_jobparams->rotation;
- rc = OMX_SetConfig(p_session->omx_handle, OMX_IndexConfigCommonRotate,
- &rotate);
- if (OMX_ErrorNone != rc) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, rc);
- return rc;
- }
- CDBG("%s:%d] Set rotation to %d at port_idx = %d", __func__, __LINE__,
- (int)p_jobparams->rotation, (int)rotate.nPortIndex);
-
- /* Set Exif data*/
- memset(&p_session->exif_info_local[0], 0, sizeof(p_session->exif_info_local));
- rc = OMX_GetExtensionIndex(p_session->omx_handle, QOMX_IMAGE_EXT_EXIF_NAME,
- &exif_idx);
- if (OMX_ErrorNone != rc) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, rc);
- return rc;
- }
-
- CDBG("%s:%d] Num of exif entries passed from HAL: %d", __func__, __LINE__,
- (int)p_jobparams->exif_info.numOfEntries);
- if (p_jobparams->exif_info.numOfEntries > 0) {
- rc = OMX_SetConfig(p_session->omx_handle, exif_idx,
- &p_jobparams->exif_info);
- if (OMX_ErrorNone != rc) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, rc);
- return rc;
- }
- }
- /*parse aditional exif data from the metadata*/
- if (NULL != p_jobparams->p_metadata) {
- exif_info.numOfEntries = 0;
- exif_info.exif_data = &p_session->exif_info_local[0];
- process_meta_data(p_jobparams->p_metadata, &exif_info, &p_jobparams->cam_exif_params);
- /* After Parse metadata */
- p_session->exif_count_local = (int)exif_info.numOfEntries;
-
- if (exif_info.numOfEntries > 0) {
- /* set exif tags */
- CDBG("%s:%d] exif tags from metadata count %d", __func__, __LINE__,
- (int)exif_info.numOfEntries);
-
- rc = OMX_SetConfig(p_session->omx_handle, exif_idx,
- &exif_info);
- if (OMX_ErrorNone != rc) {
- CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, rc);
- return rc;
- }
- }
- }
-
- return rc;
-}
-
-
-
-
-/** mm_jpeg_session_abort:
- *
- * Arguments:
- * @p_session: jpeg session
- *
- * Return:
- * OMX_BOOL
- *
- * Description:
- * Abort ongoing job
- *
- **/
-OMX_BOOL mm_jpeg_session_abort(mm_jpeg_job_session_t *p_session)
-{
- int rc = 0;
-
- CDBG("%s:%d] E", __func__, __LINE__);
- pthread_mutex_lock(&p_session->lock);
- if (MM_JPEG_ABORT_NONE != p_session->abort_state) {
- pthread_mutex_unlock(&p_session->lock);
- CDBG("%s:%d] **** ALREADY ABORTED", __func__, __LINE__);
- return 0;
- }
- p_session->abort_state = MM_JPEG_ABORT_INIT;
- if (OMX_TRUE == p_session->encoding) {
- p_session->state_change_pending = OMX_TRUE;
-
- CDBG("%s:%d] **** ABORTING", __func__, __LINE__);
- pthread_mutex_unlock(&p_session->lock);
-
- rc = mm_jpegenc_destroy_job(p_session);
- if (rc != 0) {
- CDBG("%s:%d] Destroy job returned error %d", __func__, __LINE__, rc);
- }
-
- pthread_mutex_lock(&p_session->lock);
- if (MM_JPEG_ABORT_INIT == p_session->abort_state) {
- CDBG("%s:%d] before wait", __func__, __LINE__);
- pthread_cond_wait(&p_session->cond, &p_session->lock);
- }
- CDBG("%s:%d] after wait", __func__, __LINE__);
- }
- p_session->abort_state = MM_JPEG_ABORT_DONE;
- pthread_mutex_unlock(&p_session->lock);
-
-
- // Abort next session
- if (p_session->next_session) {
- mm_jpeg_session_abort(p_session->next_session);
- }
-
- CDBG("%s:%d] X", __func__, __LINE__);
- return 0;
-}
-
-
-/** mm_jpeg_configure_params
- *
- * Arguments:
- * @p_session: encode session
- *
- * Return:
- * none
- *
- * Description:
- * Configure the job specific params
- *
- **/
-static OMX_ERRORTYPE mm_jpeg_configure_job_params(
- mm_jpeg_job_session_t *p_session)
-{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- OMX_IMAGE_PARAM_QFACTORTYPE q_factor;
- QOMX_WORK_BUFFER work_buffer;
- OMX_INDEXTYPE work_buffer_index;
- mm_jpeg_encode_params_t *p_params = &p_session->params;
-
- /* common config */
- ret = mm_jpeg_session_config_common(p_session);
- if (OMX_ErrorNone != ret) {
- CDBG_ERROR("%s:%d] config common failed", __func__, __LINE__);
-
- }
-
- /* config Main Image crop */
- CDBG("%s:%d] config main crop", __func__, __LINE__);
- ret = mm_jpeg_session_config_main_crop(p_session);
- if (OMX_ErrorNone != ret) {
- CDBG_ERROR("%s: config crop failed", __func__);
- return ret;
- }
-
- /* set quality */
- memset(&q_factor, 0, sizeof(q_factor));
- q_factor.nPortIndex = 0;
- q_factor.nQFactor = p_params->quality;
- ret = OMX_SetConfig(p_session->omx_handle, OMX_IndexParamQFactor, &q_factor);
- CDBG("%s:%d] config QFactor: %d", __func__, __LINE__, (int)q_factor.nQFactor);
- if (OMX_ErrorNone != ret) {
- CDBG_ERROR("%s:%d] Error setting Q factor %d", __func__, __LINE__, ret);
- return ret;
- }
-
- /* config thumbnail */
- ret = mm_jpeg_session_config_thumbnail(p_session);
- if (OMX_ErrorNone != ret) {
- CDBG_ERROR("%s:%d] config thumbnail img failed", __func__, __LINE__);
- return ret;
- }
-
- //Pass the ION buffer to be used as o/p for HW
- memset(&work_buffer, 0x0, sizeof(QOMX_WORK_BUFFER));
- ret = OMX_GetExtensionIndex(p_session->omx_handle,
- QOMX_IMAGE_EXT_WORK_BUFFER_NAME,
- &work_buffer_index);
- if (ret) {
- CDBG_ERROR("%s:%d] Error getting work buffer index %d",
- __func__, __LINE__, ret);
- return ret;
- }
- work_buffer.fd = p_session->work_buffer.p_pmem_fd;
- work_buffer.vaddr = p_session->work_buffer.addr;
- work_buffer.length = (uint32_t)p_session->work_buffer.size;
- CDBG_ERROR("%s:%d] Work buffer %d %p WorkBufSize: %d", __func__, __LINE__,
- work_buffer.fd, work_buffer.vaddr, work_buffer.length);
-
- buffer_invalidate(&p_session->work_buffer);
-
- ret = OMX_SetConfig(p_session->omx_handle, work_buffer_index,
- &work_buffer);
- if (ret) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- return ret;
- }
-
- /* set metadata */
- ret = mm_jpeg_metadata(p_session);
- CDBG_ERROR("%s: config makernote data failed", __func__);
- if (OMX_ErrorNone != ret) {
- return ret;
- }
-
- return ret;
-}
-
-/** mm_jpeg_session_configure:
- *
- * Arguments:
- * @data: encode session
- *
- * Return:
- * none
- *
- * Description:
- * Configure the session
- *
- **/
-static OMX_ERRORTYPE mm_jpeg_session_configure(mm_jpeg_job_session_t *p_session)
-{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
-
- CDBG("%s:%d] E ", __func__, __LINE__);
-
- MM_JPEG_CHK_ABORT(p_session, ret, error);
-
- /* config main img */
- ret = mm_jpeg_session_config_main(p_session);
- if (OMX_ErrorNone != ret) {
- CDBG_ERROR("%s:%d] config main img failed", __func__, __LINE__);
- goto error;
- }
- ret = mm_jpeg_session_change_state(p_session, OMX_StateIdle,
- mm_jpeg_session_send_buffers);
- if (ret) {
- CDBG_ERROR("%s:%d] change state to idle failed %d",
- __func__, __LINE__, ret);
- goto error;
- }
-
- ret = mm_jpeg_session_change_state(p_session, OMX_StateExecuting,
- NULL);
- if (ret) {
- CDBG_ERROR("%s:%d] change state to executing failed %d",
- __func__, __LINE__, ret);
- goto error;
- }
-
-error:
- CDBG("%s:%d] X ret %d", __func__, __LINE__, ret);
- return ret;
-}
-
-
-
-
-
-
-/** mm_jpeg_session_encode:
- *
- * Arguments:
- * @p_session: encode session
- *
- * Return:
- * OMX_ERRORTYPE
- *
- * Description:
- * Start the encoding
- *
- **/
-static OMX_ERRORTYPE mm_jpeg_session_encode(mm_jpeg_job_session_t *p_session)
-{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
-
- pthread_mutex_lock(&p_session->lock);
- p_session->abort_state = MM_JPEG_ABORT_NONE;
- p_session->encoding = OMX_FALSE;
- pthread_mutex_unlock(&p_session->lock);
-
- if (OMX_FALSE == p_session->config) {
- ret = mm_jpeg_session_configure(p_session);
- if (ret) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- goto error;
- }
- p_session->config = OMX_TRUE;
- }
-
- ret = mm_jpeg_configure_job_params(p_session);
- if (ret) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- goto error;
- }
- pthread_mutex_lock(&p_session->lock);
- p_session->encoding = OMX_TRUE;
- pthread_mutex_unlock(&p_session->lock);
-
- MM_JPEG_CHK_ABORT(p_session, ret, error);
-
-#ifdef MM_JPEG_DUMP_INPUT
- char filename[256];
- snprintf(filename, 255, "/data/misc/camera/jpeg/mm_jpeg_int%d.yuv", p_session->ebd_count);
- DUMP_TO_FILE(filename,
- p_session->p_in_omx_buf[p_jobparams->src_index]->pBuffer,
- (size_t)p_session->p_in_omx_buf[p_jobparams->src_index]->nAllocLen);
-#endif
-
- ret = OMX_EmptyThisBuffer(p_session->omx_handle,
- p_session->p_in_omx_buf[p_jobparams->src_index]);
- if (ret) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- goto error;
- }
-
- if (p_session->params.encode_thumbnail) {
-#ifdef MM_JPEG_DUMP_INPUT
- char thumb_filename[256];
- snprintf(thumb_filename, 255, "/data/misc/camera/jpeg/mm_jpeg_int_t%d.yuv",
- p_session->ebd_count);
- DUMP_TO_FILE(filename,
- p_session->p_in_omx_thumb_buf[p_jobparams->thumb_index]->pBuffer,
- (size_t)p_session->p_in_omx_thumb_buf[p_jobparams->thumb_index]->nAllocLen);
-#endif
- ret = OMX_EmptyThisBuffer(p_session->omx_handle,
- p_session->p_in_omx_thumb_buf[p_jobparams->thumb_index]);
- if (ret) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- goto error;
- }
- }
-
- ret = OMX_FillThisBuffer(p_session->omx_handle,
- p_session->p_out_omx_buf[p_jobparams->dst_index]);
- if (ret) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- goto error;
- }
-
- MM_JPEG_CHK_ABORT(p_session, ret, error);
-
-error:
-
- CDBG("%s:%d] X ", __func__, __LINE__);
- return ret;
-}
-
-/** mm_jpeg_process_encoding_job:
- *
- * Arguments:
- * @my_obj: jpeg client
- * @job_node: job node
- *
- * Return:
- * 0 for success -1 otherwise
- *
- * Description:
- * Start the encoding job
- *
- **/
-int32_t mm_jpeg_process_encoding_job(mm_jpeg_obj *my_obj, mm_jpeg_job_q_node_t* job_node)
-{
- mm_jpeg_q_data_t qdata;
- int32_t rc = 0;
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- mm_jpeg_job_session_t *p_session = NULL;
- uint32_t buf_idx;
-
- /* check if valid session */
- p_session = mm_jpeg_get_session(my_obj, job_node->enc_info.job_id);
- if (NULL == p_session) {
- CDBG_ERROR("%s:%d] invalid job id %x", __func__, __LINE__,
- job_node->enc_info.job_id);
- return -1;
- }
-
- CDBG_HIGH("%s:%d] before dequeue session %d",
- __func__, __LINE__, ret);
-
- /* dequeue available omx handle */
- qdata = mm_jpeg_queue_deq(p_session->session_handle_q);
- p_session = qdata.p;
-
- if (NULL == p_session) {
- CDBG_HIGH("%s:%d] No available sessions %d",
- __func__, __LINE__, ret);
- /* No available handles */
- qdata.p = job_node;
- mm_jpeg_queue_enq_head(&my_obj->job_mgr.job_queue, qdata);
-
- CDBG_HIGH("%s:%d]end enqueue %d",
- __func__, __LINE__, ret);
- return rc;
-
- }
-
- p_session->auto_out_buf = OMX_FALSE;
- if (job_node->enc_info.encode_job.dst_index < 0) {
- /* dequeue available output buffer idx */
- qdata = mm_jpeg_queue_deq(p_session->out_buf_q);
- buf_idx = qdata.u32;
-
- if (0U == buf_idx) {
- CDBG_ERROR("%s:%d] No available output buffers %d",
- __func__, __LINE__, ret);
- return OMX_ErrorUndefined;
- }
-
- buf_idx--;
-
- job_node->enc_info.encode_job.dst_index = (int32_t)buf_idx;
- p_session->auto_out_buf = OMX_TRUE;
- }
-
- /* sent encode cmd to OMX, queue job into ongoing queue */
- qdata.p = job_node;
- rc = mm_jpeg_queue_enq(&my_obj->ongoing_job_q, qdata);
- if (rc) {
- CDBG_ERROR("%s:%d] jpeg enqueue failed %d",
- __func__, __LINE__, ret);
- goto error;
- }
-
- p_session->encode_job = job_node->enc_info.encode_job;
- p_session->jobId = job_node->enc_info.job_id;
- ret = mm_jpeg_session_encode(p_session);
- if (ret) {
- CDBG_ERROR("%s:%d] encode session failed", __func__, __LINE__);
- goto error;
- }
-
- CDBG("%s:%d] Success X ", __func__, __LINE__);
- return rc;
-
-error:
-
- if ((OMX_ErrorNone != ret) &&
- (NULL != p_session->params.jpeg_cb)) {
- p_session->job_status = JPEG_JOB_STATUS_ERROR;
- CDBG("%s:%d] send jpeg error callback %d", __func__, __LINE__,
- p_session->job_status);
- p_session->params.jpeg_cb(p_session->job_status,
- p_session->client_hdl,
- p_session->jobId,
- NULL,
- p_session->params.userdata);
- }
-
- /*remove the job*/
- mm_jpegenc_job_done(p_session);
- CDBG("%s:%d] Error X ", __func__, __LINE__);
-
- return rc;
-}
-
-
-
-/** mm_jpeg_jobmgr_thread:
- *
- * Arguments:
- * @my_obj: jpeg object
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * job manager thread main function
- *
- **/
-static void *mm_jpeg_jobmgr_thread(void *data)
-{
- mm_jpeg_q_data_t qdata;
- int rc = 0;
- int running = 1;
- uint32_t num_ongoing_jobs = 0;
- mm_jpeg_obj *my_obj = (mm_jpeg_obj*)data;
- mm_jpeg_job_cmd_thread_t *cmd_thread = &my_obj->job_mgr;
- mm_jpeg_job_q_node_t* node = NULL;
- prctl(PR_SET_NAME, (unsigned long)"mm_jpeg_thread", 0, 0, 0);
-
- do {
- do {
- rc = cam_sem_wait(&cmd_thread->job_sem);
- if (rc != 0 && errno != EINVAL) {
- CDBG_ERROR("%s: cam_sem_wait error (%s)",
- __func__, strerror(errno));
- return NULL;
- }
- } while (rc != 0);
-
- /* check ongoing q size */
- num_ongoing_jobs = mm_jpeg_queue_get_size(&my_obj->ongoing_job_q);
- if (num_ongoing_jobs >= NUM_MAX_JPEG_CNCURRENT_JOBS) {
- CDBG("%s:%d] ongoing job already reach max %d", __func__,
- __LINE__, num_ongoing_jobs);
- continue;
- }
-
- pthread_mutex_lock(&my_obj->job_lock);
- /* can go ahead with new work */
- qdata = mm_jpeg_queue_deq(&cmd_thread->job_queue);
- node = (mm_jpeg_job_q_node_t*)qdata.p;
- if (node != NULL) {
- switch (node->type) {
- case MM_JPEG_CMD_TYPE_JOB:
- rc = mm_jpeg_process_encoding_job(my_obj, node);
- break;
- case MM_JPEG_CMD_TYPE_DECODE_JOB:
- rc = mm_jpegdec_process_decoding_job(my_obj, node);
- break;
- case MM_JPEG_CMD_TYPE_EXIT:
- default:
- /* free node */
- free(node);
- /* set running flag to false */
- running = 0;
- break;
- }
- }
- pthread_mutex_unlock(&my_obj->job_lock);
-
- } while (running);
- return NULL;
-}
-
-/** mm_jpeg_jobmgr_thread_launch:
- *
- * Arguments:
- * @my_obj: jpeg object
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * launches the job manager thread
- *
- **/
-int32_t mm_jpeg_jobmgr_thread_launch(mm_jpeg_obj *my_obj)
-{
- int32_t rc = 0;
- mm_jpeg_job_cmd_thread_t *job_mgr = &my_obj->job_mgr;
-
- cam_sem_init(&job_mgr->job_sem, 0);
- mm_jpeg_queue_init(&job_mgr->job_queue);
-
- /* launch the thread */
- pthread_create(&job_mgr->pid,
- NULL,
- mm_jpeg_jobmgr_thread,
- (void *)my_obj);
- pthread_setname_np(job_mgr->pid, "CAM_jpeg_jobmgr");
- return rc;
-}
-
-/** mm_jpeg_jobmgr_thread_release:
- *
- * Arguments:
- * @my_obj: jpeg object
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Releases the job manager thread
- *
- **/
-int32_t mm_jpeg_jobmgr_thread_release(mm_jpeg_obj * my_obj)
-{
- mm_jpeg_q_data_t qdata;
- int32_t rc = 0;
- mm_jpeg_job_cmd_thread_t * cmd_thread = &my_obj->job_mgr;
- mm_jpeg_job_q_node_t* node =
- (mm_jpeg_job_q_node_t *)malloc(sizeof(mm_jpeg_job_q_node_t));
- if (NULL == node) {
- CDBG_ERROR("%s: No memory for mm_jpeg_job_q_node_t", __func__);
- return -1;
- }
-
- memset(node, 0, sizeof(mm_jpeg_job_q_node_t));
- node->type = MM_JPEG_CMD_TYPE_EXIT;
-
- qdata.p = node;
- mm_jpeg_queue_enq(&cmd_thread->job_queue, qdata);
- cam_sem_post(&cmd_thread->job_sem);
-
- /* wait until cmd thread exits */
- if (pthread_join(cmd_thread->pid, NULL) != 0) {
- CDBG("%s: pthread dead already", __func__);
- }
- mm_jpeg_queue_deinit(&cmd_thread->job_queue);
-
- cam_sem_destroy(&cmd_thread->job_sem);
- memset(cmd_thread, 0, sizeof(mm_jpeg_job_cmd_thread_t));
- return rc;
-}
-
-/** mm_jpeg_init:
- *
- * Arguments:
- * @my_obj: jpeg object
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Initializes the jpeg client
- *
- **/
-int32_t mm_jpeg_init(mm_jpeg_obj *my_obj)
-{
- int32_t rc = 0;
-
- /* init locks */
- pthread_mutex_init(&my_obj->job_lock, NULL);
-
- /* init ongoing job queue */
- rc = mm_jpeg_queue_init(&my_obj->ongoing_job_q);
- if (0 != rc) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- pthread_mutex_destroy(&my_obj->job_lock);
- return -1;
- }
-
-
- /* init job semaphore and launch jobmgr thread */
- CDBG("%s:%d] Launch jobmgr thread rc %d", __func__, __LINE__, rc);
- rc = mm_jpeg_jobmgr_thread_launch(my_obj);
- if (0 != rc) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- mm_jpeg_queue_deinit(&my_obj->ongoing_job_q);
- pthread_mutex_destroy(&my_obj->job_lock);
- return -1;
- }
-
- /* set work buf size from max picture size */
- if (my_obj->max_pic_w <= 0 || my_obj->max_pic_h <= 0) {
- CDBG_ERROR("%s:%d] Width and height are not valid "
- "dimensions, cannot calc work buf size",__func__, __LINE__);
- mm_jpeg_jobmgr_thread_release(my_obj);
- mm_jpeg_queue_deinit(&my_obj->ongoing_job_q);
- pthread_mutex_destroy(&my_obj->job_lock);
- return -1;
- }
-
- /* load OMX */
- if (OMX_ErrorNone != OMX_Init()) {
- /* roll back in error case */
- CDBG_ERROR("%s:%d] OMX_Init failed (%d)", __func__, __LINE__, rc);
- mm_jpeg_jobmgr_thread_release(my_obj);
- mm_jpeg_queue_deinit(&my_obj->ongoing_job_q);
- pthread_mutex_destroy(&my_obj->job_lock);
- }
-
-#ifdef LOAD_ADSP_RPC_LIB
- my_obj->adsprpc_lib_handle = dlopen("libadsprpc.so", RTLD_NOW);
- if (NULL == my_obj->adsprpc_lib_handle) {
- CDBG_ERROR("%s:%d] Cannot load the library", __func__, __LINE__);
- /* not returning error here bcoz even if this loading fails
- we can go ahead with SW JPEG enc */
- }
-#endif
-
- return rc;
-}
-
-/** mm_jpeg_deinit:
- *
- * Arguments:
- * @my_obj: jpeg object
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Deinits the jpeg client
- *
- **/
-int32_t mm_jpeg_deinit(mm_jpeg_obj *my_obj)
-{
- int32_t rc = 0;
- uint32_t i = 0;
-
- /* release jobmgr thread */
- rc = mm_jpeg_jobmgr_thread_release(my_obj);
- if (0 != rc) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- }
-
- /* unload OMX engine */
- OMX_Deinit();
-
- /* deinit ongoing job and cb queue */
- rc = mm_jpeg_queue_deinit(&my_obj->ongoing_job_q);
- if (0 != rc) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- }
-
- for (i = 0; i < my_obj->work_buf_cnt; i++) {
- /*Release the ION buffer*/
- rc = buffer_deallocate(&my_obj->ionBuffer[i]);
- if (0 != rc) {
- CDBG_ERROR("%s:%d] Error releasing ION buffer", __func__, __LINE__);
- }
- }
-
- /* destroy locks */
- pthread_mutex_destroy(&my_obj->job_lock);
-
- return rc;
-}
-
-/** mm_jpeg_new_client:
- *
- * Arguments:
- * @my_obj: jpeg object
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Create new jpeg client
- *
- **/
-uint32_t mm_jpeg_new_client(mm_jpeg_obj *my_obj)
-{
- uint32_t client_hdl = 0;
- uint8_t idx;
- int i = 0;
-
- if (my_obj->num_clients >= MAX_JPEG_CLIENT_NUM) {
- CDBG_ERROR("%s: num of clients reached limit", __func__);
- return client_hdl;
- }
-
- for (idx = 0; idx < MAX_JPEG_CLIENT_NUM; idx++) {
- if (0 == my_obj->clnt_mgr[idx].is_used) {
- break;
- }
- }
-
- if (idx < MAX_JPEG_CLIENT_NUM) {
- /* client session avail */
- /* generate client handler by index */
- client_hdl = mm_jpeg_util_generate_handler(idx);
-
- /* update client session */
- my_obj->clnt_mgr[idx].is_used = 1;
- my_obj->clnt_mgr[idx].client_handle = client_hdl;
-
- pthread_mutex_init(&my_obj->clnt_mgr[idx].lock, NULL);
- for (i = 0; i < MM_JPEG_MAX_SESSION; i++) {
- memset(&my_obj->clnt_mgr[idx].session[i], 0x0, sizeof(mm_jpeg_job_session_t));
- }
-
- /* increse client count */
- my_obj->num_clients++;
- }
-
- return client_hdl;
-}
-
-/** mm_jpeg_start_job:
- *
- * Arguments:
- * @my_obj: jpeg object
- * @client_hdl: client handle
- * @job: pointer to encode job
- * @jobId: job id
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Start the encoding job
- *
- **/
-int32_t mm_jpeg_start_job(mm_jpeg_obj *my_obj,
- mm_jpeg_job_t *job,
- uint32_t *job_id)
-{
- mm_jpeg_q_data_t qdata;
- int32_t rc = -1;
- uint8_t session_idx = 0;
- uint8_t client_idx = 0;
- mm_jpeg_job_q_node_t* node = NULL;
- mm_jpeg_job_session_t *p_session = NULL;
- mm_jpeg_encode_job_t *p_jobparams = NULL;
- uint32_t work_bufs_need;
- uint32_t work_buf_size = 0, i = 0;
- int32_t curr_width, prev_width;
- int32_t curr_height, prev_height;
-
- *job_id = 0;
-
- if (!job) {
- CDBG_ERROR("%s:%d] invalid job !!!", __func__, __LINE__);
- return rc;
- }
- p_jobparams = &job->encode_job;
-
- /* check if valid session */
- session_idx = GET_SESSION_IDX(p_jobparams->session_id);
- client_idx = GET_CLIENT_IDX(p_jobparams->session_id);
- CDBG_HIGH("%s:%d] session_idx %d client idx %d", __func__, __LINE__,
- session_idx, client_idx);
-
- if ((session_idx >= MM_JPEG_MAX_SESSION) ||
- (client_idx >= MAX_JPEG_CLIENT_NUM)) {
- CDBG_ERROR("%s:%d] invalid session id %x", __func__, __LINE__,
- job->encode_job.session_id);
- return rc;
- }
-
- p_session = &my_obj->clnt_mgr[client_idx].session[session_idx];
-
- p_session->work_buffer.addr = p_jobparams->work_buf.buf_vaddr;
- p_session->work_buffer.size = p_jobparams->work_buf.buf_size;
- p_session->work_buffer.ion_info_fd.fd = p_jobparams->work_buf.fd;
- p_session->work_buffer.p_pmem_fd = p_jobparams->work_buf.fd;
-
- prev_width = my_obj->prev_w;
- prev_height = my_obj->prev_h;
-
- curr_width = p_jobparams->main_dim.src_dim.width;
- curr_height = p_jobparams->main_dim.src_dim.height;
-
- work_bufs_need = my_obj->num_sessions + NUM_OMX_SESSIONS;
-
- if (work_bufs_need > MM_JPEG_CONCURRENT_SESSIONS_COUNT) {
- work_bufs_need = MM_JPEG_CONCURRENT_SESSIONS_COUNT;
- }
-
- if (p_session->work_buffer.addr) {
- work_bufs_need--;
- /* release if there are any work buffers already allocated */
- while (my_obj->work_buf_cnt) {
- buffer_deallocate(&my_obj->ionBuffer[my_obj->work_buf_cnt]);
- my_obj->work_buf_cnt--;
- }
- CDBG_HIGH("%s:%d] HAL passed the work buffer of size = %d; don't alloc internally",
- __func__, __LINE__, p_session->work_buffer.size);
- } else {
- p_session->work_buffer = my_obj->ionBuffer[0];
-
- CDBG_HIGH("%s:%d] work_bufs_need %d work_buf_cnt %d", __func__, __LINE__,
- work_bufs_need, my_obj->work_buf_cnt);
-
- if (my_obj->work_buf_cnt > work_bufs_need) {
- CDBG_ERROR("%s: %d] Unexpected work buffer count", __func__, __LINE__);
- return rc;
- }
-
- if ((my_obj->work_buf_cnt == work_bufs_need) &&
- ((curr_width * curr_height) != (prev_width * prev_height))) {
- CDBG_HIGH("%s: %d] curr_width %d curr_height %d prev_width %d prev_height %d",
- __func__, __LINE__, curr_width, curr_height, prev_width, prev_height);
- /* resolution changed, release the previously allocated work buffer */
- while (my_obj->work_buf_cnt) {
- buffer_deallocate(&my_obj->ionBuffer[my_obj->work_buf_cnt]);
- my_obj->work_buf_cnt--;
- }
- }
- my_obj->prev_w = curr_width;
- my_obj->prev_h = curr_height;
- work_buf_size = CEILING64(curr_width) *
- CEILING64(curr_height) * 3 / 2;
- }
-
- CDBG_HIGH("%s:%d] >>>> Work bufs need %d, %d", __func__, __LINE__,
- work_bufs_need, my_obj->work_buf_cnt);
-
- for (i = my_obj->work_buf_cnt; i < work_bufs_need; i++) {
- my_obj->ionBuffer[i].size = CEILING32(work_buf_size);
- CDBG_HIGH("%s: Picture size %d x %d, WorkBufSize = %zu",__func__,
- curr_width, curr_height, my_obj->ionBuffer[i].size);
-
- my_obj->ionBuffer[i].addr = (uint8_t *)buffer_allocate(&my_obj->ionBuffer[i], 1);
- my_obj->work_buf_cnt++;
- if (NULL == my_obj->ionBuffer[i].addr) {
- CDBG_ERROR("%s:%d] Ion allocation failed",__func__, __LINE__);
- while (i--) {
- buffer_deallocate(&my_obj->ionBuffer[i]);
- my_obj->work_buf_cnt--;
- }
- return -1;
- } else
- p_session->work_buffer = my_obj->ionBuffer[i];
- }
-
- if (OMX_FALSE == p_session->active) {
- CDBG_ERROR("%s:%d] session not active %x", __func__, __LINE__,
- job->encode_job.session_id);
- return rc;
- }
-
- if ((p_jobparams->src_index >= (int32_t)p_session->params.num_src_bufs) ||
- (p_jobparams->dst_index >= (int32_t)p_session->params.num_dst_bufs)) {
- CDBG_ERROR("%s:%d] invalid buffer indices", __func__, __LINE__);
- return rc;
- }
-
- /* enqueue new job into todo job queue */
- node = (mm_jpeg_job_q_node_t *)malloc(sizeof(mm_jpeg_job_q_node_t));
- if (NULL == node) {
- CDBG_ERROR("%s: No memory for mm_jpeg_job_q_node_t", __func__);
- return -1;
- }
-
- ATRACE_INT("Camera:JPEG",
- (int32_t)((uint32_t)session_idx<<16 | ++p_session->job_index));
-
- *job_id = job->encode_job.session_id |
- (((uint32_t)p_session->job_hist++ % JOB_HIST_MAX) << 16);
-
- memset(node, 0, sizeof(mm_jpeg_job_q_node_t));
- node->enc_info.encode_job = job->encode_job;
- node->enc_info.job_id = *job_id;
- node->enc_info.client_handle = p_session->client_hdl;
- node->type = MM_JPEG_CMD_TYPE_JOB;
-
-
-
- qdata.p = node;
- rc = mm_jpeg_queue_enq(&my_obj->job_mgr.job_queue, qdata);
- if (0 == rc) {
- cam_sem_post(&my_obj->job_mgr.job_sem);
- }
-
- CDBG_ERROR("%s:%d] X", __func__, __LINE__);
-
- return rc;
-}
-
-
-
-/** mm_jpeg_abort_job:
- *
- * Arguments:
- * @my_obj: jpeg object
- * @client_hdl: client handle
- * @jobId: job id
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Abort the encoding session
- *
- **/
-int32_t mm_jpeg_abort_job(mm_jpeg_obj *my_obj,
- uint32_t jobId)
-{
- int32_t rc = -1;
- mm_jpeg_job_q_node_t *node = NULL;
- mm_jpeg_job_session_t *p_session = NULL;
-
- CDBG("%s:%d] ", __func__, __LINE__);
- pthread_mutex_lock(&my_obj->job_lock);
-
- /* abort job if in todo queue */
- node = mm_jpeg_queue_remove_job_by_job_id(&my_obj->job_mgr.job_queue, jobId);
- if (NULL != node) {
- free(node);
- goto abort_done;
- }
-
- /* abort job if in ongoing queue */
- node = mm_jpeg_queue_remove_job_by_job_id(&my_obj->ongoing_job_q, jobId);
- if (NULL != node) {
- /* find job that is OMX ongoing, ask OMX to abort the job */
- p_session = mm_jpeg_get_session(my_obj, node->enc_info.job_id);
- if (p_session) {
- mm_jpeg_session_abort(p_session);
- } else {
- CDBG_ERROR("%s:%d] Invalid job id 0x%x", __func__, __LINE__,
- node->enc_info.job_id);
- }
- free(node);
- goto abort_done;
- }
-
-abort_done:
- pthread_mutex_unlock(&my_obj->job_lock);
-
- return rc;
-}
-
-
-#ifdef MM_JPEG_READ_META_KEYFILE
-static int32_t mm_jpeg_read_meta_keyfile(mm_jpeg_job_session_t *p_session,
- const char *filename)
-{
- int rc = 0;
- FILE *fp = NULL;
- size_t file_size = 0;
- fp = fopen(filename, "r");
- if (!fp) {
- CDBG_ERROR("%s:%d] Key not present", __func__, __LINE__);
- return -1;
- }
- fseek(fp, 0, SEEK_END);
- file_size = (size_t)ftell(fp);
- fseek(fp, 0, SEEK_SET);
-
- p_session->meta_enc_key = (uint8_t *) malloc((file_size + 1) * sizeof(uint8_t));
-
- if (!p_session->meta_enc_key) {
- CDBG_ERROR("%s:%d] error", __func__, __LINE__);
- return -1;
- }
-
- fread(p_session->meta_enc_key, 1, file_size, fp);
- fclose(fp);
-
- p_session->meta_enc_keylen = file_size;
-
- return rc;
-}
-#endif // MM_JPEG_READ_META_KEYFILE
-
-/** mm_jpeg_create_session:
- *
- * Arguments:
- * @my_obj: jpeg object
- * @client_hdl: client handle
- * @p_params: pointer to encode params
- * @p_session_id: session id
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Start the encoding session
- *
- **/
-int32_t mm_jpeg_create_session(mm_jpeg_obj *my_obj,
- uint32_t client_hdl,
- mm_jpeg_encode_params_t *p_params,
- uint32_t* p_session_id)
-{
- mm_jpeg_q_data_t qdata;
- int32_t rc = 0;
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- uint8_t clnt_idx = 0;
- int session_idx = -1;
- mm_jpeg_job_session_t *p_session = NULL;
- mm_jpeg_job_session_t * p_prev_session = NULL;
- *p_session_id = 0;
- uint32_t i = 0;
- uint32_t num_omx_sessions = NUM_OMX_SESSIONS;
- mm_jpeg_queue_t *p_session_handle_q, *p_out_buf_q;
- char trace_tag[32];
-
- /* validate the parameters */
- if ((p_params->num_src_bufs > MM_JPEG_MAX_BUF)
- || (p_params->num_dst_bufs > MM_JPEG_MAX_BUF)) {
- CDBG_ERROR("%s:%d] invalid num buffers", __func__, __LINE__);
- return rc;
- }
-
- /* check if valid client */
- clnt_idx = mm_jpeg_util_get_index_by_handler(client_hdl);
- if (clnt_idx >= MAX_JPEG_CLIENT_NUM) {
- CDBG_ERROR("%s: invalid client with handler (%d)", __func__, client_hdl);
- return rc;
- }
-
- if (p_params->burst_mode) {
- num_omx_sessions = MM_JPEG_CONCURRENT_SESSIONS_COUNT;
- }
-
- /* init omx handle queue */
- p_session_handle_q = (mm_jpeg_queue_t *) malloc(sizeof(*p_session_handle_q));
- if (NULL == p_session_handle_q) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- goto error1;
- }
- rc = mm_jpeg_queue_init(p_session_handle_q);
- if (0 != rc) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- free(p_session_handle_q);
- goto error1;
- }
-
- /* init output buf queue */
- p_out_buf_q = (mm_jpeg_queue_t *) malloc(sizeof(*p_out_buf_q));
- if (NULL == p_out_buf_q) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- return -1;
- }
- /* init omx handle queue */
- rc = mm_jpeg_queue_init(p_out_buf_q);
- if (0 != rc) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- free(p_out_buf_q);
- goto error1;
- }
-
- for (i = 0; i < num_omx_sessions; i++) {
- uint32_t buf_idx = 0U;
- session_idx = mm_jpeg_get_new_session_idx(my_obj, clnt_idx, &p_session);
- if (session_idx < 0 || NULL == p_session) {
- CDBG_ERROR("%s:%d] invalid session id (%d)", __func__, __LINE__, session_idx);
- goto error2;
- }
-
- snprintf(trace_tag, sizeof(trace_tag), "Camera:JPEGsession%d", session_idx);
- ATRACE_INT(trace_tag, 1);
-
- p_session->job_index = 0;
-
- p_session->next_session = NULL;
-
- if (p_prev_session) {
- p_prev_session->next_session = p_session;
- }
- p_prev_session = p_session;
-
- buf_idx = my_obj->num_sessions + i;
- if (buf_idx < MM_JPEG_CONCURRENT_SESSIONS_COUNT) {
- p_session->work_buffer = my_obj->ionBuffer[buf_idx];
- } else {
- p_session->work_buffer.addr = NULL;
- p_session->work_buffer.ion_fd = -1;
- p_session->work_buffer.p_pmem_fd = -1;
- }
-
- p_session->jpeg_obj = (void*)my_obj; /* save a ptr to jpeg_obj */
-
- ret = mm_jpeg_session_create(p_session);
- if (OMX_ErrorNone != ret) {
- p_session->active = OMX_FALSE;
- CDBG_ERROR("%s:%d] jpeg session create failed", __func__, __LINE__);
- goto error2;
- }
-
- uint32_t session_id = (JOB_ID_MAGICVAL << 24) |
- ((uint32_t)session_idx << 8) | clnt_idx;
-
- if (!*p_session_id) {
- *p_session_id = session_id;
- }
-
- /*copy the params*/
- p_session->params = *p_params;
- p_session->client_hdl = client_hdl;
- p_session->sessionId = session_id;
- p_session->session_handle_q = p_session_handle_q;
- p_session->out_buf_q = p_out_buf_q;
-
- qdata.p = p_session;
- mm_jpeg_queue_enq(p_session_handle_q, qdata);
-
- if (OMX_FALSE == p_session->config) {
- rc = mm_jpeg_session_configure(p_session);
- if (rc) {
- CDBG_ERROR("%s:%d] Error", __func__, __LINE__);
- goto error2;
- }
- p_session->config = OMX_TRUE;
- }
- p_session->num_omx_sessions = num_omx_sessions;
-
- CDBG("%s:%d] session id %x", __func__, __LINE__, session_id);
- }
-
- // Queue the output buf indexes
- for (i = 0; i < p_params->num_dst_bufs; i++) {
- qdata.u32 = i + 1;
- mm_jpeg_queue_enq(p_out_buf_q, qdata);
- }
-
- p_session->meta_enc_key = NULL;
- p_session->meta_enc_keylen = 0;
-
-#ifdef MM_JPEG_READ_META_KEYFILE
- mm_jpeg_read_meta_keyfile(p_session, META_KEYFILE);
-#endif
-
- return rc;
-
-error1:
- rc = -1;
-error2:
- if (NULL != p_session) {
- ATRACE_INT(trace_tag, 0);
- }
- return rc;
-}
-
-/** mm_jpegenc_destroy_job
- *
- * Arguments:
- * @p_session: Session obj
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Destroy the job based paramenters
- *
- **/
-static int32_t mm_jpegenc_destroy_job(mm_jpeg_job_session_t *p_session)
-{
- mm_jpeg_encode_job_t *p_jobparams = &p_session->encode_job;
- int i = 0, rc = 0;
-
- CDBG_ERROR("%s:%d] Exif entry count %d %d", __func__, __LINE__,
- (int)p_jobparams->exif_info.numOfEntries,
- (int)p_session->exif_count_local);
- for (i = 0; i < p_session->exif_count_local; i++) {
- rc = releaseExifEntry(&p_session->exif_info_local[i]);
- if (rc) {
- CDBG_ERROR("%s:%d] Exif release failed (%d)", __func__, __LINE__, rc);
- }
- }
- p_session->exif_count_local = 0;
-
- return rc;
-}
-
-/** mm_jpeg_session_encode:
- *
- * Arguments:
- * @p_session: encode session
- *
- * Return:
- * OMX_ERRORTYPE
- *
- * Description:
- * Start the encoding
- *
- **/
-static void mm_jpegenc_job_done(mm_jpeg_job_session_t *p_session)
-{
- mm_jpeg_q_data_t qdata;
- mm_jpeg_obj *my_obj = (mm_jpeg_obj *)p_session->jpeg_obj;
- mm_jpeg_job_q_node_t *node = NULL;
-
- /*Destroy job related params*/
- mm_jpegenc_destroy_job(p_session);
-
- /*remove the job*/
- node = mm_jpeg_queue_remove_job_by_job_id(&my_obj->ongoing_job_q,
- p_session->jobId);
- if (node) {
- free(node);
- }
- p_session->encoding = OMX_FALSE;
-
- // Queue to available sessions
- qdata.p = p_session;
- mm_jpeg_queue_enq(p_session->session_handle_q, qdata);
-
- if (p_session->auto_out_buf) {
- //Queue out buf index
- qdata.u32 = (uint32_t)(p_session->encode_job.dst_index + 1);
- mm_jpeg_queue_enq(p_session->out_buf_q, qdata);
- }
-
- /* wake up jobMgr thread to work on new job if there is any */
- cam_sem_post(&my_obj->job_mgr.job_sem);
-}
-
-/** mm_jpeg_destroy_session:
- *
- * Arguments:
- * @my_obj: jpeg object
- * @session_id: session index
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Destroy the encoding session
- *
- **/
-int32_t mm_jpeg_destroy_session(mm_jpeg_obj *my_obj,
- mm_jpeg_job_session_t *p_session)
-{
- mm_jpeg_q_data_t qdata;
- int32_t rc = 0;
- mm_jpeg_job_q_node_t *node = NULL;
- uint32_t session_id = 0;
- mm_jpeg_job_session_t *p_cur_sess;
- char trace_tag[32];
-
- if (NULL == p_session) {
- CDBG_ERROR("%s:%d] invalid session", __func__, __LINE__);
- return rc;
- }
-
- session_id = p_session->sessionId;
-
- pthread_mutex_lock(&my_obj->job_lock);
-
- /* abort job if in todo queue */
- CDBG("%s:%d] abort todo jobs", __func__, __LINE__);
- node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->job_mgr.job_queue, session_id);
- while (NULL != node) {
- free(node);
- node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->job_mgr.job_queue, session_id);
- }
-
- /* abort job if in ongoing queue */
- CDBG("%s:%d] abort ongoing jobs", __func__, __LINE__);
- node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->ongoing_job_q, session_id);
- while (NULL != node) {
- free(node);
- node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->ongoing_job_q, session_id);
- }
-
- /* abort the current session */
- mm_jpeg_session_abort(p_session);
- mm_jpeg_session_destroy(p_session);
-
- p_cur_sess = p_session;
-
- do {
- mm_jpeg_remove_session_idx(my_obj, p_cur_sess->sessionId);
- } while (NULL != (p_cur_sess = p_cur_sess->next_session));
-
-
- pthread_mutex_unlock(&my_obj->job_lock);
-
- while (1) {
- qdata = mm_jpeg_queue_deq(p_session->session_handle_q);
- if (NULL == qdata.p)
- break;
- }
- mm_jpeg_queue_deinit(p_session->session_handle_q);
- free(p_session->session_handle_q);
- p_session->session_handle_q = NULL;
-
- while (1) {
- qdata = mm_jpeg_queue_deq(p_session->out_buf_q);
- if (0U == qdata.u32)
- break;
- }
- mm_jpeg_queue_deinit(p_session->out_buf_q);
- free(p_session->out_buf_q);
- p_session->out_buf_q = NULL;
-
-
- /* wake up jobMgr thread to work on new job if there is any */
- cam_sem_post(&my_obj->job_mgr.job_sem);
-
- snprintf(trace_tag, sizeof(trace_tag), "Camera:JPEGsession%d", GET_SESSION_IDX(session_id));
- ATRACE_INT(trace_tag, 0);
-
- CDBG("%s:%d] X", __func__, __LINE__);
-
-
- return rc;
-}
-
-
-
-
-/** mm_jpeg_destroy_session:
- *
- * Arguments:
- * @my_obj: jpeg object
- * @session_id: session index
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Destroy the encoding session
- *
- **/
-int32_t mm_jpeg_destroy_session_unlocked(mm_jpeg_obj *my_obj,
- mm_jpeg_job_session_t *p_session)
-{
- int32_t rc = -1;
- mm_jpeg_job_q_node_t *node = NULL;
- uint32_t session_id = 0;
- if (NULL == p_session) {
- CDBG_ERROR("%s:%d] invalid session", __func__, __LINE__);
- return rc;
- }
-
- session_id = p_session->sessionId;
-
- /* abort job if in todo queue */
- CDBG("%s:%d] abort todo jobs", __func__, __LINE__);
- node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->job_mgr.job_queue, session_id);
- while (NULL != node) {
- free(node);
- node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->job_mgr.job_queue, session_id);
- }
-
- /* abort job if in ongoing queue */
- CDBG("%s:%d] abort ongoing jobs", __func__, __LINE__);
- node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->ongoing_job_q, session_id);
- while (NULL != node) {
- free(node);
- node = mm_jpeg_queue_remove_job_by_session_id(&my_obj->ongoing_job_q, session_id);
- }
-
- /* abort the current session */
- mm_jpeg_session_abort(p_session);
- mm_jpeg_remove_session_idx(my_obj, session_id);
-
- return rc;
-}
-
-/** mm_jpeg_destroy_session:
- *
- * Arguments:
- * @my_obj: jpeg object
- * @session_id: session index
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Destroy the encoding session
- *
- **/
-int32_t mm_jpeg_destroy_session_by_id(mm_jpeg_obj *my_obj, uint32_t session_id)
-{
- mm_jpeg_job_session_t *p_session = mm_jpeg_get_session(my_obj, session_id);
-
- return mm_jpeg_destroy_session(my_obj, p_session);
-}
-
-
-
-/** mm_jpeg_close:
- *
- * Arguments:
- * @my_obj: jpeg object
- * @client_hdl: client handle
- *
- * Return:
- * 0 for success else failure
- *
- * Description:
- * Close the jpeg client
- *
- **/
-int32_t mm_jpeg_close(mm_jpeg_obj *my_obj, uint32_t client_hdl)
-{
- int32_t rc = -1;
- uint8_t clnt_idx = 0;
- int i = 0;
-
- /* check if valid client */
- clnt_idx = mm_jpeg_util_get_index_by_handler(client_hdl);
- if (clnt_idx >= MAX_JPEG_CLIENT_NUM) {
- CDBG_ERROR("%s: invalid client with handler (%d)", __func__, client_hdl);
- return rc;
- }
-
- CDBG("%s:%d] E", __func__, __LINE__);
-
- /* abort all jobs from the client */
- pthread_mutex_lock(&my_obj->job_lock);
-
- CDBG("%s:%d] ", __func__, __LINE__);
-
- for (i = 0; i < MM_JPEG_MAX_SESSION; i++) {
- if (OMX_TRUE == my_obj->clnt_mgr[clnt_idx].session[i].active)
- mm_jpeg_destroy_session_unlocked(my_obj,
- &my_obj->clnt_mgr[clnt_idx].session[i]);
- }
-
- CDBG("%s:%d] ", __func__, __LINE__);
-
-#ifdef LOAD_ADSP_RPC_LIB
- if (NULL != my_obj->adsprpc_lib_handle) {
- dlclose(my_obj->adsprpc_lib_handle);
- my_obj->adsprpc_lib_handle = NULL;
- }
-#endif
-
- pthread_mutex_unlock(&my_obj->job_lock);
- CDBG("%s:%d] ", __func__, __LINE__);
-
- /* invalidate client session */
- pthread_mutex_destroy(&my_obj->clnt_mgr[clnt_idx].lock);
- memset(&my_obj->clnt_mgr[clnt_idx], 0, sizeof(mm_jpeg_client_t));
-
- rc = 0;
- CDBG("%s:%d] X", __func__, __LINE__);
- return rc;
-}
-
-OMX_ERRORTYPE mm_jpeg_ebd(OMX_HANDLETYPE hComponent,
- OMX_PTR pAppData,
- OMX_BUFFERHEADERTYPE *pBuffer)
-{
- mm_jpeg_job_session_t *p_session = (mm_jpeg_job_session_t *) pAppData;
-
- CDBG("%s:%d] count %d ", __func__, __LINE__, p_session->ebd_count);
- pthread_mutex_lock(&p_session->lock);
- p_session->ebd_count++;
- pthread_mutex_unlock(&p_session->lock);
- return 0;
-}
-
-OMX_ERRORTYPE mm_jpeg_fbd(OMX_HANDLETYPE hComponent,
- OMX_PTR pAppData,
- OMX_BUFFERHEADERTYPE *pBuffer)
-{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- mm_jpeg_job_session_t *p_session = (mm_jpeg_job_session_t *) pAppData;
- mm_jpeg_output_t output_buf;
- CDBG("%s:%d] count %d ", __func__, __LINE__, p_session->fbd_count);
- CDBG_HIGH("[KPI Perf] : PROFILE_JPEG_FBD");
-
- pthread_mutex_lock(&p_session->lock);
- ATRACE_INT("Camera:JPEG",
- (int32_t)((uint32_t)GET_SESSION_IDX(
- p_session->sessionId)<<16 | --p_session->job_index));
- if (MM_JPEG_ABORT_NONE != p_session->abort_state) {
- omx_jpeg_ouput_buf_t *jpeg_out = (omx_jpeg_ouput_buf_t*) pBuffer->pBuffer;
- CDBG_HIGH("%s:%d] Releasing bit stream buf in abort ", __func__, __LINE__);
-
- p_session->params.put_memory (jpeg_out);
- p_session->abort_state = MM_JPEG_ABORT_DONE;
- pthread_cond_signal(&p_session->cond);
- pthread_mutex_unlock(&p_session->lock);
- return ret;
- }
-
- p_session->fbd_count++;
- if (NULL != p_session->params.jpeg_cb) {
-
- p_session->job_status = JPEG_JOB_STATUS_DONE;
- output_buf.buf_filled_len = (uint32_t)pBuffer->nFilledLen;
- output_buf.buf_vaddr = pBuffer->pBuffer;
- output_buf.fd = 0;
- CDBG("%s:%d] send jpeg callback %d buf 0x%p len %u JobID %u",
- __func__, __LINE__,
- p_session->job_status, pBuffer->pBuffer,
- (unsigned int)pBuffer->nFilledLen, p_session->jobId);
- p_session->params.jpeg_cb(p_session->job_status,
- p_session->client_hdl,
- p_session->jobId,
- &output_buf,
- p_session->params.userdata);
-
- mm_jpegenc_job_done(p_session);
-
- }
- pthread_mutex_unlock(&p_session->lock);
- CDBG("%s:%d] ", __func__, __LINE__);
-
- return ret;
-}
-
-
-
-OMX_ERRORTYPE mm_jpeg_event_handler(OMX_HANDLETYPE hComponent,
- OMX_PTR pAppData,
- OMX_EVENTTYPE eEvent,
- OMX_U32 nData1,
- OMX_U32 nData2,
- OMX_PTR pEventData)
-{
- mm_jpeg_job_session_t *p_session = (mm_jpeg_job_session_t *) pAppData;
-
- CDBG("%s:%d] %d %d %d state %d", __func__, __LINE__, eEvent, (int)nData1,
- (int)nData2, p_session->abort_state);
-
- pthread_mutex_lock(&p_session->lock);
-
- if (MM_JPEG_ABORT_INIT == p_session->abort_state) {
- p_session->abort_state = MM_JPEG_ABORT_DONE;
- pthread_cond_signal(&p_session->cond);
- pthread_mutex_unlock(&p_session->lock);
- return OMX_ErrorNone;
- }
-
- if (eEvent == OMX_EventError) {
- p_session->error_flag = nData2;
- if (p_session->encoding == OMX_TRUE) {
- CDBG("%s:%d] Error during encoding", __func__, __LINE__);
-
- /* send jpeg callback */
- if (NULL != p_session->params.jpeg_cb) {
- p_session->job_status = JPEG_JOB_STATUS_ERROR;
- CDBG("%s:%d] send jpeg error callback %d", __func__, __LINE__,
- p_session->job_status);
- p_session->params.jpeg_cb(p_session->job_status,
- p_session->client_hdl,
- p_session->jobId,
- NULL,
- p_session->params.userdata);
- }
-
- /* remove from ready queue */
- mm_jpegenc_job_done(p_session);
- }
- pthread_cond_signal(&p_session->cond);
- } else if (eEvent == OMX_EventCmdComplete) {
- if (p_session->state_change_pending == OMX_TRUE) {
- p_session->state_change_pending = OMX_FALSE;
- pthread_cond_signal(&p_session->cond);
- }
- }
-
- pthread_mutex_unlock(&p_session->lock);
- CDBG("%s:%d]", __func__, __LINE__);
- return OMX_ErrorNone;
-}
-
-
-
-/* remove the first job from the queue with matching client handle */
-mm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_by_client_id(
- mm_jpeg_queue_t* queue, uint32_t client_hdl)
-{
- mm_jpeg_q_node_t* node = NULL;
- mm_jpeg_job_q_node_t* data = NULL;
- mm_jpeg_job_q_node_t* job_node = NULL;
- struct cam_list *head = NULL;
- struct cam_list *pos = NULL;
-
- pthread_mutex_lock(&queue->lock);
- head = &queue->head.list;
- pos = head->next;
- while(pos != head) {
- node = member_of(pos, mm_jpeg_q_node_t, list);
- data = (mm_jpeg_job_q_node_t *)node->data.p;
-
- if (data && (data->enc_info.client_handle == client_hdl)) {
- CDBG_ERROR("%s:%d] found matching client handle", __func__, __LINE__);
- job_node = data;
- cam_list_del_node(&node->list);
- queue->size--;
- free(node);
- CDBG_ERROR("%s: queue size = %d", __func__, queue->size);
- break;
- }
- pos = pos->next;
- }
-
- pthread_mutex_unlock(&queue->lock);
-
- return job_node;
-}
-
-/* remove the first job from the queue with matching session id */
-mm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_by_session_id(
- mm_jpeg_queue_t* queue, uint32_t session_id)
-{
- mm_jpeg_q_node_t* node = NULL;
- mm_jpeg_job_q_node_t* data = NULL;
- mm_jpeg_job_q_node_t* job_node = NULL;
- struct cam_list *head = NULL;
- struct cam_list *pos = NULL;
-
- pthread_mutex_lock(&queue->lock);
- head = &queue->head.list;
- pos = head->next;
- while(pos != head) {
- node = member_of(pos, mm_jpeg_q_node_t, list);
- data = (mm_jpeg_job_q_node_t *)node->data.p;
-
- if (data && (data->enc_info.encode_job.session_id == session_id)) {
- CDBG_ERROR("%s:%d] found matching session id", __func__, __LINE__);
- job_node = data;
- cam_list_del_node(&node->list);
- queue->size--;
- free(node);
- CDBG_ERROR("%s: queue size = %d", __func__, queue->size);
- break;
- }
- pos = pos->next;
- }
-
- pthread_mutex_unlock(&queue->lock);
-
- return job_node;
-}
-
-/* remove job from the queue with matching job id */
-mm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_by_job_id(
- mm_jpeg_queue_t* queue, uint32_t job_id)
-{
- mm_jpeg_q_node_t* node = NULL;
- mm_jpeg_job_q_node_t* data = NULL;
- mm_jpeg_job_q_node_t* job_node = NULL;
- struct cam_list *head = NULL;
- struct cam_list *pos = NULL;
- uint32_t lq_job_id;
-
- pthread_mutex_lock(&queue->lock);
- head = &queue->head.list;
- pos = head->next;
- while(pos != head) {
- node = member_of(pos, mm_jpeg_q_node_t, list);
- data = (mm_jpeg_job_q_node_t *)node->data.p;
-
- if (data != NULL) {
- if (data->type == MM_JPEG_CMD_TYPE_DECODE_JOB) {
- lq_job_id = data->dec_info.job_id;
- } else {
- lq_job_id = data->enc_info.job_id;
- }
-
- if (lq_job_id == job_id) {
- CDBG_ERROR("%s:%d] found matching job id", __func__, __LINE__);
- job_node = data;
- cam_list_del_node(&node->list);
- queue->size--;
- free(node);
- break;
- }
- }
- pos = pos->next;
- }
-
- pthread_mutex_unlock(&queue->lock);
-
- return job_node;
-}
-
-/* remove job from the queue with matching job id */
-mm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_unlk(
- mm_jpeg_queue_t* queue, uint32_t job_id)
-{
- mm_jpeg_q_node_t* node = NULL;
- mm_jpeg_job_q_node_t* data = NULL;
- mm_jpeg_job_q_node_t* job_node = NULL;
- struct cam_list *head = NULL;
- struct cam_list *pos = NULL;
-
- head = &queue->head.list;
- pos = head->next;
- while(pos != head) {
- node = member_of(pos, mm_jpeg_q_node_t, list);
- data = (mm_jpeg_job_q_node_t *)node->data.p;
-
- if (data && (data->enc_info.job_id == job_id)) {
- job_node = data;
- cam_list_del_node(&node->list);
- queue->size--;
- free(node);
- break;
- }
- pos = pos->next;
- }
-
- return job_node;
-}