Re: [PATCHv3 15/15] media.h: reorganize header to make it easier to understand

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

 



Hi Hans,

On Wed, Feb 21, 2018 at 03:33:03PM +0100, Hans Verkuil wrote:
> On 02/21/18 15:15, Sakari Ailus wrote:
> > Hi Hans,
> > 
> > On Mon, Feb 19, 2018 at 11:38:06AM +0100, Hans Verkuil wrote:
> >> The media.h public header is very messy. It mixes legacy and 'new' defines
> >> and it is not easy to figure out what should and what shouldn't be used. It
> >> also contains confusing comment that are either out of date or completely
> >> uninteresting for anyone that needs to use this header.
> >>
> >> The patch groups all entity functions together, including the 'old' defines
> >> based on the old range base. The reader just wants to know about the available
> >> functions and doesn't care about what range is used.
> >>
> >> All legacy defines are moved to the end of the header, so it is easier to
> >> locate them and just ignore them.
> >>
> >> The legacy structs in the struct media_entity_desc are put under
> >> #if !defined(__KERNEL__) to prevent the kernel from using them, and this is
> >> also a much more effective signal to the reader that they shouldn't be used
> >> compared to the old method of relying on '#if 1' followed by a comment.
> >>
> >> The unused MEDIA_INTF_T_ALSA_* defines are also moved to the end of the header
> >> in the legacy area. They are also dropped from intf_type() in media-entity.c.
> >>
> >> All defines are also aligned at the same tab making the header easier to read.
> >>
> >> Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx>
> >> ---
> >>  drivers/media/media-entity.c |  16 --
> >>  include/uapi/linux/media.h   | 345 +++++++++++++++++++++----------------------
> >>  2 files changed, 166 insertions(+), 195 deletions(-)
> >>
> 
> <snip>
> 
> >>  /*
> >> - * I/O entities
> >> + * Subdevs are initialized with MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN in order
> >> + * to preserve backward compatibility. Drivers must change to the proper
> >> + * subdev type before registering the entity.
> > 
> > s/type/function/
> 
> Good catch!
> 
> > 
> > I wonder if "should" would actually be better; the current API assumes an
> > entity has at most one function which is somehow defined by the API. I
> > guess you could force everything into some kind of a group, as the current
> > approach seems to be. This is also what the enumeration through
> > MEDIA_IOC_ENUM_ENTITIES will yield to for the new functions anyway.
> 
> I don't quite follow you. 'should' suggests that they don't have to, but that's
> not the case. They really must set function to something other than UNKNOWN.

I'd like to reiterate that a single function cannot fully describe all
entities, and not all of them fit well to existing categories. If an entity
has multiple functions, which one do you pick?

Say, a SoC camera that also controls the lens.

> 
> The fact that newer functions are never actually exposed in the MEDIA_IOC_ENUM_ENTITIES
> ioctl since there only is a 'type' field and not a 'function' field is another
> matter altogether.

I don't have a strong opinion on this, feel free to leave it as-is for now.

> 
> > 
> >>   */
> >> -#define MEDIA_ENT_F_IO_DTV		(MEDIA_ENT_F_BASE + 0x01001)
> >> -#define MEDIA_ENT_F_IO_VBI		(MEDIA_ENT_F_BASE + 0x01002)
> >> -#define MEDIA_ENT_F_IO_SWRADIO		(MEDIA_ENT_F_BASE + 0x01003)
> >> +#define MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN		MEDIA_ENT_F_OLD_SUBDEV_BASE
> >>  
> >>  /*
> >> - * Analog TV IF-PLL decoders
> >> - *
> >> - * It is a responsibility of the master/bridge drivers to create links
> >> - * for MEDIA_ENT_F_IF_VID_DECODER and MEDIA_ENT_F_IF_AUD_DECODER.
> >> + * DVB entity functions
> >>   */
> >> -#define MEDIA_ENT_F_IF_VID_DECODER	(MEDIA_ENT_F_BASE + 0x02001)
> >> -#define MEDIA_ENT_F_IF_AUD_DECODER	(MEDIA_ENT_F_BASE + 0x02002)
> >> +#define MEDIA_ENT_F_DTV_DEMOD			(MEDIA_ENT_F_BASE + 0x00001)
> >> +#define MEDIA_ENT_F_TS_DEMUX			(MEDIA_ENT_F_BASE + 0x00002)
> >> +#define MEDIA_ENT_F_DTV_CA			(MEDIA_ENT_F_BASE + 0x00003)
> >> +#define MEDIA_ENT_F_DTV_NET_DECAP		(MEDIA_ENT_F_BASE + 0x00004)
> >>  
> >>  /*
> >> - * Audio Entity Functions
> >> + * I/O entity functions
> >>   */
> >> -#define MEDIA_ENT_F_AUDIO_CAPTURE	(MEDIA_ENT_F_BASE + 0x03001)
> >> -#define MEDIA_ENT_F_AUDIO_PLAYBACK	(MEDIA_ENT_F_BASE + 0x03002)
> >> -#define MEDIA_ENT_F_AUDIO_MIXER		(MEDIA_ENT_F_BASE + 0x03003)
> >> +#define MEDIA_ENT_F_IO_V4L  			(MEDIA_ENT_F_OLD_BASE + 1)
> >> +#define MEDIA_ENT_F_IO_DTV			(MEDIA_ENT_F_BASE + 0x01001)
> >> +#define MEDIA_ENT_F_IO_VBI			(MEDIA_ENT_F_BASE + 0x01002)
> >> +#define MEDIA_ENT_F_IO_SWRADIO			(MEDIA_ENT_F_BASE + 0x01003)
> >>  
> >>  /*
> >> - * Processing entities
> >> + * Sensor functions
> >>   */
> >> -#define MEDIA_ENT_F_PROC_VIDEO_COMPOSER		(MEDIA_ENT_F_BASE + 0x4001)
> >> -#define MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER	(MEDIA_ENT_F_BASE + 0x4002)
> >> -#define MEDIA_ENT_F_PROC_VIDEO_PIXEL_ENC_CONV	(MEDIA_ENT_F_BASE + 0x4003)
> >> -#define MEDIA_ENT_F_PROC_VIDEO_LUT		(MEDIA_ENT_F_BASE + 0x4004)
> >> -#define MEDIA_ENT_F_PROC_VIDEO_SCALER		(MEDIA_ENT_F_BASE + 0x4005)
> >> -#define MEDIA_ENT_F_PROC_VIDEO_STATISTICS	(MEDIA_ENT_F_BASE + 0x4006)
> >> +#define MEDIA_ENT_F_CAM_SENSOR			(MEDIA_ENT_F_OLD_SUBDEV_BASE + 1)
> >> +#define MEDIA_ENT_F_FLASH			(MEDIA_ENT_F_OLD_SUBDEV_BASE + 2)
> >> +#define MEDIA_ENT_F_LENS			(MEDIA_ENT_F_OLD_SUBDEV_BASE + 3)
> >>  
> >>  /*
> >> - * Switch and bridge entitites
> >> + * Analog video decoder functions
> >>   */
> >> -#define MEDIA_ENT_F_VID_MUX			(MEDIA_ENT_F_BASE + 0x5001)
> >> -#define MEDIA_ENT_F_VID_IF_BRIDGE		(MEDIA_ENT_F_BASE + 0x5002)
> >> +#define MEDIA_ENT_F_ATV_DECODER			(MEDIA_ENT_F_OLD_SUBDEV_BASE + 4)
> >>  
> >>  /*
> >> - * Connectors
> >> - */
> >> -/* It is a responsibility of the entity drivers to add connectors and links */
> >> -#ifdef __KERNEL__
> >> -	/*
> >> -	 * For now, it should not be used in userspace, as some
> >> -	 * definitions may change
> >> -	 */
> >> -
> >> -#define MEDIA_ENT_F_CONN_RF		(MEDIA_ENT_F_BASE + 0x30001)
> >> -#define MEDIA_ENT_F_CONN_SVIDEO		(MEDIA_ENT_F_BASE + 0x30002)
> >> -#define MEDIA_ENT_F_CONN_COMPOSITE	(MEDIA_ENT_F_BASE + 0x30003)
> >> -
> >> -#endif
> >> -
> >> -/*
> >> - * Don't touch on those. The ranges MEDIA_ENT_F_OLD_BASE and
> >> - * MEDIA_ENT_F_OLD_SUBDEV_BASE are kept to keep backward compatibility
> >> - * with the legacy v1 API.The number range is out of range by purpose:
> >> - * several previously reserved numbers got excluded from this range.
> >> + * Digital TV, analog TV, radio and/or software defined radio tuner functions.
> >>   *
> >> - * Subdevs are initialized with MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN,
> >> - * in order to preserve backward compatibility.
> >> - * Drivers must change to the proper subdev type before
> >> - * registering the entity.
> >> - */
> >> -
> >> -#define MEDIA_ENT_F_IO_V4L  		(MEDIA_ENT_F_OLD_BASE + 1)
> >> -
> >> -#define MEDIA_ENT_F_CAM_SENSOR		(MEDIA_ENT_F_OLD_SUBDEV_BASE + 1)
> >> -#define MEDIA_ENT_F_FLASH		(MEDIA_ENT_F_OLD_SUBDEV_BASE + 2)
> >> -#define MEDIA_ENT_F_LENS		(MEDIA_ENT_F_OLD_SUBDEV_BASE + 3)
> >> -#define MEDIA_ENT_F_ATV_DECODER		(MEDIA_ENT_F_OLD_SUBDEV_BASE + 4)
> >> -/*
> >>   * It is a responsibility of the master/bridge drivers to add connectors
> >>   * and links for MEDIA_ENT_F_TUNER. Please notice that some old tuners
> >>   * may require the usage of separate I2C chips to decode analog TV signals,
> >> @@ -151,49 +104,46 @@ struct media_device_info {
> >>   * On such cases, the IF-PLL staging is mapped via one or two entities:
> >>   * MEDIA_ENT_F_IF_VID_DECODER and/or MEDIA_ENT_F_IF_AUD_DECODER.
> >>   */
> >> -#define MEDIA_ENT_F_TUNER		(MEDIA_ENT_F_OLD_SUBDEV_BASE + 5)
> >> +#define MEDIA_ENT_F_TUNER			(MEDIA_ENT_F_OLD_SUBDEV_BASE + 5)
> >>  
> >> -#define MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN	MEDIA_ENT_F_OLD_SUBDEV_BASE
> >> +/*
> >> + * Analog TV IF-PLL decoder functions
> >> + *
> >> + * It is a responsibility of the master/bridge drivers to create links
> >> + * for MEDIA_ENT_F_IF_VID_DECODER and MEDIA_ENT_F_IF_AUD_DECODER.
> >> + */
> >> +#define MEDIA_ENT_F_IF_VID_DECODER		(MEDIA_ENT_F_BASE + 0x02001)
> >> +#define MEDIA_ENT_F_IF_AUD_DECODER		(MEDIA_ENT_F_BASE + 0x02002)
> >>  
> >> -#if !defined(__KERNEL__) || defined(__NEED_MEDIA_LEGACY_API)
> >> +/*
> >> + * Audio entity functions
> >> + */
> >> +#define MEDIA_ENT_F_AUDIO_CAPTURE		(MEDIA_ENT_F_BASE + 0x03001)
> >> +#define MEDIA_ENT_F_AUDIO_PLAYBACK		(MEDIA_ENT_F_BASE + 0x03002)
> >> +#define MEDIA_ENT_F_AUDIO_MIXER			(MEDIA_ENT_F_BASE + 0x03003)
> >>  
> >>  /*
> >> - * Legacy symbols used to avoid userspace compilation breakages
> >> - *
> >> - * Those symbols map the entity function into types and should be
> >> - * used only on legacy programs for legacy hardware. Don't rely
> >> - * on those for MEDIA_IOC_G_TOPOLOGY.
> >> + * Processing entity functions
> >>   */
> >> -#define MEDIA_ENT_TYPE_SHIFT		16
> >> -#define MEDIA_ENT_TYPE_MASK		0x00ff0000
> >> -#define MEDIA_ENT_SUBTYPE_MASK		0x0000ffff
> >> -
> >> -/* End of the old subdev reserved numberspace */
> >> -#define MEDIA_ENT_T_DEVNODE_UNKNOWN	(MEDIA_ENT_T_DEVNODE | \
> >> -					 MEDIA_ENT_SUBTYPE_MASK)
> >> -
> >> -#define MEDIA_ENT_T_DEVNODE		MEDIA_ENT_F_OLD_BASE
> >> -#define MEDIA_ENT_T_DEVNODE_V4L		MEDIA_ENT_F_IO_V4L
> >> -#define MEDIA_ENT_T_DEVNODE_FB		(MEDIA_ENT_T_DEVNODE + 2)
> >> -#define MEDIA_ENT_T_DEVNODE_ALSA	(MEDIA_ENT_T_DEVNODE + 3)
> >> -#define MEDIA_ENT_T_DEVNODE_DVB		(MEDIA_ENT_T_DEVNODE + 4)
> >> -
> >> -#define MEDIA_ENT_T_UNKNOWN		MEDIA_ENT_F_UNKNOWN
> >> -#define MEDIA_ENT_T_V4L2_VIDEO		MEDIA_ENT_F_IO_V4L
> >> -#define MEDIA_ENT_T_V4L2_SUBDEV		MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN
> >> -#define MEDIA_ENT_T_V4L2_SUBDEV_SENSOR	MEDIA_ENT_F_CAM_SENSOR
> >> -#define MEDIA_ENT_T_V4L2_SUBDEV_FLASH	MEDIA_ENT_F_FLASH
> >> -#define MEDIA_ENT_T_V4L2_SUBDEV_LENS	MEDIA_ENT_F_LENS
> >> -#define MEDIA_ENT_T_V4L2_SUBDEV_DECODER	MEDIA_ENT_F_ATV_DECODER
> >> -#define MEDIA_ENT_T_V4L2_SUBDEV_TUNER	MEDIA_ENT_F_TUNER
> >> +#define MEDIA_ENT_F_PROC_VIDEO_COMPOSER		(MEDIA_ENT_F_BASE + 0x4001)
> >> +#define MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER	(MEDIA_ENT_F_BASE + 0x4002)
> >> +#define MEDIA_ENT_F_PROC_VIDEO_PIXEL_ENC_CONV	(MEDIA_ENT_F_BASE + 0x4003)
> >> +#define MEDIA_ENT_F_PROC_VIDEO_LUT		(MEDIA_ENT_F_BASE + 0x4004)
> >> +#define MEDIA_ENT_F_PROC_VIDEO_SCALER		(MEDIA_ENT_F_BASE + 0x4005)
> >> +#define MEDIA_ENT_F_PROC_VIDEO_STATISTICS	(MEDIA_ENT_F_BASE + 0x4006)
> >>  
> >> -/* Obsolete symbol for media_version, no longer used in the kernel */
> >> -#define MEDIA_API_VERSION		KERNEL_VERSION(0, 1, 0)
> >> -#endif
> >> +/*
> >> + * Switch and bridge entity functions
> >> + */
> >> +#define MEDIA_ENT_F_VID_MUX			(MEDIA_ENT_F_BASE + 0x5001)
> >> +#define MEDIA_ENT_F_VID_IF_BRIDGE		(MEDIA_ENT_F_BASE + 0x5002)
> >>  
> >>  /* Entity flags */
> >> -#define MEDIA_ENT_FL_DEFAULT		(1 << 0)
> >> -#define MEDIA_ENT_FL_CONNECTOR		(1 << 1)
> >> +#define MEDIA_ENT_FL_DEFAULT			(1 << 0)
> >> +#define MEDIA_ENT_FL_CONNECTOR			(1 << 1)
> >> +
> >> +/* OR with the entity id value to find the next entity */
> > 
> > This comment is confusing, I'd prefer to either drop or improve it. This is
> > well documented in uAPI documentation after all.
> 
> Hmm. How about:
> 
> /* Modifier flag for the media_entity_desc 'id' field */
> 
> Or, alternatively: /* Entity ID flag */
> 
> I'd like to have something, otherwise it is just a random define without a
> comment that puts it into context.

How about:

/* Flags for struct media_entity_desc id field */

Pick the one you like the best.

Acked-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>

-- 
Regards,

Sakari Ailus
e-mail: sakari.ailus@xxxxxx



[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