diff options
| author | Muralidharan Karicheri <m-karicheri2@ti.com> | 2009-11-19 10:00:31 -0500 |
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-12-15 21:18:03 -0500 |
| commit | b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031 (patch) | |
| tree | e5742dc96ec8b2a74708787e6cb4ceefcc3e2bac /include | |
| parent | 20d15a200d34cfb7141fb4558895d7d5233db84b (diff) | |
V4L/DVB (13571): v4l: Adding Digital Video Timings APIs
This adds the above APIs to the v4l2 core. This is based on version v1.2
of the RFC titled "V4L - Support for video timings at the input/output interface"
Following new ioctls are added:-
- VIDIOC_ENUM_DV_PRESETS
- VIDIOC_S_DV_PRESET
- VIDIOC_G_DV_PRESET
- VIDIOC_QUERY_DV_PRESET
- VIDIOC_S_DV_TIMINGS
- VIDIOC_G_DV_TIMINGS
Please refer to the RFC for the details. This code was tested using vpfe
capture driver on TI's DM365. Following is the test configuration used :-
Blu-Ray HD DVD source -> TVP7002 -> DM365 (VPFE) ->DDR
A draft version of the TVP7002 driver (currently being reviewed in the mailing
list) was used that supports V4L2_DV_1080I60 & V4L2_DV_720P60 presets.
A loopback video capture application was used for testing these APIs. This calls
following IOCTLS :-
- verify the new v4l2_input capabilities flag added
- Enumerate available presets using VIDIOC_ENUM_DV_PRESETS
- Set one of the supported preset using VIDIOC_S_DV_PRESET
- Get current preset using VIDIOC_G_DV_PRESET
- Detect current preset using VIDIOC_QUERY_DV_PRESET
- Using stub functions in tvp7002, verify VIDIOC_S_DV_TIMINGS
and VIDIOC_G_DV_TIMINGS ioctls are received at the sub device.
- Tested on 64bit platform by Hans Verkuil
Signed-off-by: Muralidharan Karicheri <m-karicheri2@ti.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Reviewed-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/videodev2.h | 116 | ||||
| -rw-r--r-- | include/media/v4l2-ioctl.h | 15 | ||||
| -rw-r--r-- | include/media/v4l2-subdev.h | 21 |
3 files changed, 150 insertions, 2 deletions
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 32b92298fd79..59047ebf452e 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
| @@ -732,6 +732,99 @@ struct v4l2_standard { | |||
| 732 | }; | 732 | }; |
| 733 | 733 | ||
| 734 | /* | 734 | /* |
| 735 | * V I D E O T I M I N G S D V P R E S E T | ||
| 736 | */ | ||
| 737 | struct v4l2_dv_preset { | ||
| 738 | __u32 preset; | ||
| 739 | __u32 reserved[4]; | ||
| 740 | }; | ||
| 741 | |||
| 742 | /* | ||
| 743 | * D V P R E S E T S E N U M E R A T I O N | ||
| 744 | */ | ||
| 745 | struct v4l2_dv_enum_preset { | ||
| 746 | __u32 index; | ||
| 747 | __u32 preset; | ||
| 748 | __u8 name[32]; /* Name of the preset timing */ | ||
| 749 | __u32 width; | ||
| 750 | __u32 height; | ||
| 751 | __u32 reserved[4]; | ||
| 752 | }; | ||
| 753 | |||
| 754 | /* | ||
| 755 | * D V P R E S E T V A L U E S | ||
| 756 | */ | ||
| 757 | #define V4L2_DV_INVALID 0 | ||
| 758 | #define V4L2_DV_480P59_94 1 /* BT.1362 */ | ||
| 759 | #define V4L2_DV_576P50 2 /* BT.1362 */ | ||
| 760 | #define V4L2_DV_720P24 3 /* SMPTE 296M */ | ||
| 761 | #define V4L2_DV_720P25 4 /* SMPTE 296M */ | ||
| 762 | #define V4L2_DV_720P30 5 /* SMPTE 296M */ | ||
| 763 | #define V4L2_DV_720P50 6 /* SMPTE 296M */ | ||
| 764 | #define V4L2_DV_720P59_94 7 /* SMPTE 274M */ | ||
| 765 | #define V4L2_DV_720P60 8 /* SMPTE 274M/296M */ | ||
| 766 | #define V4L2_DV_1080I29_97 9 /* BT.1120/ SMPTE 274M */ | ||
| 767 | #define V4L2_DV_1080I30 10 /* BT.1120/ SMPTE 274M */ | ||
| 768 | #define V4L2_DV_1080I25 11 /* BT.1120 */ | ||
| 769 | #define V4L2_DV_1080I50 12 /* SMPTE 296M */ | ||
| 770 | #define V4L2_DV_1080I60 13 /* SMPTE 296M */ | ||
| 771 | #define V4L2_DV_1080P24 14 /* SMPTE 296M */ | ||
| 772 | #define V4L2_DV_1080P25 15 /* SMPTE 296M */ | ||
| 773 | #define V4L2_DV_1080P30 16 /* SMPTE 296M */ | ||
| 774 | #define V4L2_DV_1080P50 17 /* BT.1120 */ | ||
| 775 | #define V4L2_DV_1080P60 18 /* BT.1120 */ | ||
| 776 | |||
| 777 | /* | ||
| 778 | * D V B T T I M I N G S | ||
| 779 | */ | ||
| 780 | |||
| 781 | /* BT.656/BT.1120 timing data */ | ||
| 782 | struct v4l2_bt_timings { | ||
| 783 | __u32 width; /* width in pixels */ | ||
| 784 | __u32 height; /* height in lines */ | ||
| 785 | __u32 interlaced; /* Interlaced or progressive */ | ||
| 786 | __u32 polarities; /* Positive or negative polarity */ | ||
| 787 | __u64 pixelclock; /* Pixel clock in HZ. Ex. 74.25MHz->74250000 */ | ||
| 788 | __u32 hfrontporch; /* Horizpontal front porch in pixels */ | ||
| 789 | __u32 hsync; /* Horizontal Sync length in pixels */ | ||
| 790 | __u32 hbackporch; /* Horizontal back porch in pixels */ | ||
| 791 | __u32 vfrontporch; /* Vertical front porch in pixels */ | ||
| 792 | __u32 vsync; /* Vertical Sync length in lines */ | ||
| 793 | __u32 vbackporch; /* Vertical back porch in lines */ | ||
| 794 | __u32 il_vfrontporch; /* Vertical front porch for bottom field of | ||
| 795 | * interlaced field formats | ||
| 796 | */ | ||
| 797 | __u32 il_vsync; /* Vertical sync length for bottom field of | ||
| 798 | * interlaced field formats | ||
| 799 | */ | ||
| 800 | __u32 il_vbackporch; /* Vertical back porch for bottom field of | ||
| 801 | * interlaced field formats | ||
| 802 | */ | ||
| 803 | __u32 reserved[16]; | ||
| 804 | } __attribute__ ((packed)); | ||
| 805 | |||
| 806 | /* Interlaced or progressive format */ | ||
| 807 | #define V4L2_DV_PROGRESSIVE 0 | ||
| 808 | #define V4L2_DV_INTERLACED 1 | ||
| 809 | |||
| 810 | /* Polarities. If bit is not set, it is assumed to be negative polarity */ | ||
| 811 | #define V4L2_DV_VSYNC_POS_POL 0x00000001 | ||
| 812 | #define V4L2_DV_HSYNC_POS_POL 0x00000002 | ||
| 813 | |||
| 814 | |||
| 815 | /* DV timings */ | ||
| 816 | struct v4l2_dv_timings { | ||
| 817 | __u32 type; | ||
| 818 | union { | ||
| 819 | struct v4l2_bt_timings bt; | ||
| 820 | __u32 reserved[32]; | ||
| 821 | }; | ||
| 822 | } __attribute__ ((packed)); | ||
| 823 | |||
| 824 | /* Values for the type field */ | ||
| 825 | #define V4L2_DV_BT_656_1120 0 /* BT.656/1120 timing type */ | ||
| 826 | |||
| 827 | /* | ||
| 735 | * V I D E O I N P U T S | 828 | * V I D E O I N P U T S |
| 736 | */ | 829 | */ |
| 737 | struct v4l2_input { | 830 | struct v4l2_input { |
| @@ -742,7 +835,8 @@ struct v4l2_input { | |||
| 742 | __u32 tuner; /* Associated tuner */ | 835 | __u32 tuner; /* Associated tuner */ |
| 743 | v4l2_std_id std; | 836 | v4l2_std_id std; |
| 744 | __u32 status; | 837 | __u32 status; |
| 745 | __u32 reserved[4]; | 838 | __u32 capabilities; |
| 839 | __u32 reserved[3]; | ||
| 746 | }; | 840 | }; |
| 747 | 841 | ||
| 748 | /* Values for the 'type' field */ | 842 | /* Values for the 'type' field */ |
| @@ -773,6 +867,11 @@ struct v4l2_input { | |||
| 773 | #define V4L2_IN_ST_NO_ACCESS 0x02000000 /* Conditional access denied */ | 867 | #define V4L2_IN_ST_NO_ACCESS 0x02000000 /* Conditional access denied */ |
| 774 | #define V4L2_IN_ST_VTR 0x04000000 /* VTR time constant */ | 868 | #define V4L2_IN_ST_VTR 0x04000000 /* VTR time constant */ |
| 775 | 869 | ||
| 870 | /* capabilities flags */ | ||
| 871 | #define V4L2_IN_CAP_PRESETS 0x00000001 /* Supports S_DV_PRESET */ | ||
| 872 | #define V4L2_IN_CAP_CUSTOM_TIMINGS 0x00000002 /* Supports S_DV_TIMINGS */ | ||
| 873 | #define V4L2_IN_CAP_STD 0x00000004 /* Supports S_STD */ | ||
| 874 | |||
| 776 | /* | 875 | /* |
| 777 | * V I D E O O U T P U T S | 876 | * V I D E O O U T P U T S |
| 778 | */ | 877 | */ |
| @@ -783,13 +882,19 @@ struct v4l2_output { | |||
| 783 | __u32 audioset; /* Associated audios (bitfield) */ | 882 | __u32 audioset; /* Associated audios (bitfield) */ |
| 784 | __u32 modulator; /* Associated modulator */ | 883 | __u32 modulator; /* Associated modulator */ |
| 785 | v4l2_std_id std; | 884 | v4l2_std_id std; |
| 786 | __u32 reserved[4]; | 885 | __u32 capabilities; |
| 886 | __u32 reserved[3]; | ||
| 787 | }; | 887 | }; |
| 788 | /* Values for the 'type' field */ | 888 | /* Values for the 'type' field */ |
| 789 | #define V4L2_OUTPUT_TYPE_MODULATOR 1 | 889 | #define V4L2_OUTPUT_TYPE_MODULATOR 1 |
| 790 | #define V4L2_OUTPUT_TYPE_ANALOG 2 | 890 | #define V4L2_OUTPUT_TYPE_ANALOG 2 |
| 791 | #define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3 | 891 | #define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3 |
| 792 | 892 | ||
| 893 | /* capabilities flags */ | ||
| 894 | #define V4L2_OUT_CAP_PRESETS 0x00000001 /* Supports S_DV_PRESET */ | ||
| 895 | #define V4L2_OUT_CAP_CUSTOM_TIMINGS 0x00000002 /* Supports S_DV_TIMINGS */ | ||
| 896 | #define V4L2_OUT_CAP_STD 0x00000004 /* Supports S_STD */ | ||
| 897 | |||
| 793 | /* | 898 | /* |
| 794 | * C O N T R O L S | 899 | * C O N T R O L S |
| 795 | */ | 900 | */ |
| @@ -1624,6 +1729,13 @@ struct v4l2_dbg_chip_ident { | |||
| 1624 | #endif | 1729 | #endif |
| 1625 | 1730 | ||
| 1626 | #define VIDIOC_S_HW_FREQ_SEEK _IOW('V', 82, struct v4l2_hw_freq_seek) | 1731 | #define VIDIOC_S_HW_FREQ_SEEK _IOW('V', 82, struct v4l2_hw_freq_seek) |
| 1732 | #define VIDIOC_ENUM_DV_PRESETS _IOWR('V', 83, struct v4l2_dv_enum_preset) | ||
| 1733 | #define VIDIOC_S_DV_PRESET _IOWR('V', 84, struct v4l2_dv_preset) | ||
| 1734 | #define VIDIOC_G_DV_PRESET _IOWR('V', 85, struct v4l2_dv_preset) | ||
| 1735 | #define VIDIOC_QUERY_DV_PRESET _IOR('V', 86, struct v4l2_dv_preset) | ||
| 1736 | #define VIDIOC_S_DV_TIMINGS _IOWR('V', 87, struct v4l2_dv_timings) | ||
| 1737 | #define VIDIOC_G_DV_TIMINGS _IOWR('V', 88, struct v4l2_dv_timings) | ||
| 1738 | |||
| 1627 | /* Reminder: when adding new ioctls please add support for them to | 1739 | /* Reminder: when adding new ioctls please add support for them to |
| 1628 | drivers/media/video/v4l2-compat-ioctl32.c as well! */ | 1740 | drivers/media/video/v4l2-compat-ioctl32.c as well! */ |
| 1629 | 1741 | ||
diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h index 7a4529defa88..e8ba0f2efbae 100644 --- a/include/media/v4l2-ioctl.h +++ b/include/media/v4l2-ioctl.h | |||
| @@ -239,6 +239,21 @@ struct v4l2_ioctl_ops { | |||
| 239 | int (*vidioc_enum_frameintervals) (struct file *file, void *fh, | 239 | int (*vidioc_enum_frameintervals) (struct file *file, void *fh, |
| 240 | struct v4l2_frmivalenum *fival); | 240 | struct v4l2_frmivalenum *fival); |
| 241 | 241 | ||
| 242 | /* DV Timings IOCTLs */ | ||
| 243 | int (*vidioc_enum_dv_presets) (struct file *file, void *fh, | ||
| 244 | struct v4l2_dv_enum_preset *preset); | ||
| 245 | |||
| 246 | int (*vidioc_s_dv_preset) (struct file *file, void *fh, | ||
| 247 | struct v4l2_dv_preset *preset); | ||
| 248 | int (*vidioc_g_dv_preset) (struct file *file, void *fh, | ||
| 249 | struct v4l2_dv_preset *preset); | ||
| 250 | int (*vidioc_query_dv_preset) (struct file *file, void *fh, | ||
| 251 | struct v4l2_dv_preset *qpreset); | ||
| 252 | int (*vidioc_s_dv_timings) (struct file *file, void *fh, | ||
| 253 | struct v4l2_dv_timings *timings); | ||
| 254 | int (*vidioc_g_dv_timings) (struct file *file, void *fh, | ||
| 255 | struct v4l2_dv_timings *timings); | ||
| 256 | |||
| 242 | /* For other private ioctls */ | 257 | /* For other private ioctls */ |
| 243 | long (*vidioc_default) (struct file *file, void *fh, | 258 | long (*vidioc_default) (struct file *file, void *fh, |
| 244 | int cmd, void *arg); | 259 | int cmd, void *arg); |
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index 00bf17608453..7a3408f9d0f2 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h | |||
| @@ -217,6 +217,19 @@ struct v4l2_subdev_audio_ops { | |||
| 217 | 217 | ||
| 218 | s_routing: see s_routing in audio_ops, except this version is for video | 218 | s_routing: see s_routing in audio_ops, except this version is for video |
| 219 | devices. | 219 | devices. |
| 220 | |||
| 221 | s_dv_preset: set dv (Digital Video) preset in the sub device. Similar to | ||
| 222 | s_std() | ||
| 223 | |||
| 224 | query_dv_preset: query dv preset in the sub device. This is similar to | ||
| 225 | querystd() | ||
| 226 | |||
| 227 | s_dv_timings(): Set custom dv timings in the sub device. This is used | ||
| 228 | when sub device is capable of setting detailed timing information | ||
| 229 | in the hardware to generate/detect the video signal. | ||
| 230 | |||
| 231 | g_dv_timings(): Get custom dv timings in the sub device. | ||
| 232 | |||
| 220 | */ | 233 | */ |
| 221 | struct v4l2_subdev_video_ops { | 234 | struct v4l2_subdev_video_ops { |
| 222 | int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config); | 235 | int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config); |
| @@ -240,6 +253,14 @@ struct v4l2_subdev_video_ops { | |||
| 240 | int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); | 253 | int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); |
| 241 | int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize); | 254 | int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize); |
| 242 | int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival); | 255 | int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival); |
| 256 | int (*s_dv_preset)(struct v4l2_subdev *sd, | ||
| 257 | struct v4l2_dv_preset *preset); | ||
| 258 | int (*query_dv_preset)(struct v4l2_subdev *sd, | ||
| 259 | struct v4l2_dv_preset *preset); | ||
| 260 | int (*s_dv_timings)(struct v4l2_subdev *sd, | ||
| 261 | struct v4l2_dv_timings *timings); | ||
| 262 | int (*g_dv_timings)(struct v4l2_subdev *sd, | ||
| 263 | struct v4l2_dv_timings *timings); | ||
| 243 | }; | 264 | }; |
| 244 | 265 | ||
| 245 | /* | 266 | /* |
