Hans Verkuil <hverkuil@xxxxxxxxx> wrote: >Hi Mauro, > >Thanks for the RFC! Some initial comments below. I'll hope to do some >more >testing and reviewing in the coming week. > >On Sunday, May 29, 2011 03:01:43 Mauro Carvalho Chehab wrote: >> Em 28-05-2011 13:20, Mauro Carvalho Chehab escreveu: >> > Em 28-05-2011 12:24, Hans Verkuil escreveu: >> >> But I would really like to see an RFC with a proposal of the API >and how >> >> it is to be used. Then after an agreement has been reached the >library can >> >> be modified accordingly and we can release it. >> > >> > Ok, that's the RFC for the API. The code is already committed, on a >separate >> > library at v4l-utils. So, feel free to test. >> http://git.linuxtv.org/v4l-utils.gi >> Just finished a version 2 of the library. I've addressed on it the >two >> comments from Hans de Goede: to allow calling the seek method for the >> associated devices using an open file descriptor, and to allow >listing >> all video nodes. The library is at utils/libmedia_dev dir, at >> http://git.linuxtv.org/v4l-utils.git. IMO, the proper step is to move >it >> to the libv4l, but it is better to wait to the release of the current >> version. After that, I'll change xawtv3 to link against the new >library. >> >> Btw, it may be a good idea to also move the alsa thread code from >xawtv3 >> (and tvtime) to v4l-utils. >> >> - >> >> 1) Why such library is needed >> ========================== >> >> Media devices can be very complex. It is not trivial how to detect >what's the >> other devices associated with a video node. >> >> This API provides the capabilities of getting the associated devices >with a >> video node. >> >> It is currently implemented at http://git.linuxtv.org/v4l-utils.git, >at the >> utils/libmedia_dev/. After validating it, it makes sense to move it >to be >> part of libv4l. >> >> 2) Provided functions >> ================== >> >> The API defines a macro with its current version. Currently, it is: >> >> #define GET_MEDIA_DEVICES_VERSION 0x0104 >> >> Each device type that is known by the API is defined inside enum >device_type, >> currently defined as: >> >> enum device_type { >> UNKNOWN = 65535, >> NONE = 65534, >> MEDIA_V4L_VIDEO = 0, > >Can you add MEDIA_V4L_RADIO as well? And MEDIA_V4L_SUBDEV too. > >> MEDIA_V4L_VBI, >> MEDIA_DVB_FRONTEND, > >It might be better to start at a new offset here, e.g. >MEDIA_DVB_FRONTEND = 100 >Ditto for SND. That makes it easier to insert new future device nodes. > >> MEDIA_DVB_DEMUX, >> MEDIA_DVB_DVR, >> MEDIA_DVB_NET, >> MEDIA_DVB_CA, >> MEDIA_SND_CARD, >> MEDIA_SND_CAP, >> MEDIA_SND_OUT, >> MEDIA_SND_CONTROL, >> MEDIA_SND_HW, > >Should we have IR (input) nodes as well? That would associate a IR >input with >a particular card. > >> }; >> >> The first function discovers the media devices and stores the >information >> at an internal representation. Such representation should be opaque >to >> the userspace applications, as it can change from version to version. >> >> 2.1) Device discover and release functions >> ===================================== >> >> The device discover is done by calling: >> >> void *discover_media_devices(void); >> >> In order to release the opaque structure, a free method is provided: >> >> void free_media_devices(void *opaque); >> >> 2.2) Functions to help printing the discovered devices >> ================================================= >> >> In order to allow printing the device type, a function is provided to >> convert from enum device_type into string: >> >> char *media_device_type(enum device_type type); > >const char *? > >> >> All discovered devices can be displayed by calling: >> >> void display_media_devices(void *opaque); > >This would be much more useful if a callback is provided. > >> >> 2.3) Functions to get device associations >> ==================================== >> >> The API provides 3 methods to get the associated devices: >> >> a) get_associated_device: returns the next device associated with >another one >> >> char *get_associated_device(void *opaque, >> char *last_seek, >> enum device_type desired_type, >> char *seek_device, >> enum device_type seek_type); > >const char *? Ditto elsewhere. > >> The parameters are: >> >> opaque: media devices opaque descriptor >> last_seek: last seek result. Use NULL to get the first result >> desired_type: type of the desired device >> seek_device: name of the device with you want to get an association. >> seek_type: type of the seek device. Using NONE produces the same >> result of using NULL for the seek_device. >> >> This function seeks inside the media_devices struct for the next >device >> that it is associated with a seek parameter. >> It can be used to get an alsa device associated with a video device. >If >> the seek_device is NULL or seek_type is NONE, it will just search for >> devices of the desired_type. >> >> >> b) fget_associated_device: returns the next device associated with >another one >> >> char *fget_associated_device(void *opaque, >> char *last_seek, >> enum device_type desired_type, >> int fd_seek_device, >> enum device_type seek_type); >> >> The parameters are: >> >> opaque: media devices opaque descriptor >> last_seek: last seek result. Use NULL to get the first result >> desired_type: type of the desired device >> fd_seek_device: file handler for the device where the association >will >> be made >> seek_type: type of the seek device. Using NONE produces the same >> result of using NULL for the seek_device. >> >> This function seeks inside the media_devices struct for the next >device >> that it is associated with a seek parameter. >> It can be used to get an alsa device associated with an open file >descriptor >> >> c) get_not_associated_device: Returns the next device not associated >with >> an specific device type. >> >> char *get_not_associated_device(void *opaque, >> char *last_seek, >> enum device_type desired_type, >> enum device_type not_desired_type); >> >> The parameters are: >> >> opaque: media devices opaque descriptor >> last_seek: last seek result. Use NULL to get the first result >> desired_type: type of the desired device >> not_desired_type: type of the seek device >> >> This function seeks inside the media_devices struct for the next >physical >> device that doesn't support a non_desired type. >> This method is useful for example to return the audio devices that >are >> provided by the motherboard. > >Hmmm. What you really want IMHO is to iterate over 'media hardware', >and for >each piece of hardware you can find the associated device nodes. > >It's what you expect to see in an application: a list of >USB/PCI/Platform >devices to choose from. > >> >> 3) Examples with typical usecases >> ============================== >> >> a) Just displaying all media devices: >> >> void *md = discover_media_devices(); >> display_media_devices(md); >> free_media_devices(md); >> >> The devices will be shown at the order they appear at the computer >buses. >> >> b) For video0, prints the associated alsa capture device(s): >> >> void *md = discover_media_devices(); >> char *devname = NULL, video0 = "/dev/video0"; >> do { >> devname = get_associated_device(md, devname, MEDIA_SND_CAP, >> video0, MEDIA_V4L_VIDEO); >> if (devname) >> printf("Alsa capture: %s\n", devname); >> } while (devname); >> free_media_devices(md); >> >> Note: the video0 string can be declarated as "/dev/video0" or as just >"video0", >> as the search functions will discard any patch on it. >> >> c) Get the alsa capture device associated with an opened file >descriptor: >> >> int fd = open("/dev/video0", O_RDWR); >> ... >> void *md = discover_media_devices(); >> vid = fget_associated_device(md, NULL, MEDIA_SND_CAP, fd, >> MEDIA_V4L_VIDEO); >> printf("\n\nAlsa device = %s\n", vid); >> close(fd); >> free_media_devices(md); >> >> d) Get the mainboard alsa playback devices: >> >> char *devname = NULL; >> void *md = discover_media_devices(); >> do { >> devname = get_not_associated_device(md, devname, MEDIA_SND_OUT, >> MEDIA_V4L_VIDEO); >> if (devname) >> printf("Alsa playback: %s\n", devname); >> } while (devname); >> free_media_devices(md); >> >> e) Get all video devices: >> >> md = discover_media_devices(); >> >> char *vid = NULL; >> do { >> vid = get_associated_device(md, vid, MEDIA_V4L_VIDEO, >> NULL, NONE); >> if (!vid) >> break; >> printf("Video device: %s\n", vid); >> } while (vid); >> free_media_devices(md); >> > >I did some testing: vivi video nodes do not show up at all. And since >there is >no concept of 'media hardware' in this API the handling of devices with >multiple >video nodes (e.g. ivtv) is very poor. One thing that we wanted to do >with the MC >is to select default nodes for complex hardware. This gives >applications a hint >as to what is the default video node to use for standard >capture/output. This >concept can be used here as well. Perhaps we should introduce a >'V4L2_CAP_DEFAULT' >capabity that drivers can set? > >I think this library would also be more useful if it can filter >devices: e.g. >filter on capture devices or output devices. Actually, I can't >immediately think >of other useful filters than capture vs output. > >We also need some way to tell apps that certain devices are mutually >exclusive. >Even if we cannot tell the app that through sysfs at the moment, this >information >will become available in the future through the MC, so we should >prepare the API >for this. > >Did anyone test what happens when the user renames device nodes using >udev rules? >I haven't had the chance to test that yet. > >Regards, > > Hans >-- >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 Framebuffer devices are missing from the list. Ivtv provides one at the moment. -Andy -- 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