Em 07-07-2011 11:58, Hans Verkuil escreveu:
> On Thursday, July 07, 2011 15:52:53 Mauro Carvalho Chehab wrote:
>> Em 07-07-2011 08:33, Hans Verkuil escreveu:
>>> On Wednesday, July 06, 2011 21:39:46 Mauro Carvalho Chehab wrote:
>>>> Em 06-07-2011 09:14, Hans Verkuil escreveu:
>>>>>> Em 06-07-2011 08:31, Hans Verkuil escreveu:
>>>>>>>> Em 05-07-2011 10:20, Hans Verkuil escreveu:
>>>>>>>>
>>>>>>>>>> I failed to see what information is provided by the "presets" name.
>>>>>>>>>> If
>>>>>>>>>> this were removed
>>>>>>>>>> from the ioctl, and fps would be added instead, the API would be
>>>>>>>>>> clearer. The only
>>>>>>>>>> adjustment would be to use "index" as the preset selection key.
>>>>>>>>>> Anyway,
>>>>>>>>>> it is too late
>>>>>>>>>> for such change. We need to live with that.
>>>>>>>>>
>>>>>>>>> Adding the fps solves nothing. Because that still does not give you
>>>>>>>>> specific timings.
>>>>>>>>> You can have 1920x1080P60 that has quite different timings from the
>>>>>>>>> CEA-861 standard
>>>>>>>>> and that may not be supported by a TV.
>>>>>>>>>
>>>>>>>>> If you are working with HDMI, then you may want to filter all
>>>>>>>>> supported
>>>>>>>>> presets to
>>>>>>>>> those of the CEA standard.
>>>>>>>>>
>>>>>>>>> That's one thing that is missing at the moment: that presets belonging
>>>>>>>>> to a certain
>>>>>>>>> standard get their own range. Since we only do CEA861 right now it
>>>>>>>>> hasn't been an
>>>>>>>>> issue, but it will.
>>>>>>>>
>>>>>>>> I prepared a long email about that, but then I realized that we're
>>>>>>>> investing our time into
>>>>>>>> something broken, at the light of all DV timing standards. So, I've
>>>>>>>> dropped it and
>>>>>>>> started from scratch.
>>>>>>>>
>>>>>>>> From what I've got, there are some hardware that can only do a limited
>>>>>>>> set
>>>>>>>> of DV timings.
>>>>>>>> If this were not the case, we could simply just use the
>>>>>>>> VIDIOC_S_DV_TIMINGS/VIDIOC_G_DV_TIMINGS,
>>>>>>>> and put the CEA 861 and VESA timings into some userspace library.
>>>>>>>>
>>>>>>>> In other words, the PRESET API is meant to solve the case where
>>>>>>>> hardware
>>>>>>>> only support
>>>>>>>> a limited set of frequencies, that may or may not be inside the CEA
>>>>>>>> standard.
>>>>>>>>
>>>>>>>> Let's assume we never added the current API, and discuss how it would
>>>>>>>> properly fulfill
>>>>>>>> the user needs. An API that would likely work is:
>>>>>>>>
>>>>>>>> struct v4l2_dv_enum_preset2 {
>>>>>>>>        __u32     index;
>>>>>>>>        __u8      name[32]; /* Name of the preset timing */
>>>>>>>>
>>>>>>>>        struct v4l2_fract fps;
>>>>>>>>
>>>>>>>> #define DV_PRESET_IS_PROGRESSIVE       1<<31
>>>>>>>> #define DV_PRESET_SPEC(flag)           (flag && 0xff)
>>>>>>>> #define DV_PRESET_IS_CEA861            1
>>>>>>>> #define DV_PRESET_IS_DMT               2
>>>>>>>> #define DV_PRESET_IS_CVF               3
>>>>>>>> #define DV_PRESET_IS_GTF               4
>>>>>>>> #define DV_PRESET_IS_VENDOR_SPECIFIC   5
>>>>>>>>
>>>>>>>>        __u32   flags;          /* Interlaced/progressive, DV specs, 
>>>>>>>> etc */
>>>>>>>>
>>>>>>>>        __u32   width;          /* width in pixels */
>>>>>>>>        __u32   height;         /* height in lines */
>>>>>>>>        __u32   polarities;     /* Positive or negative polarity */
>>>>>>>>        __u64   pixelclock;     /* Pixel clock in HZ. Ex. 
>>>>>>>> 74.25MHz->74250000 */
>>>>>>>>        __u32   hfrontporch;    /* Horizpontal front porch in pixels */
>>>>>>>>        __u32   hsync;          /* Horizontal Sync length in pixels */
>>>>>>>>        __u32   hbackporch;     /* Horizontal back porch in pixels */
>>>>>>>>        __u32   vfrontporch;    /* Vertical front porch in pixels */
>>>>>>>>        __u32   vsync;          /* Vertical Sync length in lines */
>>>>>>>>        __u32   vbackporch;     /* Vertical back porch in lines */
>>>>>>>>        __u32   il_vfrontporch; /* Vertical front porch for bottom 
>>>>>>>> field of
>>>>>>>>                                 * interlaced field formats
>>>>>>>>                                 */
>>>>>>>>        __u32   il_vsync;       /* Vertical sync length for bottom 
>>>>>>>> field of
>>>>>>>>                                 * interlaced field formats
>>>>>>>>                                 */
>>>>>>>>        __u32   il_vbackporch;  /* Vertical back porch for bottom field 
>>>>>>>> of
>>>>>>>>                                 * interlaced field formats
>>>>>>>>                                 */
>>>>>>>>        __u32     reserved[4];
>>>>>>>> };
>>>>>>>>
>>>>>>>> #define        VIDIOC_ENUM_DV_PRESETS2 _IOWR('V', 83, struct
>>>>>>>> v4l2_dv_enum_preset2)
>>>>>>>> #define        VIDIOC_S_DV_PRESET2     _IOWR('V', 84, u32 index)
>>>>>>>> #define        VIDIOC_G_DV_PRESET2     _IOWR('V', 85, u32 index)
>>>>>>>>
>>>>>>>> Such preset API seems to work for all cases. Userspace can use any DV
>>>>>>>> timing
>>>>>>>> information to select the desired format, and don't need to have a
>>>>>>>> switch
>>>>>>>> for
>>>>>>>> a preset macro to try to guess what the format actually means. Also,
>>>>>>>> there's no
>>>>>>>> need to touch at the API spec every time a new DV timeline is needed.
>>>>>>>>
>>>>>>>> Also, it should be noticed that, since the size of the data on the
>>>>>>>> above
>>>>>>>> definitions
>>>>>>>> are different than the old ones, _IO macros will provide a different
>>>>>>>> magic
>>>>>>>> number,
>>>>>>>> so, adding these won't break the existing API.
>>>>>>>>
>>>>>>>> So, I think we should work on this proposal, and mark the existing one
>>>>>>>> as
>>>>>>>> deprecated.
>>>>>>>
>>>>>>> This proposal makes it very hard for applications to directly select a
>>>>>>> format like 720p50 because the indices can change at any time.
>>>>>>
>>>>>> Why? All the application needs to do is to call VIDIOC_ENUM_DV_PRESETS2,
>>>>>> check what line it wants,
>>>>>
>>>>> It's not so easy as you think to find the right timings: you have to check
>>>>> many parameters to be certain you have the right one and not some subtle
>>>>> variation.
>>>>>
>>>>>> and do a S_DV_PRESET2, just like any other place
>>>>>> where V4L2 defines an ENUM function.
>>>>>>
>>>>>> The enum won't change during application runtime, so, they can be stored
>>>>>> if the application would need to switch to other formats latter.
>>>>>>
>>>>>>> I think
>>>>>>> this is a very desirable feature, particularly for apps running on
>>>>>>> embedded systems where the hardware is known. This was one of the design
>>>>>>> considerations at the time this API was made.
>>>>>>
>>>>>> This is a very weak argument. With just one ENUM loop, the application 
>>>>>> can
>>>>>> quickly get the right format(s), and associate them with any internal
>>>>>> namespace.
>>>>>
>>>>> That actually isn't easy at all.
>>>>
>>>> For the trivial case where the application just wants one of the CEA861 
>>>> standard
>>>> (or VESA DMT), the check is trivial.
>>>>
>>>>
>>>> The speed of the test can even be improved if the order at the struct would
>>>> be changed to be:
>>>>
>>>> struct v4l2_dv_enum_preset2 {
>>>>    __u32   index;
>>>>    __u32   flags;
>>>>
>>>>    struct v4l2_fract fps;
>>>>    __u32   width;          /* width in pixels */
>>>>    __u32   height;         /* height in lines */
>>>>
>>>>    ...
>>>> }
>>>>
>>>> The dv preset seek routine at the application can then be coded as:
>>>>
>>>> struct seek_preset {               /* Need to follow the same 
>>>> order/arguments as v4l2_dv_enum_preset2 */
>>>>    struct v4l2_fract fps;
>>>>    __u32   width;
>>>>    __u32   height;
>>>> };
>>>>
>>>> struct myapp_preset {
>>>>    __u32 flags;
>>>>
>>>>    struct seek_preset preset;
>>>> };
>>>>
>>>> struct  myapp_preset cea861_vic16  = {
>>>>    .flags = DV_PRESET_IS_PROGRESSIVE | DV_PRESET_IS_CEA861,
>>>>    .width = 1920,
>>>>    .height = 1080,
>>>> };
>>>>
>>>> int return_dv_preset_index(fp, struct  myapp_preset *needed)
>>>> {
>>>>    int found = -1;
>>>>    struct v4l2_dv_enum_preset2 preset;
>>>>    do {
>>>>            rc = ioctl(fp, VIDIOC_ENUM_DV_PRESETS, &preset);
>>>>            if (rc == -1)
>>>>                    break;
>>>>            if ((preset.flags & needed->flags) != needed->flags)
>>>>                    continue;
>>>>            if (!memcmp(&preset.fps, &needed->preset)) {
>>>>                    found = preset->index;
>>>>                    break;
>>>>            }       
>>>>    } while (!rc && found < 0);
>>>> }
>>>>
>>>> void main(void) {
>>>> ...
>>>>    index = return_dv_preset_index(fp, cea861_vic16);
>>>> ...
>>>> }
>>>
>>> And the current equivalent is:
>>>
>>>     struct v4l_dv_preset preset = { V4L2_DV_1080P60 };
>>>     ioctl(f, VIDIOC_S_DV_PRESET, &preset);
>>
>> Yes, except for the fact that:
>>      - API spec needs addition for every new preset that we standardize;
> 
> True. But I believe that it is very useful to have such standardized presets.

Here is one of the points that we disagree. I think that a proper seek mechanism
is preferred, providing more information for the userspace to do the right 
choice.

> 
>>      - It doesn't support a vendor-specific preset, as there's no way to
>>        discover what are the timing constants for the preset;
> 
> That's why I propose a G_PRESET_TIMINGS.
> 
> In my experience most applications do not care about such timings unless you 
> want to
> support a wide range of formats, in which case you are more likely to use the 
> DV_TIMINGS
> API (if supported by the hardware). Note that the fps+flags fields should 
> certainly
> be added to v4l2_enum_dv_preset. No doubt about that.

If hardware or driver doesn't support, apps need to use the preset API.

>>      - Namespacing is broken.
> 
> That could be improved, indeed. Deciding on a right namespace isn't that 
> easy, though.

I seriously doubt that we could find a proper future-proof namespacing. 
Standards will
add more things, and might eventually review a few badly-specified timings.

>>> You want a whole new API that in my view makes things only more complicated 
>>> and
>>> misses existing functionality (such as the one above).
>>
>> I prefer to fix the API, if it is possible/doable on a non-messy way. Yet, 
>> as this
>> API is currently used only by two drivers (DaVinci and tvp7002), it is 
>> better to fix
>> it sooner than later, to avoid more efforts on fixing it.
>>  
>>> Whereas with a few tweaks and possibly a new VIDIOC_G_PRESET_TIMINGS ioctl 
>>> you
>>> can offer the same functionality with the existing API.
>>
>> You're proposing a new "enum" preset timings that would present the missing 
>> info
>> that VIDIOC_S_DV_PRESET doesn't present, except that an application will 
>> need to call
>> 2 ioctl's in order to enumerate the presets, instead of one.
> 
> Very few applications actually need such precise information. Resolution, fps 
> and
> interlaced/progressive is enough for most.

most =! all. Removing the amount of provided information due to the assumption 
that applications
may not want is a wrong decision for such API. There's no big deal on providing 
all preset
parameters to userspace. This is not a time-critical API, and will be called 
once at the
application runtime. 

If, on some particular application, a developer found that this might actually 
represent
a significant amount of time for whatever reason (with I seriously doubt), it 
could just code a 
"cache" file that will be filled the first time the application boots with a 
new kernel, 
replicating exactly the same mechanism as you've conceived before: once the 
association is 
found, it will just use the index discovered at the first run.

>>> So, once again my proposal:
>>>
>>> ENUM_DV_PRESETS is extended with a flags field and a fps v4l2_fract (or 
>>> frame_period,
>>> whatever works best). Flags give you progressive vs interlaced, and I've no 
>>> problem
>>> adding things like IS_CEA861 or similar flags to that.
>>>
>>> The current set of presets remain in use (but get renamed with the old ones 
>>> as aliases)
>>> for CEA861 and (in the near future) VESA DMT timings. 
>>
>>
>>> Note that all the hardware I
>>> know that has predefined timings does so only for those two standards. 
>>> Makes sense
>>> too: only the consumer electronic standards for SDTV/HDTV and the VGA-like 
>>> PC monitor
>>> standards are typical standards.
>>
>> We need a further investigation about that. What are the predefined timings 
>> defined for Samgung
>> hardware?
>>
>> Also, one possible implementation for output devices would be to use EDID to 
>> retrieve the
>> timings acceptable by the monitor/TV and compare to its internal 
>> capabilities. This is
>> probably the only way to avoid requiring CAP_SYS_ADMIN for the DV calls, as 
>> a bad timing
>> may damage the monitor and/or the V4L device.
> 
> Is CAP_SYS_ADMIN needed today to set graphics modelines? I am not aware of 
> any checks being
> done (other than probably against EDID information, if present).

With great power comes great responsibility. The VESA FB driver explicitly 
checks for CAP_SYS_ADMIN.
Xorg process runs as root, as almost all resources required for controlling the 
video display
requires root, and a non-root access may damage the hardware and/or BIOS. The 
security solution
used there is to lock things like /dev/mem to be accessible only by root (e. g. 
the entire char 
device is protected).

In the case of V4L, we need to provide an ioctl-based security mechanism, as 
only a very few
set of ioctl's can be dangerous.

> To my (limited) knowledge hardware that can be broken that way is very, very 
> old and
> very unlikely to have EDID capabilities.

A quick Google search for "permanent damage lcd due to wrong video settings" 
hits 5.380.000 pages.
A look at those two specs:

        
http://www.viewsonic.com.au/support/manuals/files/LCD/Series%20X/VX510-1%20User%20Guide%20English.pdf
        http://pt.scribd.com/doc/20791522/VA2226w-LCD-Display

Both have the same kind of warning:

WARNING: Do not set the graphics card in your computer to exceed the
        maximum refresh rate of 85Hz/ 1024 x 768@75Hz;
        doing so may result in permanent damage to your LCD display.
(VX510 manual, page 7. A similar text is at page 8 of VA2226w manual)

The VA2226w manual was written in 2008, so it is very likely that it supports 
EDID.

So, AFAIK, your assumption is wrong. Monitors can be damaged if a wrong DV 
timing is selected.

We need to restrict the DV S_ preset/timings calls for output devices with 
CAP_SYS_ADMIN, except
if the driver or firmware provides some other explicit mechanism to protect 
such damages.

>> If a vendor decides to implement something like that (either in firmware or 
>> on Kernel), then 
>> the list of presets will likely have a mix with all standards.
> 
> The EDID does not make the list of presets, that is based on the capabilities 
> of the
> transmitter (or receiver, for that matter). The EDID may be used to filter 
> the list of
> presets, though.

Yes, that's what I meant to say. Setting to a timing that is compatible with 
EDID information
doesn't need to require root access, but it there's no such check in 
kernel/hardware/firmware,
then userspace calls need protection mechanisms.

>>> For presets not related to those standards the easiest method I see is just 
>>> to assign
>>> a preset like (0x80000000 | index).
>>
>> I've thinked about that already. Yeah, this would fix part of the problem, 
>> allowing
>> the implementation of vendor-specific timings and the support for other 
>> standards not
>> covered yet. There are, however, some issues:
>>      1) the API will be messier;
>>      2) Imagine that a new timing were added as a vendor-specific timing. 
>> Later,
>> that standard got recognized by some forum and were added at some standard. 
>> In that
>> case, the vendor cannot simply change the preset index, as it will break the 
>> API.
> 
> Why would that break the API? The preset was 0x80000000 | 42 (or whatever), 
> now it
> becomes V4L2_DV_FOO_WXHP50. You couldn't rely on the first preset to stay the 
> same
> anyway.

Because the preset index is a sequential number. V4L2_DV_FOO_WXHP50 is index 
#42 on driver 
foo, but it may have index #10 on other drivers.

See the issue? Using a preset macro for seek is not flexible.

An implementation like G_PRESET_FOR_STD that will return the index for a macro 
name
and a full-featured preset ENUM would be better than the current mechanism.

Yet, I fail to see that seeking for a preset internally at the driver (either 
with 
the current G/S PRESET ioctl's or with a newly G_PRESET_FOR_STD) would really 
bring
and significant performance improvement to justify not implementing an ENUM loop
in userspace.

>> Also, duplicating the information is not a good idea. With the preset 
>> standards as
>> flags, when this happens, all the driver needs is to add a new flag, without 
>> breaking
>> the API.
>>
>>> We may need to add a VIDIOC_G_PRESET_TIMINGS, but I am not certain we 
>>> really need
>>> that. ENUM_DV_PRESETS may give sufficient information already.
>>
>> This will only work if there aren't two timings with the same 
>> fps/resolution, including
>> on the vendor-specific timings. Let's suppose that there are two non-DMT, 
>> non-CEA
>> standars, from two different vendors, that have different timings. With the 
>> current
>> API, there's no way to differentiate them.
> 
> That's why G_PRESET_TIMINGS may be necessary. I'm just doubtful that 
> applications will
> know what to do with that information.
>  
>>> Based on my experience with GTF/CVT formats I strongly suspect that drivers 
>>> will
>>> need to implement a VIDIOC_QUERY_DV_TIMINGS ioctl and let a userspace 
>>> library detect
>>> the GTF/CVT standard. This is surprisingly complex (mostly due to extremely 
>>> shoddy
>>> standards). 
>>
>> Maybe, but I bet that there are a few GTF/CVT standards that are implemented 
>> on
>> a large amount of TV/monitors. It may make sense to have those added as 
>> presets.
> 
> Sure, many TVs and monitors support GTF and CVT, but they are not presets as 
> such
> but algorithms to allow almost all possible combinations of resolution and 
> fps.
> 
> CVT formats can be detected based on hsync and vsync polarities and the 
> vertical
> sync width. GTF is much harder to detect, unfortunately.
> 
> The CEA standard has only positive hsync+vsync or negative hsync+vsync 
> polarities.
> Except for one single timing (VIC 39). Which @#$^%@@ imbecile came up with 
> that
> bright idea?!
> 
>> I'd love to get some feedback from other developers about that. Samsung?
>>
>> The issue with S_DV_TIMINGS is that we likely need to request for 
>> CAP_SYS_ADMIN,
>> as a bad timing may damage the hardware.
> 
> How would this help? Changing my graphics card resolution today doesn't 
> require me to
> be root either. 

It does requre. Xorg runs as root:

$ ls -la /usr/bin/Xorg
-rws--x--x 1 root root 1932152 Abr  7 18:46 /usr/bin/Xorg

This type of permission was ever required since XFree86 old days.

> The only time this might conceivably be an issue is for analog
> video transmitters. I would need to do more research on this. Does anyone 
> else know
> much about what constitutes a bad timing and how it might damage hardware?
> 
>> Currently, there's not such requirement for DaVinci/tvp7002, nor v4l2-ioctl 
>> enforces
>> that, but this needs a fix.
>>
>>> For GTF/CVT output you want to use VIDIOC_S_DV_TIMINGS anyway.
>>
>> True.
>>
>>> The reason
>>> there is no GTF/CVT support yet is simply because I don't want to make 
>>> proposals
>>> unless I actually implemented it and worked with it for some time to see 
>>> what works
>>> best.
>>>
>>> Everything you can do with your proposal you can do with mine, and mine 
>>> doesn't
>>> deprecate anything.
>>
>> See above.
>>
>>> BTW, in the case of HD-SDI transmitters/receivers the CEA-861 standard does 
>>> not
>>> apply, strictly speaking. That standard is covered by SMPTE 292M. It does 
>>> support
>>> most of the usual SDTV/HDTV formats as are defined in CEA-861, except that 
>>> things
>>> like front/back porch etc. do not apply to this serial interface. The idea 
>>> behind
>>> the presets is that it defines industry standard resolution/framerate 
>>> combinations,
>>> but the standards behind those differ per interface type. You don't really 
>>> care
>>> about those in an application. The user (or developer) just wants to select 
>>> 1080P60 or
>>> WUXGA. 
>>
>> Ok.
>>
>>> I am frankly not certain anymore if we want to have the standard as part of
>>> the macro name. Something like V4L2_DV_HDTV_1920X1080P60 might be more 
>>> appropriate,
>>> with comments next to it referring to the relevant standards depending on 
>>> the
>>> physical interface type.
>>
>> That's the problem with the namespace. I think that that's basically the 
>> reason why
>> Xorg never created a macro naming for the resolutions. Whatever namespace we 
>> choose,
>> we'll have troubles. I bet that, with your proposal, we'll end by having 
>> conflicts
>> between two different standards that implement the same 
>> resolution/fps/"progressiveness".
>>
>>> And instead of using flags to denote the used standard, it might be better 
>>> to
>>> reserve a u16 for the standard.
>>
>> It seems that a standards bitmask may work better, as, eventually, the same 
>> timing may
>> be defined by more than one standard.
> 
> That's makes the interesting assumption that there will be no more than 32 
> standards :-)

:) Well, we may use u64 ;)

I'm in doubt between using u16 or a bitmask, as we may have the same timings 
defined
on two or more standards.

>>> History has shown that video formats stay around for a looong time, but the 
>>> standards
>>> describing them evolve continuously.
>>
>> True. We might end to have some timings that are different on a new standard 
>> revision,
>> in order to fix some issue. That's why I think we need to expose all the 
>> timings at
>> the DV enum ioctl. This gives more flexibility to the application to reject 
>> an specific
>> standard if needed for whatever reason.
> 
> Let's stop discussing this for a bit until we get some feedback from others. 
> It's more
> a ping-pong match between us right now and I would really like to hear the 
> opinions of
> others (Samsung in particular).

Agreed.

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

Reply via email to