111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. 211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Redistribution and use in source and binary forms, with or without 411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * modification, are permitted provided that the following conditions are 511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * met: 611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Redistributions of source code must retain the above copyright 711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * notice, this list of conditions and the following disclaimer. 811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Redistributions in binary form must reproduce the above 911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * copyright notice, this list of conditions and the following 1011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * disclaimer in the documentation and/or other materials provided 1111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * with the distribution. 1211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Neither the name of The Linux Foundation nor the names of its 1311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * contributors may be used to endorse or promote products derived 1411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * from this software without specific prior written permission. 1511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 1611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 2811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev */ 2911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#ifndef MM_JPEG_H_ 3111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define MM_JPEG_H_ 3211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <cam_semaphore.h> 3411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "mm_jpeg_interface.h" 3511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "cam_list.h" 3611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "OMX_Types.h" 3711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "OMX_Index.h" 3811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "OMX_Core.h" 3911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "OMX_Component.h" 4011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "QOMX_JpegExtensions.h" 4111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define MM_JPEG_MAX_THREADS 30 4311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define MM_JPEG_CIRQ_SIZE 30 4411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define MM_JPEG_MAX_SESSION 10 4511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define MAX_EXIF_TABLE_ENTRIES 50 4611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 4811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct cam_list list; 4911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void* data; 5011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} mm_jpeg_q_node_t; 5111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 5211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 5311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_q_node_t head; /* dummy head */ 5411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t size; 5511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev pthread_mutex_t lock; 5611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} mm_jpeg_queue_t; 5711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 5811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef enum { 5911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev MM_JPEG_CMD_TYPE_JOB, /* job cmd */ 6011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev MM_JPEG_CMD_TYPE_EXIT, /* EXIT cmd for exiting jobMgr thread */ 6111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev MM_JPEG_CMD_TYPE_MAX 6211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} mm_jpeg_cmd_type_t; 6311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 6411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 6511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev union { 6611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int i_data[MM_JPEG_CIRQ_SIZE]; 6711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void *p_data[MM_JPEG_CIRQ_SIZE]; 6811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev }; 6911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int front; 7011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int rear; 7111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int count; 7211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev pthread_mutex_t lock; 7311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} mm_jpeg_cirq_t; 7411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 7511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 7611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t client_hdl; /* client handler */ 7711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t jobId; /* job ID */ 7811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t sessionId; /* session ID */ 7911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_encode_params_t params; /* encode params */ 8011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_encode_job_t encode_job; /* job description */ 8111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev pthread_t encode_pid; /* encode thread handler*/ 8211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 8311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void *jpeg_obj; /* ptr to mm_jpeg_obj */ 8411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev jpeg_job_status_t job_status; /* job status */ 8511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 8611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int state_change_pending; /* flag to indicate if state change is pending */ 8711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_ERRORTYPE error_flag; /* variable to indicate error during encoding */ 8811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_BOOL abort_flag; /* variable to indicate abort during encoding */ 8911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 9011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev /* OMX related */ 9111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_HANDLETYPE omx_handle; /* handle to omx engine */ 9211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_CALLBACKTYPE omx_callbacks; /* callbacks to omx engine */ 9311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 9411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev /* buffer headers */ 9511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_BUFFERHEADERTYPE *p_in_omx_buf[MM_JPEG_MAX_BUF]; 9611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_BUFFERHEADERTYPE *p_in_omx_thumb_buf[MM_JPEG_MAX_BUF]; 9711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_BUFFERHEADERTYPE *p_out_omx_buf[MM_JPEG_MAX_BUF]; 9811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 9911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_PARAM_PORTDEFINITIONTYPE inputPort; 10011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_PARAM_PORTDEFINITIONTYPE outputPort; 10111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_PARAM_PORTDEFINITIONTYPE inputTmbPort; 10211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 10311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev /* event locks */ 10411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev pthread_mutex_t lock; 10511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev pthread_cond_t cond; 10611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 10711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QEXIF_INFO_DATA exif_info_all[MAX_EXIF_TABLE_ENTRIES]; //all exif tags for JPEG encoder 10811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 10911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_cirq_t cb_q; 11011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t ebd_count; 11111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t fbd_count; 11211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 11311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev /* this flag represents whether the job is active */ 11411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_BOOL active; 11511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 11611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev /* this flag indicates if the configration is complete */ 11711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_BOOL config; 11811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 11911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev /* job history count to generate unique id */ 12011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int job_hist; 12111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 12211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev OMX_BOOL encoding; 12311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} mm_jpeg_job_session_t; 12411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 12511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 12611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_encode_job_t encode_job; 12711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t job_id; 12811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t client_handle; 12911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} mm_jpeg_encode_job_info_t; 13011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 13111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 13211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_cmd_type_t type; 13311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev union { 13411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_encode_job_info_t enc_info; 13511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev }; 13611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} mm_jpeg_job_q_node_t; 13711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 13811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 13911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint8_t is_used; /* flag: if is a valid client */ 14011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t client_handle; /* client handle */ 14111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_job_session_t session[MM_JPEG_MAX_SESSION]; 14211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev pthread_mutex_t lock; /* job lock */ 14311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} mm_jpeg_client_t; 14411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 14511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 14611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev pthread_t pid; /* job cmd thread ID */ 14711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev cam_semaphore_t job_sem; /* semaphore for job cmd thread */ 14811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_queue_t job_queue; /* queue for job to do */ 14911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} mm_jpeg_job_cmd_thread_t; 15011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 15111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define MAX_JPEG_CLIENT_NUM 8 15211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct mm_jpeg_obj_t { 15311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev /* ClientMgr */ 15411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int num_clients; /* num of clients */ 15511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_client_t clnt_mgr[MAX_JPEG_CLIENT_NUM]; /* client manager */ 15611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 15711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev /* JobMkr */ 15811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev pthread_mutex_t job_lock; /* job lock */ 15911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_job_cmd_thread_t job_mgr; /* job mgr thread including todo_q*/ 16011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_queue_t ongoing_job_q; /* queue for ongoing jobs */ 16111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} mm_jpeg_obj; 16211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 16311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t mm_jpeg_init(mm_jpeg_obj *my_obj); 16411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t mm_jpeg_deinit(mm_jpeg_obj *my_obj); 16511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern uint32_t mm_jpeg_new_client(mm_jpeg_obj *my_obj); 16611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t mm_jpeg_start_job(mm_jpeg_obj *my_obj, 16711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_job_t* job, 16811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t* jobId); 16911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t mm_jpeg_abort_job(mm_jpeg_obj *my_obj, 17011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t jobId); 17111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t mm_jpeg_close(mm_jpeg_obj *my_obj, 17211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t client_hdl); 17311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t mm_jpeg_create_session(mm_jpeg_obj *my_obj, 17411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t client_hdl, 17511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_encode_params_t *p_params, 17611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t* p_session_id); 17711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t mm_jpeg_destroy_session_by_id(mm_jpeg_obj *my_obj, 17811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t session_id); 17911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 18011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* utiltity fucntion declared in mm-camera-inteface2.c 18111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * and need be used by mm-camera and below*/ 18211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevuint32_t mm_jpeg_util_generate_handler(uint8_t index); 18311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevuint8_t mm_jpeg_util_get_index_by_handler(uint32_t handler); 18411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 18511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* basic queue functions */ 18611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t mm_jpeg_queue_init(mm_jpeg_queue_t* queue); 18711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t mm_jpeg_queue_enq(mm_jpeg_queue_t* queue, void* node); 18811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern void* mm_jpeg_queue_deq(mm_jpeg_queue_t* queue); 18911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t mm_jpeg_queue_deinit(mm_jpeg_queue_t* queue); 19011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t mm_jpeg_queue_flush(mm_jpeg_queue_t* queue); 19111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern uint32_t mm_jpeg_queue_get_size(mm_jpeg_queue_t* queue); 19211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern void* mm_jpeg_queue_peek(mm_jpeg_queue_t* queue); 19311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t addExifEntry(QOMX_EXIF_INFO *p_exif_info, exif_tag_id_t tagid, 19411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev exif_tag_type_t type, uint32_t count, void *data); 19511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern int32_t releaseExifEntry(QOMX_EXIF_INFO *p_exif_info); 19611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 19711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#endif /* MM_JPEG_H_ */ 19811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 19911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 200