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