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