static void mm_camera_read_preview_frame(mm_camera_obj_t * my_obj) { int rc = 0; int idx; mm_camera_stream_t *stream; stream = &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream; rc = mm_camera_qbuf_to_kernel(my_obj, stream); idx = mm_camera_read_msm_frame(my_obj, stream); if (idx < 0) { return; } pthread_mutex_lock(&my_obj->ch[MM_CAMERA_CH_PREVIEW].mutex); if(my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb.cb) { mm_camera_ch_data_buf_t data; data.type = MM_CAMERA_CH_PREVIEW; data.def.idx = idx; data.def.frame = &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream.frame.frame[idx].frame; my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream.frame.ref_count[idx]++; CDBG("%s:calling data notify cb 0x%x, 0x%x\n", __func__, (uint32_t)my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb.cb, (uint32_t)my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb.user_data); my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb.cb(&data, my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb.user_data); } pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_PREVIEW].mutex); }
static void mm_camera_read_snapshot_thumbnail_frame(mm_camera_obj_t * my_obj) { int idx, rc = 0; mm_camera_stream_t *stream; mm_camera_frame_queue_t *q; mm_camera_frame_t *frame; q = &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.thumbnail.frame.readyq; stream = &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.thumbnail; frame = mm_camera_stream_frame_deq(&stream->frame.freeq); if(frame) { rc = mm_camera_stream_qbuf(my_obj, stream, frame->idx); if(rc < 0) { CDBG("%s: mm_camera_stream_qbuf(idx=%d) err=%d\n", __func__, frame->idx, rc); return; } } idx = mm_camera_read_msm_frame(my_obj,stream); if (idx < 0) return; mm_camera_stream_frame_enq(q, &stream->frame.frame[idx]); mm_camera_snapshot_send_snapshot_notify(my_obj); }
static void mm_camera_read_video_frame(mm_camera_obj_t * my_obj) { int idx, rc = 0; mm_camera_stream_t *stream; mm_camera_frame_queue_t *q; stream = &my_obj->ch[MM_CAMERA_CH_VIDEO].video.video; rc = mm_camera_qbuf_to_kernel(my_obj, stream); idx = mm_camera_read_msm_frame(my_obj,stream); if (idx < 0) return; pthread_mutex_lock(&my_obj->ch[MM_CAMERA_CH_VIDEO].mutex); if(my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb.cb) { mm_camera_ch_data_buf_t data; data.type = MM_CAMERA_CH_VIDEO; data.video.main.frame = NULL; data.video.main.idx = -1; data.video.video.idx = idx; data.video.video.frame = &my_obj->ch[MM_CAMERA_CH_VIDEO].video.video. frame.frame[idx].frame; my_obj->ch[MM_CAMERA_CH_VIDEO].video.video.frame.ref_count[idx]++; my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb.cb(&data, my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb.user_data); } pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_VIDEO].mutex); }
static void mm_camera_read_snapshot_main_frame(mm_camera_obj_t * my_obj) { int rc = 0; int idx; mm_camera_stream_t *stream; mm_camera_frame_queue_t *q; if (!my_obj->ch[MM_CAMERA_CH_SNAPSHOT].acquired) { ALOGV("Snapshot channel is not in acquired state \n"); return; } q = &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.main.frame.readyq; stream = &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.main; idx = mm_camera_read_msm_frame(my_obj,stream); if (idx < 0) return; CDBG("%s Read Snapshot frame %d ", __func__, idx); if(my_obj->op_mode == MM_CAMERA_OP_MODE_ZSL) { my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.main.frame.ref_count[idx]++; /* Reset match to 0. */ stream->frame.frame[idx].match = 0; stream->frame.frame[idx].valid_entry = 0; mm_camera_zsl_frame_cmp_and_enq(my_obj, &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.main.frame.frame[idx], stream); } else { /* send to HAL */ mm_camera_stream_frame_enq(q, &stream->frame.frame[idx]); if (!my_obj->full_liveshot) mm_camera_snapshot_send_snapshot_notify(my_obj); else mm_camera_snapshot_send_liveshot_notify(my_obj); } }
static void mm_camera_read_zsl_postview_frame(mm_camera_obj_t * my_obj) { int idx, rc = 0; mm_camera_stream_t *stream; mm_camera_frame_queue_t *q; mm_camera_frame_t *frame; int cnt, watermark; q = &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.thumbnail.frame.readyq; stream = &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.thumbnail; idx = mm_camera_read_msm_frame(my_obj,stream); if (idx < 0) return; mm_camera_stream_frame_enq(q, &stream->frame.frame[idx]); watermark = my_obj->ch[MM_CAMERA_CH_SNAPSHOT].buffering_frame.water_mark; cnt = mm_camera_stream_frame_get_q_cnt(q); if(watermark < cnt) { /* water overflow, queue head back to kernel */ frame = mm_camera_stream_frame_deq(q); if(frame) { rc = mm_camera_stream_qbuf(my_obj, stream, frame->idx); if(rc < 0) { CDBG("%s: mm_camera_stream_qbuf(idx=%d) err=%d\n", __func__, frame->idx, rc); return; } } } mm_camera_check_pending_zsl_frames(my_obj, MM_CAMERA_CH_SNAPSHOT); }
static void mm_camera_read_preview_frame(mm_camera_obj_t * my_obj) { int rc = 0; int idx; int i; int cnt = 0; mm_camera_stream_t *stream; mm_camera_buf_cb_t buf_cb[MM_CAMERA_BUF_CB_MAX]; mm_camera_ch_data_buf_t data[MM_CAMERA_BUF_CB_MAX]; if (!my_obj->ch[MM_CAMERA_CH_PREVIEW].acquired) { ALOGV("Preview channel is not in acquired state \n"); return; } stream = &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream; idx = mm_camera_read_msm_frame(my_obj, stream); if (idx < 0) { return; } CDBG("%s Read Preview frame %d ", __func__, idx); pthread_mutex_lock(&my_obj->ch[MM_CAMERA_CH_PREVIEW].mutex); for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) { if((my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i].cb) && (my_obj->poll_threads[MM_CAMERA_CH_PREVIEW].data.used == 1)) { data[cnt].type = MM_CAMERA_CH_PREVIEW; data[cnt].def.idx = idx; data[cnt].def.frame = &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream.frame.frame[idx].frame; /* Since the frame is originating here, reset the ref count to either * 2(ZSL case) or 1(non-ZSL case). */ if(my_obj->op_mode == MM_CAMERA_OP_MODE_ZSL) my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream.frame.ref_count[idx] = 2; else my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream.frame.ref_count[idx] = 1; CDBG("%s:calling data notify cb 0x%x, 0x%x\n", __func__, (uint32_t)my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i].cb, (uint32_t)my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i].user_data); /*my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i].cb(&data, my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i].user_data);*/ memcpy(&buf_cb[cnt], &my_obj->ch[MM_CAMERA_CH_PREVIEW].buf_cb[i], sizeof(mm_camera_buf_cb_t)); cnt++; } } pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_PREVIEW].mutex); if(my_obj->op_mode == MM_CAMERA_OP_MODE_ZSL) { /* Reset match to 0. */ stream->frame.frame[idx].match = 0; stream->frame.frame[idx].valid_entry = 0; mm_camera_zsl_frame_cmp_and_enq(my_obj, &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream.frame.frame[idx], stream); } for( i=0;i<cnt;i++) { if(buf_cb[i].cb != NULL && my_obj->poll_threads[MM_CAMERA_CH_PREVIEW].data.used == 1) { buf_cb[i].cb(&data[i],buf_cb[i].user_data); } } }
static void mm_camera_read_raw_frame(mm_camera_obj_t * my_obj) { int rc = 0; int idx; int i; mm_camera_stream_t *stream; stream = &my_obj->ch[MM_CAMERA_CH_RAW].raw.stream; idx = mm_camera_read_msm_frame(my_obj, stream); if (idx < 0) { return; } pthread_mutex_lock(&my_obj->ch[MM_CAMERA_CH_RAW].mutex); for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) { if((my_obj->ch[MM_CAMERA_CH_RAW].buf_cb[i].cb) && (my_obj->poll_threads[MM_CAMERA_CH_RAW].data.used == 1)){ mm_camera_ch_data_buf_t data; data.type = MM_CAMERA_CH_RAW; data.def.idx = idx; data.def.frame = &my_obj->ch[MM_CAMERA_CH_RAW].raw.stream.frame.frame[idx].frame; my_obj->ch[MM_CAMERA_CH_RAW].raw.stream.frame.ref_count[idx]++; CDBG("%s:calling data notify cb 0x%x, 0x%x\n", __func__, (uint32_t)my_obj->ch[MM_CAMERA_CH_RAW].buf_cb[i].cb, (uint32_t)my_obj->ch[MM_CAMERA_CH_RAW].buf_cb[i].user_data); my_obj->ch[MM_CAMERA_CH_RAW].buf_cb[i].cb(&data, my_obj->ch[MM_CAMERA_CH_RAW].buf_cb[i].user_data); } } pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_RAW].mutex); }
static void mm_camera_read_snapshot_thumbnail_frame(mm_camera_obj_t * my_obj) { int idx, rc = 0; mm_camera_stream_t *stream; mm_camera_frame_queue_t *q; q = &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.thumbnail.frame.readyq; stream = &my_obj->ch[MM_CAMERA_CH_SNAPSHOT].snapshot.thumbnail; idx = mm_camera_read_msm_frame(my_obj,stream); if (idx < 0) return; if(my_obj->op_mode != MM_CAMERA_OP_MODE_ZSL) { mm_camera_stream_frame_enq(q, &stream->frame.frame[idx]); mm_camera_snapshot_send_snapshot_notify(my_obj); } else { // CDBG("%s: ZSL does not use thumbnail stream", __func__); rc = mm_camera_stream_qbuf(my_obj, stream, idx); // CDBG("%s Q back thumbnail buffer rc = %d ", __func__, rc); } }
static void mm_camera_read_video_frame(mm_camera_obj_t * my_obj) { int idx, rc = 0; mm_camera_stream_t *stream; mm_camera_frame_queue_t *q; int i; stream = &my_obj->ch[MM_CAMERA_CH_VIDEO].video.video; idx = mm_camera_read_msm_frame(my_obj,stream); if (idx < 0) return; ALOGE("Video thread locked"); pthread_mutex_lock(&my_obj->ch[MM_CAMERA_CH_VIDEO].mutex); for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) { if((my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb) && (my_obj->poll_threads[MM_CAMERA_CH_VIDEO].data.used == 1)){ mm_camera_ch_data_buf_t data; data.type = MM_CAMERA_CH_VIDEO; data.video.main.frame = NULL; data.video.main.idx = -1; data.video.video.idx = idx; data.video.video.frame = &my_obj->ch[MM_CAMERA_CH_VIDEO].video.video. frame.frame[idx].frame; my_obj->ch[MM_CAMERA_CH_VIDEO].video.video.frame.ref_count[idx]++; ALOGE("Video thread callback issued"); my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb(&data, my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].user_data); ALOGE("Video thread callback returned"); if( my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb_type==MM_CAMERA_BUF_CB_COUNT ) { ALOGE("<DEBUG>:%s: Additional cb called for buffer %p:%d",__func__,stream,idx); if(--(my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb_count) == 0 ) my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb=NULL; } } } pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_VIDEO].mutex); ALOGE("Video thread unlocked"); }
static void mm_camera_read_video_frame(mm_camera_obj_t * my_obj) { int idx, rc = 0; mm_camera_stream_t *stream; mm_camera_frame_queue_t *q; int i; int cnt = 0; mm_camera_buf_cb_t buf_cb[MM_CAMERA_BUF_CB_MAX]; mm_camera_ch_data_buf_t data[MM_CAMERA_BUF_CB_MAX]; if (!my_obj->ch[MM_CAMERA_CH_VIDEO].acquired) { ALOGV("Snapshot channel is not in acquired state \n"); return; } stream = &my_obj->ch[MM_CAMERA_CH_VIDEO].video.video; idx = mm_camera_read_msm_frame(my_obj,stream); if (idx < 0) return; ALOGV("Video thread locked"); pthread_mutex_lock(&my_obj->ch[MM_CAMERA_CH_VIDEO].mutex); for( i=0;i<MM_CAMERA_BUF_CB_MAX;i++) { if((my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb) && (my_obj->poll_threads[MM_CAMERA_CH_VIDEO].data.used == 1)){ data[cnt].type = MM_CAMERA_CH_VIDEO; data[cnt].video.main.frame = NULL; data[cnt].video.main.idx = -1; data[cnt].video.video.idx = idx; data[cnt].video.video.frame = &my_obj->ch[MM_CAMERA_CH_VIDEO].video.video. frame.frame[idx].frame; my_obj->ch[MM_CAMERA_CH_VIDEO].video.video.frame.ref_count[idx]++; ALOGV("Video thread callback issued"); //my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb(&data, // my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].user_data); memcpy(&buf_cb[cnt], &my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i], sizeof(mm_camera_buf_cb_t)); cnt++; ALOGV("Video thread callback returned"); if( my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb_type==MM_CAMERA_BUF_CB_COUNT ) { ALOGV("<DEBUG>:%s: Additional cb called for buffer %p:%d",__func__,stream,idx); if(--(my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb_count) == 0 ) my_obj->ch[MM_CAMERA_CH_VIDEO].buf_cb[i].cb=NULL; } } } pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_VIDEO].mutex); for( i=0;i<cnt;i++) { if(buf_cb[i].cb != NULL && my_obj->poll_threads[MM_CAMERA_CH_VIDEO].data.used == 1) { buf_cb[i].cb(&data[i],buf_cb[i].user_data); } /*if( buf_cb[i].cb_type==MM_CAMERA_BUF_CB_COUNT ) { ALOGV("<DEBUG>:%s: Additional cb called for buffer %p:%d",__func__,stream,idx); if(--(buf_cb[i].cb_count) == 0 ) buf_cb[i].cb=NULL; }*/ } ALOGV("Video thread unlocked"); }