Home | History | Annotate | Download | only in common
      1 /* Copyright (c) 2012-2013, 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) ((size + padding - 1) & ~(padding - 1))
     44 
     45 /** mm_camera_buf_def_t: structure for stream frame buf
     46 *    @stream_id : stream handler to uniquely identify a stream
     47 *               object
     48 *    @buf_idx : index of the buf within the stream bufs, to be
     49 *               filled during mem allocation
     50 *    @timespec_ts : time stamp, to be filled when DQBUF is
     51 *                 called
     52 *    @frame_idx : frame sequence num, to be filled when DQBUF
     53 *    @num_planes : num of planes for the frame buffer, to be
     54 *               filled during mem allocation
     55 *    @planes : plane info for the frame buffer, to be filled
     56 *               during mem allocation
     57 *    @fd : file descriptor of the frame buffer, to be filled
     58 *        during mem allocation
     59 *    @buffer : pointer to the frame buffer, to be filled during
     60 *            mem allocation
     61 *    @frame_len : length of the whole frame, to be filled during
     62 *               mem allocation
     63 *    @mem_info : user specific pointer to additional mem info
     64 **/
     65 typedef struct {
     66     uint32_t stream_id;
     67     cam_stream_type_t stream_type;
     68     int8_t buf_idx;
     69     struct timespec ts;
     70     uint32_t frame_idx;
     71     int8_t num_planes;
     72     struct v4l2_plane planes[VIDEO_MAX_PLANES];
     73     int fd;
     74     void *buffer;
     75     uint32_t frame_len;
     76     void *mem_info;
     77 } mm_camera_buf_def_t;
     78 
     79 /** mm_camera_super_buf_t: super buf structure for bundled
     80 *   stream frames
     81 *    @camera_handle : camera handler to uniquely identify
     82 *              a camera object
     83 *    @ch_id : channel handler to uniquely ideentify a channel
     84 *           object
     85 *    @num_bufs : number of buffers in the super buf, should not
     86 *              exceeds MAX_STREAM_NUM_IN_BUNDLE
     87 *    @bufs : array of buffers in the bundle
     88 **/
     89 typedef struct {
     90     uint32_t camera_handle;
     91     uint32_t ch_id;
     92     uint8_t num_bufs;
     93     mm_camera_buf_def_t* bufs[MAX_STREAM_NUM_IN_BUNDLE];
     94 } mm_camera_super_buf_t;
     95 
     96 /** mm_camera_event_t: structure for event
     97 *    @server_event_type : event type from serer
     98 *    @status : status of an event, value could be
     99 *              CAM_STATUS_SUCCESS
    100 *              CAM_STATUS_FAILED
    101 **/
    102 typedef struct {
    103     cam_event_type_t server_event_type;
    104     uint32_t status;
    105 } mm_camera_event_t;
    106 
    107 /** mm_camera_event_notify_t: function definition for event
    108 *   notify handling
    109 *    @camera_handle : camera handler
    110 *    @evt : pointer to an event struct
    111 *    @user_data: user data pointer
    112 **/
    113 typedef void (*mm_camera_event_notify_t)(uint32_t camera_handle,
    114                                          mm_camera_event_t *evt,
    115                                          void *user_data);
    116 
    117 /** mm_camera_buf_notify_t: function definition for frame notify
    118 *   handling
    119 *    @mm_camera_super_buf_t : received frame buffers
    120 *    @user_data: user data pointer
    121 **/
    122 typedef void (*mm_camera_buf_notify_t) (mm_camera_super_buf_t *bufs,
    123                                         void *user_data);
    124 
    125 /** map_stream_buf_op_t: function definition for operation of
    126 *   mapping stream buffers via domain socket
    127 *    @frame_idx : buffer index within stream buffers
    128 *    @plane_idx    : plane index. If all planes share the same
    129 *                   fd, plane_idx = -1; otherwise, plean_idx is
    130 *                   the index to plane (0..num_of_planes)
    131 *    @fd : file descriptor of the stream buffer
    132 *    @size: size of the stream buffer
    133 *    @userdata : user data pointer
    134 **/
    135 typedef int32_t (*map_stream_buf_op_t) (uint32_t frame_idx,
    136                                         int32_t plane_idx,
    137                                         int fd,
    138                                         uint32_t size,
    139                                         void *userdata);
    140 
    141 /** unmap_stream_buf_op_t: function definition for operation of
    142 *                          unmapping stream buffers via domain
    143 *                          socket
    144 *    @frame_idx : buffer index within stream buffers
    145 *    @plane_idx : plane index. If all planes share the same
    146 *                 fd, plane_idx = -1; otherwise, plean_idx is
    147 *                 the index to plane (0..num_of_planes)
    148 *    @userdata : user data pointer
    149 **/
    150 typedef int32_t (*unmap_stream_buf_op_t) (uint32_t frame_idx,
    151                                           int32_t plane_idx,
    152                                           void *userdata);
    153 
    154 /** mm_camera_map_unmap_ops_tbl_t: virtual table
    155 *                      for mapping/unmapping stream buffers via
    156 *                      domain socket
    157 *    @map_ops : operation for mapping
    158 *    @unmap_ops : operation for unmapping
    159 *    @userdata: user data pointer
    160 **/
    161 typedef struct {
    162     map_stream_buf_op_t map_ops;
    163     unmap_stream_buf_op_t unmap_ops;
    164     void *userdata;
    165 } mm_camera_map_unmap_ops_tbl_t;
    166 
    167 /** mm_camera_stream_mem_vtbl_t: virtual table for stream
    168 *                      memory allocation and deallocation
    169 *    @get_bufs : function definition for allocating
    170 *                stream buffers
    171 *    @put_bufs : function definition for deallocating
    172 *                stream buffers
    173 *    @user_data: user data pointer
    174 **/
    175 typedef struct {
    176   void *user_data;
    177   int32_t (*get_bufs) (cam_frame_len_offset_t *offset,
    178                        uint8_t *num_bufs,
    179                        uint8_t **initial_reg_flag,
    180                        mm_camera_buf_def_t **bufs,
    181                        mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    182                        void *user_data);
    183   int32_t (*put_bufs) (mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    184                        void *user_data);
    185   int32_t (*invalidate_buf)(int index, void *user_data);
    186   int32_t (*clean_invalidate_buf)(int index, void *user_data);
    187 } mm_camera_stream_mem_vtbl_t;
    188 
    189 /** mm_camera_stream_config_t: structure for stream
    190 *                              configuration
    191 *    @stream_info : pointer to a stream info structure
    192 *    @padding_info: padding info obtained from querycapability
    193 *    @mem_tbl : memory operation table for
    194 *              allocating/deallocating stream buffers
    195 *    @stream_cb : callback handling stream frame notify
    196 *    @userdata : user data pointer
    197 **/
    198 typedef struct {
    199     cam_stream_info_t *stream_info;
    200     cam_padding_info_t padding_info;
    201     mm_camera_stream_mem_vtbl_t mem_vtbl;
    202     mm_camera_buf_notify_t stream_cb;
    203     void *userdata;
    204 } mm_camera_stream_config_t;
    205 
    206 /** mm_camera_super_buf_notify_mode_t: enum for super uffer
    207 *                                      notification mode
    208 *    @MM_CAMERA_SUPER_BUF_NOTIFY_BURST :
    209 *       ZSL use case: get burst of frames
    210 *    @MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS :
    211 *       get continuous frames: when the super buf is ready
    212 *       dispatch it to HAL
    213 **/
    214 typedef enum {
    215     MM_CAMERA_SUPER_BUF_NOTIFY_BURST = 0,
    216     MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS,
    217     MM_CAMERA_SUPER_BUF_NOTIFY_MAX
    218 } mm_camera_super_buf_notify_mode_t;
    219 
    220 /** mm_camera_super_buf_priority_t: enum for super buffer
    221 *                                   matching priority
    222 *    @MM_CAMERA_SUPER_BUF_PRIORITY_NORMAL :
    223 *       Save the frame no matter focused or not. Currently only
    224 *       this type is supported.
    225 *    @MM_CAMERA_SUPER_BUF_PRIORITY_FOCUS :
    226 *       only queue the frame that is focused. Will enable meta
    227 *       data header to carry focus info
    228 *    @MM_CAMERA_SUPER_BUF_PRIORITY_EXPOSURE_BRACKETING :
    229 *       after shutter, only queue matched exposure index
    230 **/
    231 typedef enum {
    232     MM_CAMERA_SUPER_BUF_PRIORITY_NORMAL = 0,
    233     MM_CAMERA_SUPER_BUF_PRIORITY_FOCUS,
    234     MM_CAMERA_SUPER_BUF_PRIORITY_EXPOSURE_BRACKETING,
    235     MM_CAMERA_SUPER_BUF_PRIORITY_MAX
    236 } mm_camera_super_buf_priority_t;
    237 
    238 /** mm_camera_channel_attr_t: structure for defining channel
    239 *                             attributes
    240 *    @notify_mode : notify mode: burst or continuous
    241 *    @water_mark : queue depth. Only valid for burst mode
    242 *    @look_back : look back how many frames from last buf.
    243 *                 Only valid for burst mode
    244 *    @post_frame_skip : after send first frame to HAL, how many
    245 *                     frames needing to be skipped for next
    246 *                     delivery. Only valid for burst mode
    247 *    @max_unmatched_frames : max number of unmatched frames in
    248 *                     queue
    249 *    @priority : save matched priority frames only
    250 **/
    251 typedef struct {
    252     mm_camera_super_buf_notify_mode_t notify_mode;
    253     uint8_t water_mark;
    254     uint8_t look_back;
    255     uint8_t post_frame_skip;
    256     uint8_t max_unmatched_frames;
    257     mm_camera_super_buf_priority_t priority;
    258 } mm_camera_channel_attr_t;
    259 
    260 typedef struct {
    261     /** query_capability: fucntion definition for querying static
    262      *                    camera capabilities
    263      *    @camera_handle : camer handler
    264      *  Return value: 0 -- success
    265      *                -1 -- failure
    266      *  Note: would assume cam_capability_t is already mapped
    267      **/
    268     int32_t (*query_capability) (uint32_t camera_handle);
    269 
    270     /** register_event_notify: fucntion definition for registering
    271      *                         for event notification
    272      *    @camera_handle : camer handler
    273      *    @evt_cb : callback for event notify
    274      *    @user_data : user data poiner
    275      *  Return value: 0 -- success
    276      *                -1 -- failure
    277      **/
    278     int32_t (*register_event_notify) (uint32_t camera_handle,
    279                                       mm_camera_event_notify_t evt_cb,
    280                                       void *user_data);
    281 
    282     /** close_camera: fucntion definition for closing a camera
    283      *    @camera_handle : camer handler
    284      *  Return value: 0 -- success
    285      *                -1 -- failure
    286      **/
    287     int32_t (*close_camera) (uint32_t camera_handle);
    288 
    289     /** map_buf: fucntion definition for mapping a camera buffer
    290      *           via domain socket
    291      *    @camera_handle : camer handler
    292      *    @buf_type : type of mapping buffers, can be value of
    293      *                CAM_MAPPING_BUF_TYPE_CAPABILITY
    294      *                CAM_MAPPING_BUF_TYPE_SETPARM_BUF
    295      *                CAM_MAPPING_BUF_TYPE_GETPARM_BUF
    296      *    @fd : file descriptor of the stream buffer
    297      *    @size :  size of the stream buffer
    298      *  Return value: 0 -- success
    299      *                -1 -- failure
    300      **/
    301     int32_t (*map_buf) (uint32_t camera_handle,
    302                         uint8_t buf_type,
    303                         int fd,
    304                         uint32_t size);
    305 
    306     /** unmap_buf: fucntion definition for unmapping a camera buffer
    307      *           via domain socket
    308      *    @camera_handle : camer handler
    309      *    @buf_type : type of mapping buffers, can be value of
    310      *                CAM_MAPPING_BUF_TYPE_CAPABILITY
    311      *                CAM_MAPPING_BUF_TYPE_SETPARM_BUF
    312      *                CAM_MAPPING_BUF_TYPE_GETPARM_BUF
    313      *  Return value: 0 -- success
    314      *                -1 -- failure
    315      **/
    316     int32_t (*unmap_buf) (uint32_t camera_handle,
    317                           uint8_t buf_type);
    318 
    319     /** set_parms: fucntion definition for setting camera
    320      *             based parameters to server
    321      *    @camera_handle : camer handler
    322      *    @parms : batch for parameters to be set, stored in
    323      *               parm_buffer_t
    324      *  Return value: 0 -- success
    325      *                -1 -- failure
    326      *  Note: would assume parm_buffer_t is already mapped, and
    327      *       according parameter entries to be set are filled in the
    328      *       buf before this call
    329      **/
    330     int32_t (*set_parms) (uint32_t camera_handle,
    331                           parm_buffer_t *parms);
    332 
    333     /** get_parms: fucntion definition for querying camera
    334      *             based parameters from server
    335      *    @camera_handle : camer handler
    336      *    @parms : batch for parameters to be queried, stored in
    337      *               parm_buffer_t
    338      *  Return value: 0 -- success
    339      *                -1 -- failure
    340      *  Note: would assume parm_buffer_t is already mapped, and
    341      *       according parameter entries to be queried are filled in
    342      *       the buf before this call
    343      **/
    344     int32_t (*get_parms) (uint32_t camera_handle,
    345                           parm_buffer_t *parms);
    346 
    347     /** do_auto_focus: fucntion definition for performing auto focus
    348      *    @camera_handle : camer handler
    349      *  Return value: 0 -- success
    350      *                -1 -- failure
    351      *  Note: if this call success, we will always assume there will
    352      *        be an auto_focus event following up.
    353      **/
    354     int32_t (*do_auto_focus) (uint32_t camera_handle);
    355 
    356     /** cancel_auto_focus: fucntion definition for cancelling
    357      *                     previous auto focus request
    358      *    @camera_handle : camer handler
    359     *  Return value: 0 -- success
    360     *                -1 -- failure
    361      **/
    362     int32_t (*cancel_auto_focus) (uint32_t camera_handle);
    363 
    364     /** prepare_snapshot: fucntion definition for preparing hardware
    365      *                    for snapshot.
    366      *    @camera_handle : camer handler
    367      *    @do_af_flag    : flag indicating if AF needs to be done
    368      *                     0 -- no AF needed
    369      *                     1 -- AF needed
    370      *  Return value: 0 -- success
    371      *                -1 -- failure
    372      **/
    373     int32_t (*prepare_snapshot) (uint32_t camera_handle,
    374                                  int32_t do_af_flag);
    375 
    376     /** start_zsl_snapshot: function definition for starting
    377      *                    zsl snapshot.
    378      *    @camera_handle : camer handler
    379      *  Return value: 0 -- success
    380      *                -1 -- failure
    381      **/
    382     int32_t (*start_zsl_snapshot) (uint32_t camera_handle);
    383 
    384     /** stop_zsl_snapshot: function definition for stopping
    385      *                    zsl snapshot.
    386      *    @camera_handle : camer handler
    387      *  Return value: 0 -- success
    388      *                -1 -- failure
    389      **/
    390     int32_t (*stop_zsl_snapshot) (uint32_t camera_handle);
    391 
    392     /** add_channel: fucntion definition for adding a channel
    393      *    @camera_handle : camer handler
    394      *    @ch_id : channel handler
    395      *    @attr : pointer to channel attribute structure
    396      *    @channel_cb : callbak to handle bundled super buffer
    397      *    @userdata : user data pointer
    398      *  Return value: channel id, zero is invalid ch_id
    399      * Note: attr, channel_cb, and userdata can be NULL if no
    400      *       superbufCB is needed
    401      **/
    402     uint32_t (*add_channel) (uint32_t camera_handle,
    403                              mm_camera_channel_attr_t *attr,
    404                              mm_camera_buf_notify_t channel_cb,
    405                              void *userdata);
    406 
    407     /** delete_channel: fucntion definition for deleting a channel
    408      *    @camera_handle : camer handler
    409      *    @ch_id : channel handler
    410      *  Return value: 0 -- success
    411      *                -1 -- failure
    412      **/
    413     int32_t (*delete_channel) (uint32_t camera_handle,
    414                                uint32_t ch_id);
    415 
    416     /** get_bundle_info: function definition for querying bundle
    417      *  info of the channel
    418      *    @camera_handle : camera handler
    419      *    @ch_id         : channel handler
    420      *    @bundle_info   : bundle info to be filled in
    421      *  Return value: 0 -- success
    422      *                -1 -- failure
    423      **/
    424     int32_t (*get_bundle_info) (uint32_t camera_handle,
    425                                 uint32_t ch_id,
    426                                 cam_bundle_config_t *bundle_info);
    427 
    428     /** add_stream: fucntion definition for adding a stream
    429      *    @camera_handle : camer handler
    430      *    @ch_id : channel handler
    431      *  Return value: stream_id. zero is invalid stream_id
    432      **/
    433     uint32_t (*add_stream) (uint32_t camera_handle,
    434                             uint32_t ch_id);
    435 
    436     /** delete_stream: fucntion definition for deleting a stream
    437      *    @camera_handle : camer handler
    438      *    @ch_id : channel handler
    439      *    @stream_id : stream handler
    440      *  Return value: 0 -- success
    441      *                -1 -- failure
    442      **/
    443     int32_t (*delete_stream) (uint32_t camera_handle,
    444                               uint32_t ch_id,
    445                               uint32_t stream_id);
    446 
    447     /** config_stream: fucntion definition for configuring a stream
    448      *    @camera_handle : camer handler
    449      *    @ch_id : channel handler
    450      *    @stream_id : stream handler
    451      *    @confid : pointer to a stream configuration structure
    452      *  Return value: 0 -- success
    453      *                -1 -- failure
    454      **/
    455     int32_t (*config_stream) (uint32_t camera_handle,
    456                               uint32_t ch_id,
    457                               uint32_t stream_id,
    458                               mm_camera_stream_config_t *config);
    459 
    460     /** map_stream_buf: fucntion definition for mapping
    461      *                 stream buffer via domain socket
    462      *    @camera_handle : camer handler
    463      *    @ch_id : channel handler
    464      *    @stream_id : stream handler
    465      *    @buf_type : type of mapping buffers, can be value of
    466      *             CAM_MAPPING_BUF_TYPE_STREAM_BUF
    467      *             CAM_MAPPING_BUF_TYPE_STREAM_INFO
    468      *             CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
    469      *    @buf_idx : buffer index within the stream buffers
    470      *    @plane_idx : plane index. If all planes share the same fd,
    471      *               plane_idx = -1; otherwise, plean_idx is the
    472      *               index to plane (0..num_of_planes)
    473      *    @fd : file descriptor of the stream buffer
    474      *    @size :  size of the stream buffer
    475      *  Return value: 0 -- success
    476      *                -1 -- failure
    477      **/
    478     int32_t (*map_stream_buf) (uint32_t camera_handle,
    479                                uint32_t ch_id,
    480                                uint32_t stream_id,
    481                                uint8_t buf_type,
    482                                uint32_t buf_idx,
    483                                int32_t plane_idx,
    484                                int fd,
    485                                uint32_t size);
    486 
    487     /** unmap_stream_buf: fucntion definition for unmapping
    488      *                 stream buffer via domain socket
    489      *    @camera_handle : camer handler
    490      *    @ch_id : channel handler
    491      *    @stream_id : stream handler
    492      *    @buf_type : type of mapping buffers, can be value of
    493      *             CAM_MAPPING_BUF_TYPE_STREAM_BUF
    494      *             CAM_MAPPING_BUF_TYPE_STREAM_INFO
    495      *             CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
    496      *    @buf_idx : buffer index within the stream buffers
    497      *    @plane_idx : plane index. If all planes share the same fd,
    498      *               plane_idx = -1; otherwise, plean_idx is the
    499      *               index to plane (0..num_of_planes)
    500      *  Return value: 0 -- success
    501      *                -1 -- failure
    502      **/
    503     int32_t (*unmap_stream_buf) (uint32_t camera_handle,
    504                                  uint32_t ch_id,
    505                                  uint32_t stream_id,
    506                                  uint8_t buf_type,
    507                                  uint32_t buf_idx,
    508                                  int32_t plane_idx);
    509 
    510     /** set_stream_parms: fucntion definition for setting stream
    511      *                    specific parameters to server
    512      *    @camera_handle : camer handler
    513      *    @ch_id : channel handler
    514      *    @stream_id : stream handler
    515      *    @parms : batch for parameters to be set
    516      *  Return value: 0 -- success
    517      *                -1 -- failure
    518      *  Note: would assume parm buffer is already mapped, and
    519      *       according parameter entries to be set are filled in the
    520      *       buf before this call
    521      **/
    522     int32_t (*set_stream_parms) (uint32_t camera_handle,
    523                                  uint32_t ch_id,
    524                                  uint32_t s_id,
    525                                  cam_stream_parm_buffer_t *parms);
    526 
    527     /** get_stream_parms: fucntion definition for querying stream
    528      *                    specific parameters from server
    529      *    @camera_handle : camer handler
    530      *    @ch_id : channel handler
    531      *    @stream_id : stream handler
    532      *    @parms : batch for parameters to be queried
    533      *  Return value: 0 -- success
    534      *                -1 -- failure
    535      *  Note: would assume parm buffer is already mapped, and
    536      *       according parameter entries to be queried are filled in
    537      *       the buf before this call
    538      **/
    539     int32_t (*get_stream_parms) (uint32_t camera_handle,
    540                                  uint32_t ch_id,
    541                                  uint32_t s_id,
    542                                  cam_stream_parm_buffer_t *parms);
    543 
    544     /** start_channel: fucntion definition for starting a channel
    545      *    @camera_handle : camer handler
    546      *    @ch_id : channel handler
    547      *  Return value: 0 -- success
    548      *                -1 -- failure
    549      * This call will start all streams belongs to the channel
    550      **/
    551     int32_t (*start_channel) (uint32_t camera_handle,
    552                               uint32_t ch_id);
    553 
    554     /** stop_channel: fucntion definition for stopping a channel
    555      *    @camera_handle : camer handler
    556      *    @ch_id : channel handler
    557      *  Return value: 0 -- success
    558      *                -1 -- failure
    559      * This call will stop all streams belongs to the channel
    560      **/
    561     int32_t (*stop_channel) (uint32_t camera_handle,
    562                              uint32_t ch_id);
    563 
    564     /** qbuf: fucntion definition for queuing a frame buffer back to
    565      *        kernel for reuse
    566      *    @camera_handle : camer handler
    567      *    @ch_id : channel handler
    568      *    @buf : a frame buffer to be queued back to kernel
    569      *  Return value: 0 -- success
    570      *                -1 -- failure
    571      **/
    572     int32_t (*qbuf) (uint32_t camera_handle,
    573                      uint32_t ch_id,
    574                      mm_camera_buf_def_t *buf);
    575 
    576     /** request_super_buf: fucntion definition for requesting frames
    577      *                     from superbuf queue in burst mode
    578      *    @camera_handle : camer handler
    579      *    @ch_id : channel handler
    580      *    @num_buf_requested : number of super buffers requested
    581      *  Return value: 0 -- success
    582      *                -1 -- failure
    583      **/
    584     int32_t (*request_super_buf) (uint32_t camera_handle,
    585                                   uint32_t ch_id,
    586                                   uint32_t num_buf_requested);
    587 
    588     /** cancel_super_buf_request: fucntion definition for canceling
    589      *                     frames dispatched from superbuf queue in
    590      *                     burst mode
    591      *    @camera_handle : camer handler
    592      *    @ch_id : channel handler
    593      *  Return value: 0 -- success
    594      *                -1 -- failure
    595      **/
    596     int32_t (*cancel_super_buf_request) (uint32_t camera_handle,
    597                                          uint32_t ch_id);
    598 
    599     /** flush_super_buf_queue: function definition for flushing out
    600      *                     all frames in the superbuf queue up to frame_idx,
    601      *                     even if frames with frame_idx come in later than
    602      *                     this call.
    603      *    @camera_handle : camer handler
    604      *    @ch_id : channel handler
    605      *    @frame_idx : frame index up until which all superbufs are flushed
    606      *  Return value: 0 -- success
    607      *                -1 -- failure
    608      **/
    609     int32_t (*flush_super_buf_queue) (uint32_t camera_handle,
    610                                       uint32_t ch_id, uint32_t frame_idx);
    611 
    612     /** configure_notify_mode: function definition for configuring the
    613      *                         notification mode of channel
    614      *    @camera_handle : camera handler
    615      *    @ch_id : channel handler
    616      *    @notify_mode : notification mode
    617      *  Return value: 0 -- success
    618      *                -1 -- failure
    619      **/
    620     int32_t (*configure_notify_mode) (uint32_t camera_handle,
    621                                       uint32_t ch_id,
    622                                       mm_camera_super_buf_notify_mode_t notify_mode);
    623 } mm_camera_ops_t;
    624 
    625 /** mm_camera_vtbl_t: virtual table for camera operations
    626 *    @camera_handle : camera handler which uniquely identifies a
    627 *                   camera object
    628 *    @ops : API call table
    629 **/
    630 typedef struct {
    631     uint32_t camera_handle;
    632     mm_camera_ops_t *ops;
    633 } mm_camera_vtbl_t;
    634 
    635 /* return number of cameras */
    636 uint8_t get_num_of_cameras();
    637 
    638 /* return reference pointer of camera vtbl */
    639 mm_camera_vtbl_t * camera_open(uint8_t camera_idx);
    640 
    641 #endif /*__MM_CAMERA_INTERFACE_H__*/
    642