From c707b1d73e29aa8df2a6d2f666eca57e816b0f6e Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Tue, 27 Jan 2015 22:36:25 -0800 Subject: Camera: Add support to not queue all buffers up front Camera HAL needs to call cancel_buffer on min_undequeued_buffers preview buffers up front. That means not all preview buffers should be queued into camera driver. This change adds the support. Bug: 18630337 Change-Id: I794b0dcafa03ebfaddf4c68b66b09c74bbb206d0 --- camera/mm-camera-interface/mm_camera.c | 10 +-- camera/mm-camera-interface/mm_camera.h | 6 +- camera/mm-camera-interface/mm_camera_channel.c | 3 +- camera/mm-camera-interface/mm_camera_interface2.c | 32 +-------- camera/mm-camera-interface/mm_camera_interface2.h | 4 +- camera/mm-camera-interface/mm_camera_stream.c | 88 ++++++++--------------- 6 files changed, 35 insertions(+), 108 deletions(-) (limited to 'camera/mm-camera-interface') 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; -- cgit v1.2.3