Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
e2c77314
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 3 年多
通知
13
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
e2c77314
编写于
12月 10, 2007
作者:
M
Mauro Carvalho Chehab
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
V4L/DVB (6759): CodingStyle fixes
Signed-off-by:
N
Mauro Carvalho Chehab
<
mchehab@infradead.org
>
上级
543323bc
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
146 addition
and
146 deletion
+146
-146
drivers/media/video/videobuf-core.c
drivers/media/video/videobuf-core.c
+146
-146
未找到文件。
drivers/media/video/videobuf-core.c
浏览文件 @
e2c77314
...
...
@@ -22,29 +22,32 @@
#include <media/videobuf-core.h>
#define MAGIC_BUFFER 0x20070728
#define MAGIC_CHECK(is,should) if (unlikely((is) != (should))) \
{ printk(KERN_ERR "magic mismatch: %x (expected %x)\n",is,should); BUG(); }
#define MAGIC_CHECK(is, should) do { \
if (unlikely((is) != (should))) { \
printk(KERN_ERR "magic mismatch: %x (expected %x)\n", is, should); \
BUG(); } } while (0)
static
int
debug
=
0
;
static
int
debug
;
module_param
(
debug
,
int
,
0644
);
MODULE_DESCRIPTION
(
"helper module to manage video4linux buffers"
);
MODULE_AUTHOR
(
"Mauro Carvalho Chehab <mchehab@infradead.org>"
);
MODULE_LICENSE
(
"GPL"
);
#define dprintk(level, fmt, arg...) if (debug >= level) \
printk(KERN_DEBUG "vbuf: " fmt , ## arg)
#define dprintk(level, fmt, arg...) do { \
if (debug >= level) \
printk(KERN_DEBUG "vbuf: " fmt , ## arg); } while (0)
/* --------------------------------------------------------------------- */
#define CALL(q, f, arg...) \
(
(q->int_ops->f)
? q->int_ops->f(arg) : 0)
(
(q->int_ops->f)
? q->int_ops->f(arg) : 0)
void
*
videobuf_alloc
(
struct
videobuf_queue
*
q
)
void
*
videobuf_alloc
(
struct
videobuf_queue
*
q
)
{
struct
videobuf_buffer
*
vb
;
BUG_ON
(
q
->
msize
<
sizeof
(
*
vb
));
BUG_ON
(
q
->
msize
<
sizeof
(
*
vb
));
if
(
!
q
->
int_ops
||
!
q
->
int_ops
->
alloc
)
{
printk
(
KERN_ERR
"No specific ops defined!
\n
"
);
...
...
@@ -66,7 +69,7 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
int
retval
=
0
;
DECLARE_WAITQUEUE
(
wait
,
current
);
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
add_wait_queue
(
&
vb
->
done
,
&
wait
);
while
(
vb
->
state
==
VIDEOBUF_ACTIVE
||
vb
->
state
==
VIDEOBUF_QUEUED
)
{
if
(
non_blocking
)
{
...
...
@@ -75,11 +78,12 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
}
set_current_state
(
intr
?
TASK_INTERRUPTIBLE
:
TASK_UNINTERRUPTIBLE
);
if
(
vb
->
state
==
VIDEOBUF_ACTIVE
||
vb
->
state
==
VIDEOBUF_QUEUED
)
if
(
vb
->
state
==
VIDEOBUF_ACTIVE
||
vb
->
state
==
VIDEOBUF_QUEUED
)
schedule
();
set_current_state
(
TASK_RUNNING
);
if
(
intr
&&
signal_pending
(
current
))
{
dprintk
(
1
,
"buffer waiton: -EINTR
\n
"
);
dprintk
(
1
,
"buffer waiton: -EINTR
\n
"
);
retval
=
-
EINTR
;
break
;
}
...
...
@@ -88,27 +92,27 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
return
retval
;
}
int
videobuf_iolock
(
struct
videobuf_queue
*
q
,
struct
videobuf_buffer
*
vb
,
int
videobuf_iolock
(
struct
videobuf_queue
*
q
,
struct
videobuf_buffer
*
vb
,
struct
v4l2_framebuffer
*
fbuf
)
{
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
/* FIXME: This is required to avoid OOPS on some cases,
since mmap_mapper()
method should be called before _iolock.
/* FIXME: This is required to avoid OOPS on some cases,
since mmap_mapper()
method should be called before _iolock.
On some cases, the mmap_mapper() is called only after scheduling.
However, this way is just too dirty! Better to wait for some event.
*/
schedule_timeout
(
HZ
);
return
CALL
(
q
,
iolock
,
q
,
vb
,
fbuf
);
return
CALL
(
q
,
iolock
,
q
,
vb
,
fbuf
);
}
/* --------------------------------------------------------------------- */
void
videobuf_queue_core_init
(
struct
videobuf_queue
*
q
,
void
videobuf_queue_core_init
(
struct
videobuf_queue
*
q
,
struct
videobuf_queue_ops
*
ops
,
void
*
dev
,
spinlock_t
*
irqlock
,
...
...
@@ -118,7 +122,7 @@ void videobuf_queue_core_init(struct videobuf_queue* q,
void
*
priv
,
struct
videobuf_qtype_ops
*
int_ops
)
{
memset
(
q
,
0
,
sizeof
(
*
q
));
memset
(
q
,
0
,
sizeof
(
*
q
));
q
->
irqlock
=
irqlock
;
q
->
dev
=
dev
;
q
->
type
=
type
;
...
...
@@ -129,13 +133,13 @@ void videobuf_queue_core_init(struct videobuf_queue* q,
q
->
int_ops
=
int_ops
;
/* All buffer operations are mandatory */
BUG_ON
(
!
q
->
ops
->
buf_setup
);
BUG_ON
(
!
q
->
ops
->
buf_prepare
);
BUG_ON
(
!
q
->
ops
->
buf_queue
);
BUG_ON
(
!
q
->
ops
->
buf_release
);
BUG_ON
(
!
q
->
ops
->
buf_setup
);
BUG_ON
(
!
q
->
ops
->
buf_prepare
);
BUG_ON
(
!
q
->
ops
->
buf_queue
);
BUG_ON
(
!
q
->
ops
->
buf_release
);
/* Having implementations for abstract methods are mandatory */
BUG_ON
(
!
q
->
int_ops
);
BUG_ON
(
!
q
->
int_ops
);
mutex_init
(
&
q
->
lock
);
INIT_LIST_HEAD
(
&
q
->
stream
);
...
...
@@ -146,33 +150,33 @@ int videobuf_queue_is_busy(struct videobuf_queue *q)
{
int
i
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
if
(
q
->
streaming
)
{
dprintk
(
1
,
"busy: streaming active
\n
"
);
dprintk
(
1
,
"busy: streaming active
\n
"
);
return
1
;
}
if
(
q
->
reading
)
{
dprintk
(
1
,
"busy: pending read #1
\n
"
);
dprintk
(
1
,
"busy: pending read #1
\n
"
);
return
1
;
}
if
(
q
->
read_buf
)
{
dprintk
(
1
,
"busy: pending read #2
\n
"
);
dprintk
(
1
,
"busy: pending read #2
\n
"
);
return
1
;
}
for
(
i
=
0
;
i
<
VIDEO_MAX_FRAME
;
i
++
)
{
if
(
NULL
==
q
->
bufs
[
i
])
continue
;
if
(
q
->
bufs
[
i
]
->
map
)
{
dprintk
(
1
,
"busy: buffer #%d mapped
\n
"
,
i
);
dprintk
(
1
,
"busy: buffer #%d mapped
\n
"
,
i
);
return
1
;
}
if
(
q
->
bufs
[
i
]
->
state
==
VIDEOBUF_QUEUED
)
{
dprintk
(
1
,
"busy: buffer #%d queued
\n
"
,
i
);
dprintk
(
1
,
"busy: buffer #%d queued
\n
"
,
i
);
return
1
;
}
if
(
q
->
bufs
[
i
]
->
state
==
VIDEOBUF_ACTIVE
)
{
dprintk
(
1
,
"busy: buffer #%d avtive
\n
"
,
i
);
dprintk
(
1
,
"busy: buffer #%d avtive
\n
"
,
i
);
return
1
;
}
}
...
...
@@ -182,12 +186,12 @@ int videobuf_queue_is_busy(struct videobuf_queue *q)
/* Locking: Caller holds q->lock */
void
videobuf_queue_cancel
(
struct
videobuf_queue
*
q
)
{
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
int
i
;
/* remove queued buffers from list */
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
for
(
i
=
0
;
i
<
VIDEO_MAX_FRAME
;
i
++
)
{
if
(
NULL
==
q
->
bufs
[
i
])
continue
;
...
...
@@ -197,13 +201,13 @@ void videobuf_queue_cancel(struct videobuf_queue *q)
}
}
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
/* free all buffers + clear queue */
for
(
i
=
0
;
i
<
VIDEO_MAX_FRAME
;
i
++
)
{
if
(
NULL
==
q
->
bufs
[
i
])
continue
;
q
->
ops
->
buf_release
(
q
,
q
->
bufs
[
i
]);
q
->
ops
->
buf_release
(
q
,
q
->
bufs
[
i
]);
}
INIT_LIST_HEAD
(
&
q
->
stream
);
}
...
...
@@ -233,8 +237,8 @@ enum v4l2_field videobuf_next_field(struct videobuf_queue *q)
static
void
videobuf_status
(
struct
videobuf_queue
*
q
,
struct
v4l2_buffer
*
b
,
struct
videobuf_buffer
*
vb
,
enum
v4l2_buf_type
type
)
{
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
vb
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
b
->
index
=
vb
->
i
;
b
->
type
=
type
;
...
...
@@ -294,16 +298,16 @@ static int __videobuf_mmap_free(struct videobuf_queue *q)
if
(
!
q
)
return
0
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
rc
=
CALL
(
q
,
mmap_free
,
q
);
if
(
rc
<
0
)
rc
=
CALL
(
q
,
mmap_free
,
q
);
if
(
rc
<
0
)
return
rc
;
for
(
i
=
0
;
i
<
VIDEO_MAX_FRAME
;
i
++
)
{
if
(
NULL
==
q
->
bufs
[
i
])
continue
;
q
->
ops
->
buf_release
(
q
,
q
->
bufs
[
i
]);
q
->
ops
->
buf_release
(
q
,
q
->
bufs
[
i
]);
kfree
(
q
->
bufs
[
i
]);
q
->
bufs
[
i
]
=
NULL
;
}
...
...
@@ -328,7 +332,7 @@ static int __videobuf_mmap_setup(struct videobuf_queue *q,
unsigned
int
i
;
int
err
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
err
=
__videobuf_mmap_free
(
q
);
if
(
0
!=
err
)
...
...
@@ -359,7 +363,7 @@ static int __videobuf_mmap_setup(struct videobuf_queue *q,
if
(
!
i
)
return
-
ENOMEM
;
dprintk
(
1
,
"mmap setup: %d buffers, %d bytes each
\n
"
,
dprintk
(
1
,
"mmap setup: %d buffers, %d bytes each
\n
"
,
i
,
bsize
);
return
i
;
...
...
@@ -379,35 +383,35 @@ int videobuf_mmap_setup(struct videobuf_queue *q,
int
videobuf_reqbufs
(
struct
videobuf_queue
*
q
,
struct
v4l2_requestbuffers
*
req
)
{
unsigned
int
size
,
count
;
unsigned
int
size
,
count
;
int
retval
;
if
(
req
->
count
<
1
)
{
dprintk
(
1
,
"reqbufs: count invalid (%d)
\n
"
,
req
->
count
);
dprintk
(
1
,
"reqbufs: count invalid (%d)
\n
"
,
req
->
count
);
return
-
EINVAL
;
}
if
(
req
->
memory
!=
V4L2_MEMORY_MMAP
&&
req
->
memory
!=
V4L2_MEMORY_USERPTR
&&
req
->
memory
!=
V4L2_MEMORY_OVERLAY
)
{
dprintk
(
1
,
"reqbufs: memory type invalid
\n
"
);
dprintk
(
1
,
"reqbufs: memory type invalid
\n
"
);
return
-
EINVAL
;
}
mutex_lock
(
&
q
->
lock
);
if
(
req
->
type
!=
q
->
type
)
{
dprintk
(
1
,
"reqbufs: queue type invalid
\n
"
);
dprintk
(
1
,
"reqbufs: queue type invalid
\n
"
);
retval
=
-
EINVAL
;
goto
done
;
}
if
(
q
->
streaming
)
{
dprintk
(
1
,
"reqbufs: streaming already exists
\n
"
);
dprintk
(
1
,
"reqbufs: streaming already exists
\n
"
);
retval
=
-
EBUSY
;
goto
done
;
}
if
(
!
list_empty
(
&
q
->
stream
))
{
dprintk
(
1
,
"reqbufs: stream running
\n
"
);
dprintk
(
1
,
"reqbufs: stream running
\n
"
);
retval
=
-
EBUSY
;
goto
done
;
}
...
...
@@ -416,14 +420,14 @@ int videobuf_reqbufs(struct videobuf_queue *q,
if
(
count
>
VIDEO_MAX_FRAME
)
count
=
VIDEO_MAX_FRAME
;
size
=
0
;
q
->
ops
->
buf_setup
(
q
,
&
count
,
&
size
);
q
->
ops
->
buf_setup
(
q
,
&
count
,
&
size
);
size
=
PAGE_ALIGN
(
size
);
dprintk
(
1
,
"reqbufs: bufs=%d, size=0x%x [%d pages total]
\n
"
,
dprintk
(
1
,
"reqbufs: bufs=%d, size=0x%x [%d pages total]
\n
"
,
count
,
size
,
(
count
*
size
)
>>
PAGE_SHIFT
);
retval
=
__videobuf_mmap_setup
(
q
,
count
,
size
,
req
->
memory
);
retval
=
__videobuf_mmap_setup
(
q
,
count
,
size
,
req
->
memory
);
if
(
retval
<
0
)
{
dprintk
(
1
,
"reqbufs: mmap setup returned %d
\n
"
,
retval
);
dprintk
(
1
,
"reqbufs: mmap setup returned %d
\n
"
,
retval
);
goto
done
;
}
...
...
@@ -440,19 +444,19 @@ int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b)
mutex_lock
(
&
q
->
lock
);
if
(
unlikely
(
b
->
type
!=
q
->
type
))
{
dprintk
(
1
,
"querybuf: Wrong type.
\n
"
);
dprintk
(
1
,
"querybuf: Wrong type.
\n
"
);
goto
done
;
}
if
(
unlikely
(
b
->
index
<
0
||
b
->
index
>=
VIDEO_MAX_FRAME
))
{
dprintk
(
1
,
"querybuf: index out of range.
\n
"
);
dprintk
(
1
,
"querybuf: index out of range.
\n
"
);
goto
done
;
}
if
(
unlikely
(
NULL
==
q
->
bufs
[
b
->
index
]))
{
dprintk
(
1
,
"querybuf: buffer is null.
\n
"
);
dprintk
(
1
,
"querybuf: buffer is null.
\n
"
);
goto
done
;
}
videobuf_status
(
q
,
b
,
q
->
bufs
[
b
->
index
],
q
->
type
);
videobuf_status
(
q
,
b
,
q
->
bufs
[
b
->
index
],
q
->
type
);
ret
=
0
;
done:
...
...
@@ -465,10 +469,10 @@ int videobuf_qbuf(struct videobuf_queue *q,
{
struct
videobuf_buffer
*
buf
;
enum
v4l2_field
field
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
int
retval
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
if
(
b
->
memory
==
V4L2_MEMORY_MMAP
)
down_read
(
&
current
->
mm
->
mmap_sem
);
...
...
@@ -476,36 +480,36 @@ int videobuf_qbuf(struct videobuf_queue *q,
mutex_lock
(
&
q
->
lock
);
retval
=
-
EBUSY
;
if
(
q
->
reading
)
{
dprintk
(
1
,
"qbuf: Reading running...
\n
"
);
dprintk
(
1
,
"qbuf: Reading running...
\n
"
);
goto
done
;
}
retval
=
-
EINVAL
;
if
(
b
->
type
!=
q
->
type
)
{
dprintk
(
1
,
"qbuf: Wrong type.
\n
"
);
dprintk
(
1
,
"qbuf: Wrong type.
\n
"
);
goto
done
;
}
if
(
b
->
index
<
0
||
b
->
index
>=
VIDEO_MAX_FRAME
)
{
dprintk
(
1
,
"qbuf: index out of range.
\n
"
);
dprintk
(
1
,
"qbuf: index out of range.
\n
"
);
goto
done
;
}
buf
=
q
->
bufs
[
b
->
index
];
if
(
NULL
==
buf
)
{
dprintk
(
1
,
"qbuf: buffer is null.
\n
"
);
dprintk
(
1
,
"qbuf: buffer is null.
\n
"
);
goto
done
;
}
MAGIC_CHECK
(
buf
->
magic
,
MAGIC_BUFFER
);
MAGIC_CHECK
(
buf
->
magic
,
MAGIC_BUFFER
);
if
(
buf
->
memory
!=
b
->
memory
)
{
dprintk
(
1
,
"qbuf: memory type is wrong.
\n
"
);
dprintk
(
1
,
"qbuf: memory type is wrong.
\n
"
);
goto
done
;
}
if
(
buf
->
state
!=
VIDEOBUF_NEEDS_INIT
&&
buf
->
state
!=
VIDEOBUF_IDLE
)
{
dprintk
(
1
,
"qbuf: buffer is already queued or active.
\n
"
);
dprintk
(
1
,
"qbuf: buffer is already queued or active.
\n
"
);
goto
done
;
}
if
(
b
->
flags
&
V4L2_BUF_FLAG_INPUT
)
{
if
(
b
->
input
>=
q
->
inputs
)
{
dprintk
(
1
,
"qbuf: wrong input.
\n
"
);
dprintk
(
1
,
"qbuf: wrong input.
\n
"
);
goto
done
;
}
buf
->
input
=
b
->
input
;
...
...
@@ -516,44 +520,46 @@ int videobuf_qbuf(struct videobuf_queue *q,
switch
(
b
->
memory
)
{
case
V4L2_MEMORY_MMAP
:
if
(
0
==
buf
->
baddr
)
{
dprintk
(
1
,
"qbuf: mmap requested but buffer addr is zero!
\n
"
);
dprintk
(
1
,
"qbuf: mmap requested "
"but buffer addr is zero!
\n
"
);
goto
done
;
}
break
;
case
V4L2_MEMORY_USERPTR
:
if
(
b
->
length
<
buf
->
bsize
)
{
dprintk
(
1
,
"qbuf: buffer length is not enough
\n
"
);
dprintk
(
1
,
"qbuf: buffer length is not enough
\n
"
);
goto
done
;
}
if
(
VIDEOBUF_NEEDS_INIT
!=
buf
->
state
&&
buf
->
baddr
!=
b
->
m
.
userptr
)
q
->
ops
->
buf_release
(
q
,
buf
);
if
(
VIDEOBUF_NEEDS_INIT
!=
buf
->
state
&&
buf
->
baddr
!=
b
->
m
.
userptr
)
q
->
ops
->
buf_release
(
q
,
buf
);
buf
->
baddr
=
b
->
m
.
userptr
;
break
;
case
V4L2_MEMORY_OVERLAY
:
buf
->
boff
=
b
->
m
.
offset
;
break
;
default:
dprintk
(
1
,
"qbuf: wrong memory type
\n
"
);
dprintk
(
1
,
"qbuf: wrong memory type
\n
"
);
goto
done
;
}
dprintk
(
1
,
"qbuf: requesting next field
\n
"
);
dprintk
(
1
,
"qbuf: requesting next field
\n
"
);
field
=
videobuf_next_field
(
q
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
buf
,
field
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
buf
,
field
);
if
(
0
!=
retval
)
{
dprintk
(
1
,
"qbuf: buffer_prepare returned %d
\n
"
,
retval
);
dprintk
(
1
,
"qbuf: buffer_prepare returned %d
\n
"
,
retval
);
goto
done
;
}
list_add_tail
(
&
buf
->
stream
,
&
q
->
stream
);
list_add_tail
(
&
buf
->
stream
,
&
q
->
stream
);
if
(
q
->
streaming
)
{
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
buf
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
buf
);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
}
dprintk
(
1
,
"qbuf: succeded
\n
"
);
dprintk
(
1
,
"qbuf: succeded
\n
"
);
retval
=
0
;
done:
...
...
@@ -571,49 +577,49 @@ int videobuf_dqbuf(struct videobuf_queue *q,
struct
videobuf_buffer
*
buf
;
int
retval
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
mutex_lock
(
&
q
->
lock
);
retval
=
-
EBUSY
;
if
(
q
->
reading
)
{
dprintk
(
1
,
"dqbuf: Reading running...
\n
"
);
dprintk
(
1
,
"dqbuf: Reading running...
\n
"
);
goto
done
;
}
retval
=
-
EINVAL
;
if
(
b
->
type
!=
q
->
type
)
{
dprintk
(
1
,
"dqbuf: Wrong type.
\n
"
);
dprintk
(
1
,
"dqbuf: Wrong type.
\n
"
);
goto
done
;
}
if
(
list_empty
(
&
q
->
stream
))
{
dprintk
(
1
,
"dqbuf: stream running
\n
"
);
dprintk
(
1
,
"dqbuf: stream running
\n
"
);
goto
done
;
}
buf
=
list_entry
(
q
->
stream
.
next
,
struct
videobuf_buffer
,
stream
);
retval
=
videobuf_waiton
(
buf
,
nonblocking
,
1
);
if
(
retval
<
0
)
{
dprintk
(
1
,
"dqbuf: waiton returned %d
\n
"
,
retval
);
dprintk
(
1
,
"dqbuf: waiton returned %d
\n
"
,
retval
);
goto
done
;
}
switch
(
buf
->
state
)
{
case
VIDEOBUF_ERROR
:
dprintk
(
1
,
"dqbuf: state is error
\n
"
);
dprintk
(
1
,
"dqbuf: state is error
\n
"
);
retval
=
-
EIO
;
CALL
(
q
,
sync
,
q
,
buf
);
CALL
(
q
,
sync
,
q
,
buf
);
buf
->
state
=
VIDEOBUF_IDLE
;
break
;
case
VIDEOBUF_DONE
:
dprintk
(
1
,
"dqbuf: state is done
\n
"
);
CALL
(
q
,
sync
,
q
,
buf
);
dprintk
(
1
,
"dqbuf: state is done
\n
"
);
CALL
(
q
,
sync
,
q
,
buf
);
buf
->
state
=
VIDEOBUF_IDLE
;
break
;
default:
dprintk
(
1
,
"dqbuf: state invalid
\n
"
);
dprintk
(
1
,
"dqbuf: state invalid
\n
"
);
retval
=
-
EINVAL
;
goto
done
;
}
list_del
(
&
buf
->
stream
);
memset
(
b
,
0
,
sizeof
(
*
b
));
videobuf_status
(
q
,
b
,
buf
,
q
->
type
);
memset
(
b
,
0
,
sizeof
(
*
b
));
videobuf_status
(
q
,
b
,
buf
,
q
->
type
);
done:
mutex_unlock
(
&
q
->
lock
);
...
...
@@ -623,7 +629,7 @@ int videobuf_dqbuf(struct videobuf_queue *q,
int
videobuf_streamon
(
struct
videobuf_queue
*
q
)
{
struct
videobuf_buffer
*
buf
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
int
retval
;
mutex_lock
(
&
q
->
lock
);
...
...
@@ -635,12 +641,12 @@ int videobuf_streamon(struct videobuf_queue *q)
goto
done
;
q
->
streaming
=
1
;
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
list_for_each_entry
(
buf
,
&
q
->
stream
,
stream
)
if
(
buf
->
state
==
VIDEOBUF_PREPARED
)
q
->
ops
->
buf_queue
(
q
,
buf
);
q
->
ops
->
buf_queue
(
q
,
buf
);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
done:
mutex_unlock
(
&
q
->
lock
);
...
...
@@ -676,10 +682,10 @@ static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
size_t
count
,
loff_t
*
ppos
)
{
enum
v4l2_field
field
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
int
retval
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
/* setup stuff */
q
->
read_buf
=
videobuf_alloc
(
q
);
...
...
@@ -691,19 +697,19 @@ static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
q
->
read_buf
->
bsize
=
count
;
field
=
videobuf_next_field
(
q
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
q
->
read_buf
,
field
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
q
->
read_buf
,
field
);
if
(
0
!=
retval
)
goto
done
;
/* start capture & wait */
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
retval
=
videobuf_waiton
(
q
->
read_buf
,
0
,
0
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
retval
=
videobuf_waiton
(
q
->
read_buf
,
0
,
0
);
if
(
0
==
retval
)
{
CALL
(
q
,
sync
,
q
,
q
->
read_buf
);
CALL
(
q
,
sync
,
q
,
q
->
read_buf
);
if
(
VIDEOBUF_ERROR
==
q
->
read_buf
->
state
)
retval
=
-
EIO
;
else
...
...
@@ -712,7 +718,7 @@ static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
done:
/* cleanup */
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
kfree
(
q
->
read_buf
);
q
->
read_buf
=
NULL
;
return
retval
;
...
...
@@ -723,21 +729,21 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
int
nonblocking
)
{
enum
v4l2_field
field
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
unsigned
size
,
nbufs
;
int
retval
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
mutex_lock
(
&
q
->
lock
);
nbufs
=
1
;
size
=
0
;
q
->
ops
->
buf_setup
(
q
,
&
nbufs
,
&
size
);
q
->
ops
->
buf_setup
(
q
,
&
nbufs
,
&
size
);
if
(
NULL
==
q
->
read_buf
&&
count
>=
size
&&
!
nonblocking
)
{
retval
=
videobuf_read_zerocopy
(
q
,
data
,
count
,
ppos
);
retval
=
videobuf_read_zerocopy
(
q
,
data
,
count
,
ppos
);
if
(
retval
>=
0
||
retval
==
-
EIO
)
/* ok, all done */
goto
done
;
...
...
@@ -749,25 +755,25 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
retval
=
-
ENOMEM
;
q
->
read_buf
=
videobuf_alloc
(
q
);
dprintk
(
1
,
"video alloc=0x%p
\n
"
,
q
->
read_buf
);
dprintk
(
1
,
"video alloc=0x%p
\n
"
,
q
->
read_buf
);
if
(
NULL
==
q
->
read_buf
)
goto
done
;
q
->
read_buf
->
memory
=
V4L2_MEMORY_USERPTR
;
q
->
read_buf
->
bsize
=
count
;
/* preferred size */
field
=
videobuf_next_field
(
q
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
q
->
read_buf
,
field
);
retval
=
q
->
ops
->
buf_prepare
(
q
,
q
->
read_buf
,
field
);
if
(
0
!=
retval
)
{
kfree
(
q
->
read_buf
);
kfree
(
q
->
read_buf
);
q
->
read_buf
=
NULL
;
goto
done
;
}
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
q
->
read_off
=
0
;
}
...
...
@@ -776,11 +782,11 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
if
(
0
!=
retval
)
goto
done
;
CALL
(
q
,
sync
,
q
,
q
->
read_buf
);
CALL
(
q
,
sync
,
q
,
q
->
read_buf
);
if
(
VIDEOBUF_ERROR
==
q
->
read_buf
->
state
)
{
/* catch I/O errors */
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
kfree
(
q
->
read_buf
);
q
->
read_buf
=
NULL
;
retval
=
-
EIO
;
...
...
@@ -788,14 +794,14 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
}
/* Copy to userspace */
retval
=
CALL
(
q
,
video_copy_to_user
,
q
,
data
,
count
,
nonblocking
);
if
(
retval
<
0
)
retval
=
CALL
(
q
,
video_copy_to_user
,
q
,
data
,
count
,
nonblocking
);
if
(
retval
<
0
)
goto
done
;
q
->
read_off
+=
retval
;
if
(
q
->
read_off
==
q
->
read_buf
->
size
)
{
/* all data copied, cleanup */
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
q
->
ops
->
buf_release
(
q
,
q
->
read_buf
);
kfree
(
q
->
read_buf
);
q
->
read_buf
=
NULL
;
}
...
...
@@ -809,11 +815,11 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
int
__videobuf_read_start
(
struct
videobuf_queue
*
q
)
{
enum
v4l2_field
field
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
unsigned
int
count
=
0
,
size
=
0
;
int
err
,
i
;
q
->
ops
->
buf_setup
(
q
,
&
count
,
&
size
);
q
->
ops
->
buf_setup
(
q
,
&
count
,
&
size
);
if
(
count
<
2
)
count
=
2
;
if
(
count
>
VIDEO_MAX_FRAME
)
...
...
@@ -828,17 +834,17 @@ int __videobuf_read_start(struct videobuf_queue *q)
for
(
i
=
0
;
i
<
count
;
i
++
)
{
field
=
videobuf_next_field
(
q
);
err
=
q
->
ops
->
buf_prepare
(
q
,
q
->
bufs
[
i
],
field
);
err
=
q
->
ops
->
buf_prepare
(
q
,
q
->
bufs
[
i
],
field
);
if
(
err
)
return
err
;
list_add_tail
(
&
q
->
bufs
[
i
]
->
stream
,
&
q
->
stream
);
}
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
for
(
i
=
0
;
i
<
count
;
i
++
)
q
->
ops
->
buf_queue
(
q
,
q
->
bufs
[
i
]);
q
->
ops
->
buf_queue
(
q
,
q
->
bufs
[
i
]);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
q
->
reading
=
1
;
return
0
;
}
...
...
@@ -859,7 +865,7 @@ static void __videobuf_read_stop(struct videobuf_queue *q)
}
q
->
read_buf
=
NULL
;
q
->
reading
=
0
;
}
int
videobuf_read_start
(
struct
videobuf_queue
*
q
)
...
...
@@ -899,11 +905,11 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q,
int
vbihack
,
int
nonblocking
)
{
int
rc
,
retval
;
unsigned
long
flags
=
0
;
unsigned
long
flags
=
0
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
dprintk
(
2
,
"%s
\n
"
,
__FUNCTION__
);
dprintk
(
2
,
"%s
\n
"
,
__FUNCTION__
);
mutex_lock
(
&
q
->
lock
);
retval
=
-
EBUSY
;
if
(
q
->
streaming
)
...
...
@@ -932,7 +938,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
=
CALL
(
q
,
copy_stream
,
q
,
data
+
retval
,
count
,
retval
,
vbihack
,
nonblocking
);
if
(
rc
<
0
)
{
retval
=
rc
;
...
...
@@ -953,10 +959,10 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q,
list_add_tail
(
&
q
->
read_buf
->
stream
,
&
q
->
stream
);
if
(
q
->
irqlock
)
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
spin_lock_irqsave
(
q
->
irqlock
,
flags
);
q
->
ops
->
buf_queue
(
q
,
q
->
read_buf
);
if
(
q
->
irqlock
)
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
spin_unlock_irqrestore
(
q
->
irqlock
,
flags
);
q
->
read_buf
=
NULL
;
}
if
(
retval
<
0
)
...
...
@@ -1012,10 +1018,10 @@ int videobuf_mmap_mapper(struct videobuf_queue *q,
{
int
retval
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
mutex_lock
(
&
q
->
lock
);
retval
=
CALL
(
q
,
mmap_mapper
,
q
,
vma
);
retval
=
CALL
(
q
,
mmap_mapper
,
q
,
vma
);
mutex_unlock
(
&
q
->
lock
);
return
retval
;
...
...
@@ -1026,15 +1032,15 @@ int videobuf_cgmbuf(struct videobuf_queue *q,
struct
video_mbuf
*
mbuf
,
int
count
)
{
struct
v4l2_requestbuffers
req
;
int
rc
,
i
;
int
rc
,
i
;
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
MAGIC_CHECK
(
q
->
int_ops
->
magic
,
MAGIC_QTYPE_OPS
);
memset
(
&
req
,
0
,
sizeof
(
req
));
memset
(
&
req
,
0
,
sizeof
(
req
));
req
.
type
=
q
->
type
;
req
.
count
=
count
;
req
.
memory
=
V4L2_MEMORY_MMAP
;
rc
=
videobuf_reqbufs
(
q
,
&
req
);
rc
=
videobuf_reqbufs
(
q
,
&
req
);
if
(
rc
<
0
)
return
rc
;
...
...
@@ -1079,9 +1085,3 @@ EXPORT_SYMBOL_GPL(videobuf_poll_stream);
EXPORT_SYMBOL_GPL
(
videobuf_mmap_setup
);
EXPORT_SYMBOL_GPL
(
videobuf_mmap_free
);
EXPORT_SYMBOL_GPL
(
videobuf_mmap_mapper
);
/*
* Local variables:
* c-basic-offset: 8
* End:
*/
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录