|
@@ -793,6 +793,49 @@ done:
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
+static int __videobuf_copy_to_user(struct videobuf_queue *q,
|
|
|
+ struct videobuf_buffer *buf,
|
|
|
+ char __user *data, size_t count,
|
|
|
+ int nonblocking)
|
|
|
+{
|
|
|
+ void *vaddr = CALL(q, vaddr, buf);
|
|
|
+
|
|
|
+ /* copy to userspace */
|
|
|
+ if (count > buf->size - q->read_off)
|
|
|
+ count = buf->size - q->read_off;
|
|
|
+
|
|
|
+ if (copy_to_user(data, vaddr + q->read_off, count))
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
+ return count;
|
|
|
+}
|
|
|
+
|
|
|
+static int __videobuf_copy_stream(struct videobuf_queue *q,
|
|
|
+ struct videobuf_buffer *buf,
|
|
|
+ char __user *data, size_t count, size_t pos,
|
|
|
+ int vbihack, int nonblocking)
|
|
|
+{
|
|
|
+ unsigned int *fc = CALL(q, vaddr, buf);
|
|
|
+
|
|
|
+ if (vbihack) {
|
|
|
+ /* dirty, undocumented hack -- pass the frame counter
|
|
|
+ * within the last four bytes of each vbi data block.
|
|
|
+ * We need that one to maintain backward compatibility
|
|
|
+ * to all vbi decoding software out there ... */
|
|
|
+ fc += (buf->size >> 2) - 1;
|
|
|
+ *fc = buf->field_count >> 1;
|
|
|
+ dprintk(1, "vbihack: %d\n", *fc);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* copy stuff using the common method */
|
|
|
+ count = __videobuf_copy_to_user(q, buf, data, count, nonblocking);
|
|
|
+
|
|
|
+ if ((count == -EFAULT) && (pos == 0))
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
+ return count;
|
|
|
+}
|
|
|
+
|
|
|
ssize_t videobuf_read_one(struct videobuf_queue *q,
|
|
|
char __user *data, size_t count, loff_t *ppos,
|
|
|
int nonblocking)
|
|
@@ -861,7 +904,7 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
|
|
|
}
|
|
|
|
|
|
/* Copy to userspace */
|
|
|
- retval = CALL(q, video_copy_to_user, q, data, count, nonblocking);
|
|
|
+ retval = __videobuf_copy_to_user(q, q->read_buf, data, count, nonblocking);
|
|
|
if (retval < 0)
|
|
|
goto done;
|
|
|
|
|
@@ -1003,7 +1046,7 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q,
|
|
|
}
|
|
|
|
|
|
if (q->read_buf->state == VIDEOBUF_DONE) {
|
|
|
- rc = CALL(q, copy_stream, q, data + retval, count,
|
|
|
+ rc = __videobuf_copy_stream(q, q->read_buf, data + retval, count,
|
|
|
retval, vbihack, nonblocking);
|
|
|
if (rc < 0) {
|
|
|
retval = rc;
|