RE: RFC (v1.1): V4L - Support for video timings at the input/output interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hans,

So the only change will be about renaming the flags..

Do you expect LCD VESA timings defined by V4L2_DV_BT_656_1120 timing type?

I will update the RFC with capabilities flags renamed as discussed and re-send it and work on implementation based on this version.

Murali Karicheri
Software Design Engineer
Texas Instruments Inc.
Germantown, MD 20874
email: m-karicheri2@xxxxxx

>-----Original Message-----
>From: Hans Verkuil [mailto:hverkuil@xxxxxxxxx]
>Sent: Saturday, October 10, 2009 2:39 PM
>To: Karicheri, Muralidharan
>Cc: linux-media@xxxxxxxxxxxxxxx
>Subject: Re: RFC (v1.1): V4L - Support for video timings at the
>input/output interface
>
>On Saturday 10 October 2009 17:07:36 Karicheri, Muralidharan wrote:
>> Hans,
>>
>> ________________________________________
>> From: Hans Verkuil [hverkuil@xxxxxxxxx]
>> Sent: Friday, October 09, 2009 10:43 AM
>> To: Karicheri, Muralidharan
>> Cc: linux-media@xxxxxxxxxxxxxxx
>> Subject: Re: RFC (v1.1): V4L - Support for video timings at the
>input/output interface
>>
>> i Murali,
>>
>> Reading through this I noticed that there was one thing that is probably
>> no longer needed: now that we have the SUPPORTS_CUSTOM_TIMING capability
>> there is no need to include the CUSTOM preset when enumerating presets.
>> Instead I suggest that the INVALID preset define takes the place of the
>> CUSTOM preset.
>>
>> [MK] Ok.
>>
>> Also, these capabilities should probably be renamed to
>> V4L2_IN_CAP_STD/PRESETS/CUSTOM.
>>
>> This is more in line with the current naming convention.
>>
>>
>> [MK] I think this is only partially correct. These presets applies to
>OUTPUT as well. So We might want to
>> define V4L2_OUT_CAP_STD/PRESETS/CUSTOM as well or Keep it as is.
>
>I got confused here by the tuner and modulator flags where the tuner flags
>are reused by the modulator flags. Sorry about that.
>
>So I think it is best to have both V4L2_IN_CAP and V4L2_OUT_CAP defines.
>These
>may initially be the same, but I would not be surprised if we start seeing
>caps that are unique to either input or output in the future. Just my
>opinion,
>though.
>
>>
>>
>> Otherwise I think this is pretty good.
>>
>> One thing: did you check against the FB API? We should have at least the
>> same timing parameters as they have (it is my understanding that timings
>> can also be setup through the FB API).
>>
>> In FB, following parameters defined for video mode..... I have mapped it
>to
>> timing parameter below. I have used modedb.c to understand the parameters.
>>
>> Probably add a timing type for VESA and a structure similar to
>fb_videomode???
>>
>> struct fb_videomode {
>>         const char *name;       /* optional */       - Missing in our API
>
>I don't see a good reason for adding this.
>
>>         u32 refresh;            /* optional */             - Missing in
>out API.
>
>This can be calculated from the other arguments.
>
>>         u32 xres;                                                     -
>width
>>         u32 yres;                                                     -
>height
>>         u32 pixclock; -                                           -
>pixelclock
>>         u32 left_margin;                                       -
>hfrontporch (should we rename to left_margin ??)
>>         u32 right_margin;                                    -  Need to
>derive - should we add right margin??
>>         u32 upper_margin;                                 -  vfrontporch
>(should we rename to upper margin??)
>>         u32 lower_margin;                                  - Need to
>derive - should we add lower margin??)
>
>h/vfrontporch is more standard than margin, so I vote for keeping that
>terminology. Neither should we add right/lower margin. We have total
>width/height instead which is also more commonly used.
>
>>         u32 hsync_len;                                        -  hsync -
>better to rename this as hsync_len
>>         u32 vsync_len;                                        - vsync -
>better to rename
>
>No need for a rename IMHO. If we do that, then hfrontporch and htotal also
>need to be renamed.
>
>The important bit is that all the same timings are represented here.
>
>>         u32 sync;                                                 -
>polarities
>>         u32 vmode;                                             -
>interlaced
>>         u32 flag;                                                   -
>Missing. May be add this ???
>
>Are there any flags defined? We have reserved fields that we can utilize in
>the future.
>
>Regards,
>
>       Hans
>
>> };
>>
>> Out timing definition.....
>>
>> > /* bt.656/bt.1120 timing data */
>> > struct v4l2_bt_timings {
>> >     __u32      interlaced;
>> >     __u64      pixelclock;
>> >     __u32      width, height;
>> >     __u32      polarities;
>> >     __u32      hfrontporch, hsync, htotal;
>> >     __u32      vfrontporch, vsync, vtotal;
>> >     /* timings for bottom frame for interlaced formats */
>> >     __u32      il_vtotal;
>> >     __u32      reserved[16];
>> > };
>>
>>
>> Regards,
>>
>>          Hans
>>
>> > Hello,
>> >
>> > Here is the version 1.1 of the RFC which will be used for implementing
>> > the video timing APIs in the V4L2 core. Please review and let me know
>> > if I have missed something. Following are the changes incorporated in
>this
>> > version :-
>> >
>> > 1) Added width and height parameters in the struct v4l2_dv_enum_presets
>> >
>> > 2) Corrected duplicate values in the defined preset values
>> >
>> > 3) Added following capability to indicate if the driver supports
>setting
>> > standards through existing S_STD IOCTL.
>> >
>> >       #define V4L2_SUPPORTS_STD                0x00000004
>> >
>> > 4) Removed negative Polarity masks
>> >
>> > 5) Added issue #7 for camera sensor frame size/frame rate setting.
>> >
>> >
>===========================================================================
>=
>> > RFC (v1.1): V4L - Support for video timings at the input/output
>interface
>> >
>> > Version : 1.1
>> >
>> > Background
>> > -----------
>> >
>> > Currently v4l2 specification supports capturing video frames from TV
>> > signals using tuners (input type V4L2_INPUT_TYPE_TUNER) and baseband TV
>> > signals (V4L2_INPUT_TYPE_CAMERA) and sensors. Similarly on the output
>> > side, the signals could be TV signal (V4L2_OUTPUT_TYPE_MODULATOR),
>> > baseband TV signal (V4L2_OUTPUT_TYPE_ANALOG) or hybrid analog VGA
>overlay
>> > (V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY) which output from a graphics card
>and
>> > then use chromakeying to replace part of the picture with the video.
>> > V4L2_OUTPUT_TYPE_ANALOG & V4L2_INPUT_TYPE_CAMERA are for analog
>interfaces
>> > that includes composite, S-Video and VGA (for output only). Note that
>even
>> > though VGA is a supported output, we don't have anyway to set the
>standard
>> > or timing on the output. Standard ids are only defined for TVs using
>> > v4l2_std_id and a set of bit masks  defined for analog TV standards.
>> >
>> > Today we have a wide variety of different interfaces available to
>> > transmit/receive video or graphics content between source device and
>> > destination device. Following are some of the interfaces used in
>addition
>> > to the ones described in the v4l2 specification.
>> >
>> > Component analog input/output interface - ED/HD video
>> > DVI - Digital only, ANALOG only, DVI integrated that support Digital
>and
>> >       Analog;
>> >       Dual Link - Where second data link is used for higher bandwidth
>> > SDI - Serial digital interface standardized by SMPTE
>> > HDMI - HD video and Audio
>> > DisplayPort - digital audio/video interconnect by VESA
>> >
>> > V4L2 specification currently defined NTSC/PAL/SECAM (all variants)
>> > standards for describing the timing of the signal transmitted over
>these
>> > interfaces. Even though the specification defined ANALOG output type
>for
>> > VGA, there are no ways to set the timings used for output to VGA or LCD
>> > display monitors. Some of the proprietary implementations used existing
>> > standards IOCTL, VIDIOC_S_STD, to set these timings over these
>interfaces.
>> > For example, TI SoCs have Video Processing Back End (VPBE) on various
>> > media SOCs (Eg, DM6446, DM355 etc) that can output signal for Analog TV
>> > and VGA interfaces (using Digital LCD port) and support timings for
>> > displaying SD and HD videos (1080i, 1080p and 720p) as well as over VGA
>> > interface to a CRT or LCD display monitor. So we need to enhance the
>v4l2
>> > specification to allow applications to set these timings in the capture
>or
>> > output devices. This RFC proposes to add new IOCTLs for setting/getting
>> > timings over the different interfaces described above and freeze the
>the
>> > use of existing standards IOCTL and standards IDs for analog TVs only.
>> >
>> > Timings
>> > -------
>> >
>> > The timings at the analog or digital interface that are not covered by
>the
>> > v4l2_std_id can be defined using a set of preset values that are used
>by
>> > the hardware where the timings are predefined or by a set of timing
>values
>> > which can be configured at the hardware to generate the signal expected
>at
>> > the interface. The former will be used for hardware like
>TVP7002/THS8200
>> > which specifies preset timing required for output HD video such
>> > 1080i50/60, 720p50/60 etc. The latter can be used for hardware that
>> > requires configuration of frame timing such as front porch, hsync
>length,
>> > vsync length, pixel clock etc. For example the earlier mentioned TI
>SOCs
>> > have a Digital LCD port that can be configured to output different
>timing
>> > values expected by LCD Display monitors.
>> >
>> > Preset timings (defined by VESA, SMPTE or BT.656/BT.1120 or others) can
>be
>> > defined by the following structure:-
>> >
>> > struct v4l2_dv_preset {
>> >     __u32    preset;
>> >     __u32    reserved[4];
>> > };
>> >
>> > Where preset is one of the following values:-
>> >
>> > #define         V4L2_DV_CUSTOM         0x00000000
>> > #define       V4L2_DV_480I59_94      0x00000001
>> > #define       V4L2_DV_480I60         0x00000002
>> > #define       V4L2_DV_480P23_976     0x00000003
>> > #define       V4L2_DV_480P24         0x00000004
>> > #define       V4L2_DV_480P29_97      0x00000005
>> > #define       V4L2_DV_480P30         0x00000006
>> > #define       V4L2_DV_576I50         0x00000007
>> > #define       V4L2_DV_576P25         0x00000008
>> > #define       V4L2_DV_576P50         0x00000009
>> > #define       V4L2_DV_720P23_976     0x0000000A
>> > #define       V4L2_DV_720P24         0x0000000B
>> > #define       V4L2_DV_720P25         0x0000000C
>> > #define       V4L2_DV_720P29_97      0x0000000D
>> > #define       V4L2_DV_720P30         0x0000000E
>> > #define       V4L2_DV_720P50         0x0000000F
>> > #define       V4L2_DV_720P59_94      0x00000010
>> > #define       V4L2_DV_720P60         0x00000011
>> > #define       V4L2_DV_1080I50        0x00000012
>> > #define       V4L2_DV_1080I59_94     0x00000013
>> > #define       V4L2_DV_1080I60        0x00000014
>> > #define       V4L2_DV_1080P23_976    0x00000015
>> > #define       V4L2_DV_1080P24        0x00000016
>> > #define       V4L2_DV_1080P25        0x00000017
>> > #define       V4L2_DV_1080P29_97     0x00000018
>> > #define       V4L2_DV_1080P30        0x00000019
>> > #define       V4L2_DV_1080P60        0x00000020
>> >
>> >
>> > /* Following preset value is used by driver to indicate there is no
>signal
>> >  detected or could not lock to the signal for VIDIOC_QUERY_DV_PRESET.
>> > */
>> > #define       V4L2_DV_INVALID       0xFFFFFFFF
>> >
>> >
>> > This list is expected grow over time. So a bit mask is not used for
>this
>> > (Unlike analog TV standards) so that many presets can be defined as
>needed
>> > in the future.
>> >
>> > To enumerate the DV preset timings available, applications call
>> > VIDIOC_ENUM_DV_PRESETS using the following structure:-
>> >
>> > struct v4l2_dv_enum_presets {
>> >         __u32     index;
>> >         __u32     preset;
>> >         __u8      name[32]; /* Name of the preset timing */
>> >         __u32     width;
>> >         __u32     height;
>> >         __u32     reserved[4];
>> > };
>> >
>> > Application set/get the preset by calling VIDIOC_S/G_DV_PRESET using
>> > v4l2_dv_preset structure.
>> >
>> > Also add a capabilities field in the input and output structure to
>support
>> > presets
>> >
>> > /*
>> >  *      V I D E O   I N P U T S
>> >  */
>> > struct v4l2_input {
>> >         __u32        index;             /*  Which input */
>> >         __u8         name[32];          /*  Label */
>> >         __u32        type;              /*  Type of input */
>> >         __u32        audioset;          /*  Associated audios
>(bitfield)
>> > */
>> >         __u32        tuner;             /*  Associated tuner */
>> >         v4l2_std_id  std;
>> >         __u32        status;
>> >         __u32        capabilities;
>> >         __u32        reserved[3];
>> > };
>> >
>> > /*
>> >  *      V I D E O   O U T P U T S
>> >  */
>> > struct v4l2_output {
>> >         __u32        index;             /*  Which output */
>> >         __u8         name[32];          /*  Label */
>> >         __u32        type;              /*  Type of output */
>> >         __u32        audioset;          /*  Associated audios
>(bitfield)
>> > */
>> >         __u32        modulator;         /*  Associated modulator */
>> >         v4l2_std_id  std;
>> >         __u32        capabilities;
>> >         __u32        reserved[3];
>> > };
>> >
>> > where capabilities can be one or more of the following:-
>> >
>> > #define V4L2_SUPPORTS_PRESETS        0x00000001
>> > #define V4L2_SUPPORTS_CUSTOM_TIMINGS 0x00000002
>> > #define V4L2_SUPPORTS_STD              0x00000004
>> >
>> > For setting custom timing at the device, following structure is used
>which
>> > defines the complete set of timing values required at the input and
>output
>> > interface:-
>> >
>> > /* timing data values specified by various standards such as BT.1120,
>> > BT.656 etc. */
>> >
>> > /* bt.656/bt.1120 timing data */
>> > struct v4l2_bt_timings {
>> >     __u32      interlaced;
>> >     __u64      pixelclock;
>> >     __u32      width, height;
>> >     __u32      polarities;
>> >     __u32      hfrontporch, hsync, htotal;
>> >     __u32      vfrontporch, vsync, vtotal;
>> >     /* timings for bottom frame for interlaced formats */
>> >     __u32      il_vtotal;
>> >     __u32      reserved[16];
>> > };
>> >
>> >
>> > interlaced - Interlaced or progressive. use following values:-
>> >
>> > #define V4L2_DV_INTERLACED      0
>> > #define V4L2_DV_PROGRESSIVE    1
>> >
>> > pixelclock - expressed in HZ. So for 74.25MHz, use 74250000.
>> > width - number of pixels in horizontal direction
>> > height - number of lines in vertical direction
>> > polarities - Bit mask for following polarities to begin with
>> > (if polarity bit is not set, corresponding polarity is assumed to be
>> > negative)
>> >
>> > #define V4L2_DV_VSYNC_POS_POL    0x00000001
>> > #define V4L2_DV_HSYNC_POS_POL    0x00000002
>> >
>> > hfrontporch,hsync, and htotal for horizontal direction and vfrontporch,
>> > vsync, and vtotal for vertical direction. il_vtotal is the number of
>> > vertical lines for interlaced video for bottom field.
>> >
>> > To define a particular timing type, following enum is used:-
>> >
>> > enum v4l2_dv_timings_type {
>> >         V4L2_DV_BT_656_1120,
>> > };
>> >
>> > This will allow adding new timing types in the future.
>> >
>> > If the driver supports a set of custom timing, it can be set/get using
>> > VIDIOC_S/G_DV_TIMINGS IOCTL and specifying timings using the structure
>> >
>> > struct v4l2_dv_timings {
>> >         enum v4l2_dv_timings_type type;
>> >         union {
>> >                 struct v4l2_bt_timings bt;
>> >                 __u32 reserved[32];
>> >         };
>> > };
>> >
>> >
>> > If the driver supports custom timing as well as Presets, it will return
>> > V4L2_DV_CUSTOM along with other preset timings for the
>> > VIDIOC_ENUM_DV_PRESETS IOCTL call. Application can then call
>> > VIDIOC_S/G_TIMING to get/set custom timings at the driver.
>> >
>> > To detect a preset timing at the input application calls
>> > VIDIOC_QUERY_DV_PRESET which returns the preset using the
>v4l2_dv_preset
>> > structure.
>> >
>> > Following summarize the new ioctls added by this RFC
>> >
>> > #define VIDIOC_ENUM_DV_PRESETS   _IOWR('V', 79, struct
>> > v4l2_dv_enum_presets)
>> > #define VIDIOC_S_DV_PRESET       _IOWR('V', 80, struct v4l2_dv_preset)
>> > #define VIDIOC_G_DV_PRESET       _IOWR('V', 81, struct v4l2_dv_preset)
>> > #define VIDIOC_QUERY_DV_PRESET   _IOR('V',  82, struct v4l2_dv_preset)
>> > #define VIDIOC_S_DV_TIMINGS      _IOWR('V', 83, struct v4l2_dv_timings)
>> > #define VIDIOC_G_DV_TIMINGS      _IOWR('V', 84, struct v4l2_dv_timings)
>> >
>> > Open issues
>> > -----------
>> >
>> > 1.How to handle an HDMI transmitter? It can be put in two different
>modes:
>> > DVI compatible
>> > or HDMI compatible. Some of the choices are
>> >         a) enumerate them as two different outputs when enumerating.
>> >         b) adding a status bit on the input.
>> >         c) change it using a control
>> >
>> > 2. Detecting whether there is an analog or digital signal on an DVI-I
>> > input:
>> >       a) add new status field value for v4l2_input ?
>> >          #define  V4L2_IN_ST_DVI_ANALOG_DETECTED    0x10000000
>> >          #define  V4L2_IN_ST_DVI_DIGITAL_DETECTED   0x20000000
>> >
>> > 3. Detecting an EDID.
>> >       a) adding a status field in v4l2_output and two new ioctls that
>can set
>> > the EDID for an input or retrieve it for an output. It should also be
>> > added as an input/output capability.
>> >
>> > 4. ATSC bits in v4l2_std_id: how are they used? Are they used at all
>for
>> > that matter?
>> > 5. There are a lot of status bits defined in v4l2_input, but only a few
>> > are actually used. What are we going to do with that?
>> >
>> > 6. HDMI requires additional investigation. HDMI defines a whole bunch
>of
>> > infoframe fields. Most of these can probably be exported as controls??
>Is
>> > HDMI audio handled by alsa?
>> >
>> > 7. Can sensor driver use the same API for setting frame size and frame
>> > rate? It was discussed and the general agreement was to use this API
>only
>> > for video timing.
>> >
>> >
>> > Murali Karicheri
>> > Software Design Engineer
>> > Texas Instruments Inc.
>> > Germantown, MD 20874
>> > email: m-karicheri2@xxxxxx
>> >
>> > --
>> > To unsubscribe from this list: send the line "unsubscribe linux-media"
>in
>> > the body of a message to majordomo@xxxxxxxxxxxxxxx
>> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> >
>>
>>
>> --
>> Hans Verkuil - video4linux developer - sponsored by TANDBERG Telecom
>>
>>
>>
>>
>
>
>
>--
>Hans Verkuil - video4linux developer - sponsored by TANDBERG Telecom

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux