Home | History | Annotate | Download | only in inc
      1 
      2 /* Copyright (c) 2012, The Linux Foundation. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *     * Redistributions of source code must retain the above copyright
      8  *       notice, this list of conditions and the following disclaimer.
      9  *     * Redistributions in binary form must reproduce the above
     10  *       copyright notice, this list of conditions and the following
     11  *       disclaimer in the documentation and/or other materials provided
     12  *       with the distribution.
     13  *     * Neither the name of The Linux Foundation nor the names of its
     14  *       contributors may be used to endorse or promote products derived
     15  *       from this software without specific prior written permission.
     16  *
     17  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     18  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     21  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     24  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     25  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     26  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     27  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28  */
     29 
     30 #ifndef MM_JPEG_H_
     31 #define MM_JPEG_H_
     32 
     33 #include "mm_jpeg_interface.h"
     34 #include "cam_list.h"
     35 #include "OMX_Types.h"
     36 #include "OMX_Index.h"
     37 #include "OMX_Core.h"
     38 #include "OMX_Component.h"
     39 //#include "omx_jpeg_ext.h"
     40 #include <semaphore.h>
     41 
     42 typedef struct {
     43     struct cam_list list;
     44     void* data;
     45 } mm_jpeg_q_node_t;
     46 
     47 typedef struct {
     48     mm_jpeg_q_node_t head; /* dummy head */
     49     uint32_t size;
     50     pthread_mutex_t lock;
     51 } mm_jpeg_queue_t;
     52 
     53 typedef enum
     54 {
     55     MM_JPEG_CMD_TYPE_JOB,          /* job cmd */
     56     MM_JPEG_CMD_TYPE_EXIT,         /* EXIT cmd for exiting jobMgr thread */
     57     MM_JPEG_CMD_TYPE_MAX
     58 } mm_jpeg_cmd_type_t;
     59 
     60 typedef struct {
     61     OMX_BUFFERHEADERTYPE* buf_header;
     62     uint32_t portIdx;
     63 } mm_jpeg_omx_buf_info;
     64 
     65 typedef struct {
     66     uint8_t num_bufs;
     67     mm_jpeg_omx_buf_info bufs[MAX_SRC_BUF_NUM];
     68 } mm_jpeg_omx_src_buf;
     69 
     70 typedef struct {
     71     uint32_t client_hdl;           /* client handler */
     72     uint32_t jobId;                /* job ID */
     73     mm_jpeg_job job;               /* job description */
     74     pthread_t cb_pid;              /* cb thread heandler*/
     75 
     76     void* jpeg_obj;                /* ptr to mm_jpeg_obj */
     77     jpeg_job_status_t job_status;  /* job status */
     78     uint8_t thumbnail_dropped;     /* flag indicating if thumbnail is dropped */
     79     int32_t jpeg_size;             /* the size of jpeg output after job is done */
     80 
     81     mm_jpeg_omx_src_buf src_bufs[JPEG_SRC_IMAGE_TYPE_MAX];
     82     mm_jpeg_omx_buf_info sink_buf;
     83 } mm_jpeg_job_entry;
     84 
     85 typedef struct {
     86     mm_jpeg_cmd_type_t type;
     87     union {
     88         mm_jpeg_job_entry  entry;
     89     };
     90 } mm_jpeg_job_q_node_t;
     91 
     92 typedef struct {
     93     uint8_t is_used;                /* flag: if is a valid client */
     94     uint32_t client_handle;         /* client handle */
     95 } mm_jpeg_client_t;
     96 
     97 typedef struct {
     98     pthread_t pid;                  /* job cmd thread ID */
     99     sem_t job_sem;                  /* semaphore for job cmd thread */
    100     mm_jpeg_queue_t job_queue;      /* queue for job to do */
    101 } mm_jpeg_job_cmd_thread_t;
    102 
    103 typedef enum {
    104     MM_JPEG_EVENT_MASK_JPEG_DONE    = 0x00000001, /* jpeg job is done */
    105     MM_JPEG_EVENT_MASK_JPEG_ABORT   = 0x00000002, /* jpeg job is aborted */
    106     MM_JPEG_EVENT_MASK_JPEG_ERROR   = 0x00000004, /* jpeg job has error */
    107     MM_JPEG_EVENT_MASK_CMD_COMPLETE = 0x00000100  /* omx cmd complete evt */
    108 } mm_jpeg_event_mask_t;
    109 
    110 typedef struct {
    111     uint32_t evt;
    112     int omx_value1;  /* only valid when evt_mask == MM_JPEG_EVENT_MASK_CMD_COMPLETE */
    113     int omx_value2;  /* only valid when evt_mask == MM_JPEG_EVENT_MASK_CMD_COMPLETE */
    114 } mm_jpeg_evt_t;
    115 
    116 #define MAX_JPEG_CLIENT_NUM 8
    117 typedef struct mm_jpeg_obj_t {
    118     /* ClientMgr */
    119     int num_clients;                                /* num of clients */
    120     mm_jpeg_client_t clnt_mgr[MAX_JPEG_CLIENT_NUM]; /* client manager */
    121 
    122     /* JobMkr */
    123     pthread_mutex_t job_lock;                       /* job lock */
    124     mm_jpeg_job_cmd_thread_t job_mgr;               /* job mgr thread including todo_q*/
    125     mm_jpeg_queue_t ongoing_job_q;                  /* queue for ongoing jobs */
    126 
    127     /* Notifier */
    128     mm_jpeg_queue_t cb_q;                           /* queue for CB threads */
    129 
    130     /* OMX related */
    131     OMX_HANDLETYPE omx_handle;                      /* handle to omx engine */
    132 
    133     pthread_mutex_t omx_evt_lock;
    134     pthread_cond_t omx_evt_cond;
    135     mm_jpeg_evt_t omx_evt_rcvd;
    136 } mm_jpeg_obj;
    137 
    138 extern int32_t mm_jpeg_init(mm_jpeg_obj *my_obj);
    139 extern int32_t mm_jpeg_deinit(mm_jpeg_obj *my_obj);
    140 extern uint32_t mm_jpeg_new_client(mm_jpeg_obj *my_obj);
    141 extern int32_t mm_jpeg_start_job(mm_jpeg_obj *my_obj,
    142                                  uint32_t client_hdl,
    143                                  mm_jpeg_job* job,
    144                                  uint32_t* jobId);
    145 extern int32_t mm_jpeg_abort_job(mm_jpeg_obj *my_obj,
    146                                  uint32_t client_hdl,
    147                                  uint32_t jobId);
    148 extern int32_t mm_jpeg_close(mm_jpeg_obj *my_obj,
    149                              uint32_t client_hdl);
    150 
    151 /* utiltity fucntion declared in mm-camera-inteface2.c
    152  * and need be used by mm-camera and below*/
    153 uint32_t mm_jpeg_util_generate_handler(uint8_t index);
    154 uint8_t mm_jpeg_util_get_index_by_handler(uint32_t handler);
    155 
    156 /* basic queue functions */
    157 extern int32_t mm_jpeg_queue_init(mm_jpeg_queue_t* queue);
    158 extern int32_t mm_jpeg_queue_enq(mm_jpeg_queue_t* queue, void* node);
    159 extern void* mm_jpeg_queue_deq(mm_jpeg_queue_t* queue);
    160 extern int32_t mm_jpeg_queue_deinit(mm_jpeg_queue_t* queue);
    161 extern int32_t mm_jpeg_queue_flush(mm_jpeg_queue_t* queue);
    162 extern uint32_t mm_jpeg_queue_get_size(mm_jpeg_queue_t* queue);
    163 
    164 #endif /* MM_JPEG_H_ */
    165 
    166 
    167