diff options
author | Shuzhen Wang <shuzhenw@codeaurora.org> | 2015-01-27 22:36:25 -0800 |
---|---|---|
committer | Zhijun He <zhijunhe@google.com> | 2015-01-28 13:01:08 -0800 |
commit | c707b1d73e29aa8df2a6d2f666eca57e816b0f6e (patch) | |
tree | 0fe60fa9f12e68df739b3b0c850005c678aa8a9f /camera/mm-camera-interface/mm_camera_stream.c | |
parent | 5c6d74bb8fc04cdf47ebbc07c0b645d0c1c37646 (diff) | |
download | mako-c707b1d73e29aa8df2a6d2f666eca57e816b0f6e.tar.gz |
Camera: Add support to not queue all buffers up frontandroid-cts-5.1_r9android-cts-5.1_r8android-cts-5.1_r7android-cts-5.1_r6android-cts-5.1_r5android-cts-5.1_r4android-cts-5.1_r3android-cts-5.1_r28android-cts-5.1_r27android-cts-5.1_r26android-cts-5.1_r25android-cts-5.1_r24android-cts-5.1_r23android-cts-5.1_r22android-cts-5.1_r21android-cts-5.1_r20android-cts-5.1_r2android-cts-5.1_r19android-cts-5.1_r18android-cts-5.1_r17android-cts-5.1_r16android-cts-5.1_r15android-cts-5.1_r14android-cts-5.1_r13android-cts-5.1_r10android-cts-5.1_r1android-5.1.1_r9android-5.1.1_r8android-5.1.1_r7android-5.1.1_r6android-5.1.1_r5android-5.1.1_r4android-5.1.1_r38android-5.1.1_r37android-5.1.1_r36android-5.1.1_r35android-5.1.1_r34android-5.1.1_r33android-5.1.1_r30android-5.1.1_r3android-5.1.1_r29android-5.1.1_r28android-5.1.1_r26android-5.1.1_r25android-5.1.1_r24android-5.1.1_r23android-5.1.1_r22android-5.1.1_r20android-5.1.1_r2android-5.1.1_r19android-5.1.1_r18android-5.1.1_r17android-5.1.1_r16android-5.1.1_r15android-5.1.1_r14android-5.1.1_r13android-5.1.1_r12android-5.1.1_r10android-5.1.1_r1android-5.1.0_r5android-5.1.0_r4android-5.1.0_r3android-5.1.0_r1lollipop-mr1-wfc-releaselollipop-mr1-releaselollipop-mr1-fi-releaselollipop-mr1-devlollipop-mr1-cts-release
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
Diffstat (limited to 'camera/mm-camera-interface/mm_camera_stream.c')
-rw-r--r-- | camera/mm-camera-interface/mm_camera_stream.c | 88 |
1 files changed, 28 insertions, 60 deletions
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; |