コード例 #1
0
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;
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}
コード例 #4
0
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;
}
コード例 #5
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;
}
コード例 #6
0
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;
}
コード例 #7
0
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;
}
コード例 #8
0
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;
}
コード例 #9
0
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;
}