static int32_t mm_camera_ch_util_acquire(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type) { int32_t rc = MM_CAMERA_OK; mm_camera_stream_t *stream1 = NULL; mm_camera_stream_t *stream2 = NULL; mm_camera_stream_type_t type1; mm_camera_stream_type_t type2; if(my_obj->ch[ch_type].acquired) { rc = MM_CAMERA_OK; goto end; } pthread_mutex_init(&my_obj->ch[ch_type].mutex, NULL); switch(ch_type) { case MM_CAMERA_CH_RAW: stream1 = &my_obj->ch[ch_type].raw.stream; type1 = MM_CAMERA_STREAM_RAW; break; case MM_CAMERA_CH_PREVIEW: stream1 = &my_obj->ch[ch_type].preview.stream; type1 = MM_CAMERA_STREAM_PREVIEW; break; case MM_CAMERA_CH_RDI: stream1 = &my_obj->ch[ch_type].rdi.stream; type1 = MM_CAMERA_STREAM_RDI0; break; case MM_CAMERA_CH_VIDEO: stream1 = &my_obj->ch[ch_type].video.video; type1 = MM_CAMERA_STREAM_VIDEO; /* no full image live shot by default */ my_obj->ch[ch_type].video.has_main = FALSE; break; case MM_CAMERA_CH_SNAPSHOT: stream1 = &my_obj->ch[ch_type].snapshot.main; type1 = MM_CAMERA_STREAM_SNAPSHOT; if (!my_obj->full_liveshot) { stream2 = &my_obj->ch[ch_type].snapshot.thumbnail; type2 = MM_CAMERA_STREAM_THUMBNAIL; } break; default: return -1; break; } if(stream1) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, stream1, MM_CAMERA_STATE_EVT_ACQUIRE, &type1); if(stream2 && !rc) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, stream2, MM_CAMERA_STATE_EVT_ACQUIRE, &type2); if(rc == MM_CAMERA_OK) { if(!my_obj->ch[ch_type].acquired) my_obj->ch[ch_type].acquired = TRUE; } end: return rc; }
static int32_t mm_camera_ch_util_set_fmt(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type, mm_camera_ch_image_fmt_parm_t *fmt) { int32_t rc = MM_CAMERA_OK; mm_camera_stream_t *stream1 = NULL; mm_camera_stream_t *stream2 = NULL; mm_camera_image_fmt_t *fmt1 = NULL; mm_camera_image_fmt_t *fmt2 = NULL; switch(ch_type) { case MM_CAMERA_CH_RAW: stream1 = &my_obj->ch[ch_type].raw.stream; fmt1 = &fmt->def; break; case MM_CAMERA_CH_PREVIEW: stream1 = &my_obj->ch[ch_type].preview.stream; fmt1 = &fmt->def; break; case MM_CAMERA_CH_RDI: stream1 = &my_obj->ch[ch_type].rdi.stream; fmt1 = &fmt->def; break; case MM_CAMERA_CH_VIDEO: stream1 = &my_obj->ch[ch_type].video.video; fmt1 = &fmt->video.video; if(my_obj->ch[ch_type].video.has_main) { CDBG("%s:video channel has main image stream\n", __func__); stream2 = &my_obj->ch[ch_type].video.main; fmt2 = &fmt->video.main; } break; case MM_CAMERA_CH_SNAPSHOT: stream1 = &my_obj->ch[ch_type].snapshot.main; fmt1 = &fmt->snapshot.main; if (!my_obj->full_liveshot) { stream2 = &my_obj->ch[ch_type].snapshot.thumbnail; fmt2 = &fmt->snapshot.thumbnail; } break; default: rc = -1; break; } CDBG("%s:ch=%d, streams[0x%x,0x%x]\n", __func__, ch_type, (uint32_t)stream1, (uint32_t)stream2); if(stream1) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, stream1, MM_CAMERA_STATE_EVT_SET_FMT, fmt1); if(stream2 && !rc) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, stream2, MM_CAMERA_STATE_EVT_SET_FMT, fmt2); return rc; }
static int32_t mm_camera_ch_util_qbuf(mm_camera_obj_t *my_obj, mm_camera_channel_type_t ch_type, mm_camera_state_evt_type_t evt, mm_camera_ch_data_buf_t *val) { int32_t rc = -1; switch(ch_type) { case MM_CAMERA_CH_RAW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].raw.stream, evt, &val->def); break; case MM_CAMERA_CH_PREVIEW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].preview.stream, evt, &val->def); break; case MM_CAMERA_CH_VIDEO: { rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].video.video, evt, &val->video.video); if(!rc && val->video.main.frame) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].video.main, evt, &val->video.main); } break; case MM_CAMERA_CH_SNAPSHOT: { rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].snapshot.main, evt, &val->snapshot.main); if(!rc) { rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].snapshot.thumbnail, evt, &val->snapshot.thumbnail); } } break; case MM_CAMERA_CH_ZSL: { rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].zsl.main, evt, &val->zsl.main); if(!rc) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].zsl.postview, evt, &val->zsl.postview); } break; default: return -1; break; } return rc; }
static int32_t mm_camera_ch_util_release(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type, mm_camera_state_evt_type_t evt) { mm_camera_stream_t *stream1, *stream2; if(!my_obj->ch[ch_type].acquired) return MM_CAMERA_OK; mm_camera_ch_util_get_stream_objs(my_obj,ch_type, &stream1, &stream2); if(stream1) mm_camera_stream_fsm_fn_vtbl(my_obj, stream1, evt, NULL); if(stream2) mm_camera_stream_fsm_fn_vtbl(my_obj, stream2, evt, NULL); pthread_mutex_destroy(&my_obj->ch[ch_type].mutex); memset(&my_obj->ch[ch_type],0,sizeof(my_obj->ch[ch_type])); return 0; }
static int mm_camera_ch_util_get_crop(mm_camera_obj_t *my_obj, mm_camera_channel_type_t ch_type, mm_camera_state_evt_type_t evt, mm_camera_ch_crop_t *crop) { int rc = MM_CAMERA_OK; switch(ch_type) { case MM_CAMERA_CH_RAW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].raw.stream, evt, &crop->crop); break; case MM_CAMERA_CH_PREVIEW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].preview.stream, evt, &crop->crop); break; case MM_CAMERA_CH_VIDEO: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].video.video, evt, &crop->crop); break; case MM_CAMERA_CH_SNAPSHOT: { rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].snapshot.main, evt, &crop->snapshot.main_crop); if(!rc && !my_obj->full_liveshot) { ALOGE("%s: should not come here for Live Shot", __func__); rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].snapshot.thumbnail, evt, &crop->snapshot.thumbnail_crop); } } break; default: return -1; break; } return rc; }
static int32_t mm_camera_ch_util_reg_buf(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type, mm_camera_state_evt_type_t evt, void *val) { int32_t rc = 0; switch(ch_type) { case MM_CAMERA_CH_RAW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].raw.stream, evt, (mm_camera_buf_def_t *)val); break; case MM_CAMERA_CH_PREVIEW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].preview.stream, evt, (mm_camera_buf_def_t *)val); break; case MM_CAMERA_CH_RDI: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].rdi.stream, evt, (mm_camera_buf_def_t *)val); break; case MM_CAMERA_CH_VIDEO: { mm_camera_buf_video_t * buf = (mm_camera_buf_video_t *)val; rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].video.video, evt, &buf->video); if(!rc && my_obj->ch[ch_type].video.has_main) { rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].video.main, evt, &buf->main); } } break; case MM_CAMERA_CH_SNAPSHOT: { mm_camera_buf_snapshot_t * buf = (mm_camera_buf_snapshot_t *)val; rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].snapshot.main, evt, &buf->main); if(!rc && !my_obj->full_liveshot) { rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].snapshot.thumbnail, evt, & buf->thumbnail); } } break; default: return -1; break; } return rc; }
static int32_t mm_camera_ch_util_stream_null_val(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type, mm_camera_state_evt_type_t evt, void *val) { int32_t rc = 0; switch(ch_type) { case MM_CAMERA_CH_RAW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].raw.stream, evt, NULL); break; case MM_CAMERA_CH_PREVIEW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].preview.stream, evt, NULL); break; case MM_CAMERA_CH_VIDEO: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].video.video, evt, NULL); if(!rc && my_obj->ch[ch_type].video.main.fd) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].video.main, evt, NULL); break; case MM_CAMERA_CH_SNAPSHOT: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].snapshot.main, evt, NULL); if(!rc) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].snapshot.thumbnail, evt, NULL); break; case MM_CAMERA_CH_ZSL: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].zsl.main, evt, NULL); if(!rc) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].zsl.postview, evt, NULL); break; default: return -1; break; } return rc; }
static int32_t mm_camera_ch_util_stream_null_val(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type, mm_camera_state_evt_type_t evt, void *val) { int32_t rc = 0; switch(ch_type) { case MM_CAMERA_CH_RAW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].raw.stream, evt, NULL); break; case MM_CAMERA_CH_PREVIEW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].preview.stream, evt, NULL); break; case MM_CAMERA_CH_RDI: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].rdi.stream, evt, NULL); break; case MM_CAMERA_CH_VIDEO: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].video.video, evt, NULL); if(!rc && my_obj->ch[ch_type].video.main.fd) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].video.main, evt, NULL); break; case MM_CAMERA_CH_SNAPSHOT: my_obj->ch[ch_type].snapshot.expected_matching_id = 0; rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].snapshot.main, evt, NULL); if(!rc && !my_obj->full_liveshot) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].snapshot.thumbnail, evt, NULL); break; default: CDBG_ERROR("%s: Invalid ch_type=%d", __func__, ch_type); rc = -1; break; } return rc; }
static int32_t mm_camera_ch_util_qbuf(mm_camera_obj_t *my_obj, mm_camera_channel_type_t ch_type, mm_camera_state_evt_type_t evt, mm_camera_ch_data_buf_t *val) { int32_t rc = -1; mm_camera_stream_t *stream; struct ion_flush_data cache_inv_data; int ion_fd; struct msm_frame *cache_frame; struct msm_frame *cache_frame1 = NULL; #ifdef USE_ION memset(&cache_inv_data, 0, sizeof(struct ion_flush_data)); ion_fd = open("/dev/ion", O_RDONLY); if(ion_fd < 0) { CDBG_ERROR("%s: Ion device open failed\n", __func__); } #endif ALOGV("<DEBUG>: %s:ch_type:%d",__func__,ch_type); switch(ch_type) { case MM_CAMERA_CH_RAW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].raw.stream, evt, &val->def); cache_frame = val->def.frame; break; case MM_CAMERA_CH_PREVIEW: rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].preview.stream, evt, &val->def); cache_frame = val->def.frame; CDBG("buffer fd = %d, length = %d, vaddr = %p\n", val->def.frame->fd, val->def.frame->ion_alloc.len, val->def.frame->buffer); break; case MM_CAMERA_CH_VIDEO: { rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].video.video, evt, &val->video.video); cache_frame = val->video.video.frame; CDBG("buffer fd = %d, length = %d, vaddr = %p\n", val->video.video.frame->fd, val->video.video.frame->ion_alloc.len, val->video.video.frame->buffer); if(!rc && val->video.main.frame) { rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].video.main, evt, &val->video.main); cache_frame1 = val->video.main.frame; } } break; case MM_CAMERA_CH_SNAPSHOT: { rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].snapshot.main, evt, &val->snapshot.main); cache_frame = val->snapshot.main.frame; CDBG("buffer fd = %d, length = %d, vaddr = %p\n", val->snapshot.main.frame->fd, val->snapshot.main.frame->ion_alloc.len, val->snapshot.main.frame->buffer); if(!rc) { if (my_obj->op_mode == MM_CAMERA_OP_MODE_ZSL) stream = &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream; else stream = &my_obj->ch[ch_type].snapshot.thumbnail; rc = mm_camera_stream_fsm_fn_vtbl(my_obj, stream, evt, &val->snapshot.thumbnail); cache_frame1 = val->snapshot.thumbnail.frame; CDBG("buffer fd = %d, length = %d, vaddr = %p\n", val->snapshot.thumbnail.frame->fd, val->snapshot.thumbnail.frame->ion_alloc.len, val->snapshot.thumbnail.frame->buffer); } } break; default: return -1; break; } #ifdef USE_ION cache_inv_data.vaddr = cache_frame->buffer; cache_inv_data.fd = cache_frame->fd; cache_inv_data.handle = cache_frame->fd_data.handle; cache_inv_data.length = cache_frame->ion_alloc.len; if(ion_fd > 0) { if(ioctl(ion_fd, ION_IOC_INV_CACHES, &cache_inv_data) < 0) CDBG_ERROR("%s: Cache Invalidate failed\n", __func__); else { CDBG("%s: Successful cache invalidate\n", __func__); if(cache_frame1) { cache_inv_data.vaddr = cache_frame1->buffer; cache_inv_data.fd = cache_frame1->fd; cache_inv_data.handle = cache_frame1->fd_data.handle; cache_inv_data.length = cache_frame1->ion_alloc.len; if(ioctl(ion_fd, ION_IOC_INV_CACHES, &cache_inv_data) < 0) CDBG_ERROR("%s: Cache Invalidate failed\n", __func__); else CDBG("%s: Successful cache invalidate\n", __func__); } } close(ion_fd); } #endif return rc; }