All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: Hans Verkuil <hverkuil@xs4all.nl>
Cc: linux-media@vger.kernel.org, Hans Verkuil <hans.verkuil@cisco.com>
Subject: Re: [RFCv1 PATCH 1/6] videodev2.h: add enum/query/cap dv_timings ioctls.
Date: Tue, 28 Feb 2012 08:14:54 -0300	[thread overview]
Message-ID: <4F4CB72E.6080302@redhat.com> (raw)
In-Reply-To: <201202281206.17474.hverkuil@xs4all.nl>

Em 28-02-2012 08:06, Hans Verkuil escreveu:
> On Tuesday, February 28, 2012 11:54:54 Mauro Carvalho Chehab wrote:
>> Em 03-02-2012 08:06, Hans Verkuil escreveu:
>>> From: Hans Verkuil <hans.verkuil@cisco.com>
>>>
>>> These new ioctls make it possible for the dv_timings API to replace
>>> the dv_preset API eventually.
>>>
>>> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
>>> ---
>>>  include/linux/videodev2.h |  110 ++++++++++++++++++++++++++++++++++++++++----
>>>  1 files changed, 100 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
>>> index 0db0503..e59cd02 100644
>>> --- a/include/linux/videodev2.h
>>> +++ b/include/linux/videodev2.h
>>> @@ -987,28 +987,42 @@ struct v4l2_dv_enum_preset {
>>>   */
>>>  
>>>  /* BT.656/BT.1120 timing data */
>>> +
>>> +/*
>>> + * A note regarding vertical interlaced timings: height refers to the total
>>> + * height of the frame (= two fields). The blanking timings refer
>>> + * to the blanking of each field. So the height of the active frame is
>>> + * calculated as follows:
>>> + *
>>> + * act_height = height - vfrontporch - vsync - vbackporch -
>>> + *                       il_vfrontporch - il_vsync - il_vbackporch
>>> + *
>>> + * The active height of each field is act_height / 2.
>>> + */
>>>  struct v4l2_bt_timings {
>>> -	__u32	width;		/* width in pixels */
>>> -	__u32	height;		/* height in lines */
>>> +	__u32	width;		/* total frame width in pixels */
>>> +	__u32	height;		/* total frame height in lines */
>>>  	__u32	interlaced;	/* Interlaced or progressive */
>>>  	__u32	polarities;	/* Positive or negative polarity */
>>>  	__u64	pixelclock;	/* Pixel clock in HZ. Ex. 74.25MHz->74250000 */
>>> -	__u32	hfrontporch;	/* Horizpontal front porch in pixels */
>>> +	__u32	hfrontporch;	/* Horizontal 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_vfrontporch;	/* Vertical front porch for the even field
>>> +				 * (aka field 2) of interlaced field formats
>>>  				 */
>>> -	__u32	il_vsync;	/* Vertical sync length for bottom field of
>>> -				 * interlaced field formats
>>> +	__u32	il_vsync;	/* Vertical sync length for the even field
>>> +				 * (aka field 2) of interlaced field formats
>>>  				 */
>>> -	__u32	il_vbackporch;	/* Vertical back porch for bottom field of
>>> -				 * interlaced field formats
>>> +	__u32	il_vbackporch;	/* Vertical back porch for the even field
>>> +				 * (aka field 2) of interlaced field formats
>>>  				 */
>>> -	__u32	reserved[16];
>>> +	__u32	standards;	/* Standards the timing belongs to */
>>> +	__u32	flags;		/* Flags */
>>> +	__u32	reserved[14];
>>>  } __attribute__ ((packed));
>>>  
>>>  /* Interlaced or progressive format */
>>> @@ -1019,6 +1033,37 @@ struct v4l2_bt_timings {
>>>  #define V4L2_DV_VSYNC_POS_POL	0x00000001
>>>  #define V4L2_DV_HSYNC_POS_POL	0x00000002
>>>  
>>> +/* Timings standards */
>>> +#define V4L2_DV_BT_STD_CEA861	(1 << 0)  /* CEA-861 Digital TV Profile */
>>> +#define V4L2_DV_BT_STD_DMT	(1 << 1)  /* VESA Discrete Monitor Timings */
>>> +#define V4L2_DV_BT_STD_CVT	(1 << 2)  /* VESA Coordinated Video Timings */
>>> +#define V4L2_DV_BT_STD_GTF	(1 << 3)  /* VESA Generalized Timings Formula */
>>> +
>>> +/* Flags */
>>> +
>>> +/* CVT/GTF specific: timing uses reduced blanking (CVT) or the 'Secondary
>>> +   GTF' curve (GTF). In both cases the horizontal and/or vertical blanking
>>> +   intervals are reduced, allowing a higher resolution over the same
>>> +   bandwidth. This is a read-only flag. */
>>> +#define V4L2_DV_FL_REDUCED_BLANKING		(1 << 0)
>>
>>> +/* CEA-861 specific: set for CEA-861 formats with a framerate of a multiple
>>> +   of six. These formats can be optionally played at 1 / 1.001 speed to
>>> +   be compatible with the normal NTSC framerate of 29.97 frames per second.
>>> +   This is a read-only flag. */
>>> +#define V4L2_DV_FL_NTSC_COMPATIBLE		(1 << 1)
>>> +/* CEA-861 specific: only valid for video transmitters, the flag is cleared
>>> +   by receivers.
>>> +   If the framerate of the format is a multiple of six, then the pixelclock
>>> +   used to set up the transmitter is divided by 1.001 to make it compatible
>>> +   with NTSC framerates. Otherwise this flag is cleared. If the transmitter
>>> +   can't generate such frequencies, then the flag will also be cleared. */
>>> +#define V4L2_DV_FL_DIVIDE_CLOCK_BY_1_001	(1 << 2)
>>
>> The two above have a conceptual problem: NTSC has nothing to do with the frequency.
>>
>> While, in practice, NTSC is only used on Countries with 60Hz power supply, and a
>> 1000/1001 shift is used there, to avoid flicker with the light bulbs, the 
>> standard doesn't mean a 29.97 Hz frame rate. 
>>
>> If you take a look at CEA-861, it doesn't mention there NTSC (well, except for a 
>> reference for the existing standards), to avoid such conceptual issue.
>>
>> Besides that,  PAL/M (and PAL/60) also uses a 29.97 Hz frame rate, in order to avoid 
>> flicker.
>>
>> So, please don't call the flag as "NTSC_COMPATIBLE", and please fix the comments
>> to either not mention NTSC, or to use something more generic, like replacing:
>>
>> 	"...be compatible with the normal NTSC framerateof 29.97 frames per second."
>> with
>> 	"...be compatible with 60Hz based standards that use a framerate of 29.97
>> 	 frames per second, like NTSC and PAL/M."
> 
> I'll try and find a more neutral term. I'm not satisfied with the name either.

Ok, thanks!

> 
>>
>>> +/* Specific to interlaced formats: if set, then field 1 is really one half-line
>>> +   longer and field 2 is really one half-line shorter, so each field has
>>> +   exactly the same number of half-lines. Whether half-lines can be detected
>>> +   or used depends on the hardware. */
>>> +#define V4L2_DV_FL_HALF_LINE			(1 << 0)
>>> +
>>>  
>>>  /* DV timings */
>>>  struct v4l2_dv_timings {
>>> @@ -1032,6 +1077,47 @@ struct v4l2_dv_timings {
>>>  /* Values for the type field */
>>>  #define V4L2_DV_BT_656_1120	0	/* BT.656/1120 timing type */
>>>  
>>> +
>>> +/* DV timings enumeration */
>>> +struct v4l2_enum_dv_timings {
>>> +	__u32 index;
>>> +	__u32 reserved[3];
>>> +	struct v4l2_dv_timings timings;
>>> +};
>>> +
>>> +/* BT.656/BT.1120 timing capabilities */
>>> +struct v4l2_bt_timings_cap {
>>> +	__u32	min_width;	/* width in pixels */
>>> +	__u32	max_width;	/* width in pixels */
>>> +	__u32	min_height;	/* height in lines */
>>> +	__u32	max_height;	/* height in lines */
>>> +	__u64	min_pixelclock;	/* Pixel clock in HZ. Ex. 74.25MHz->74250000 */
>>> +	__u64	max_pixelclock;	/* Pixel clock in HZ. Ex. 74.25MHz->74250000 */
>>> +	__u32	standards;	/* Supported standards */
>>> +	__u32	capabilities;	/* See below */
>>> +	__u32	reserved[16];
>>> +} __attribute__ ((packed));
>>
>> Hmm... why to define a new struct here, instead of just use struct v4l2_bt_timings ?
> 
> Perhaps there is some misunderstanding here? Struct v4l2_bt_timings defines the
> timings of a particular format. Struct v4l2_bt_timings_cap defines the range of
> timings that the hardware is capable of. The fields are quite different between
> the two.

Ah, OK. 
> 
>>
>>> +
>>> +/* Supports interlaced formats */
>>> +#define V4L2_DV_BT_CAP_INTERLACED	(1 << 0)
>>> +/* Supports progressive formats */
>>> +#define V4L2_DV_BT_CAP_PROGRESSIVE	(1 << 1)
>>> +/* Supports CVT/GTF reduced blanking */
>>> +#define V4L2_DV_BT_CAP_REDUCED_BLANKING	(1 << 2)
>>> +/* Supports custom formats */
>>> +#define V4L2_DV_BT_CAP_CUSTOM		(1 << 3)
>>> +
>>> +/* DV timings capabilities */
>>> +struct v4l2_dv_timings_cap {
>>> +	__u32 type;
>>
>> What are the posible values for type?
> 
> Same as the type of v4l2_dv_timings. I'll clarify this.
> 
>> Btw, it is a good idea to use kernel-doc-nano to describe the structures:
>>
>> /**
>>  * struct v4l2_dv_timings_cap - DV timings capabilities
>>  * @type:	some description
>> ...
>>  */
>>
>> As it documents better what is defined there.
> 
> Certainly.
> 
>>> +	__u32 reserved[3];
>>> +	union {
>>> +		struct v4l2_bt_timings_cap bt;
>>> +		__u32 raw_data[32];
>>> +	};
>>> +};
>>> +
>>> +
>>>  /*
>>>   *	V I D E O   I N P U T S
>>>   */
>>> @@ -2318,6 +2404,10 @@ struct v4l2_create_buffers {
>>>  #define VIDIOC_G_SELECTION	_IOWR('V', 94, struct v4l2_selection)
>>>  #define VIDIOC_S_SELECTION	_IOWR('V', 95, struct v4l2_selection)
>>>  
>>> +#define VIDIOC_ENUM_DV_TIMINGS  _IOWR('V', 96, struct v4l2_enum_dv_timings)
>>> +#define VIDIOC_QUERY_DV_TIMINGS  _IOR('V', 97, struct v4l2_dv_timings)
>>> +#define VIDIOC_DV_TIMINGS_CAP   _IOWR('V', 98, struct v4l2_dv_timings_cap)
>>> +
>>>  /* Reminder: when adding new ioctls please add support for them to
>>>     drivers/media/video/v4l2-compat-ioctl32.c as well! */
>>>  
>>
> 
> Thanks for reviewing this!
> 
> Regards,
> 
> 	Hans
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


  reply	other threads:[~2012-02-28 12:10 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-03 10:06 [RFCv1 PATCH 0/6] Improved/New timings API Hans Verkuil
2012-02-03 10:06 ` [RFCv1 PATCH 1/6] videodev2.h: add enum/query/cap dv_timings ioctls Hans Verkuil
2012-02-03 10:06   ` [RFCv1 PATCH 2/6] v4l2 framework: add support for the new " Hans Verkuil
2012-02-03 10:06   ` [RFCv1 PATCH 3/6] v4l2-dv-timings.h: definitions for CEA-861 and VESA DMT timings Hans Verkuil
2012-02-03 10:06   ` [RFCv1 PATCH 4/6] V4L2 spec: document the new V4L2 DV timings ioctls Hans Verkuil
2012-02-28 11:01     ` Mauro Carvalho Chehab
2012-02-28 11:09       ` Hans Verkuil
2012-02-03 10:06   ` [RFCv1 PATCH 5/6] v4l2-common: add new support functions to match DV timings Hans Verkuil
2012-02-28 11:03     ` Mauro Carvalho Chehab
2012-02-28 11:18       ` Hans Verkuil
2012-02-28 11:26         ` Mauro Carvalho Chehab
2012-02-03 10:06   ` [RFCv1 PATCH 6/6] tvp7002: add support for the new dv timings API Hans Verkuil
2012-02-28 10:54   ` [RFCv1 PATCH 1/6] videodev2.h: add enum/query/cap dv_timings ioctls Mauro Carvalho Chehab
2012-02-28 11:06     ` Hans Verkuil
2012-02-28 11:14       ` Mauro Carvalho Chehab [this message]
2012-02-24  9:54 ` [RFCv1 PATCH 0/6] Improved/New timings API Hans Verkuil
2012-02-28 11:13   ` Mauro Carvalho Chehab
2012-02-28 12:42     ` Hans Verkuil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F4CB72E.6080302@redhat.com \
    --to=mchehab@redhat.com \
    --cc=hans.verkuil@cisco.com \
    --cc=hverkuil@xs4all.nl \
    --cc=linux-media@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.