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 int mm_camera_channel_skip_frames(mm_camera_obj_t *my_obj, mm_camera_frame_queue_t *mq, mm_camera_frame_queue_t *sq, mm_camera_stream_t *mstream, mm_camera_stream_t *sstream, mm_camera_channel_attr_buffering_frame_t *frame_attr) { int count = 0; int i = 0; mm_camera_frame_t *mframe = NULL, *sframe = NULL; mm_camera_notify_frame_t notify_frame; count = mm_camera_stream_frame_get_q_cnt(mq); if(count < mm_camera_stream_frame_get_q_cnt(sq)) count = mm_camera_stream_frame_get_q_cnt(sq); CDBG("%s: Q-size=%d, look_back =%d, M_match=%d, T_match=%d", __func__, count, frame_attr->look_back, mq->match_cnt, sq->match_cnt); count -= frame_attr->look_back; CDBG("count=%d, frame_attr->look_back=%d,mq->match_cnt=%d, sq->match_cnt=%d", count, frame_attr->look_back, mq->match_cnt,sq->match_cnt); for(i=0; i < count; i++) { mframe = mm_camera_stream_frame_deq(mq); sframe = mm_camera_stream_frame_deq(sq); if(mframe && sframe && mframe->frame.frame_id == sframe->frame.frame_id) { mq->match_cnt--; sq->match_cnt--; } if(mframe) { notify_frame.frame = &mframe->frame; notify_frame.idx = mframe->idx; mm_camera_stream_util_buf_done(my_obj, mstream, ¬ify_frame); } if(sframe) { notify_frame.frame = &sframe->frame; notify_frame.idx = sframe->idx; mm_camera_stream_util_buf_done(my_obj, sstream, ¬ify_frame); } } CDBG("Post %s: Q-size=%d, look_back =%d, M_match=%d, T_match=%d", __func__, count, frame_attr->look_back, mq->match_cnt, sq->match_cnt); return MM_CAMERA_OK; }
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)); }