aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/pci/ivtv
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2015-03-30 12:54:13 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-04-02 22:57:19 -0400
commitbbc9fa2ece0f2bb1db9b195d7a6ac88468cd45d4 (patch)
tree1a2e06147646a9f293f1e4e6208b1fe7fd9b4145 /drivers/media/pci/ivtv
parent4db4ca7450f97c300ebf74f5dca69015ad0d5ed3 (diff)
[media] ivtv: replace crop by selection
Replace the old g/s_crop ioctls by the new g/s_selection ioctls. This solves a v4l2-compliance failure, and it is something that needs to be done anyway to eventually be able to remove the old g/s_crop ioctl ops. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/pci/ivtv')
-rw-r--r--drivers/media/pci/ivtv/ivtv-ioctl.c115
1 files changed, 69 insertions, 46 deletions
diff --git a/drivers/media/pci/ivtv/ivtv-ioctl.c b/drivers/media/pci/ivtv/ivtv-ioctl.c
index fa875655ede6..683beb4f1951 100644
--- a/drivers/media/pci/ivtv/ivtv-ioctl.c
+++ b/drivers/media/pci/ivtv/ivtv-ioctl.c
@@ -816,80 +816,103 @@ static int ivtv_cropcap(struct file *file, void *fh, struct v4l2_cropcap *cropca
816{ 816{
817 struct ivtv_open_id *id = fh2id(fh); 817 struct ivtv_open_id *id = fh2id(fh);
818 struct ivtv *itv = id->itv; 818 struct ivtv *itv = id->itv;
819 struct yuv_playback_info *yi = &itv->yuv_info;
820 int streamtype;
821
822 streamtype = id->type;
823 819
824 if (cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
825 return -EINVAL;
826 cropcap->bounds.top = cropcap->bounds.left = 0;
827 cropcap->bounds.width = 720;
828 if (cropcap->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { 820 if (cropcap->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
829 cropcap->bounds.height = itv->is_50hz ? 576 : 480;
830 cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10; 821 cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10;
831 cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11; 822 cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11;
832 } else if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) { 823 } else if (cropcap->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
833 if (yi->track_osd) {
834 cropcap->bounds.width = yi->osd_full_w;
835 cropcap->bounds.height = yi->osd_full_h;
836 } else {
837 cropcap->bounds.width = 720;
838 cropcap->bounds.height =
839 itv->is_out_50hz ? 576 : 480;
840 }
841 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10; 824 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
842 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11; 825 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
843 } else { 826 } else {
844 cropcap->bounds.height = itv->is_out_50hz ? 576 : 480; 827 return -EINVAL;
845 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
846 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
847 } 828 }
848 cropcap->defrect = cropcap->bounds;
849 return 0; 829 return 0;
850} 830}
851 831
852static int ivtv_s_crop(struct file *file, void *fh, const struct v4l2_crop *crop) 832static int ivtv_s_selection(struct file *file, void *fh,
833 struct v4l2_selection *sel)
853{ 834{
854 struct ivtv_open_id *id = fh2id(fh); 835 struct ivtv_open_id *id = fh2id(fh);
855 struct ivtv *itv = id->itv; 836 struct ivtv *itv = id->itv;
856 struct yuv_playback_info *yi = &itv->yuv_info; 837 struct yuv_playback_info *yi = &itv->yuv_info;
857 int streamtype; 838 struct v4l2_rect r = { 0, 0, 720, 0 };
839 int streamtype = id->type;
858 840
859 streamtype = id->type; 841 if (sel->type != V4L2_BUF_TYPE_VIDEO_OUTPUT ||
842 !(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
843 return -EINVAL;
860 844
861 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT && 845 if (sel->target != V4L2_SEL_TGT_COMPOSE)
862 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
863 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
864 yi->main_rect = crop->c;
865 return 0;
866 } else {
867 if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
868 crop->c.width, crop->c.height, crop->c.left, crop->c.top)) {
869 itv->main_rect = crop->c;
870 return 0;
871 }
872 }
873 return -EINVAL; 846 return -EINVAL;
847
848
849 if (sel->type != V4L2_BUF_TYPE_VIDEO_OUTPUT ||
850 !(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
851 return -EINVAL;
852
853 r.height = itv->is_out_50hz ? 576 : 480;
854 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV && yi->track_osd) {
855 r.width = yi->osd_full_w;
856 r.height = yi->osd_full_h;
857 }
858 sel->r.width = clamp(sel->r.width, 16U, r.width);
859 sel->r.height = clamp(sel->r.height, 16U, r.height);
860 sel->r.left = clamp_t(unsigned, sel->r.left, 0, r.width - sel->r.width);
861 sel->r.top = clamp_t(unsigned, sel->r.top, 0, r.height - sel->r.height);
862
863 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
864 yi->main_rect = sel->r;
865 return 0;
866 }
867 if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
868 sel->r.width, sel->r.height, sel->r.left, sel->r.top)) {
869 itv->main_rect = sel->r;
870 return 0;
874 } 871 }
875 return -EINVAL; 872 return -EINVAL;
876} 873}
877 874
878static int ivtv_g_crop(struct file *file, void *fh, struct v4l2_crop *crop) 875static int ivtv_g_selection(struct file *file, void *fh,
876 struct v4l2_selection *sel)
879{ 877{
880 struct ivtv_open_id *id = fh2id(fh); 878 struct ivtv_open_id *id = fh2id(fh);
881 struct ivtv *itv = id->itv; 879 struct ivtv *itv = id->itv;
882 struct yuv_playback_info *yi = &itv->yuv_info; 880 struct yuv_playback_info *yi = &itv->yuv_info;
883 int streamtype; 881 struct v4l2_rect r = { 0, 0, 720, 0 };
882 int streamtype = id->type;
883
884 if (sel->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
885 switch (sel->target) {
886 case V4L2_SEL_TGT_CROP_DEFAULT:
887 case V4L2_SEL_TGT_CROP_BOUNDS:
888 sel->r.top = sel->r.left = 0;
889 sel->r.width = 720;
890 sel->r.height = itv->is_50hz ? 576 : 480;
891 return 0;
892 default:
893 return -EINVAL;
894 }
895 }
884 896
885 streamtype = id->type; 897 if (sel->type != V4L2_BUF_TYPE_VIDEO_OUTPUT ||
898 !(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
899 return -EINVAL;
886 900
887 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT && 901 switch (sel->target) {
888 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) { 902 case V4L2_SEL_TGT_COMPOSE:
889 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) 903 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV)
890 crop->c = yi->main_rect; 904 sel->r = yi->main_rect;
891 else 905 else
892 crop->c = itv->main_rect; 906 sel->r = itv->main_rect;
907 return 0;
908 case V4L2_SEL_TGT_COMPOSE_DEFAULT:
909 case V4L2_SEL_TGT_COMPOSE_BOUNDS:
910 r.height = itv->is_out_50hz ? 576 : 480;
911 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV && yi->track_osd) {
912 r.width = yi->osd_full_w;
913 r.height = yi->osd_full_h;
914 }
915 sel->r = r;
893 return 0; 916 return 0;
894 } 917 }
895 return -EINVAL; 918 return -EINVAL;
@@ -1837,8 +1860,8 @@ static const struct v4l2_ioctl_ops ivtv_ioctl_ops = {
1837 .vidioc_enum_output = ivtv_enum_output, 1860 .vidioc_enum_output = ivtv_enum_output,
1838 .vidioc_enumaudout = ivtv_enumaudout, 1861 .vidioc_enumaudout = ivtv_enumaudout,
1839 .vidioc_cropcap = ivtv_cropcap, 1862 .vidioc_cropcap = ivtv_cropcap,
1840 .vidioc_s_crop = ivtv_s_crop, 1863 .vidioc_s_selection = ivtv_s_selection,
1841 .vidioc_g_crop = ivtv_g_crop, 1864 .vidioc_g_selection = ivtv_g_selection,
1842 .vidioc_g_input = ivtv_g_input, 1865 .vidioc_g_input = ivtv_g_input,
1843 .vidioc_s_input = ivtv_s_input, 1866 .vidioc_s_input = ivtv_s_input,
1844 .vidioc_g_output = ivtv_g_output, 1867 .vidioc_g_output = ivtv_g_output,