summaryrefslogtreecommitdiff
path: root/camera/mm-camera-interface
diff options
context:
space:
mode:
Diffstat (limited to 'camera/mm-camera-interface')
-rw-r--r--camera/mm-camera-interface/mm_camera.c10
-rw-r--r--camera/mm-camera-interface/mm_camera.h6
-rwxr-xr-xcamera/mm-camera-interface/mm_camera_channel.c3
-rwxr-xr-xcamera/mm-camera-interface/mm_camera_interface2.c32
-rwxr-xr-xcamera/mm-camera-interface/mm_camera_interface2.h4
-rw-r--r--camera/mm-camera-interface/mm_camera_stream.c88
6 files changed, 35 insertions, 108 deletions
diff --git a/camera/mm-camera-interface/mm_camera.c b/camera/mm-camera-interface/mm_camera.c
index 145fdb2..883d179 100644
--- a/camera/mm-camera-interface/mm_camera.c
+++ b/camera/mm-camera-interface/mm_camera.c
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -689,14 +689,6 @@ int32_t mm_camera_request_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf
return rc;
}
-int32_t mm_camera_enqueue_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf)
-{
- int32_t rc = -MM_CAMERA_E_GENERAL;
- rc = mm_camera_ch_fn(my_obj, buf->ch_type,
- MM_CAMERA_STATE_EVT_ENQUEUE_BUF, (void *)&buf->preview);
- return rc;
-}
-
int32_t mm_camera_prepare_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf)
{
int32_t rc = -MM_CAMERA_E_GENERAL;
diff --git a/camera/mm-camera-interface/mm_camera.h b/camera/mm-camera-interface/mm_camera.h
index 0d62fbe..57c229b 100644
--- a/camera/mm-camera-interface/mm_camera.h
+++ b/camera/mm-camera-interface/mm_camera.h
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -58,7 +58,6 @@ typedef enum {
MM_CAMERA_STATE_EVT_GET_CROP,
MM_CAMERA_STATE_EVT_DISPATCH_BUFFERED_FRAME,
MM_CAMERA_STATE_EVT_REQUEST_BUF, // request amount of buffers to kernel only
- MM_CAMERA_STATE_EVT_ENQUEUE_BUF, // enqueue some of buffers to kernel only
MM_CAMERA_STATE_EVT_MAX
} mm_camera_state_evt_type_t;
@@ -114,7 +113,7 @@ typedef struct {
mm_camera_frame_queue_t readyq;
int32_t num_frame;
uint32_t frame_len;
- int8_t reg_flag;
+ int8_t reg_flag[MM_CAMERA_MAX_NUM_FRAMES];
uint32_t frame_offset[MM_CAMERA_MAX_NUM_FRAMES];
mm_camera_frame_t frame[MM_CAMERA_MAX_NUM_FRAMES];
int8_t ref_count[MM_CAMERA_MAX_NUM_FRAMES];
@@ -302,7 +301,6 @@ extern int32_t mm_camera_get_parm(mm_camera_obj_t * my_obj,
extern int32_t mm_camera_set_parm(mm_camera_obj_t * my_obj,
mm_camera_parm_t *parm);
extern int32_t mm_camera_request_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf);
-extern int32_t mm_camera_enqueue_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf);
extern int32_t mm_camera_prepare_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf);
extern int32_t mm_camera_unprepare_buf(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type);
extern int mm_camera_poll_thread_launch(mm_camera_obj_t * my_obj, int ch_type);
diff --git a/camera/mm-camera-interface/mm_camera_channel.c b/camera/mm-camera-interface/mm_camera_channel.c
index 40f3fb0..51b0f2c 100755
--- a/camera/mm-camera-interface/mm_camera_channel.c
+++ b/camera/mm-camera-interface/mm_camera_channel.c
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -721,7 +721,6 @@ int32_t mm_camera_ch_fn(mm_camera_obj_t * my_obj,
break;
case MM_CAMERA_STATE_EVT_REG_BUF:
case MM_CAMERA_STATE_EVT_REQUEST_BUF:
- case MM_CAMERA_STATE_EVT_ENQUEUE_BUF:
rc = mm_camera_ch_util_reg_buf(my_obj, ch_type, evt, val);
break;
case MM_CAMERA_STATE_EVT_UNREG_BUF:
diff --git a/camera/mm-camera-interface/mm_camera_interface2.c b/camera/mm-camera-interface/mm_camera_interface2.c
index f6ccca9..0d46afb 100755
--- a/camera/mm-camera-interface/mm_camera_interface2.c
+++ b/camera/mm-camera-interface/mm_camera_interface2.c
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -181,24 +181,6 @@ static int32_t mm_camera_cfg_request_buf(mm_camera_t * camera,
return rc;
}
-static int32_t mm_camera_cfg_enqueue_buf(mm_camera_t * camera,
- mm_camera_reg_buf_t *buf)
-{
- int32_t rc = -MM_CAMERA_E_GENERAL;
- uint32_t tmp;
- mm_camera_obj_t * my_obj = NULL;
-
- pthread_mutex_lock(&g_mutex);
- my_obj = g_cam_ctrl.cam_obj[camera->camera_info.camera_id];
- pthread_mutex_unlock(&g_mutex);
- if(my_obj) {
- pthread_mutex_lock(&my_obj->mutex);
- rc = mm_camera_enqueue_buf(my_obj, buf);
- pthread_mutex_unlock(&my_obj->mutex);
- }
- return rc;
-}
-
static int32_t mm_camera_cfg_prepare_buf(mm_camera_t * camera,
mm_camera_reg_buf_t *buf)
{
@@ -240,7 +222,6 @@ static mm_camera_config_t mm_camera_cfg = {
.set_parm = mm_camera_cfg_set_parm,
.get_parm = mm_camera_cfg_get_parm,
.request_buf = mm_camera_cfg_request_buf,
- .enqueue_buf = mm_camera_cfg_enqueue_buf,
.prepare_buf = mm_camera_cfg_prepare_buf,
.unprepare_buf = mm_camera_cfg_unprepare_buf
};
@@ -799,17 +780,6 @@ int32_t cam_config_request_buf(int cam_id, mm_camera_reg_buf_t *buf)
return rc;
}
-int32_t cam_config_enqueue_buf(int cam_id, mm_camera_reg_buf_t *buf)
-{
-
- int32_t rc = -1;
- mm_camera_t * mm_cam = get_camera_by_id(cam_id);
- if (mm_cam) {
- rc = mm_cam->cfg->enqueue_buf(mm_cam, buf);
- }
- return rc;
-}
-
int32_t cam_config_prepare_buf(int cam_id, mm_camera_reg_buf_t *buf)
{
diff --git a/camera/mm-camera-interface/mm_camera_interface2.h b/camera/mm-camera-interface/mm_camera_interface2.h
index ba4dcd5..20153e4 100755
--- a/camera/mm-camera-interface/mm_camera_interface2.h
+++ b/camera/mm-camera-interface/mm_camera_interface2.h
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -177,6 +177,7 @@ typedef struct {
typedef struct {
int8_t num;
+ int8_t no_enqueue_flag[MM_CAMERA_MAX_NUM_FRAMES];
union {
mm_camera_sp_buf_t sp;
mm_camera_mp_buf_t *mp;
@@ -463,7 +464,6 @@ int32_t cam_config_get_parm(
mm_camera_parm_type_t parm_type,
void* p_value);
int32_t cam_config_request_buf(int cam_id, mm_camera_reg_buf_t *buf);
-int32_t cam_config_enqueue_buf(int cam_id, mm_camera_reg_buf_t *buf);
int32_t cam_config_prepare_buf(int cam_id, mm_camera_reg_buf_t *buf);
int32_t cam_config_unprepare_buf(int cam_id, mm_camera_channel_type_t ch_type);
diff --git a/camera/mm-camera-interface/mm_camera_stream.c b/camera/mm-camera-interface/mm_camera_stream.c
index 6fca2db..e7d2c84 100644
--- a/camera/mm-camera-interface/mm_camera_stream.c
+++ b/camera/mm-camera-interface/mm_camera_stream.c
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -220,6 +220,10 @@ int mm_camera_read_msm_frame(mm_camera_obj_t * my_obj,
stream->frame.frame[idx].frame.frame_id = vb.sequence;
stream->frame.frame[idx].frame.ts.tv_sec = vb.timestamp.tv_sec;
stream->frame.frame[idx].frame.ts.tv_nsec = vb.timestamp.tv_usec * 1000;
+
+ CDBG("%s:type=%d,frame idx=%d, frame_id %d\n", __func__,
+ stream->stream_type, idx, vb.sequence);
+
return idx;
}
@@ -400,7 +404,7 @@ int mm_camera_stream_qbuf(mm_camera_obj_t * my_obj, mm_camera_stream_t *stream,
rc = ioctl(stream->fd, VIDIOC_QBUF, &buffer);
if (rc < 0) {
- CDBG_ERROR("%s: VIDIOC_QBUF error = %d, stream type=%d\n", __func__, rc, stream->stream_type);
+ CDBG_ERROR("%s: VIDIOC_QBUF error = %d, stream type=%d, errno = %d\n", __func__, rc, stream->stream_type, errno);
return rc;
}
CDBG("%s: X idx: %d, stream_type:%d", __func__, idx, stream->stream_type);
@@ -439,40 +443,6 @@ end:
return rc;
}
-/* This function enqueue existing buffers (not first time allocated buffers from Surface) to kernel */
-static int mm_camera_stream_util_enqueue_buf(mm_camera_obj_t * my_obj,
- mm_camera_stream_t *stream,
- mm_camera_buf_def_t *vbuf)
-{
- int32_t i, rc = MM_CAMERA_OK, j;
-
- if(vbuf->num > MM_CAMERA_MAX_NUM_FRAMES) {
- rc = -MM_CAMERA_E_GENERAL;
- CDBG("%s: buf num %d > max limit %d\n",
- __func__, vbuf->num, MM_CAMERA_MAX_NUM_FRAMES);
- goto end;
- }
-
- for(i = 0; i < vbuf->num; i++){
- int idx = vbuf->buf.mp[i].idx;
- ALOGV("%s: enqueue buf index = %d\n",__func__, idx);
- if(idx < MM_CAMERA_MAX_NUM_FRAMES) {
- ALOGV("%s: stream_fd = %d, frame_fd = %d, frame ID = %d, offset = %d\n",
- __func__, stream->fd, stream->frame.frame[i].frame.fd,
- idx, stream->frame.frame_offset[idx]);
- rc = mm_camera_stream_qbuf(my_obj, stream, stream->frame.frame[idx].idx);
- if (rc < 0) {
- CDBG("%s: VIDIOC_QBUF rc = %d\n", __func__, rc);
- goto end;
- }
- stream->frame.ref_count[idx] = 0;
- }
- }
- stream->frame.qbuf = 1;
-end:
- return rc;
-}
-
static int mm_camera_stream_util_reg_buf(mm_camera_obj_t * my_obj,
mm_camera_stream_t *stream,
mm_camera_buf_def_t *vbuf)
@@ -548,15 +518,20 @@ static int mm_camera_stream_util_reg_buf(mm_camera_obj_t * my_obj,
stream->frame.frame_offset[i] = 0;
}
- rc = mm_camera_stream_qbuf(my_obj, stream, stream->frame.frame[i].idx);
- if (rc < 0) {
- CDBG_ERROR("%s: VIDIOC_QBUF rc = %d\n", __func__, rc);
- goto end;
+ if (!vbuf->no_enqueue_flag[i]) {
+ rc = mm_camera_stream_qbuf(my_obj, stream, stream->frame.frame[i].idx);
+ if (rc < 0) {
+ CDBG_ERROR("%s: VIDIOC_QBUF rc = %d\n", __func__, rc);
+ goto end;
+ }
+ stream->frame.ref_count[i] = 0;
+ } else {
+ stream->frame.ref_count[i] = 1;
}
- stream->frame.ref_count[i] = 0;
- CDBG("%s: stream_fd = %d, frame_fd = %d, frame ID = %d, offset = %d\n",
+ stream->frame.reg_flag[i] = vbuf->no_enqueue_flag[i];
+ CDBG("%s: stream_fd = %d, frame_fd = %d, frame ID = %d, offset = %d, reg_flag = %d, ref_cnt = %d\n",
__func__, stream->fd, stream->frame.frame[i].frame.fd,
- i, stream->frame.frame_offset[i]);
+ i, stream->frame.frame_offset[i], stream->frame.reg_flag[i], stream->frame.ref_count[i]);
}
stream->frame.qbuf = 1;
end:
@@ -707,10 +682,6 @@ static int32_t mm_camera_stream_fsm_cfg(mm_camera_obj_t * my_obj,
case MM_CAMERA_STATE_EVT_REQUEST_BUF:
rc = mm_camera_stream_util_request_buf(my_obj, stream, ((mm_camera_buf_def_t *)val)->num);
break;
- case MM_CAMERA_STATE_EVT_ENQUEUE_BUF:
- rc = mm_camera_stream_util_enqueue_buf(my_obj, stream, (mm_camera_buf_def_t *)val);
- if(!rc) mm_camera_stream_util_set_state(stream, MM_CAMERA_STREAM_STATE_REG);
- break;
default:
CDBG_ERROR("%s: Invalid evt=%d, stream_state=%d", __func__, evt,
stream->state);
@@ -796,13 +767,16 @@ static int32_t mm_camera_stream_fsm_reg(mm_camera_obj_t * my_obj,
int i = 0;
mm_camera_frame_t *frame;
if(stream->frame.qbuf == 0) {
+ CDBG("%s: queueing buffers during stream on", __func__);
for(i = 0; i < stream->frame.num_frame; i++) {
- rc = mm_camera_stream_qbuf(my_obj, stream,
- stream->frame.frame[i].idx);
- if (rc < 0) {
- CDBG_ERROR("%s: ioctl VIDIOC_QBUF error=%d, stream->type=%d\n",
- __func__, rc, stream->stream_type);
- return rc;
+ if (!stream->frame.reg_flag[i]) {
+ rc = mm_camera_stream_qbuf(my_obj, stream,
+ stream->frame.frame[i].idx);
+ if (rc < 0) {
+ CDBG_ERROR("%s: ioctl VIDIOC_QBUF error=%d, stream->type=%d\n",
+ __func__, rc, stream->stream_type);
+ return rc;
+ }
}
stream->frame.ref_count[i] = 0;
}
@@ -820,9 +794,6 @@ static int32_t mm_camera_stream_fsm_reg(mm_camera_obj_t * my_obj,
mm_camera_stream_util_set_state(stream, MM_CAMERA_STREAM_STATE_ACTIVE);
}
break;
- case MM_CAMERA_STATE_EVT_ENQUEUE_BUF:
- rc = mm_camera_stream_util_enqueue_buf(my_obj, stream, (mm_camera_buf_def_t *)val);
- break;
default:
CDBG_ERROR("%s: Invalid evt=%d, stream_state=%d", __func__, evt,
stream->state);
@@ -862,10 +833,7 @@ static int32_t mm_camera_stream_fsm_active(mm_camera_obj_t * my_obj,
}
}
break;
- case MM_CAMERA_STATE_EVT_ENQUEUE_BUF:
- rc = mm_camera_stream_util_enqueue_buf(my_obj, stream, (mm_camera_buf_def_t *)val);
- break;
- default:
+ default:
CDBG_ERROR("%s: Invalid evt=%d, stream_state=%d", __func__, evt,
stream->state);
return -1;