1 /* 2 Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. 3 4 Redistribution and use in source and binary forms, with or without 5 modification, are permitted provided that the following conditions are 6 met: 7 * Redistributions of source code must retain the above copyright 8 notice, this list of conditions and the following disclaimer. 9 * Redistributions in binary form must reproduce the above 10 copyright notice, this list of conditions and the following 11 disclaimer in the documentation and/or other materials provided 12 with the distribution. 13 * Neither the name of The Linux Foundation nor the names of its 14 contributors may be used to endorse or promote products derived 15 from this software without specific prior written permission. 16 17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #include <pthread.h> 31 #include <errno.h> 32 #include <sys/ioctl.h> 33 #include <sys/types.h> 34 #include <sys/stat.h> 35 #include <fcntl.h> 36 #include <poll.h> 37 #include "mm_camera_dbg.h" 38 #include "mm_qcamera_app.h" 39 40 #define BUFF_SIZE_128 128 41 42 #ifdef TEST_ABORT_JPEG_ENCODE 43 static uint8_t aborted_flag = 1; 44 #endif 45 46 //static mm_camera_ch_data_buf_t *mCurrentFrameEncoded; 47 static int JpegOffset = 0; 48 static int raw_snapshot_cnt = 0; 49 static int snapshot_cnt = 0; 50 static pthread_mutex_t g_s_mutex; 51 static int g_status = 0; 52 static pthread_cond_t g_s_cond_v; 53 54 extern void dumpFrameToFile(mm_camera_buf_def_t* newFrame, int w, int h, char* name, int main_422,char *ext); 55 extern int mm_app_open_zsl(int cam_id); 56 extern int mm_app_open_camera(int cam_id); 57 extern int mm_app_start_preview(int cam_id); 58 extern int mm_stream_alloc_bufs(mm_camera_app_obj_t *pme, 59 mm_camear_app_buf_t* app_bufs, 60 mm_camera_frame_len_offset *frame_offset_info, 61 uint8_t num_bufs); 62 extern int mm_stream_release_bufs(mm_camera_app_obj_t *pme, 63 mm_camear_app_buf_t* app_bufs); 64 extern int mm_stream_invalid_cache(mm_camera_app_obj_t *pme, 65 mm_camera_buf_def_t *frame); 66 67 static void mm_app_snapshot_done() 68 { 69 pthread_mutex_lock(&g_s_mutex); 70 g_status = TRUE; 71 pthread_cond_signal(&g_s_cond_v); 72 pthread_mutex_unlock(&g_s_mutex); 73 } 74 75 static int mm_app_dump_snapshot_frame(struct msm_frame *frame, 76 uint32_t len, int is_main, int is_raw) 77 { 78 char bufp[BUFF_SIZE_128]; 79 int file_fdp; 80 int rc = 0; 81 82 if (is_raw) { 83 snprintf(bufp, BUFF_SIZE_128, "/data/main_raw_%d.yuv", raw_snapshot_cnt); 84 } else { 85 if (is_main) { 86 snprintf(bufp, BUFF_SIZE_128, "/data/main_%d.yuv", snapshot_cnt); 87 } else { 88 snprintf(bufp, BUFF_SIZE_128, "/data/thumb_%d.yuv", snapshot_cnt); 89 } 90 } 91 92 file_fdp = open(bufp, O_RDWR | O_CREAT, 0777); 93 94 if (file_fdp < 0) { 95 CDBG("cannot open file %s\n", bufp); 96 rc = -1; 97 goto end; 98 } 99 CDBG("%s:dump snapshot frame to '%s'\n", __func__, bufp); 100 write(file_fdp, 101 (const void *)frame->buffer, len); 102 close(file_fdp); 103 end: 104 return rc; 105 } 106 107 108 static void mm_app_dump_jpeg_frame(const void * data, uint32_t size, char* name, char* ext, int index) 109 { 110 char buf[32]; 111 int file_fd; 112 if ( data != NULL) { 113 char * str; 114 snprintf(buf, sizeof(buf), "/data/%s_%d.%s", name, index, ext); 115 CDBG("%s: %s size =%d, jobId=%d", __func__, buf, size, index); 116 file_fd = open(buf, O_RDWR | O_CREAT, 0777); 117 write(file_fd, data, size); 118 close(file_fd); 119 } 120 } 121 122 static int mm_app_set_thumbnail_fmt(int cam_id, mm_camera_image_fmt_t *fmt) 123 { 124 int rc = MM_CAMERA_OK; 125 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 126 127 fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF; 128 fmt->fmt = pme->dim.thumb_format; 129 fmt->width = pme->dim.thumbnail_width; 130 fmt->height = pme->dim.thumbnail_height; 131 if (cam_id == 0) { 132 /* back camera, rotate 90 */ 133 fmt->rotation = 90; 134 } 135 CDBG("Thumbnail Dimension = %dX%d",fmt->width,fmt->height); 136 return rc; 137 } 138 139 int mm_app_set_snapshot_fmt(int cam_id, mm_camera_image_fmt_t *fmt) 140 { 141 142 int rc = MM_CAMERA_OK; 143 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 144 fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF; 145 fmt->fmt = pme->dim.main_img_format; 146 fmt->width = pme->dim.picture_width; 147 fmt->height = pme->dim.picture_height; 148 if (cam_id == 0) { 149 /* back camera, rotate 90 */ 150 fmt->rotation = 90; 151 } 152 CDBG("Snapshot Dimension = %dX%d",fmt->width,fmt->height); 153 return rc; 154 } 155 156 int mm_app_set_live_snapshot_fmt(int cam_id, mm_camera_image_fmt_t *fmt) 157 { 158 int rc = MM_CAMERA_OK; 159 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 160 fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF; 161 fmt->fmt = pme->dim.enc_format; 162 fmt->width = pme->dim.video_width; 163 fmt->height = pme->dim.video_height; 164 CDBG("Livesnapshot Dimension = %dX%d",fmt->width,fmt->height); 165 return rc; 166 } 167 168 int mm_app_set_raw_snapshot_fmt(int cam_id,mm_camera_image_fmt_t *fmt) 169 { 170 int rc = MM_CAMERA_OK; 171 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 172 173 fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF; 174 fmt->fmt = pme->dim.raw_img_format; 175 fmt->width = pme->dim.raw_picture_width; 176 fmt->height = pme->dim.raw_picture_height; 177 if (cam_id == 0) { 178 /* back camera, rotate 90 */ 179 fmt->rotation = 90; 180 } 181 CDBG("%s: Raw Snapshot Dimension = %d X %d",__func__,pme->dim.raw_picture_width,pme->dim.raw_picture_height); 182 return rc; 183 } 184 185 /* This callback is received once the complete JPEG encoding is done */ 186 static void jpeg_encode_cb(jpeg_job_status_t status, 187 uint8_t thumbnailDroppedFlag, 188 uint32_t client_hdl, 189 uint32_t jobId, 190 uint8_t* out_data, 191 uint32_t data_size, 192 void *userData) 193 { 194 int rc; 195 int i = 0; 196 mm_camera_buf_def_t *main_frame = NULL; 197 mm_camera_buf_def_t *thumb_frame = NULL; 198 mm_camera_app_obj_t *pme = NULL; 199 CDBG("%s: BEGIN\n", __func__); 200 201 pme = (mm_camera_app_obj_t *)userData; 202 if (jobId != pme->current_job_id || !pme->current_job_frames) { 203 CDBG_ERROR("%s: NULL current job frames or not matching job ID (%d, %d)", 204 __func__, jobId, pme->current_job_id); 205 return; 206 } 207 208 /* dump jpeg img */ 209 CDBG_ERROR("%s: job %d, status=%d, thumbnail_dropped=%d", 210 __func__, jobId, status, thumbnailDroppedFlag); 211 if (status == JPEG_JOB_STATUS_DONE) { 212 mm_app_dump_jpeg_frame(out_data, data_size, "jpeg_dump", "jpg", pme->my_id); 213 } 214 215 /* buf done current encoding frames */ 216 pme->current_job_id = 0; 217 for (i=0; i<pme->current_job_frames->num_bufs; i++) { 218 if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->current_job_frames->camera_handle, 219 pme->current_job_frames->ch_id, 220 pme->current_job_frames->bufs[i])) { 221 CDBG_ERROR("%s: Failed in Qbuf\n", __func__); 222 } 223 } 224 free(pme->current_job_frames); 225 pme->current_job_frames = NULL; 226 227 /* signal snapshot is done */ 228 mm_app_snapshot_done(); 229 } 230 231 static int encodeData(mm_camera_app_obj_t *pme, 232 mm_camera_super_buf_t* recvd_frame) 233 { 234 int rc = -1; 235 int i,index = -1; 236 mm_jpeg_job job; 237 mm_camera_buf_def_t *main_frame = NULL; 238 mm_camera_buf_def_t *thumb_frame = NULL; 239 src_image_buffer_info* main_buf_info = NULL; 240 src_image_buffer_info* thumb_buf_info = NULL; 241 mm_camera_frame_len_offset main_offset; 242 mm_camera_frame_len_offset thumb_offset; 243 244 /* dump raw img for debug purpose */ 245 CDBG("%s : total streams = %d",__func__,recvd_frame->num_bufs); 246 for (i=0; i<recvd_frame->num_bufs; i++) { 247 if (pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id == recvd_frame->bufs[i]->stream_id) { 248 main_frame = recvd_frame->bufs[i]; 249 CDBG("mainframe frame_idx = %d fd = %d frame length = %d",main_frame->frame_idx,main_frame->fd,main_frame->frame_len); 250 dumpFrameToFile(main_frame,pme->dim.picture_width,pme->dim.picture_height,"main", 1,"yuv"); 251 } else if (pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id == recvd_frame->bufs[i]->stream_id){ 252 thumb_frame = recvd_frame->bufs[1]; 253 CDBG("thumnail frame_idx = %d fd = %d frame length = %d",thumb_frame->frame_idx,thumb_frame->fd,thumb_frame->frame_len); 254 dumpFrameToFile(thumb_frame,pme->dim.thumbnail_width,pme->dim.thumbnail_height,"thumb", 1,"yuv"); 255 } 256 } 257 258 if (main_frame == NULL) { 259 CDBG_ERROR("%s: Main frame is NULL", __func__); 260 return rc; 261 } 262 263 /* remember current frames being encoded */ 264 pme->current_job_frames = 265 (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 266 if (!pme->current_job_frames) { 267 CDBG_ERROR("%s: No memory for current_job_frames", __func__); 268 return rc; 269 } 270 memcpy(pme->current_job_frames, recvd_frame, sizeof(mm_camera_super_buf_t)); 271 272 memset(&job, 0, sizeof(job)); 273 job.job_type = JPEG_JOB_TYPE_ENCODE; 274 job.encode_job.jpeg_cb = jpeg_encode_cb; 275 job.encode_job.userdata = (void*)pme; 276 job.encode_job.encode_parm.exif_data = NULL; 277 job.encode_job.encode_parm.exif_numEntries = 0; 278 job.encode_job.encode_parm.rotation = 0; 279 job.encode_job.encode_parm.buf_info.src_imgs.src_img_num = recvd_frame->num_bufs; 280 job.encode_job.encode_parm.rotation = 0; 281 if (pme->my_id == 0) { 282 /* back camera, rotate 90 */ 283 job.encode_job.encode_parm.rotation = 90; 284 } 285 286 /* fill in main src img encode param */ 287 main_buf_info = &job.encode_job.encode_parm.buf_info.src_imgs.src_img[JPEG_SRC_IMAGE_TYPE_MAIN]; 288 main_buf_info->type = JPEG_SRC_IMAGE_TYPE_MAIN; 289 main_buf_info->color_format = MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; //TODO 290 main_buf_info->quality = 85; 291 main_buf_info->src_dim.width = pme->dim.picture_width; 292 main_buf_info->src_dim.height = pme->dim.picture_height; 293 main_buf_info->out_dim.width = pme->dim.picture_width; 294 main_buf_info->out_dim.height = pme->dim.picture_height; 295 main_buf_info->crop.width = pme->dim.picture_width; 296 main_buf_info->crop.height = pme->dim.picture_height; 297 main_buf_info->crop.offset_x = 0; 298 main_buf_info->crop.offset_y = 0; 299 main_buf_info->img_fmt = JPEG_SRC_IMAGE_FMT_YUV; 300 main_buf_info->num_bufs = 1; 301 main_buf_info->src_image[0].fd = main_frame->fd; 302 main_buf_info->src_image[0].buf_vaddr = main_frame->buffer; 303 pme->cam->ops->get_stream_parm(pme->cam->camera_handle, 304 pme->ch_id, 305 pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id, 306 MM_CAMERA_STREAM_OFFSET, 307 &main_buf_info->src_image[0].offset); 308 CDBG("%s: main offset: num_planes=%d, frame length=%d, y_offset=%d, cbcr_offset=%d", 309 __func__, main_buf_info->src_image[0].offset.num_planes, 310 main_buf_info->src_image[0].offset.frame_len, 311 main_buf_info->src_image[0].offset.mp[0].offset, 312 main_buf_info->src_image[0].offset.mp[1].offset); 313 314 mm_stream_clear_invalid_cache(pme,main_frame); 315 316 if (thumb_frame) { 317 /* fill in thumbnail src img encode param */ 318 thumb_buf_info = &job.encode_job.encode_parm.buf_info.src_imgs.src_img[JPEG_SRC_IMAGE_TYPE_THUMB]; 319 thumb_buf_info->type = JPEG_SRC_IMAGE_TYPE_THUMB; 320 thumb_buf_info->color_format = MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; //TODO 321 thumb_buf_info->quality = 85; 322 thumb_buf_info->src_dim.width = pme->dim.thumbnail_width; 323 thumb_buf_info->src_dim.height = pme->dim.thumbnail_height; 324 thumb_buf_info->out_dim.width = pme->dim.thumbnail_width; 325 thumb_buf_info->out_dim.height = pme->dim.thumbnail_height; 326 thumb_buf_info->crop.width = pme->dim.thumbnail_width; 327 thumb_buf_info->crop.height = pme->dim.thumbnail_height; 328 thumb_buf_info->crop.offset_x = 0; 329 thumb_buf_info->crop.offset_y = 0; 330 thumb_buf_info->img_fmt = JPEG_SRC_IMAGE_FMT_YUV; 331 thumb_buf_info->num_bufs = 1; 332 thumb_buf_info->src_image[0].fd = thumb_frame->fd; 333 thumb_buf_info->src_image[0].buf_vaddr = thumb_frame->buffer; 334 pme->cam->ops->get_stream_parm(pme->cam->camera_handle, 335 pme->ch_id, 336 pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id, 337 MM_CAMERA_STREAM_OFFSET, 338 &thumb_buf_info->src_image[0].offset); 339 } 340 341 /* fill in sink img param */ 342 job.encode_job.encode_parm.buf_info.sink_img.buf_len = pme->jpeg_buf.bufs[0].frame_len; 343 job.encode_job.encode_parm.buf_info.sink_img.buf_vaddr = pme->jpeg_buf.bufs[0].buffer; 344 job.encode_job.encode_parm.buf_info.sink_img.fd = pme->jpeg_buf.bufs[0].fd; 345 346 mm_stream_clear_invalid_cache(pme,thumb_frame); 347 348 rc = pme->jpeg_ops.start_job(pme->jpeg_hdl, &job, &pme->current_job_id); 349 if ( 0 != rc ) { 350 free(pme->current_job_frames); 351 pme->current_job_frames = NULL; 352 } 353 354 return rc; 355 } 356 357 static void snapshot_yuv_cb(mm_camera_super_buf_t *bufs, 358 void *user_data) 359 { 360 361 int rc; 362 int i = 0; 363 mm_camera_buf_def_t *main_frame = NULL; 364 mm_camera_buf_def_t *thumb_frame = NULL; 365 mm_camera_app_obj_t *pme = NULL; 366 char* cmd = "This is a private cmd from test app"; 367 368 CDBG("%s: BEGIN\n", __func__); 369 370 pme = (mm_camera_app_obj_t *)user_data; 371 372 CDBG("%s: send private ioctl here", __func__); 373 pme->cam->ops->send_command(bufs->camera_handle, 374 MM_CAMERA_CMD_TYPE_PRIVATE, 375 0, 376 strlen(cmd) + 1, 377 (void *)cmd); 378 379 /* start jpeg encoding job */ 380 rc = encodeData(pme, bufs); 381 382 /* buf done rcvd frames in error case */ 383 if ( 0 != rc ) { 384 for (i=0; i<bufs->num_bufs; i++) { 385 if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, 386 bufs->ch_id, 387 bufs->bufs[i])) { 388 CDBG_ERROR("%s: Failed in Qbuf\n", __func__); 389 } 390 mm_stream_invalid_cache(pme,bufs->bufs[i]); 391 } 392 } 393 #ifdef TEST_ABORT_JPEG_ENCODE 394 else { 395 if (aborted_flag) { 396 aborted_flag = 0; 397 /* abort the job */ 398 CDBG("%s: abort jpeg encode job here", __func__); 399 rc = pme->jpeg_ops.abort_job(pme->jpeg_hdl, pme->current_job_id); 400 if (NULL != pme->current_job_frames) { 401 free(pme->current_job_frames); 402 pme->current_job_frames = NULL; 403 } 404 CDBG("%s: abort jpeg encode job returns %d", __func__, rc); 405 for (i=0; i<bufs->num_bufs; i++) { 406 if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, 407 bufs->ch_id, 408 bufs->bufs[i])) { 409 CDBG_ERROR("%s: Failed in Qbuf\n", __func__); 410 } 411 mm_stream_invalid_cache(pme,bufs->bufs[i]); 412 } 413 414 /* signal snapshot is done */ 415 mm_app_snapshot_done(); 416 } 417 } 418 #endif 419 420 CDBG("%s: END\n", __func__); 421 } 422 423 static void snapshot_raw_cb(mm_camera_super_buf_t *recvd_frame, 424 void *user_data) 425 { 426 int rc; 427 int i = 0; 428 mm_camera_buf_def_t *main_frame = NULL; 429 mm_camera_app_obj_t *pme = NULL; 430 431 CDBG("%s: BEGIN\n", __func__); 432 433 pme = (mm_camera_app_obj_t *)user_data; 434 435 if (pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id == recvd_frame->bufs[i]->stream_id) { 436 main_frame = recvd_frame->bufs[i]; 437 CDBG("mainframe frame_idx = %d fd = %d frame length = %d",main_frame->frame_idx,main_frame->fd,main_frame->frame_len); 438 dumpFrameToFile(main_frame,pme->dim.raw_picture_width,pme->dim.raw_picture_height,"raw_main", 1,"raw"); 439 } 440 if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id, 441 main_frame)) { 442 CDBG_ERROR("%s: Failed in Qbuf\n", __func__); 443 } 444 445 mm_app_snapshot_done(); 446 } 447 448 static int encodeDisplayAndSave(mm_camera_super_buf_t* recvd_frame, 449 int enqueued, mm_camera_app_obj_t *pme) 450 { 451 int ret = -1; 452 #if 0 453 454 455 CDBG("%s: Send frame for encoding", __func__); 456 ret = encodeData(recvd_frame, pme->snapshot_buf.frame_len, 457 enqueued, pme); 458 if (!ret) { 459 CDBG_ERROR("%s: Failure configuring JPEG encoder", __func__); 460 } 461 462 LOGD("%s: X", __func__); 463 #endif 464 return ret; 465 } 466 467 int mm_app_add_snapshot_stream(int cam_id) 468 { 469 int rc = MM_CAMERA_OK; 470 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 471 472 pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id = pme->cam->ops->add_stream(pme->cam->camera_handle,pme->ch_id, 473 NULL,pme, 474 MM_CAMERA_SNAPSHOT_MAIN, 0); 475 476 CDBG("Add Snapshot main is successfull stream ID = %d",pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id); 477 if (!pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id) { 478 CDBG_ERROR("%s:snapshot main streaming err=%d\n", __func__, rc); 479 rc = -1; 480 goto end; 481 } 482 483 pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id = pme->cam->ops->add_stream(pme->cam->camera_handle,pme->ch_id, 484 NULL,pme, 485 MM_CAMERA_SNAPSHOT_THUMBNAIL, 0); 486 if (!pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id) { 487 CDBG_ERROR("%s:snapshot thumbnail streaming err=%d\n", __func__, rc); 488 rc = -1; 489 goto end; 490 } 491 end: 492 CDBG("%s: END, rc=%d\n", __func__, rc); 493 return rc; 494 } 495 496 void mm_app_set_snapshot_mode(int cam_id,int op_mode) 497 { 498 denoise_param_t wnr; 499 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 500 pme->cam->ops->set_parm(pme->cam->camera_handle,MM_CAMERA_PARM_OP_MODE, &op_mode); 501 502 /* set wnr enabled */ 503 memset(&wnr, 0, sizeof(denoise_param_t)); 504 wnr.denoise_enable = 0; 505 wnr.process_plates = 0; 506 // pme->cam->ops->set_parm(pme->cam->camera_handle, MM_CAMERA_PARM_WAVELET_DENOISE, &wnr); 507 } 508 509 int mm_app_config_raw_format(int cam_id) 510 { 511 int rc = MM_CAMERA_OK; 512 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 513 mm_camera_image_fmt_t *m_fmt = NULL; 514 mm_camera_image_fmt_t *t_fmt = NULL; 515 516 mm_app_set_raw_snapshot_fmt(cam_id,&pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.fmt); 517 518 pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.need_stream_on = 1; 519 pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.num_of_bufs = 1; 520 521 if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id, 522 &pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config))) { 523 CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc); 524 goto end; 525 } 526 527 end: 528 CDBG("%s: END, rc=%d\n", __func__, rc); 529 return rc; 530 531 } 532 533 int mm_app_config_snapshot_format(int cam_id) 534 { 535 int rc = MM_CAMERA_OK; 536 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 537 538 mm_app_set_snapshot_fmt(cam_id,&pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.fmt); 539 540 mm_app_set_thumbnail_fmt(cam_id,&pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].str_config.fmt); 541 542 pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.need_stream_on = 1; 543 pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.num_of_bufs = 1; 544 545 if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id, 546 &pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config))) { 547 CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc); 548 goto end; 549 } 550 551 pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].str_config.need_stream_on = 1; 552 pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].str_config.num_of_bufs = 1; 553 554 if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id, 555 &pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].str_config))) { 556 CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc); 557 goto end; 558 } 559 end: 560 CDBG("%s: END, rc=%d\n", __func__, rc); 561 return rc; 562 563 } 564 565 int mm_app_streamon_snapshot(int cam_id) 566 { 567 int rc = MM_CAMERA_OK; 568 uint32_t stream[2]; 569 mm_camera_bundle_attr_t attr; 570 571 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 572 573 stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id; 574 stream[1] = pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id; 575 576 attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST; 577 attr.burst_num = 1; 578 attr.look_back = 2; 579 attr.post_frame_skip = 0; 580 attr.water_mark = 2; 581 582 if (MM_CAMERA_OK != (rc = pme->cam->ops->init_stream_bundle( 583 pme->cam->camera_handle,pme->ch_id,snapshot_yuv_cb,pme,&attr,2,stream))) { 584 CDBG_ERROR("%s:init_stream_bundle err=%d\n", __func__, rc); 585 goto end; 586 } 587 588 if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id, 589 2, stream))) { 590 CDBG_ERROR("%s:start_streams err=%d\n", __func__, rc); 591 goto end; 592 } 593 594 if (MM_CAMERA_OK != (rc =pme->cam->ops->request_super_buf(pme->cam->camera_handle,pme->ch_id, attr.burst_num))) { 595 CDBG_ERROR("%s:request_super_buf err=%d\n", __func__, rc); 596 goto end; 597 } 598 pme->cam_state = CAMERA_STATE_SNAPSHOT; 599 end: 600 CDBG("%s: END, rc=%d\n", __func__, rc); 601 return rc; 602 } 603 604 int mm_app_streamon_raw(int cam_id) 605 { 606 int rc = MM_CAMERA_OK; 607 uint32_t stream[2]; 608 mm_camera_bundle_attr_t attr; 609 610 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 611 612 stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id; 613 614 attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST; 615 attr.burst_num = 1; 616 attr.look_back = 2; 617 attr.post_frame_skip = 0; 618 attr.water_mark = 2; 619 620 if (MM_CAMERA_OK != (rc = pme->cam->ops->init_stream_bundle( 621 pme->cam->camera_handle,pme->ch_id,snapshot_raw_cb,pme,&attr,1,stream))) { 622 CDBG_ERROR("%s:init_stream_bundle err=%d\n", __func__, rc); 623 goto end; 624 } 625 626 if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id, 627 1, stream))) { 628 CDBG_ERROR("%s:start_streams err=%d\n", __func__, rc); 629 goto end; 630 } 631 632 if (MM_CAMERA_OK != (rc =pme->cam->ops->request_super_buf(pme->cam->camera_handle,pme->ch_id, attr.burst_num))) { 633 CDBG_ERROR("%s:request_super_buf err=%d\n", __func__, rc); 634 goto end; 635 } 636 pme->cam_state = CAMERA_STATE_SNAPSHOT; 637 end: 638 CDBG("%s: END, rc=%d\n", __func__, rc); 639 return rc; 640 } 641 642 int mm_app_streamoff_snapshot(int cam_id) 643 { 644 int rc = MM_CAMERA_OK; 645 uint32_t stream[2]; 646 647 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 648 649 stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id; 650 stream[1] = pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id; 651 652 if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,2,stream))) { 653 CDBG_ERROR("%s : Snapshot Stream off Error",__func__); 654 goto end; 655 } 656 CDBG("Stop snapshot main successfull"); 657 658 if (MM_CAMERA_OK != (rc = pme->cam->ops->destroy_stream_bundle(pme->cam->camera_handle,pme->ch_id))) { 659 CDBG_ERROR("%s : Snapshot destroy_stream_bundle Error",__func__); 660 goto end; 661 } 662 663 if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id))) { 664 CDBG_ERROR("%s : Snapshot main image del_stream Error",__func__); 665 goto end; 666 } 667 CDBG("del_stream successfull"); 668 669 if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id))) { 670 CDBG_ERROR("%s : Snapshot thumnail image del_stream Error",__func__); 671 goto end; 672 } 673 CDBG("del_stream successfull"); 674 675 end: 676 return rc; 677 } 678 679 int mm_app_start_snapshot(int cam_id) 680 { 681 int rc = MM_CAMERA_OK; 682 int stream[2]; 683 int op_mode = 0; 684 uint8_t initial_reg_flag; 685 mm_camera_frame_len_offset frame_offset_info; 686 687 mm_camera_bundle_attr_t attr; 688 689 690 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 691 692 if (MM_CAMERA_OK != mm_app_stop_preview(cam_id)) { 693 CDBG_ERROR("%s: Stop preview Failed cam_id=%d\n",__func__,cam_id); 694 return -1; 695 } 696 op_mode = MM_CAMERA_OP_MODE_CAPTURE; 697 mm_app_set_snapshot_mode(cam_id,op_mode); 698 usleep(20*1000); 699 // pme->cam->ops->prepare_snapshot(pme->cam->camera_handle,pme->ch_id,0); 700 701 if (MM_CAMERA_OK != (rc = mm_app_add_snapshot_stream(cam_id))) { 702 CDBG_ERROR("%s : Add Snapshot stream err",__func__); 703 return rc; 704 } 705 706 if (MM_CAMERA_OK != (rc = mm_app_config_snapshot_format(cam_id))) { 707 CDBG_ERROR("%s : Config Snapshot stream err",__func__); 708 return rc; 709 } 710 711 if (MM_CAMERA_OK != (rc = mm_app_streamon_snapshot(cam_id))) { 712 CDBG_ERROR("%s : Stream on Snapshot stream err",__func__); 713 return rc; 714 } 715 716 /* init jpeg buf */ 717 pme->cam->ops->get_stream_parm(pme->cam->camera_handle, 718 pme->ch_id, 719 pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id, 720 MM_CAMERA_STREAM_OFFSET, 721 &frame_offset_info); 722 CDBG_ERROR("%s : alloc jpeg buf (len=%d)",__func__, frame_offset_info.frame_len); 723 rc = mm_stream_alloc_bufs(pme, 724 &pme->jpeg_buf, 725 &frame_offset_info, 726 1); 727 if (0 != rc) { 728 CDBG_ERROR("%s : mm_stream_alloc_bufs err",__func__); 729 return rc; 730 } 731 732 CDBG("%s: END, rc=%d\n", __func__, rc); 733 return rc; 734 } 735 736 int mm_app_start_raw(int cam_id) 737 { 738 int rc = MM_CAMERA_OK; 739 int op_mode = 0; 740 741 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 742 743 if (MM_CAMERA_OK != mm_app_stop_preview(cam_id)) { 744 CDBG_ERROR("%s: Stop preview Failed cam_id=%d\n",__func__,cam_id); 745 return -1; 746 } 747 op_mode = MM_CAMERA_OP_MODE_RAW; 748 pme->cam->ops->set_parm(pme->cam->camera_handle,MM_CAMERA_PARM_OP_MODE, &op_mode); 749 usleep(20*1000); 750 751 pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id = pme->cam->ops->add_stream(pme->cam->camera_handle,pme->ch_id, 752 NULL,pme, 753 MM_CAMERA_SNAPSHOT_MAIN, 0); 754 755 CDBG("Add RAW main is successfull stream ID = %d",pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id); 756 if (!pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id) { 757 CDBG_ERROR("%s:Raw main streaming err=%d\n", __func__, rc); 758 rc = -1; 759 return rc; 760 } 761 762 if (MM_CAMERA_OK != (rc = mm_app_config_raw_format(cam_id))) { 763 CDBG_ERROR("%s : Config Raw Snapshot stream err",__func__); 764 return rc; 765 } 766 767 if (MM_CAMERA_OK != (rc = mm_app_streamon_raw(cam_id))) { 768 CDBG_ERROR("%s : Stream on Raw Snapshot stream err",__func__); 769 return rc; 770 } 771 772 CDBG("%s: END, rc=%d\n", __func__, rc); 773 return rc; 774 } 775 776 int mm_app_stop_snapshot(int cam_id) 777 { 778 int rc = MM_CAMERA_OK; 779 int i; 780 781 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 782 783 if (pme->current_job_id) { 784 /* have current jpeg encoding running, abort the job */ 785 if (pme->jpeg_ops.abort_job) { 786 pme->jpeg_ops.abort_job(pme->jpeg_hdl, pme->current_job_id); 787 pme->current_job_id = 0; 788 } 789 790 if (pme->current_job_frames) { 791 for (i=0; i<pme->current_job_frames->num_bufs; i++) { 792 if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->current_job_frames->camera_handle, 793 pme->current_job_frames->ch_id, 794 pme->current_job_frames->bufs[i])) { 795 CDBG_ERROR("%s: Failed in Qbuf\n", __func__); 796 } 797 mm_stream_invalid_cache(pme,pme->current_job_frames->bufs[i]); 798 } 799 free(pme->current_job_frames); 800 pme->current_job_frames = NULL; 801 } 802 } 803 804 if (MM_CAMERA_OK != (rc = mm_app_streamoff_snapshot(cam_id))) { 805 CDBG_ERROR("%s : Stream off Snapshot stream err",__func__); 806 } 807 pme->cam_state = CAMERA_STATE_OPEN; 808 809 /* deinit jpeg buf */ 810 rc = mm_stream_release_bufs(pme, 811 &pme->jpeg_buf); 812 end: 813 CDBG("%s: END, rc=%d\n", __func__, rc); 814 815 return rc; 816 } 817 818 int mm_app_stop_raw(int cam_id) 819 { 820 int rc = MM_CAMERA_OK; 821 int i; 822 uint32_t stream[1]; 823 824 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 825 826 stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id; 827 828 if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,1,stream))) { 829 CDBG_ERROR("%s : Snapshot Stream off Error",__func__); 830 goto end; 831 } 832 CDBG("Stop snapshot main successfull"); 833 834 if (MM_CAMERA_OK != (rc = pme->cam->ops->destroy_stream_bundle(pme->cam->camera_handle,pme->ch_id))) { 835 CDBG_ERROR("%s : Snapshot destroy_stream_bundle Error",__func__); 836 goto end; 837 } 838 839 if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id))) { 840 CDBG_ERROR("%s : Snapshot main image del_stream Error",__func__); 841 goto end; 842 } 843 CDBG("del_stream successfull"); 844 845 pme->cam_state = CAMERA_STATE_OPEN; 846 end: 847 return rc; 848 } 849 850 static void mm_app_snapshot_wait(int cam_id) 851 { 852 pthread_mutex_lock(&g_s_mutex); 853 if (FALSE == g_status) { 854 pthread_cond_wait(&g_s_cond_v, &g_s_mutex); 855 g_status = FALSE; 856 } 857 pthread_mutex_unlock(&g_s_mutex); 858 } 859 860 static void mm_app_live_notify_cb(mm_camera_super_buf_t *bufs, 861 void *user_data) 862 { 863 864 int rc; 865 int i = 0; 866 mm_camera_buf_def_t *main_frame = NULL; 867 mm_camera_app_obj_t *pme = NULL; 868 CDBG("%s: BEGIN\n", __func__); 869 870 pme = (mm_camera_app_obj_t *)user_data; 871 872 CDBG("%s : total streams = %d",__func__,bufs->num_bufs); 873 main_frame = bufs->bufs[0]; 874 //thumb_frame = bufs->bufs[1]; 875 876 CDBG("mainframe frame_idx = %d fd = %d frame length = %d",main_frame->frame_idx,main_frame->fd,main_frame->frame_len); 877 //CDBG("thumnail frame_idx = %d fd = %d frame length = %d",thumb_frame->frame_idx,thumb_frame->fd,thumb_frame->frame_len); 878 879 //dumpFrameToFile(main_frame->frame,pme->dim.picture_width,pme->dim.picture_height,"main", 1); 880 881 dumpFrameToFile(main_frame,pme->dim.picture_width,pme->dim.picture_height,"liveshot_main", 1,"yuv"); 882 883 if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,main_frame)) { 884 CDBG_ERROR("%s: Failed in thumbnail Qbuf\n", __func__); 885 } 886 mm_stream_invalid_cache(pme,main_frame); 887 /*if(MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,thumb_frame)) 888 { 889 CDBG_ERROR("%s: Failed in thumbnail Qbuf\n", __func__); 890 }*/ 891 892 mm_app_snapshot_done(); 893 CDBG("%s: END\n", __func__); 894 895 896 } 897 898 int mm_app_prepare_live_snapshot(int cam_id) 899 { 900 int rc = 0; 901 uint32_t stream[1]; 902 mm_camera_bundle_attr_t attr; 903 int value = 0; 904 905 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 906 CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id); 907 908 stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id; 909 //stream[1] = pme->stream[MM_CAMERA_PREVIEW].id; //Need to clarify 910 911 attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST; 912 attr.burst_num = 1; 913 attr.look_back = 2; 914 attr.post_frame_skip = 0; 915 attr.water_mark = 2; 916 917 918 if (MM_CAMERA_OK != (rc = pme->cam->ops->set_parm( 919 pme->cam->camera_handle,MM_CAMERA_PARM_FULL_LIVESHOT, (void *)&value))) { 920 CDBG_ERROR("%s: set dimension err=%d\n", __func__, rc); 921 } 922 923 if (MM_CAMERA_OK != (rc = pme->cam->ops->init_stream_bundle( 924 pme->cam->camera_handle,pme->ch_id,mm_app_live_notify_cb,pme,&attr,1,stream))) { 925 CDBG_ERROR("%s:init_stream_bundle err=%d\n", __func__, rc); 926 rc = -1; 927 goto end; 928 } 929 930 if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id, 931 1, stream))) { 932 CDBG_ERROR("%s:start_streams err=%d\n", __func__, rc); 933 rc = -1; 934 goto end; 935 } 936 937 938 end: 939 CDBG("%s:END, cam_id=%d\n",__func__,cam_id); 940 return rc; 941 } 942 943 int mm_app_unprepare_live_snapshot(int cam_id) 944 { 945 int rc = 0; 946 uint32_t stream[2]; 947 948 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 949 CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id); 950 951 stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id; 952 if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,1,stream))) { 953 CDBG_ERROR("%s : Snapshot Stream off Error",__func__); 954 return -1; 955 } 956 957 if (MM_CAMERA_OK != (rc = pme->cam->ops->destroy_stream_bundle(pme->cam->camera_handle,pme->ch_id))) { 958 CDBG_ERROR("%s : Snapshot destroy_stream_bundle Error",__func__); 959 return -1; 960 } 961 CDBG("%s:END, cam_id=%d\n",__func__,cam_id); 962 return rc; 963 } 964 965 int mm_app_take_live_snapshot(int cam_id) 966 { 967 int rc = 0; 968 int stream[3]; 969 mm_camera_bundle_attr_t attr; 970 971 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 972 973 CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id); 974 975 if (pme->cam_mode == RECORDER_MODE && 976 pme->cam_state == CAMERA_STATE_RECORD) { 977 //Code to get live shot 978 if (mm_app_prepare_live_snapshot(cam_id) != MM_CAMERA_OK) { 979 CDBG_ERROR("%s: Failed prepare liveshot",__func__); 980 return -1; 981 } 982 if (MM_CAMERA_OK != (rc =pme->cam->ops->request_super_buf(pme->cam->camera_handle,pme->ch_id, 1))) { 983 CDBG_ERROR("%s:request_super_buf err=%d\n", __func__, rc); 984 return -1; 985 } 986 CDBG("%s:waiting images\n",__func__); 987 mm_app_snapshot_wait(cam_id); 988 989 if (MM_CAMERA_OK !=mm_app_unprepare_live_snapshot(cam_id)) { 990 CDBG_ERROR("%s: Snapshot Stop error",__func__); 991 } 992 993 } else { 994 CDBG_ERROR("%s: Should not come here for liveshot",__func__); 995 } 996 return rc; 997 } 998 999 int mm_app_take_picture_raw(int cam_id) 1000 { 1001 1002 int rc; 1003 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 1004 1005 CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id); 1006 1007 if (MM_CAMERA_OK != mm_app_start_raw(cam_id)) { 1008 CDBG_ERROR("%s: cam_id=%d\n",__func__,cam_id); 1009 rc = -1; 1010 goto end; 1011 } 1012 1013 CDBG("%s:waiting images\n",__func__); 1014 mm_app_snapshot_wait(cam_id); 1015 1016 if (MM_CAMERA_OK !=mm_app_stop_raw(cam_id)) { 1017 CDBG_ERROR("%s: Snapshot Stop error",__func__); 1018 } 1019 1020 preview: 1021 if (MM_CAMERA_OK != (rc = mm_app_start_preview(cam_id))) { 1022 CDBG("%s:preview start stream err=%d\n", __func__, rc); 1023 } 1024 end: 1025 CDBG("%s:END, cam_id=%d\n",__func__,cam_id); 1026 return rc; 1027 } 1028 1029 int mm_app_take_picture_zsl(int cam_id) 1030 { 1031 int rc = MM_CAMERA_OK; 1032 int value = 1; 1033 int op_mode; 1034 1035 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 1036 1037 CDBG("%s: Take picture ZSL",__func__); 1038 1039 if (MM_CAMERA_OK != (rc =pme->cam->ops->request_super_buf(pme->cam->camera_handle,pme->ch_id, 1))) { 1040 CDBG_ERROR("%s:request_super_buf err=%d\n", __func__, rc); 1041 goto end; 1042 } 1043 1044 CDBG("%s: Start ZSL Preview",__func__); 1045 1046 end: 1047 CDBG("%s: END, rc=%d\n", __func__, rc); 1048 return rc; 1049 } 1050 1051 int mm_app_take_picture_yuv(int cam_id) 1052 { 1053 int rc; 1054 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 1055 1056 CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id); 1057 1058 if (MM_CAMERA_OK != mm_app_start_snapshot(cam_id)) { 1059 CDBG_ERROR("%s: cam_id=%d\n",__func__,cam_id); 1060 rc = -1; 1061 goto end; 1062 } 1063 1064 CDBG("%s:waiting images\n",__func__); 1065 mm_app_snapshot_wait(cam_id); 1066 1067 if (MM_CAMERA_OK !=mm_app_stop_snapshot(cam_id)) { 1068 CDBG_ERROR("%s: Snapshot Stop error",__func__); 1069 } 1070 1071 preview: 1072 if (MM_CAMERA_OK != (rc = mm_app_start_preview(cam_id))) { 1073 CDBG("%s:preview start stream err=%d\n", __func__, rc); 1074 } 1075 end: 1076 CDBG("%s:END, cam_id=%d\n",__func__,cam_id); 1077 return rc; 1078 } 1079 1080 int mm_app_take_zsl(int cam_id) 1081 { 1082 int rc = MM_CAMERA_OK; 1083 1084 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 1085 1086 CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id); 1087 1088 if (pme->cam_mode == RECORDER_MODE) { 1089 switch (pme->cam_state) { 1090 case CAMERA_STATE_RECORD: 1091 if (MM_CAMERA_OK != mm_app_stop_video(cam_id)) { 1092 CDBG_ERROR("%s:Cannot stop video err=%d\n", __func__, rc); 1093 return -1; 1094 } 1095 case CAMERA_STATE_PREVIEW: 1096 if (MM_CAMERA_OK != mm_app_open_zsl(cam_id)) { 1097 CDBG_ERROR("%s: Cannot switch to camera mode\n", __func__); 1098 return -1; 1099 } 1100 break; 1101 case CAMERA_STATE_SNAPSHOT: 1102 default: 1103 CDBG("%s: Cannot normal pciture in record mode\n", __func__); 1104 break; 1105 } 1106 } else if (pme->cam_mode == CAMERA_MODE) { 1107 switch (pme->cam_state) { 1108 case CAMERA_STATE_PREVIEW: 1109 mm_app_open_zsl(cam_id); 1110 break; 1111 1112 case CAMERA_STATE_SNAPSHOT: 1113 case CAMERA_STATE_RECORD: 1114 default: 1115 CDBG("%s: Cannot normal pciture in record mode\n", __func__); 1116 break; 1117 } 1118 } 1119 1120 if (pme->cam_mode == ZSL_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) { 1121 mm_app_take_picture_zsl(cam_id); 1122 } 1123 return rc; 1124 } 1125 1126 int mm_app_take_picture(int cam_id) 1127 { 1128 int rc = 0; 1129 1130 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 1131 1132 CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id); 1133 1134 if (pme->cam_mode == RECORDER_MODE) { 1135 switch (pme->cam_state) { 1136 case CAMERA_STATE_RECORD: 1137 if (MM_CAMERA_OK != mm_app_stop_video(cam_id)) { 1138 CDBG_ERROR("%s:Cannot stop video err=%d\n", __func__, rc); 1139 return -1; 1140 } 1141 case CAMERA_STATE_PREVIEW: 1142 if (MM_CAMERA_OK != mm_app_open_camera(cam_id)) { 1143 CDBG_ERROR("%s: Cannot switch to camera mode=%d\n", __func__,rc); 1144 return -1; 1145 } 1146 break; 1147 case CAMERA_STATE_SNAPSHOT: 1148 default: 1149 CDBG("%s: Cannot normal pciture in record mode\n", __func__); 1150 break; 1151 } 1152 } else if (pme->cam_mode == ZSL_MODE) { 1153 switch (pme->cam_state) { 1154 case CAMERA_STATE_PREVIEW: 1155 mm_app_open_camera(cam_id); 1156 break; 1157 1158 case CAMERA_STATE_SNAPSHOT: 1159 case CAMERA_STATE_RECORD: 1160 default: 1161 CDBG("%s: Cannot normal pciture in record mode\n", __func__); 1162 break; 1163 } 1164 } 1165 1166 CDBG("%s : Takepicture : mode = %d state = %d, rc = %d",__func__,pme->cam_mode,pme->cam_state,rc); 1167 if (pme->cam_mode == CAMERA_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) { 1168 mm_app_take_picture_yuv(cam_id); 1169 } 1170 return rc; 1171 } 1172 1173 1174 int mm_app_take_raw(int cam_id) 1175 { 1176 int rc = 0; 1177 1178 mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id); 1179 1180 CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id); 1181 1182 if (pme->cam_mode == RECORDER_MODE) { 1183 switch (pme->cam_state) { 1184 case CAMERA_STATE_RECORD: 1185 if (MM_CAMERA_OK != mm_app_stop_video(cam_id)) { 1186 CDBG_ERROR("%s:Cannot stop video err=%d\n", __func__, rc); 1187 return -1; 1188 } 1189 case CAMERA_STATE_PREVIEW: 1190 if (MM_CAMERA_OK != mm_app_open_camera(cam_id)) { 1191 CDBG_ERROR("%s: Cannot switch to camera mode=%d\n", __func__,rc); 1192 return -1; 1193 } 1194 break; 1195 case CAMERA_STATE_SNAPSHOT: 1196 default: 1197 CDBG("%s: Cannot normal pciture in record mode\n", __func__); 1198 break; 1199 } 1200 } else if (pme->cam_mode == ZSL_MODE) { 1201 switch (pme->cam_state) { 1202 case CAMERA_STATE_PREVIEW: 1203 mm_app_open_camera(cam_id); 1204 break; 1205 1206 case CAMERA_STATE_SNAPSHOT: 1207 case CAMERA_STATE_RECORD: 1208 default: 1209 CDBG("%s: Cannot normal pciture in record mode\n", __func__); 1210 break; 1211 } 1212 } 1213 1214 CDBG("%s : Takepicture RAW: mode = %d state = %d, rc = %d",__func__,pme->cam_mode,pme->cam_state,rc); 1215 if (pme->cam_mode == CAMERA_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) { 1216 mm_app_take_picture_raw(cam_id); 1217 } 1218 return rc; 1219 } 1220 1221