@@ -3438,8 +3438,12 @@ EXPORT_SYMBOL(v4l2_ctrl_log_status);
int v4l2_ctrl_subscribe_event(struct v4l2_fh *fh,
const struct v4l2_event_subscription *sub)
{
- if (sub->type == V4L2_EVENT_CTRL)
+ switch (sub->type) {
+ case V4L2_EVENT_CTRL:
return v4l2_event_subscribe(fh, sub, 0, &v4l2_ctrl_sub_ev_ops);
+ case V4L2_EVENT_BUF_QUEUED:
+ return v4l2_event_subscribe(fh, sub, VIDEO_MAX_FRAME, NULL);
+ }
return -EINVAL;
}
EXPORT_SYMBOL(v4l2_ctrl_subscribe_event);
@@ -1231,6 +1231,8 @@ static void __enqueue_in_driver(struct vb2_buffer *vb)
trace_vb2_buf_queue(q, vb);
call_void_vb_qop(vb, buf_queue, vb);
+
+ call_void_bufop(q, buffer_queued, vb);
}
static int __buf_prepare(struct vb2_buffer *vb, const void *pb)
@@ -138,6 +138,19 @@ static void __copy_timestamp(struct vb2_buffer *vb, const void *pb)
}
};
+static void __buffer_queued(struct vb2_buffer *vb)
+{
+ struct video_device *vdev = to_video_device(vb->vb2_queue->dev);
+ struct v4l2_fh *fh = vdev->queue->owner;
+ struct v4l2_event event;
+
+ memset(&event, 0, sizeof(event));
+ event.type = V4L2_EVENT_BUF_QUEUED;
+ event.u.buf_queued.index = vb->index;
+
+ v4l2_event_queue_fh(fh, &event);
+}
+
static void vb2_warn_zero_bytesused(struct vb2_buffer *vb)
{
static bool check_once;
@@ -455,6 +468,7 @@ static const struct vb2_buf_ops v4l2_buf_ops = {
.fill_user_buffer = __fill_v4l2_buffer,
.fill_vb2_buffer = __fill_vb2_buffer,
.copy_timestamp = __copy_timestamp,
+ .buffer_queued = __buffer_queued,
};
/**