aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/usb/s2255
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2013-02-15 04:05:08 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-03-05 13:39:57 -0500
commit92513611fa5864b8aec216db5a93bafaa299d623 (patch)
tree9c74cae3884c29c696c41ac4367ab2b4250561de /drivers/media/usb/s2255
parent29ceb1101e9b39eaac2f20281a93c2afaf07aa10 (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.c61
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;