V4L/DVB (5289): Add support for video output overlays.
Add V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY support. Also add support for local and global alpha overlays. Add new field enums V4L2_FIELD_INTERLACED_TB and V4L2_FIELD_INTERLACED_BT. These changes are needed to support the ivtv On Screen Display features. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
Родитель
3bfb7398e2
Коммит
b2787845fb
|
@ -260,6 +260,8 @@ char *v4l2_field_names[] = {
|
|||
[V4L2_FIELD_SEQ_TB] = "seq-tb",
|
||||
[V4L2_FIELD_SEQ_BT] = "seq-bt",
|
||||
[V4L2_FIELD_ALTERNATE] = "alternate",
|
||||
[V4L2_FIELD_INTERLACED_TB] = "interlaced-tb",
|
||||
[V4L2_FIELD_INTERLACED_BT] = "interlaced-bt",
|
||||
};
|
||||
|
||||
char *v4l2_type_names[] = {
|
||||
|
@ -269,7 +271,8 @@ char *v4l2_type_names[] = {
|
|||
[V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap",
|
||||
[V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out",
|
||||
[V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-cap",
|
||||
[V4L2_BUF_TYPE_SLICED_VBI_OUTPUT] = "slicec-vbi-out",
|
||||
[V4L2_BUF_TYPE_SLICED_VBI_OUTPUT] = "sliced-vbi-out",
|
||||
[V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY] = "video-out-over",
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -318,6 +318,7 @@ static char *v4l2_type_names_FIXME[] = {
|
|||
[V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out",
|
||||
[V4L2_BUF_TYPE_SLICED_VBI_OUTPUT] = "sliced-vbi-out",
|
||||
[V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-capture",
|
||||
[V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY] = "video-out-over",
|
||||
[V4L2_BUF_TYPE_PRIVATE] = "private",
|
||||
};
|
||||
|
||||
|
@ -330,6 +331,8 @@ static char *v4l2_field_names_FIXME[] = {
|
|||
[V4L2_FIELD_SEQ_TB] = "seq-tb",
|
||||
[V4L2_FIELD_SEQ_BT] = "seq-bt",
|
||||
[V4L2_FIELD_ALTERNATE] = "alternate",
|
||||
[V4L2_FIELD_INTERLACED_TB] = "interlaced-tb",
|
||||
[V4L2_FIELD_INTERLACED_BT] = "interlaced-bt",
|
||||
};
|
||||
|
||||
#define prt_names(a,arr) (((a)>=0)&&((a)<ARRAY_SIZE(arr)))?arr[a]:"unknown"
|
||||
|
@ -411,6 +414,10 @@ static int check_fmt (struct video_device *vfd, enum v4l2_buf_type type)
|
|||
if (vfd->vidioc_try_fmt_vbi_output)
|
||||
return (0);
|
||||
break;
|
||||
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
|
||||
if (vfd->vidioc_try_fmt_output_overlay)
|
||||
return (0);
|
||||
break;
|
||||
case V4L2_BUF_TYPE_PRIVATE:
|
||||
if (vfd->vidioc_try_fmt_type_private)
|
||||
return (0);
|
||||
|
@ -525,6 +532,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
|
|||
ret=vfd->vidioc_enum_fmt_vbi_output(file,
|
||||
fh, f);
|
||||
break;
|
||||
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
|
||||
if (vfd->vidioc_enum_fmt_output_overlay)
|
||||
ret=vfd->vidioc_enum_fmt_output_overlay(file, fh, f);
|
||||
break;
|
||||
case V4L2_BUF_TYPE_PRIVATE:
|
||||
if (vfd->vidioc_enum_fmt_type_private)
|
||||
ret=vfd->vidioc_enum_fmt_type_private(file,
|
||||
|
@ -582,6 +593,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
|
|||
ret=vfd->vidioc_g_fmt_video_output(file,
|
||||
fh, f);
|
||||
break;
|
||||
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
|
||||
if (vfd->vidioc_g_fmt_output_overlay)
|
||||
ret=vfd->vidioc_g_fmt_output_overlay(file, fh, f);
|
||||
break;
|
||||
case V4L2_BUF_TYPE_VBI_OUTPUT:
|
||||
if (vfd->vidioc_g_fmt_vbi_output)
|
||||
ret=vfd->vidioc_g_fmt_vbi_output(file, fh, f);
|
||||
|
@ -630,6 +645,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
|
|||
ret=vfd->vidioc_s_fmt_video_output(file,
|
||||
fh, f);
|
||||
break;
|
||||
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
|
||||
if (vfd->vidioc_s_fmt_output_overlay)
|
||||
ret=vfd->vidioc_s_fmt_output_overlay(file, fh, f);
|
||||
break;
|
||||
case V4L2_BUF_TYPE_VBI_OUTPUT:
|
||||
if (vfd->vidioc_s_fmt_vbi_output)
|
||||
ret=vfd->vidioc_s_fmt_vbi_output(file,
|
||||
|
@ -680,6 +699,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
|
|||
ret=vfd->vidioc_try_fmt_video_output(file,
|
||||
fh, f);
|
||||
break;
|
||||
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
|
||||
if (vfd->vidioc_try_fmt_output_overlay)
|
||||
ret=vfd->vidioc_try_fmt_output_overlay(file, fh, f);
|
||||
break;
|
||||
case V4L2_BUF_TYPE_VBI_OUTPUT:
|
||||
if (vfd->vidioc_try_fmt_vbi_output)
|
||||
ret=vfd->vidioc_try_fmt_vbi_output(file,
|
||||
|
|
|
@ -96,44 +96,60 @@
|
|||
* E N U M S
|
||||
*/
|
||||
enum v4l2_field {
|
||||
V4L2_FIELD_ANY = 0, /* driver can choose from none,
|
||||
top, bottom, interlaced
|
||||
depending on whatever it thinks
|
||||
is approximate ... */
|
||||
V4L2_FIELD_NONE = 1, /* this device has no fields ... */
|
||||
V4L2_FIELD_TOP = 2, /* top field only */
|
||||
V4L2_FIELD_BOTTOM = 3, /* bottom field only */
|
||||
V4L2_FIELD_INTERLACED = 4, /* both fields interlaced */
|
||||
V4L2_FIELD_SEQ_TB = 5, /* both fields sequential into one
|
||||
buffer, top-bottom order */
|
||||
V4L2_FIELD_SEQ_BT = 6, /* same as above + bottom-top order */
|
||||
V4L2_FIELD_ALTERNATE = 7, /* both fields alternating into
|
||||
separate buffers */
|
||||
V4L2_FIELD_ANY = 0, /* driver can choose from none,
|
||||
top, bottom, interlaced
|
||||
depending on whatever it thinks
|
||||
is approximate ... */
|
||||
V4L2_FIELD_NONE = 1, /* this device has no fields ... */
|
||||
V4L2_FIELD_TOP = 2, /* top field only */
|
||||
V4L2_FIELD_BOTTOM = 3, /* bottom field only */
|
||||
V4L2_FIELD_INTERLACED = 4, /* both fields interlaced */
|
||||
V4L2_FIELD_SEQ_TB = 5, /* both fields sequential into one
|
||||
buffer, top-bottom order */
|
||||
V4L2_FIELD_SEQ_BT = 6, /* same as above + bottom-top order */
|
||||
V4L2_FIELD_ALTERNATE = 7, /* both fields alternating into
|
||||
separate buffers */
|
||||
V4L2_FIELD_INTERLACED_TB = 8, /* both fields interlaced, top field
|
||||
first and the top field is
|
||||
transmitted first */
|
||||
V4L2_FIELD_INTERLACED_BT = 9, /* both fields interlaced, top field
|
||||
first and the bottom field is
|
||||
transmitted first */
|
||||
};
|
||||
#define V4L2_FIELD_HAS_TOP(field) \
|
||||
((field) == V4L2_FIELD_TOP ||\
|
||||
(field) == V4L2_FIELD_INTERLACED ||\
|
||||
(field) == V4L2_FIELD_INTERLACED_TB ||\
|
||||
(field) == V4L2_FIELD_INTERLACED_BT ||\
|
||||
(field) == V4L2_FIELD_SEQ_TB ||\
|
||||
(field) == V4L2_FIELD_SEQ_BT)
|
||||
#define V4L2_FIELD_HAS_BOTTOM(field) \
|
||||
((field) == V4L2_FIELD_BOTTOM ||\
|
||||
(field) == V4L2_FIELD_INTERLACED ||\
|
||||
(field) == V4L2_FIELD_INTERLACED_TB ||\
|
||||
(field) == V4L2_FIELD_INTERLACED_BT ||\
|
||||
(field) == V4L2_FIELD_SEQ_TB ||\
|
||||
(field) == V4L2_FIELD_SEQ_BT)
|
||||
#define V4L2_FIELD_HAS_BOTH(field) \
|
||||
((field) == V4L2_FIELD_INTERLACED ||\
|
||||
(field) == V4L2_FIELD_SEQ_TB ||\
|
||||
(field) == V4L2_FIELD_INTERLACED_TB ||\
|
||||
(field) == V4L2_FIELD_INTERLACED_BT ||\
|
||||
(field) == V4L2_FIELD_SEQ_TB ||\
|
||||
(field) == V4L2_FIELD_SEQ_BT)
|
||||
|
||||
enum v4l2_buf_type {
|
||||
V4L2_BUF_TYPE_VIDEO_CAPTURE = 1,
|
||||
V4L2_BUF_TYPE_VIDEO_OUTPUT = 2,
|
||||
V4L2_BUF_TYPE_VIDEO_OVERLAY = 3,
|
||||
V4L2_BUF_TYPE_VBI_CAPTURE = 4,
|
||||
V4L2_BUF_TYPE_VBI_OUTPUT = 5,
|
||||
V4L2_BUF_TYPE_SLICED_VBI_CAPTURE = 6,
|
||||
V4L2_BUF_TYPE_SLICED_VBI_OUTPUT = 7,
|
||||
V4L2_BUF_TYPE_PRIVATE = 0x80,
|
||||
V4L2_BUF_TYPE_VIDEO_CAPTURE = 1,
|
||||
V4L2_BUF_TYPE_VIDEO_OUTPUT = 2,
|
||||
V4L2_BUF_TYPE_VIDEO_OVERLAY = 3,
|
||||
V4L2_BUF_TYPE_VBI_CAPTURE = 4,
|
||||
V4L2_BUF_TYPE_VBI_OUTPUT = 5,
|
||||
V4L2_BUF_TYPE_SLICED_VBI_CAPTURE = 6,
|
||||
V4L2_BUF_TYPE_SLICED_VBI_OUTPUT = 7,
|
||||
#if 1
|
||||
/* Experimental */
|
||||
V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8,
|
||||
#endif
|
||||
V4L2_BUF_TYPE_PRIVATE = 0x80,
|
||||
};
|
||||
|
||||
enum v4l2_ctrl_type {
|
||||
|
@ -228,6 +244,7 @@ struct v4l2_capability
|
|||
#define V4L2_CAP_SLICED_VBI_OUTPUT 0x00000080 /* Is a sliced VBI output device */
|
||||
#define V4L2_CAP_RDS_CAPTURE 0x00000100 /* RDS data capture */
|
||||
#define V4L2_CAP_VIDEO_OUTPUT_POS 0x00000200 /* Video output can have x,y coords */
|
||||
#define V4L2_CAP_VIDEO_OUTPUT_OVERLAY 0x00000400 /* Can do video output overlay */
|
||||
|
||||
#define V4L2_CAP_TUNER 0x00010000 /* has a tuner */
|
||||
#define V4L2_CAP_AUDIO 0x00020000 /* has audio support */
|
||||
|
@ -599,10 +616,14 @@ struct v4l2_framebuffer
|
|||
#define V4L2_FBUF_CAP_CHROMAKEY 0x0002
|
||||
#define V4L2_FBUF_CAP_LIST_CLIPPING 0x0004
|
||||
#define V4L2_FBUF_CAP_BITMAP_CLIPPING 0x0008
|
||||
#define V4L2_FBUF_CAP_LOCAL_ALPHA 0x0010
|
||||
#define V4L2_FBUF_CAP_GLOBAL_ALPHA 0x0020
|
||||
/* Flags for the 'flags' field. */
|
||||
#define V4L2_FBUF_FLAG_PRIMARY 0x0001
|
||||
#define V4L2_FBUF_FLAG_OVERLAY 0x0002
|
||||
#define V4L2_FBUF_FLAG_CHROMAKEY 0x0004
|
||||
#define V4L2_FBUF_FLAG_LOCAL_ALPHA 0x0008
|
||||
#define V4L2_FBUF_FLAG_GLOBAL_ALPHA 0x0010
|
||||
|
||||
struct v4l2_clip
|
||||
{
|
||||
|
@ -618,6 +639,7 @@ struct v4l2_window
|
|||
struct v4l2_clip __user *clips;
|
||||
__u32 clipcount;
|
||||
void __user *bitmap;
|
||||
__u8 global_alpha;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -127,6 +127,8 @@ struct video_device
|
|||
struct v4l2_fmtdesc *f);
|
||||
int (*vidioc_enum_fmt_video_output)(struct file *file, void *fh,
|
||||
struct v4l2_fmtdesc *f);
|
||||
int (*vidioc_enum_fmt_output_overlay) (struct file *file, void *fh,
|
||||
struct v4l2_fmtdesc *f);
|
||||
int (*vidioc_enum_fmt_vbi_output) (struct file *file, void *fh,
|
||||
struct v4l2_fmtdesc *f);
|
||||
int (*vidioc_enum_fmt_type_private)(struct file *file, void *fh,
|
||||
|
@ -145,6 +147,8 @@ struct video_device
|
|||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_video_output)(struct file *file, void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_output_overlay) (struct file *file, void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_g_fmt_type_private)(struct file *file, void *fh,
|
||||
struct v4l2_format *f);
|
||||
|
||||
|
@ -162,6 +166,8 @@ struct video_device
|
|||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_video_output)(struct file *file, void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_output_overlay) (struct file *file, void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_s_fmt_type_private)(struct file *file, void *fh,
|
||||
struct v4l2_format *f);
|
||||
|
||||
|
@ -178,6 +184,8 @@ struct video_device
|
|||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_video_output)(struct file *file, void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_output_overlay)(struct file *file, void *fh,
|
||||
struct v4l2_format *f);
|
||||
int (*vidioc_try_fmt_type_private)(struct file *file, void *fh,
|
||||
struct v4l2_format *f);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче