Home | History | Annotate | Download | only in common
      1 /* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
      2  *
      3  * Redistribution and use in source and binary forms, with or without
      4  * modification, are permitted provided that the following conditions are
      5  * met:
      6  *     * Redistributions of source code must retain the above copyright
      7  *       notice, this list of conditions and the following disclaimer.
      8  *     * Redistributions in binary form must reproduce the above
      9  *       copyright notice, this list of conditions and the following
     10  *       disclaimer in the documentation and/or other materials provided
     11  *       with the distribution.
     12  *     * Neither the name of The Linux Foundation nor the names of its
     13  *       contributors may be used to endorse or promote products derived
     14  *       from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  *
     28  */
     29 
     30 #ifndef __MM_CAMERA_INTERFACE_H__
     31 #define __MM_CAMERA_INTERFACE_H__
     32 #include <linux/msm_ion.h>
     33 #include <linux/videodev2.h>
     34 #include <media/msmb_camera.h>
     35 #include "cam_intf.h"
     36 #include "cam_queue.h"
     37 
     38 #define MM_CAMERA_MAX_NUM_SENSORS MSM_MAX_CAMERA_SENSORS
     39 #define MM_CAMERA_MAX_NUM_FRAMES CAM_MAX_NUM_BUFS_PER_STREAM
     40 /* num of channels allowed in a camera obj */
     41 #define MM_CAMERA_CHANNEL_MAX 16
     42 
     43 #define PAD_TO_SIZE(size, padding) \
     44         ((size + (typeof(size))(padding - 1)) & \
     45         (typeof(size))(~(padding - 1)))
     46 
     47 /** CAM_DUMP_TO_FILE:
     48  *  @filename: file name
     49  *  @name:filename
     50  *  @index: index of the file
     51  *  @extn: file extension
     52  *  @p_addr: address of the buffer
     53  *  @len: buffer length
     54  *
     55  *  dump the image to the file
     56  **/
     57 #define CAM_DUMP_TO_FILE(path, name, index, extn, p_addr, len) ({ \
     58   size_t rc = 0; \
     59   char filename[FILENAME_MAX]; \
     60   if (index >= 0) \
     61     snprintf(filename, FILENAME_MAX, "%s/%s%d.%s", path, name, index, extn); \
     62   else \
     63     snprintf(filename, FILENAME_MAX, "%s/%s.%s", path, name, extn); \
     64   FILE *fp = fopen(filename, "w+"); \
     65   if (fp) { \
     66     rc = fwrite(p_addr, 1, len, fp); \
     67     ALOGE("%s:%d] written size %d", __func__, __LINE__, len); \
     68     fclose(fp); \
     69   } else { \
     70     ALOGE("%s:%d] open %s failed", __func__, __LINE__, filename); \
     71   } \
     72 })
     73 
     74 /* Declaring Buffer structure */
     75 struct mm_camera_buf_def;
     76 
     77 /** mm_camera_plane_def_t : structure for frame plane info
     78 *    @num_planes : num of planes for the frame buffer, to be
     79 *               filled during mem allocation
     80 *    @planes : plane info for the frame buffer, to be filled
     81 *               during mem allocation
     82 **/
     83 typedef struct {
     84     int8_t num_planes;
     85     struct v4l2_plane planes[VIDEO_MAX_PLANES];
     86 } mm_camera_plane_buf_def_t;
     87 
     88 /** mm_camera_user_buf_def_t : structure for frame plane info
     89 *    @num_buffers : num of buffers in this user defined structure
     90 *    @bufs_used : actual number of buffer filled
     91 *    @buf_in_use : flag to notify buffer usage status.
     92 *    @plane_buf : Plane buffer array pointer.
     93 **/
     94 typedef struct {
     95     uint8_t num_buffers;
     96     uint8_t bufs_used;     /*Num of Buffer filled by Kernel*/
     97     uint8_t buf_in_use;  /* Container buffer is freed to fill*/
     98     int32_t buf_idx[MSM_CAMERA_MAX_USER_BUFF_CNT];
     99     struct mm_camera_buf_def *plane_buf;
    100 } mm_camera_user_buf_def_t;
    101 
    102 /** mm_camera_buf_def_t: structure for stream frame buf
    103 *    @stream_id : stream handler to uniquely identify a stream
    104 *               object
    105 *    @buf_idx : index of the buf within the stream bufs, to be
    106 *               filled during mem allocation
    107 *    @timespec_ts : time stamp, to be filled when DQBUF is
    108 *                 called
    109 *    @frame_idx : frame sequence num, to be filled when DQBUF
    110 *    @plane_buf  : Frame plane definition
    111 *    @fd : file descriptor of the frame buffer, to be filled
    112 *        during mem allocation
    113 *    @buffer : pointer to the frame buffer, to be filled during
    114 *            mem allocation
    115 *    @frame_len : length of the whole frame, to be filled during
    116 *               mem allocation
    117 *    @mem_info : user specific pointer to additional mem info
    118 *    @flags:  v4l2_buffer flags, used to report error in data buffers
    119 **/
    120 typedef struct mm_camera_buf_def {
    121     uint32_t stream_id;
    122     cam_stream_type_t stream_type;
    123     cam_stream_buf_type buf_type;
    124     uint32_t buf_idx;
    125     uint8_t is_uv_subsampled;
    126     struct timespec ts;
    127     uint32_t frame_idx;
    128     union {
    129         mm_camera_plane_buf_def_t planes_buf;
    130         mm_camera_user_buf_def_t user_buf;
    131     };
    132     int fd;
    133     void *buffer;
    134     size_t frame_len;
    135     void *mem_info;
    136     uint32_t flags;
    137 } mm_camera_buf_def_t;
    138 
    139 /** mm_camera_super_buf_t: super buf structure for bundled
    140 *   stream frames
    141 *    @camera_handle : camera handler to uniquely identify
    142 *              a camera object
    143 *    @ch_id : channel handler to uniquely ideentify a channel
    144 *           object
    145 *    @num_bufs : number of buffers in the super buf, should not
    146 *              exceeds MAX_STREAM_NUM_IN_BUNDLE
    147 *    @bufs : array of buffers in the bundle
    148 **/
    149 typedef struct {
    150     uint32_t camera_handle;
    151     uint32_t ch_id;
    152     uint32_t num_bufs;
    153     uint8_t bUnlockAEC;
    154     uint8_t bReadyForPrepareSnapshot;
    155     mm_camera_buf_def_t* bufs[MAX_STREAM_NUM_IN_BUNDLE];
    156 } mm_camera_super_buf_t;
    157 
    158 /** mm_camera_event_t: structure for event
    159 *    @server_event_type : event type from serer
    160 *    @status : status of an event, value could be
    161 *              CAM_STATUS_SUCCESS
    162 *              CAM_STATUS_FAILED
    163 **/
    164 typedef struct {
    165     cam_event_type_t server_event_type;
    166     uint32_t status;
    167 } mm_camera_event_t;
    168 
    169 /** mm_camera_event_notify_t: function definition for event
    170 *   notify handling
    171 *    @camera_handle : camera handler
    172 *    @evt : pointer to an event struct
    173 *    @user_data: user data pointer
    174 **/
    175 typedef void (*mm_camera_event_notify_t)(uint32_t camera_handle,
    176                                          mm_camera_event_t *evt,
    177                                          void *user_data);
    178 
    179 /** mm_camera_buf_notify_t: function definition for frame notify
    180 *   handling
    181 *    @mm_camera_super_buf_t : received frame buffers
    182 *    @user_data: user data pointer
    183 **/
    184 typedef void (*mm_camera_buf_notify_t) (mm_camera_super_buf_t *bufs,
    185                                         void *user_data);
    186 
    187 /** map_stream_buf_op_t: function definition for operation of
    188 *   mapping stream buffers via domain socket
    189 *    @frame_idx : buffer index within stream buffers
    190 *    @plane_idx    : plane index. If all planes share the same
    191 *                   fd, plane_idx = -1; otherwise, plean_idx is
    192 *                   the index to plane (0..num_of_planes)
    193 *    @fd : file descriptor of the stream buffer
    194 *    @size: size of the stream buffer
    195 *    @userdata : user data pointer
    196 **/
    197 typedef int32_t (*map_stream_buf_op_t) (uint32_t frame_idx,
    198                                         int32_t plane_idx,
    199                                         int fd,
    200                                         size_t size,
    201                                         cam_mapping_buf_type type,
    202                                         void *userdata);
    203 
    204 /** unmap_stream_buf_op_t: function definition for operation of
    205 *                          unmapping stream buffers via domain
    206 *                          socket
    207 *    @frame_idx : buffer index within stream buffers
    208 *    @plane_idx : plane index. If all planes share the same
    209 *                 fd, plane_idx = -1; otherwise, plean_idx is
    210 *                 the index to plane (0..num_of_planes)
    211 *    @userdata : user data pointer
    212 **/
    213 typedef int32_t (*unmap_stream_buf_op_t) (uint32_t frame_idx,
    214                                           int32_t plane_idx,
    215                                           cam_mapping_buf_type type,
    216                                           void *userdata);
    217 
    218 /** mm_camera_map_unmap_ops_tbl_t: virtual table
    219 *                      for mapping/unmapping stream buffers via
    220 *                      domain socket
    221 *    @map_ops : operation for mapping
    222 *    @unmap_ops : operation for unmapping
    223 *    @userdata: user data pointer
    224 **/
    225 typedef struct {
    226     map_stream_buf_op_t map_ops;
    227     unmap_stream_buf_op_t unmap_ops;
    228     void *userdata;
    229 } mm_camera_map_unmap_ops_tbl_t;
    230 
    231 /** mm_camera_stream_mem_vtbl_t: virtual table for stream
    232 *                      memory allocation and deallocation
    233 *    @get_bufs : function definition for allocating
    234 *                stream buffers
    235 *    @put_bufs : function definition for deallocating
    236 *                stream buffers
    237 *    @user_data: user data pointer
    238 **/
    239 typedef struct {
    240   void *user_data;
    241   int32_t (*get_bufs) (cam_frame_len_offset_t *offset,
    242                        uint8_t *num_bufs,
    243                        uint8_t **initial_reg_flag,
    244                        mm_camera_buf_def_t **bufs,
    245                        mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    246                        void *user_data);
    247   int32_t (*put_bufs) (mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    248                        void *user_data);
    249   int32_t (*invalidate_buf)(uint32_t index, void *user_data);
    250   int32_t (*clean_invalidate_buf)(uint32_t index, void *user_data);
    251 } mm_camera_stream_mem_vtbl_t;
    252 
    253 /** mm_camera_stream_config_t: structure for stream
    254 *                              configuration
    255 *    @stream_info : pointer to a stream info structure
    256 *    @padding_info: padding info obtained from querycapability
    257 *    @mem_tbl : memory operation table for
    258 *              allocating/deallocating stream buffers
    259 *    @stream_cb : callback handling stream frame notify
    260 *    @userdata : user data pointer
    261 **/
    262 typedef struct {
    263     cam_stream_info_t *stream_info;
    264     cam_padding_info_t padding_info;
    265     mm_camera_stream_mem_vtbl_t mem_vtbl;
    266     mm_camera_buf_notify_t stream_cb;
    267     void *userdata;
    268 } mm_camera_stream_config_t;
    269 
    270 /** mm_camera_super_buf_notify_mode_t: enum for super uffer
    271 *                                      notification mode
    272 *    @MM_CAMERA_SUPER_BUF_NOTIFY_BURST :
    273 *       ZSL use case: get burst of frames
    274 *    @MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS :
    275 *       get continuous frames: when the super buf is ready
    276 *       dispatch it to HAL
    277 **/
    278 typedef enum {
    279     MM_CAMERA_SUPER_BUF_NOTIFY_BURST = 0,
    280     MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS,
    281     MM_CAMERA_SUPER_BUF_NOTIFY_MAX
    282 } mm_camera_super_buf_notify_mode_t;
    283 
    284 /** mm_camera_super_buf_priority_t: enum for super buffer
    285 *                                   matching priority
    286 *    @MM_CAMERA_SUPER_BUF_PRIORITY_NORMAL :
    287 *       Save the frame no matter focused or not. Currently only
    288 *       this type is supported.
    289 *    @MM_CAMERA_SUPER_BUF_PRIORITY_FOCUS :
    290 *       only queue the frame that is focused. Will enable meta
    291 *       data header to carry focus info
    292 *    @MM_CAMERA_SUPER_BUF_PRIORITY_EXPOSURE_BRACKETING :
    293 *       after shutter, only queue matched exposure index
    294 **/
    295 typedef enum {
    296     MM_CAMERA_SUPER_BUF_PRIORITY_NORMAL = 0,
    297     MM_CAMERA_SUPER_BUF_PRIORITY_FOCUS,
    298     MM_CAMERA_SUPER_BUF_PRIORITY_EXPOSURE_BRACKETING,
    299     MM_CAMERA_SUPER_BUF_PRIORITY_LOW,/* Bundled metadata frame may not match*/
    300     MM_CAMERA_SUPER_BUF_PRIORITY_MAX
    301 } mm_camera_super_buf_priority_t;
    302 
    303 /** mm_camera_advanced_capture_t: enum for advanced capture type.
    304 *    @MM_CAMERA_AF_BRACKETING :
    305 *       to enable AF Bracketig.
    306 *    @MM_CAMERA_AE_BRACKETING :
    307 *       to enable AF Bracketing.
    308 *    @MM_CAMERA_FLASH_BRACKETING :
    309 *       to enable Flash Bracketing.
    310 *    @MM_CAMERA_ZOOM_1X :
    311 *       to enable zoom 1x capture request
    312 **/
    313 typedef enum {
    314    MM_CAMERA_AF_BRACKETING = 0,
    315    MM_CAMERA_AE_BRACKETING,
    316    MM_CAMERA_FLASH_BRACKETING,
    317    MM_CAMERA_ZOOM_1X,
    318    MM_CAMERA_FRAME_CAPTURE,
    319 } mm_camera_advanced_capture_t;
    320 
    321 /** mm_camera_channel_attr_t: structure for defining channel
    322 *                             attributes
    323 *    @notify_mode : notify mode: burst or continuous
    324 *    @water_mark : queue depth. Only valid for burst mode
    325 *    @look_back : look back how many frames from last buf.
    326 *                 Only valid for burst mode
    327 *    @post_frame_skip : after send first frame to HAL, how many
    328 *                     frames needing to be skipped for next
    329 *                     delivery. Only valid for burst mode
    330 *    @max_unmatched_frames : max number of unmatched frames in
    331 *                     queue
    332 *    @priority : save matched priority frames only
    333 **/
    334 typedef struct {
    335     mm_camera_super_buf_notify_mode_t notify_mode;
    336     uint8_t water_mark;
    337     uint8_t look_back;
    338     uint8_t post_frame_skip;
    339     uint8_t max_unmatched_frames;
    340     mm_camera_super_buf_priority_t priority;
    341 } mm_camera_channel_attr_t;
    342 
    343 typedef struct {
    344     /** query_capability: fucntion definition for querying static
    345      *                    camera capabilities
    346      *    @camera_handle : camer handler
    347      *  Return value: 0 -- success
    348      *                -1 -- failure
    349      *  Note: would assume cam_capability_t is already mapped
    350      **/
    351     int32_t (*query_capability) (uint32_t camera_handle);
    352 
    353     /** register_event_notify: fucntion definition for registering
    354      *                         for event notification
    355      *    @camera_handle : camer handler
    356      *    @evt_cb : callback for event notify
    357      *    @user_data : user data poiner
    358      *  Return value: 0 -- success
    359      *                -1 -- failure
    360      **/
    361     int32_t (*register_event_notify) (uint32_t camera_handle,
    362                                       mm_camera_event_notify_t evt_cb,
    363                                       void *user_data);
    364 
    365     /** close_camera: fucntion definition for closing a camera
    366      *    @camera_handle : camer handler
    367      *  Return value: 0 -- success
    368      *                -1 -- failure
    369      **/
    370     int32_t (*close_camera) (uint32_t camera_handle);
    371 
    372 
    373     /** error_close_camera: function definition for closing
    374      *                      the camera backend on an unrecoverable
    375      *                      error
    376      *    @camera_handle : camera handler
    377      *  Return value: 0 -- success
    378      *                -1 -- failure
    379      **/
    380     int32_t (*error_close_camera) (uint32_t camera_handle);
    381 
    382     /** map_buf: fucntion definition for mapping a camera buffer
    383      *           via domain socket
    384      *    @camera_handle : camer handler
    385      *    @buf_type : type of mapping buffers, can be value of
    386      *                CAM_MAPPING_BUF_TYPE_CAPABILITY
    387      *                CAM_MAPPING_BUF_TYPE_SETPARM_BUF
    388      *                CAM_MAPPING_BUF_TYPE_GETPARM_BUF
    389      *    @fd : file descriptor of the stream buffer
    390      *    @size :  size of the stream buffer
    391      *  Return value: 0 -- success
    392      *                -1 -- failure
    393      **/
    394     int32_t (*map_buf) (uint32_t camera_handle,
    395                         uint8_t buf_type,
    396                         int fd,
    397                         size_t size);
    398 
    399     /** unmap_buf: fucntion definition for unmapping a camera buffer
    400      *           via domain socket
    401      *    @camera_handle : camer handler
    402      *    @buf_type : type of mapping buffers, can be value of
    403      *                CAM_MAPPING_BUF_TYPE_CAPABILITY
    404      *                CAM_MAPPING_BUF_TYPE_SETPARM_BUF
    405      *                CAM_MAPPING_BUF_TYPE_GETPARM_BUF
    406      *  Return value: 0 -- success
    407      *                -1 -- failure
    408      **/
    409     int32_t (*unmap_buf) (uint32_t camera_handle,
    410                           uint8_t buf_type);
    411 
    412     /** set_parms: fucntion definition for setting camera
    413      *             based parameters to server
    414      *    @camera_handle : camer handler
    415      *    @parms : batch for parameters to be set, stored in
    416      *               parm_buffer_t
    417      *  Return value: 0 -- success
    418      *                -1 -- failure
    419      *  Note: would assume parm_buffer_t is already mapped, and
    420      *       according parameter entries to be set are filled in the
    421      *       buf before this call
    422      **/
    423     int32_t (*set_parms) (uint32_t camera_handle,
    424                           parm_buffer_t *parms);
    425 
    426     /** get_parms: fucntion definition for querying camera
    427      *             based parameters from server
    428      *    @camera_handle : camer handler
    429      *    @parms : batch for parameters to be queried, stored in
    430      *               parm_buffer_t
    431      *  Return value: 0 -- success
    432      *                -1 -- failure
    433      *  Note: would assume parm_buffer_t is already mapped, and
    434      *       according parameter entries to be queried are filled in
    435      *       the buf before this call
    436      **/
    437     int32_t (*get_parms) (uint32_t camera_handle,
    438                           parm_buffer_t *parms);
    439 
    440     /** do_auto_focus: fucntion definition for performing auto focus
    441      *    @camera_handle : camer handler
    442      *  Return value: 0 -- success
    443      *                -1 -- failure
    444      *  Note: if this call success, we will always assume there will
    445      *        be an auto_focus event following up.
    446      **/
    447     int32_t (*do_auto_focus) (uint32_t camera_handle);
    448 
    449     /** cancel_auto_focus: fucntion definition for cancelling
    450      *                     previous auto focus request
    451      *    @camera_handle : camer handler
    452     *  Return value: 0 -- success
    453     *                -1 -- failure
    454      **/
    455     int32_t (*cancel_auto_focus) (uint32_t camera_handle);
    456 
    457     /** prepare_snapshot: fucntion definition for preparing hardware
    458      *                    for snapshot.
    459      *    @camera_handle : camer handler
    460      *    @do_af_flag    : flag indicating if AF needs to be done
    461      *                     0 -- no AF needed
    462      *                     1 -- AF needed
    463      *  Return value: 0 -- success
    464      *                -1 -- failure
    465      **/
    466     int32_t (*prepare_snapshot) (uint32_t camera_handle,
    467                                  int32_t do_af_flag);
    468 
    469     /** start_zsl_snapshot: function definition for starting
    470      *                    zsl snapshot.
    471      *    @camera_handle : camer handler
    472      *    @ch_id         : channel id
    473      *  Return value: 0 -- success
    474      *                -1 -- failure
    475      **/
    476     int32_t (*start_zsl_snapshot) (uint32_t camera_handle, uint32_t ch_id);
    477 
    478     /** stop_zsl_snapshot: function definition for stopping
    479      *                    zsl snapshot.
    480      *    @camera_handle : camer handler
    481      *    @ch_id         : channel id
    482      *  Return value: 0 -- success
    483      *                -1 -- failure
    484      **/
    485     int32_t (*stop_zsl_snapshot) (uint32_t camera_handle, uint32_t ch_id);
    486 
    487     /** add_channel: fucntion definition for adding a channel
    488      *    @camera_handle : camer handler
    489      *    @ch_id : channel handler
    490      *    @attr : pointer to channel attribute structure
    491      *    @channel_cb : callbak to handle bundled super buffer
    492      *    @userdata : user data pointer
    493      *  Return value: channel id, zero is invalid ch_id
    494      * Note: attr, channel_cb, and userdata can be NULL if no
    495      *       superbufCB is needed
    496      **/
    497     uint32_t (*add_channel) (uint32_t camera_handle,
    498                              mm_camera_channel_attr_t *attr,
    499                              mm_camera_buf_notify_t channel_cb,
    500                              void *userdata);
    501 
    502     /** delete_channel: fucntion definition for deleting a channel
    503      *    @camera_handle : camer handler
    504      *    @ch_id : channel handler
    505      *  Return value: 0 -- success
    506      *                -1 -- failure
    507      **/
    508     int32_t (*delete_channel) (uint32_t camera_handle,
    509                                uint32_t ch_id);
    510 
    511     /** get_bundle_info: function definition for querying bundle
    512      *  info of the channel
    513      *    @camera_handle : camera handler
    514      *    @ch_id         : channel handler
    515      *    @bundle_info   : bundle info to be filled in
    516      *  Return value: 0 -- success
    517      *                -1 -- failure
    518      **/
    519     int32_t (*get_bundle_info) (uint32_t camera_handle,
    520                                 uint32_t ch_id,
    521                                 cam_bundle_config_t *bundle_info);
    522 
    523     /** add_stream: fucntion definition for adding a stream
    524      *    @camera_handle : camer handler
    525      *    @ch_id : channel handler
    526      *  Return value: stream_id. zero is invalid stream_id
    527      **/
    528     uint32_t (*add_stream) (uint32_t camera_handle,
    529                             uint32_t ch_id);
    530 
    531     /** delete_stream: fucntion definition for deleting a stream
    532      *    @camera_handle : camer handler
    533      *    @ch_id : channel handler
    534      *    @stream_id : stream handler
    535      *  Return value: 0 -- success
    536      *                -1 -- failure
    537      **/
    538     int32_t (*delete_stream) (uint32_t camera_handle,
    539                               uint32_t ch_id,
    540                               uint32_t stream_id);
    541 
    542     /** link_stream: function definition for linking a stream
    543      *    @camera_handle : camera handle
    544      *    @ch_id : channel handle from which the stream originates
    545      *    @stream_id : stream handle
    546      *    @linked_ch_id: channel handle in which the stream will be linked
    547      *  Return value: 0 -- success
    548      *                -1 -- failure
    549      **/
    550     int32_t (*link_stream) (uint32_t camera_handle,
    551           uint32_t ch_id,
    552           uint32_t stream_id,
    553           uint32_t linked_ch_id);
    554 
    555     /** config_stream: fucntion definition for configuring a stream
    556      *    @camera_handle : camer handler
    557      *    @ch_id : channel handler
    558      *    @stream_id : stream handler
    559      *    @confid : pointer to a stream configuration structure
    560      *  Return value: 0 -- success
    561      *                -1 -- failure
    562      **/
    563     int32_t (*config_stream) (uint32_t camera_handle,
    564                               uint32_t ch_id,
    565                               uint32_t stream_id,
    566                               mm_camera_stream_config_t *config);
    567 
    568     /** map_stream_buf: fucntion definition for mapping
    569      *                 stream buffer via domain socket
    570      *    @camera_handle : camer handler
    571      *    @ch_id : channel handler
    572      *    @stream_id : stream handler
    573      *    @buf_type : type of mapping buffers, can be value of
    574      *             CAM_MAPPING_BUF_TYPE_STREAM_BUF
    575      *             CAM_MAPPING_BUF_TYPE_STREAM_INFO
    576      *             CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
    577      *    @buf_idx : buffer index within the stream buffers
    578      *    @plane_idx : plane index. If all planes share the same fd,
    579      *               plane_idx = -1; otherwise, plean_idx is the
    580      *               index to plane (0..num_of_planes)
    581      *    @fd : file descriptor of the stream buffer
    582      *    @size :  size of the stream buffer
    583      *  Return value: 0 -- success
    584      *                -1 -- failure
    585      **/
    586     int32_t (*map_stream_buf) (uint32_t camera_handle,
    587                                uint32_t ch_id,
    588                                uint32_t stream_id,
    589                                uint8_t buf_type,
    590                                uint32_t buf_idx,
    591                                int32_t plane_idx,
    592                                int fd,
    593                                size_t size);
    594 
    595     /** unmap_stream_buf: fucntion definition for unmapping
    596      *                 stream buffer via domain socket
    597      *    @camera_handle : camer handler
    598      *    @ch_id : channel handler
    599      *    @stream_id : stream handler
    600      *    @buf_type : type of mapping buffers, can be value of
    601      *             CAM_MAPPING_BUF_TYPE_STREAM_BUF
    602      *             CAM_MAPPING_BUF_TYPE_STREAM_INFO
    603      *             CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
    604      *    @buf_idx : buffer index within the stream buffers
    605      *    @plane_idx : plane index. If all planes share the same fd,
    606      *               plane_idx = -1; otherwise, plean_idx is the
    607      *               index to plane (0..num_of_planes)
    608      *  Return value: 0 -- success
    609      *                -1 -- failure
    610      **/
    611     int32_t (*unmap_stream_buf) (uint32_t camera_handle,
    612                                  uint32_t ch_id,
    613                                  uint32_t stream_id,
    614                                  uint8_t buf_type,
    615                                  uint32_t buf_idx,
    616                                  int32_t plane_idx);
    617 
    618     /** set_stream_parms: fucntion definition for setting stream
    619      *                    specific parameters to server
    620      *    @camera_handle : camer handler
    621      *    @ch_id : channel handler
    622      *    @stream_id : stream handler
    623      *    @parms : batch for parameters to be set
    624      *  Return value: 0 -- success
    625      *                -1 -- failure
    626      *  Note: would assume parm buffer is already mapped, and
    627      *       according parameter entries to be set are filled in the
    628      *       buf before this call
    629      **/
    630     int32_t (*set_stream_parms) (uint32_t camera_handle,
    631                                  uint32_t ch_id,
    632                                  uint32_t s_id,
    633                                  cam_stream_parm_buffer_t *parms);
    634 
    635     /** get_stream_parms: fucntion definition for querying stream
    636      *                    specific parameters from server
    637      *    @camera_handle : camer handler
    638      *    @ch_id : channel handler
    639      *    @stream_id : stream handler
    640      *    @parms : batch for parameters to be queried
    641      *  Return value: 0 -- success
    642      *                -1 -- failure
    643      *  Note: would assume parm buffer is already mapped, and
    644      *       according parameter entries to be queried are filled in
    645      *       the buf before this call
    646      **/
    647     int32_t (*get_stream_parms) (uint32_t camera_handle,
    648                                  uint32_t ch_id,
    649                                  uint32_t s_id,
    650                                  cam_stream_parm_buffer_t *parms);
    651 
    652     /** start_channel: fucntion definition for starting a channel
    653      *    @camera_handle : camer handler
    654      *    @ch_id : channel handler
    655      *  Return value: 0 -- success
    656      *                -1 -- failure
    657      * This call will start all streams belongs to the channel
    658      **/
    659     int32_t (*start_channel) (uint32_t camera_handle,
    660                               uint32_t ch_id);
    661 
    662     /** stop_channel: fucntion definition for stopping a channel
    663      *    @camera_handle : camer handler
    664      *    @ch_id : channel handler
    665      *  Return value: 0 -- success
    666      *                -1 -- failure
    667      * This call will stop all streams belongs to the channel
    668      **/
    669     int32_t (*stop_channel) (uint32_t camera_handle,
    670                              uint32_t ch_id);
    671 
    672     /** qbuf: fucntion definition for queuing a frame buffer back to
    673      *        kernel for reuse
    674      *    @camera_handle : camer handler
    675      *    @ch_id : channel handler
    676      *    @buf : a frame buffer to be queued back to kernel
    677      *  Return value: 0 -- success
    678      *                -1 -- failure
    679      **/
    680     int32_t (*qbuf) (uint32_t camera_handle,
    681                      uint32_t ch_id,
    682                      mm_camera_buf_def_t *buf);
    683 
    684     /** get_queued_buf_count: fucntion definition for querying queued buf count
    685      *    @camera_handle : camer handler
    686      *    @ch_id : channel handler
    687      *    @stream_id : stream handler
    688      *  Return value: queued buf count
    689      **/
    690     int32_t (*get_queued_buf_count) (uint32_t camera_handle,
    691             uint32_t ch_id,
    692             uint32_t stream_id);
    693 
    694     /** request_super_buf: fucntion definition for requesting frames
    695      *                     from superbuf queue in burst mode
    696      *    @camera_handle : camer handler
    697      *    @ch_id : channel handler
    698      *    @num_buf_requested : number of super buffers requested
    699      *    @num_retro_buf_requested : number of retro buffers requested
    700      *  Return value: 0 -- success
    701      *                -1 -- failure
    702      **/
    703     int32_t (*request_super_buf) (uint32_t camera_handle,
    704                                   uint32_t ch_id,
    705                                   uint32_t num_buf_requested,
    706                                   uint32_t num_retro_buf_requested);
    707 
    708     /** cancel_super_buf_request: fucntion definition for canceling
    709      *                     frames dispatched from superbuf queue in
    710      *                     burst mode
    711      *    @camera_handle : camer handler
    712      *    @ch_id : channel handler
    713      *  Return value: 0 -- success
    714      *                -1 -- failure
    715      **/
    716     int32_t (*cancel_super_buf_request) (uint32_t camera_handle,
    717                                          uint32_t ch_id);
    718 
    719     /** flush_super_buf_queue: function definition for flushing out
    720      *                     all frames in the superbuf queue up to frame_idx,
    721      *                     even if frames with frame_idx come in later than
    722      *                     this call.
    723      *    @camera_handle : camer handler
    724      *    @ch_id : channel handler
    725      *    @frame_idx : frame index up until which all superbufs are flushed
    726      *  Return value: 0 -- success
    727      *                -1 -- failure
    728      **/
    729     int32_t (*flush_super_buf_queue) (uint32_t camera_handle,
    730                                       uint32_t ch_id, uint32_t frame_idx);
    731 
    732     /** configure_notify_mode: function definition for configuring the
    733      *                         notification mode of channel
    734      *    @camera_handle : camera handler
    735      *    @ch_id : channel handler
    736      *    @notify_mode : notification mode
    737      *  Return value: 0 -- success
    738      *                -1 -- failure
    739      **/
    740     int32_t (*configure_notify_mode) (uint32_t camera_handle,
    741                                       uint32_t ch_id,
    742                                       mm_camera_super_buf_notify_mode_t notify_mode);
    743 
    744    /** process_advanced_capture: function definition for start/stop advanced capture
    745      *                    for snapshot.
    746      *    @camera_handle : camera handle
    747      *    @ch_id : channel handler
    748      *    @type :  advanced capture type.
    749      *    @trigger    : flag indicating if advanced capture needs to be done
    750      *                     0 -- stop advanced capture
    751      *                     1 -- start advanced capture
    752      *    @in_value: Input value. Configaration
    753      *  Return value: 0 -- success
    754      *                -1 -- failure
    755      **/
    756     int32_t (*process_advanced_capture) (uint32_t camera_handle,
    757              uint32_t ch_id, mm_camera_advanced_capture_t type,
    758              int8_t start_flag, void *in_value);
    759 } mm_camera_ops_t;
    760 
    761 /** mm_camera_vtbl_t: virtual table for camera operations
    762 *    @camera_handle : camera handler which uniquely identifies a
    763 *                   camera object
    764 *    @ops : API call table
    765 **/
    766 typedef struct {
    767     uint32_t camera_handle;
    768     mm_camera_ops_t *ops;
    769 } mm_camera_vtbl_t;
    770 
    771 /* return number of cameras */
    772 uint8_t get_num_of_cameras();
    773 
    774 /* return reference pointer of camera vtbl */
    775 int32_t camera_open(uint8_t camera_idx, mm_camera_vtbl_t **camera_obj);
    776 
    777 /* helper functions */
    778 int32_t mm_stream_calc_offset_preview(cam_format_t fmt,
    779         cam_dimension_t *dim,
    780         cam_stream_buf_plane_info_t *buf_planes);
    781 
    782 int32_t mm_stream_calc_offset_post_view(cam_format_t fmt,
    783         cam_dimension_t *dim,
    784         cam_stream_buf_plane_info_t *buf_planes);
    785 
    786 int32_t mm_stream_calc_offset_snapshot(cam_format_t fmt,
    787         cam_dimension_t *dim,
    788         cam_padding_info_t *padding,
    789         cam_stream_buf_plane_info_t *buf_planes);
    790 
    791 int32_t mm_stream_calc_offset_raw(cam_format_t fmt,
    792         cam_dimension_t *dim,
    793         cam_padding_info_t *padding,
    794         cam_stream_buf_plane_info_t *buf_planes);
    795 
    796 int32_t mm_stream_calc_offset_video(cam_dimension_t *dim,
    797         cam_stream_buf_plane_info_t *buf_planes);
    798 
    799 int32_t mm_stream_calc_offset_metadata(cam_dimension_t *dim,
    800         cam_padding_info_t *padding,
    801         cam_stream_buf_plane_info_t *buf_planes);
    802 
    803 int32_t mm_stream_calc_offset_postproc(cam_stream_info_t *stream_info,
    804         cam_padding_info_t *padding,
    805         cam_stream_buf_plane_info_t *buf_planes);
    806 
    807 int32_t mm_stream_calc_offset_analysis(cam_format_t fmt,
    808         cam_dimension_t *dim,
    809         cam_padding_info_t *padding,
    810         cam_stream_buf_plane_info_t *buf_planes);
    811 
    812 struct camera_info *get_cam_info(uint32_t camera_id);
    813 #endif /*__MM_CAMERA_INTERFACE_H__*/
    814