Commit 5854bf88 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] hdpvr: allow g/s/enum/querystd when in legacy mode

Both MythTV and gstreamer expect that they can set/get/query/enumerate the
standards, even if the input is the component input for which standards
really do not apply.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 3315c59a
...@@ -571,13 +571,14 @@ static int vidioc_querycap(struct file *file, void *priv, ...@@ -571,13 +571,14 @@ static int vidioc_querycap(struct file *file, void *priv,
return 0; return 0;
} }
static int vidioc_s_std(struct file *file, void *private_data, static int vidioc_s_std(struct file *file, void *_fh,
v4l2_std_id std) v4l2_std_id std)
{ {
struct hdpvr_device *dev = video_drvdata(file); struct hdpvr_device *dev = video_drvdata(file);
struct hdpvr_fh *fh = _fh;
u8 std_type = 1; u8 std_type = 1;
if (dev->options.video_input == HDPVR_COMPONENT) if (!fh->legacy_mode && dev->options.video_input == HDPVR_COMPONENT)
return -ENODATA; return -ENODATA;
if (dev->status != STATUS_IDLE) if (dev->status != STATUS_IDLE)
return -EBUSY; return -EBUSY;
...@@ -590,25 +591,27 @@ static int vidioc_s_std(struct file *file, void *private_data, ...@@ -590,25 +591,27 @@ static int vidioc_s_std(struct file *file, void *private_data,
return hdpvr_config_call(dev, CTRL_VIDEO_STD_TYPE, std_type); return hdpvr_config_call(dev, CTRL_VIDEO_STD_TYPE, std_type);
} }
static int vidioc_g_std(struct file *file, void *private_data, static int vidioc_g_std(struct file *file, void *_fh,
v4l2_std_id *std) v4l2_std_id *std)
{ {
struct hdpvr_device *dev = video_drvdata(file); struct hdpvr_device *dev = video_drvdata(file);
struct hdpvr_fh *fh = _fh;
if (dev->options.video_input == HDPVR_COMPONENT) if (!fh->legacy_mode && dev->options.video_input == HDPVR_COMPONENT)
return -ENODATA; return -ENODATA;
*std = dev->cur_std; *std = dev->cur_std;
return 0; return 0;
} }
static int vidioc_querystd(struct file *file, void *fh, v4l2_std_id *a) static int vidioc_querystd(struct file *file, void *_fh, v4l2_std_id *a)
{ {
struct hdpvr_device *dev = video_drvdata(file); struct hdpvr_device *dev = video_drvdata(file);
struct hdpvr_video_info *vid_info; struct hdpvr_video_info *vid_info;
struct hdpvr_fh *fh = _fh;
if (dev->options.video_input == HDPVR_COMPONENT)
return -ENODATA;
*a = V4L2_STD_ALL; *a = V4L2_STD_ALL;
if (dev->options.video_input == HDPVR_COMPONENT)
return fh->legacy_mode ? 0 : -ENODATA;
vid_info = get_video_info(dev); vid_info = get_video_info(dev);
if (vid_info == NULL) if (vid_info == NULL)
return 0; return 0;
...@@ -742,8 +745,7 @@ static const char *iname[] = { ...@@ -742,8 +745,7 @@ static const char *iname[] = {
[HDPVR_COMPOSITE] = "Composite", [HDPVR_COMPOSITE] = "Composite",
}; };
static int vidioc_enum_input(struct file *file, void *priv, static int vidioc_enum_input(struct file *file, void *_fh, struct v4l2_input *i)
struct v4l2_input *i)
{ {
unsigned int n; unsigned int n;
...@@ -764,7 +766,7 @@ static int vidioc_enum_input(struct file *file, void *priv, ...@@ -764,7 +766,7 @@ static int vidioc_enum_input(struct file *file, void *priv,
return 0; return 0;
} }
static int vidioc_s_input(struct file *file, void *private_data, static int vidioc_s_input(struct file *file, void *_fh,
unsigned int index) unsigned int index)
{ {
struct hdpvr_device *dev = video_drvdata(file); struct hdpvr_device *dev = video_drvdata(file);
...@@ -779,8 +781,20 @@ static int vidioc_s_input(struct file *file, void *private_data, ...@@ -779,8 +781,20 @@ static int vidioc_s_input(struct file *file, void *private_data,
retval = hdpvr_config_call(dev, CTRL_VIDEO_INPUT_VALUE, index+1); retval = hdpvr_config_call(dev, CTRL_VIDEO_INPUT_VALUE, index+1);
if (!retval) { if (!retval) {
dev->options.video_input = index; dev->options.video_input = index;
/*
* Unfortunately gstreamer calls ENUMSTD and bails out if it
* won't find any formats, even though component input is
* selected. This means that we have to leave tvnorms at
* V4L2_STD_ALL. We cannot use the 'legacy' trick since
* tvnorms is set at the device node level and not at the
* filehandle level.
*
* Comment this out for now, but if the legacy mode can be
* removed in the future, then this code should be enabled
* again.
dev->video_dev->tvnorms = dev->video_dev->tvnorms =
index != HDPVR_COMPONENT ? V4L2_STD_ALL : 0; (index != HDPVR_COMPONENT) ? V4L2_STD_ALL : 0;
*/
} }
return retval; return retval;
...@@ -1126,6 +1140,7 @@ static const struct video_device hdpvr_video_template = { ...@@ -1126,6 +1140,7 @@ static const struct video_device hdpvr_video_template = {
.fops = &hdpvr_fops, .fops = &hdpvr_fops,
.release = hdpvr_device_release, .release = hdpvr_device_release,
.ioctl_ops = &hdpvr_ioctl_ops, .ioctl_ops = &hdpvr_ioctl_ops,
.tvnorms = V4L2_STD_ALL,
}; };
static const struct v4l2_ctrl_ops hdpvr_ctrl_ops = { static const struct v4l2_ctrl_ops hdpvr_ctrl_ops = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment