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_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_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); } }
void mm_camera_stream_frame_refill_q(mm_camera_frame_queue_t *q, mm_camera_frame_t *node, int num) { int i; mm_stream_frame_flash_q(q); for(i = 0; i < num; i++) mm_camera_stream_frame_enq(q, &node[i]); CDBG("%s: q=0x%x, num = %d, q->cnt=%d\n", __func__,(uint32_t)q,num, mm_camera_stream_frame_get_q_cnt(q)); }
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); } }
/*for ZSL mode to send the image pair to client*/ void mm_camera_dispatch_buffered_frames(mm_camera_obj_t *my_obj, mm_camera_channel_type_t ch_type) { int mcnt, i, rc = MM_CAMERA_E_GENERAL, scnt; int num_of_req_frame = 0; int j; mm_camera_ch_data_buf_t data; mm_camera_frame_t *mframe = NULL, *sframe = NULL; mm_camera_frame_t *qmframe = NULL, *qsframe = NULL; mm_camera_ch_t *ch = &my_obj->ch[ch_type]; mm_camera_frame_queue_t *mq = NULL; mm_camera_frame_queue_t *sq = NULL; mm_camera_stream_t *stream1 = NULL; mm_camera_stream_t *stream2 = NULL; ALOGE("%s: mzhu, E", __func__); mm_camera_ch_util_get_stream_objs(my_obj, ch_type, &stream1, &stream2); stream2 = &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream; if(stream1) { mq = &stream1->frame.readyq; } if(stream2) { sq = &stream2->frame.readyq; } pthread_mutex_lock(&ch->mutex); if (mq && sq && stream1 && stream2) { rc = mm_camera_channel_skip_frames(my_obj, mq, sq, stream1, stream2, &ch->buffering_frame); if(rc != MM_CAMERA_OK) { CDBG_ERROR("%s: Error getting right frame!", __func__); goto end; } num_of_req_frame = my_obj->snap_burst_num_by_user; ch->snapshot.pending_cnt = num_of_req_frame; for(i = 0; i < num_of_req_frame; i++) { mframe = mm_camera_stream_frame_deq(mq); sframe = mm_camera_stream_frame_deq(sq); if(mframe && sframe) { CDBG("%s: frame_id = 0x%x|0x%x, main idx = %d, thumbnail idx = %d", __func__, mframe->frame.frame_id, sframe->frame.frame_id, mframe->idx, sframe->idx); if(mframe->frame.frame_id != sframe->frame.frame_id) { CDBG_ERROR("%s: ZSL algorithm error, main and thumbnail " "frame_ids not same. Need bug fix", __func__); } memset(&data, 0, sizeof(data)); data.type = ch_type; data.snapshot.main.frame = &mframe->frame; data.snapshot.main.idx = mframe->idx; data.snapshot.thumbnail.frame = &sframe->frame; data.snapshot.thumbnail.idx = sframe->idx; ch->snapshot.pending_cnt--; mq->match_cnt--; sq->match_cnt--; for(j=0;j<MM_CAMERA_BUF_CB_MAX;j++) { if( ch->buf_cb[j].cb!=NULL ) ch->buf_cb[j].cb(&data, ch->buf_cb[j].user_data); } } else { CDBG_ERROR("%s: mframe %p, sframe = %p", __func__, mframe, sframe); qmframe = mframe; qsframe = sframe; rc = -1; break; } } if(qmframe) { mm_camera_stream_frame_enq(mq, &stream1->frame.frame[qmframe->idx]); qmframe = NULL; } if(qsframe) { mm_camera_stream_frame_enq(sq, &stream2->frame.frame[qsframe->idx]); qsframe = NULL; } } else { CDBG_ERROR(" mq =%p sq =%p stream1 =%p stream2 =%p", mq, sq , stream1 , stream2); } CDBG("%s: burst number: %d, pending_count: %d", __func__, my_obj->snap_burst_num_by_user, ch->snapshot.pending_cnt); end: pthread_mutex_unlock(&ch->mutex); /* If we are done sending callbacks for all the requested number of snapshots send data delivery done event*/ if((rc == MM_CAMERA_OK) && (!ch->snapshot.pending_cnt)) { mm_camera_event_t data; data.event_type = MM_CAMERA_EVT_TYPE_CH; data.e.ch.evt = MM_CAMERA_CH_EVT_DATA_DELIVERY_DONE; data.e.ch.ch = ch_type; mm_camera_poll_send_ch_event(my_obj, &data); } }