Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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");
}
Exemplo n.º 10
0
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");
}