diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2013-02-15 04:05:08 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-03-05 13:39:57 -0500 |
commit | 92513611fa5864b8aec216db5a93bafaa299d623 (patch) | |
tree | 9c74cae3884c29c696c41ac4367ab2b4250561de /drivers/media/usb/s2255 | |
parent | 29ceb1101e9b39eaac2f20281a93c2afaf07aa10 (diff) |
[media] s2255: fix field handling
Just set the field value based on the chosen format. It's either INTERLACED
or TOP.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/usb/s2255')
-rw-r--r-- | drivers/media/usb/s2255/s2255drv.c | 61 |
1 files changed, 15 insertions, 46 deletions
diff --git a/drivers/media/usb/s2255/s2255drv.c b/drivers/media/usb/s2255/s2255drv.c index a16bc6cdd007..9693eb9d9e8d 100644 --- a/drivers/media/usb/s2255/s2255drv.c +++ b/drivers/media/usb/s2255/s2255drv.c | |||
@@ -852,10 +852,15 @@ static int vidioc_g_fmt_vid_cap(struct file *file, void *priv, | |||
852 | { | 852 | { |
853 | struct s2255_fh *fh = priv; | 853 | struct s2255_fh *fh = priv; |
854 | struct s2255_channel *channel = fh->channel; | 854 | struct s2255_channel *channel = fh->channel; |
855 | int is_ntsc = channel->std & V4L2_STD_525_60; | ||
855 | 856 | ||
856 | f->fmt.pix.width = channel->width; | 857 | f->fmt.pix.width = channel->width; |
857 | f->fmt.pix.height = channel->height; | 858 | f->fmt.pix.height = channel->height; |
858 | f->fmt.pix.field = fh->vb_vidq.field; | 859 | if (f->fmt.pix.height >= |
860 | (is_ntsc ? NUM_LINES_1CIFS_NTSC : NUM_LINES_1CIFS_PAL) * 2) | ||
861 | f->fmt.pix.field = V4L2_FIELD_INTERLACED; | ||
862 | else | ||
863 | f->fmt.pix.field = V4L2_FIELD_TOP; | ||
859 | f->fmt.pix.pixelformat = channel->fmt->fourcc; | 864 | f->fmt.pix.pixelformat = channel->fmt->fourcc; |
860 | f->fmt.pix.bytesperline = f->fmt.pix.width * (channel->fmt->depth >> 3); | 865 | f->fmt.pix.bytesperline = f->fmt.pix.width * (channel->fmt->depth >> 3); |
861 | f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline; | 866 | f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline; |
@@ -869,11 +874,9 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, | |||
869 | { | 874 | { |
870 | const struct s2255_fmt *fmt; | 875 | const struct s2255_fmt *fmt; |
871 | enum v4l2_field field; | 876 | enum v4l2_field field; |
872 | int b_any_field = 0; | ||
873 | struct s2255_fh *fh = priv; | 877 | struct s2255_fh *fh = priv; |
874 | struct s2255_channel *channel = fh->channel; | 878 | struct s2255_channel *channel = fh->channel; |
875 | int is_ntsc; | 879 | int is_ntsc = channel->std & V4L2_STD_525_60; |
876 | is_ntsc = (channel->std & V4L2_STD_525_60) ? 1 : 0; | ||
877 | 880 | ||
878 | fmt = format_by_fourcc(f->fmt.pix.pixelformat); | 881 | fmt = format_by_fourcc(f->fmt.pix.pixelformat); |
879 | 882 | ||
@@ -881,8 +884,6 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, | |||
881 | return -EINVAL; | 884 | return -EINVAL; |
882 | 885 | ||
883 | field = f->fmt.pix.field; | 886 | field = f->fmt.pix.field; |
884 | if (field == V4L2_FIELD_ANY) | ||
885 | b_any_field = 1; | ||
886 | 887 | ||
887 | dprintk(50, "%s NTSC: %d suggested width: %d, height: %d\n", | 888 | dprintk(50, "%s NTSC: %d suggested width: %d, height: %d\n", |
888 | __func__, is_ntsc, f->fmt.pix.width, f->fmt.pix.height); | 889 | __func__, is_ntsc, f->fmt.pix.width, f->fmt.pix.height); |
@@ -890,24 +891,10 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, | |||
890 | /* NTSC */ | 891 | /* NTSC */ |
891 | if (f->fmt.pix.height >= NUM_LINES_1CIFS_NTSC * 2) { | 892 | if (f->fmt.pix.height >= NUM_LINES_1CIFS_NTSC * 2) { |
892 | f->fmt.pix.height = NUM_LINES_1CIFS_NTSC * 2; | 893 | f->fmt.pix.height = NUM_LINES_1CIFS_NTSC * 2; |
893 | if (b_any_field) { | 894 | field = V4L2_FIELD_INTERLACED; |
894 | field = V4L2_FIELD_SEQ_TB; | ||
895 | } else if (!((field == V4L2_FIELD_INTERLACED) || | ||
896 | (field == V4L2_FIELD_SEQ_TB) || | ||
897 | (field == V4L2_FIELD_INTERLACED_TB))) { | ||
898 | dprintk(1, "unsupported field setting\n"); | ||
899 | return -EINVAL; | ||
900 | } | ||
901 | } else { | 895 | } else { |
902 | f->fmt.pix.height = NUM_LINES_1CIFS_NTSC; | 896 | f->fmt.pix.height = NUM_LINES_1CIFS_NTSC; |
903 | if (b_any_field) { | 897 | field = V4L2_FIELD_TOP; |
904 | field = V4L2_FIELD_TOP; | ||
905 | } else if (!((field == V4L2_FIELD_TOP) || | ||
906 | (field == V4L2_FIELD_BOTTOM))) { | ||
907 | dprintk(1, "unsupported field setting\n"); | ||
908 | return -EINVAL; | ||
909 | } | ||
910 | |||
911 | } | 898 | } |
912 | if (f->fmt.pix.width >= LINE_SZ_4CIFS_NTSC) | 899 | if (f->fmt.pix.width >= LINE_SZ_4CIFS_NTSC) |
913 | f->fmt.pix.width = LINE_SZ_4CIFS_NTSC; | 900 | f->fmt.pix.width = LINE_SZ_4CIFS_NTSC; |
@@ -921,37 +908,19 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, | |||
921 | /* PAL */ | 908 | /* PAL */ |
922 | if (f->fmt.pix.height >= NUM_LINES_1CIFS_PAL * 2) { | 909 | if (f->fmt.pix.height >= NUM_LINES_1CIFS_PAL * 2) { |
923 | f->fmt.pix.height = NUM_LINES_1CIFS_PAL * 2; | 910 | f->fmt.pix.height = NUM_LINES_1CIFS_PAL * 2; |
924 | if (b_any_field) { | 911 | field = V4L2_FIELD_INTERLACED; |
925 | field = V4L2_FIELD_SEQ_TB; | ||
926 | } else if (!((field == V4L2_FIELD_INTERLACED) || | ||
927 | (field == V4L2_FIELD_SEQ_TB) || | ||
928 | (field == V4L2_FIELD_INTERLACED_TB))) { | ||
929 | dprintk(1, "unsupported field setting\n"); | ||
930 | return -EINVAL; | ||
931 | } | ||
932 | } else { | 912 | } else { |
933 | f->fmt.pix.height = NUM_LINES_1CIFS_PAL; | 913 | f->fmt.pix.height = NUM_LINES_1CIFS_PAL; |
934 | if (b_any_field) { | 914 | field = V4L2_FIELD_TOP; |
935 | field = V4L2_FIELD_TOP; | ||
936 | } else if (!((field == V4L2_FIELD_TOP) || | ||
937 | (field == V4L2_FIELD_BOTTOM))) { | ||
938 | dprintk(1, "unsupported field setting\n"); | ||
939 | return -EINVAL; | ||
940 | } | ||
941 | } | 915 | } |
942 | if (f->fmt.pix.width >= LINE_SZ_4CIFS_PAL) { | 916 | if (f->fmt.pix.width >= LINE_SZ_4CIFS_PAL) |
943 | f->fmt.pix.width = LINE_SZ_4CIFS_PAL; | 917 | f->fmt.pix.width = LINE_SZ_4CIFS_PAL; |
944 | field = V4L2_FIELD_SEQ_TB; | 918 | else if (f->fmt.pix.width >= LINE_SZ_2CIFS_PAL) |
945 | } else if (f->fmt.pix.width >= LINE_SZ_2CIFS_PAL) { | ||
946 | f->fmt.pix.width = LINE_SZ_2CIFS_PAL; | 919 | f->fmt.pix.width = LINE_SZ_2CIFS_PAL; |
947 | field = V4L2_FIELD_TOP; | 920 | else if (f->fmt.pix.width >= LINE_SZ_1CIFS_PAL) |
948 | } else if (f->fmt.pix.width >= LINE_SZ_1CIFS_PAL) { | ||
949 | f->fmt.pix.width = LINE_SZ_1CIFS_PAL; | 921 | f->fmt.pix.width = LINE_SZ_1CIFS_PAL; |
950 | field = V4L2_FIELD_TOP; | 922 | else |
951 | } else { | ||
952 | f->fmt.pix.width = LINE_SZ_1CIFS_PAL; | 923 | f->fmt.pix.width = LINE_SZ_1CIFS_PAL; |
953 | field = V4L2_FIELD_TOP; | ||
954 | } | ||
955 | } | 924 | } |
956 | f->fmt.pix.field = field; | 925 | f->fmt.pix.field = field; |
957 | f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3; | 926 | f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3; |