kaffeine-1.0 and webcamd based DVB-T?

Juergen Lock nox at jelal.kn-bremen.de
Fri Aug 20 18:10:29 UTC 2010


On Thu, Aug 19, 2010 at 08:13:48PM -0400, Joe Marcus Clarke wrote:
> On 8/19/10 12:17 PM, Juergen Lock wrote:
> > In article <4C6704A6.3050407 at FreeBSD.org> you write:
> >> On 08/14/2010 18:30, Jan Henrik Sylvester wrote:
> >>> KDE3-Kaffeine was working with my webcamd based DVB-T stick,
> >>> KDE4-Kaffeine does not.
> >>>
> >>> Now that multimedia/kaffeine is the KDE4 version and the KDE3 version
> >>> gone, is there a way to teach Kaffeine about the DVB-T stick? ("Channel
> >>> Scan" does not show any "Source".)
> >>>
> >>> I remember there was a thread about this, but I currently cannot find it.
> >>
> >> Unfortunately i don't have a supported DVB stick, so i can't test anything.
> >>
> >> kaffeine uses the v4l-compat headers so in theory it should work like in 
> >> Linux...
> >>
> >> Does your stick work with other applications like mplayer or vlc?
> > 
> > I now know what's wrong:  Unlike the old kaffeine which looked for
> > dvb devices itself, the KDE4 version relies on x11/kdelibs4 to
> > find them (<Solid/DvbInterface>, src/dvb/dvbdevice_linux.cpp
> > in kaffeine sources), which in turn relies on sysutils/hal
> > (solid/solid/backends/hal/haldvbinterface.cpp in kdelibs), and
> > at least hal doesn't know about dvb devices on FreeBSD yet, they
> > are only handled in hald/linux/device.c in hal sources.  I've
> > Cc'd the hal and kdelibs port maintainers in case they want to
> > look at this...
> 
> Hal does support v4l (and thus webcamd) right now.  I added that for
> GNOME 2.30.  I didn't do any dvb support.  I may need some examples of
> dmesg and sysctl to make this happen.

(Note:  I also found a bug in the current hal webcamd v4l handling,
more about that below. [1] )

 The devices don't show up in sysctl since they are handled by webcamd
too, dmesg here only says:

	ugen5.2: <Pinnacle> at usbus5
	ugen5.3: <Afatech> at usbus5

(the first one is dvb-s2, the second one dual dvb-t.)

 lshal on FreeBSD has this about them:

udi = '/org/freedesktop/Hal/devices/usb_device_2304_21f_noserial'
  info.bus = 'usb_device'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_0_0_noserial_4'  (string)
  info.product = 'PCTV452e'  (string)
  info.subsystem = 'usb_device'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_2304_21f_noserial'  (string)
  info.vendor = 'Pinnacle'  (string)
  usb_device.bus_number = 5  (0x5)  (int)
  usb_device.can_wake_up = true  (bool)
  usb_device.configuration = ''  (string)
  usb_device.configuration_value = 1  (0x1)  (int)
  usb_device.device_class = 0  (0x0)  (int)
  usb_device.device_protocol = 0  (0x0)  (int)
  usb_device.device_revision_bcd = 512  (0x200)  (int)
  usb_device.device_subclass = 0  (0x0)  (int)
  usb_device.is_self_powered = false  (bool)
  usb_device.level_number = 1  (0x1)  (int)
  usb_device.max_power = 10  (0xa)  (int)
  usb_device.num_configurations = 1  (0x1)  (int)
  usb_device.num_interfaces = 1  (0x1)  (int)
  usb_device.num_ports = 0  (0x0)  (int)
  usb_device.port_number = 2  (0x2)  (int)
  usb_device.product = 'PCTV452e'  (string)
  usb_device.product_id = 543  (0x21f)  (int)
  usb_device.serial = ''  (string)
  usb_device.speed = 480.0 (480) (double)
  usb_device.speed_bcd = 294912  (0x48000)  (int)
  usb_device.vendor = 'Pinnacle'  (string)
  usb_device.vendor_id = 8964  (0x2304)  (int)
  usb_device.version = 2.0 (2) (double)

udi = '/org/freedesktop/Hal/devices/usb_device_2304_21f_noserial_if0'
  info.bus = 'usb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_2304_21f_noserial'  (string)
  info.product = 'PCTV452e'  (string)
  info.subsystem = 'usb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_2304_21f_noserial_if0'  (string)
  info.vendor = 'Pinnacle'  (string)
  usb.bus_number = 5  (0x5)  (int)
  usb.can_wake_up = true  (bool)
  usb.configuration = ''  (string)
  usb.configuration_value = 1  (0x1)  (int)
  usb.device_class = 0  (0x0)  (int)
  usb.device_protocol = 0  (0x0)  (int)
  usb.device_revision_bcd = 512  (0x200)  (int)
  usb.device_subclass = 0  (0x0)  (int)
  usb.interface.class = 255  (0xff)  (int)
  usb.interface.description = ''  (string)
  usb.interface.number = 0  (0x0)  (int)
  usb.interface.protocol = 0  (0x0)  (int)
  usb.interface.subclass = 0  (0x0)  (int)
  usb.is_self_powered = false  (bool)
  usb.level_number = 1  (0x1)  (int)
  usb.max_power = 10  (0xa)  (int)
  usb.num_configurations = 1  (0x1)  (int)
  usb.num_interfaces = 1  (0x1)  (int)
  usb.num_ports = 0  (0x0)  (int)
  usb.port_number = 2  (0x2)  (int)
  usb.product = 'PCTV452e'  (string)
  usb.product_id = 543  (0x21f)  (int)
  usb.serial = ''  (string)
  usb.speed = 480.0 (480) (double)
  usb.speed_bcd = 294912  (0x48000)  (int)
  usb.vendor = 'Pinnacle'  (string)
  usb.vendor_id = 8964  (0x2304)  (int)
  usb.version = 2.0 (2) (double)

 and:

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'
  info.bus = 'usb_device'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_0_0_noserial_4'  (string)
  info.product = 'DVB-T 2'  (string)
  info.subsystem = 'usb_device'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.vendor = 'Afatech'  (string)
  usb_device.bus_number = 5  (0x5)  (int)
  usb_device.can_wake_up = false  (bool)
  usb_device.configuration = ''  (string)
  usb_device.configuration_value = 1  (0x1)  (int)
  usb_device.device_class = 0  (0x0)  (int)
  usb_device.device_protocol = 0  (0x0)  (int)
  usb_device.device_revision_bcd = 512  (0x200)  (int)
  usb_device.device_subclass = 0  (0x0)  (int)
  usb_device.is_self_powered = false  (bool)
  usb_device.level_number = 2  (0x2)  (int)
  usb_device.max_power = 500  (0x1f4)  (int)
  usb_device.num_configurations = 1  (0x1)  (int)
  usb_device.num_interfaces = 1  (0x1)  (int)
  usb_device.num_ports = 0  (0x0)  (int)
  usb_device.port_number = 3  (0x3)  (int)
  usb_device.product = 'DVB-T 2'  (string)
  usb_device.product_id = 34817  (0x8801)  (int)
  usb_device.serial = ''  (string)
  usb_device.speed = 480.0 (480) (double)
  usb_device.speed_bcd = 294912  (0x48000)  (int)
  usb_device.vendor = 'Afatech'  (string)
  usb_device.vendor_id = 5218  (0x1462)  (int)
  usb_device.version = 2.0 (2) (double)

 And for comparison, if I plug the dual dvb-t one into a Linux box
lshal there has the following:  (of which only the /dev/dvb/adapterX/net0
and the ir receiver are not supported by webcamd yet; the ir reciver
works but currently no device node gets created and it just outputs
to webcamd's stdout, and the .../net0 are afaik not used with regular
video/audio broadcasts.)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'
  info.linux.driver = 'usb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1d6b_2_0000_00_1d_7'  (string)
  info.product = 'DVB-T 2'  (string)
  info.subsystem = 'usb_device'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.vendor = 'Micro Star International'  (string)
  linux.device_file = '/dev/bus/usb/003/002'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'usb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2'  (string)
  usb_device.bus_number = 3  (0x3)  (int)
  usb_device.can_wake_up = false  (bool)
  usb_device.configuration_value = 1  (0x1)  (int)
  usb_device.device_class = 0  (0x0)  (int)
  usb_device.device_protocol = 0  (0x0)  (int)
  usb_device.device_revision_bcd = 512  (0x200)  (int)
  usb_device.device_subclass = 0  (0x0)  (int)
  usb_device.is_self_powered = false  (bool)
  usb_device.linux.device_number = 2  (0x2)  (int)
  usb_device.linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2'  (string)
  usb_device.max_power = 500  (0x1f4)  (int)
  usb_device.num_configurations = 1  (0x1)  (int)
  usb_device.num_interfaces = 1  (0x1)  (int)
  usb_device.num_ports = 0  (0x0)  (int)
  usb_device.product = 'DVB-T 2'  (string)
  usb_device.product_id = 34817  (0x8801)  (int)
  usb_device.speed = 480.0 (480) (double)
  usb_device.vendor = 'Micro Star International'  (string)
  usb_device.vendor_id = 5218  (0x1462)  (int)
  usb_device.version = 2.0 (2) (double)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_usbraw'
  info.capabilities = {'usbraw'} (string list)
  info.category = 'usbraw'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.product = 'USB Raw Device Access'  (string)
  info.subsystem = 'usb_device'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_usbraw'  (string)
  linux.device_file = '/dev/usbdev3.2'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'usb_device'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/usb_device/usbdev3.2'  (string)
  usbraw.device = '/dev/usbdev3.2'  (string)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_logicaldev_input'
  info.addons.singleton = {'hald-addon-input'} (string list)
  info.capabilities = {'input', 'input.keys', 'button'} (string list)
  info.category = 'input'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.product = 'IR-receiver inside an USB DVB receiver'  (string)
  info.subsystem = 'input'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_logicaldev_input'  (string)
  input.device = '/dev/input/event8'  (string)
  input.originating_device = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  input.product = 'IR-receiver inside an USB DVB receiver'  (string)
  linux.device_file = '/dev/input/event8'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'input'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/input/input8/event8'  (string)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_6'
  dvb.device = '/dev/dvb/adapter1/net0'  (string)
  info.capabilities = {'dvb'} (string list)
  info.category = 'dvb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.product = 'DVB Device'  (string)
  info.subsystem = 'dvb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_6'  (string)
  linux.device_file = '/dev/dvb/adapter1/net0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'dvb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/dvb/dvb1.net0'  (string)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_5'
  dvb.device = '/dev/dvb/adapter1/frontend0'  (string)
  info.capabilities = {'dvb'} (string list)
  info.category = 'dvb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.product = 'DVB Device'  (string)
  info.subsystem = 'dvb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_5'  (string)
  linux.device_file = '/dev/dvb/adapter1/frontend0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'dvb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/dvb/dvb1.frontend0'  (string)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_4'
  dvb.device = '/dev/dvb/adapter1/dvr0'  (string)
  info.capabilities = {'dvb'} (string list)
  info.category = 'dvb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.product = 'DVB Device'  (string)
  info.subsystem = 'dvb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_4'  (string)
  linux.device_file = '/dev/dvb/adapter1/dvr0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'dvb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/dvb/dvb1.dvr0'  (string)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_3'
  dvb.device = '/dev/dvb/adapter1/demux0'  (string)
  info.capabilities = {'dvb'} (string list)
  info.category = 'dvb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.product = 'DVB Device'  (string)
  info.subsystem = 'dvb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_3'  (string)
  linux.device_file = '/dev/dvb/adapter1/demux0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'dvb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/dvb/dvb1.demux0'  (string)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_2'
  dvb.device = '/dev/dvb/adapter0/net0'  (string)
  info.capabilities = {'dvb'} (string list)
  info.category = 'dvb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.product = 'DVB Device'  (string)
  info.subsystem = 'dvb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_2'  (string)
  linux.device_file = '/dev/dvb/adapter0/net0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'dvb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/dvb/dvb0.net0'  (string)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_1'
  dvb.device = '/dev/dvb/adapter0/frontend0'  (string)
  info.capabilities = {'dvb'} (string list)
  info.category = 'dvb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.product = 'DVB Device'  (string)
  info.subsystem = 'dvb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_1'  (string)
  linux.device_file = '/dev/dvb/adapter0/frontend0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'dvb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/dvb/dvb0.frontend0'  (string)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_0'
  dvb.device = '/dev/dvb/adapter0/dvr0'  (string)
  info.capabilities = {'dvb'} (string list)
  info.category = 'dvb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.product = 'DVB Device'  (string)
  info.subsystem = 'dvb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb_0'  (string)
  linux.device_file = '/dev/dvb/adapter0/dvr0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'dvb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/dvb/dvb0.dvr0'  (string)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb'
  dvb.device = '/dev/dvb/adapter0/demux0'  (string)
  info.capabilities = {'dvb'} (string list)
  info.category = 'dvb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.product = 'DVB Device'  (string)
  info.subsystem = 'dvb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_dvb'  (string)
  linux.device_file = '/dev/dvb/adapter0/demux0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'dvb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/dvb/dvb0.demux0'  (string)

udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_if0'
  info.linux.driver = 'dvb_usb_af9015'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial'  (string)
  info.product = 'USB Vendor Specific Interface'  (string)
  info.subsystem = 'usb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_1462_8801_noserial_if0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'usb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/3-2:1.0'  (string)
  usb.bus_number = 3  (0x3)  (int)
  usb.can_wake_up = false  (bool)
  usb.configuration_value = 1  (0x1)  (int)
  usb.device_class = 0  (0x0)  (int)
  usb.device_protocol = 0  (0x0)  (int)
  usb.device_revision_bcd = 512  (0x200)  (int)
  usb.device_subclass = 0  (0x0)  (int)
  usb.interface.class = 255  (0xff)  (int)
  usb.interface.number = 0  (0x0)  (int)
  usb.interface.protocol = 0  (0x0)  (int)
  usb.interface.subclass = 0  (0x0)  (int)
  usb.is_self_powered = false  (bool)
  usb.linux.device_number = 2  (0x2)  (int)
  usb.linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-2/3-2:1.0'  (string)
  usb.max_power = 500  (0x1f4)  (int)
  usb.num_configurations = 1  (0x1)  (int)
  usb.num_interfaces = 1  (0x1)  (int)
  usb.num_ports = 0  (0x0)  (int)
  usb.product = 'USB Vendor Specific Interface'  (string)
  usb.product_id = 34817  (0x8801)  (int)
  usb.speed = 480.0 (480) (double)
  usb.vendor = 'Micro Star International'  (string)
  usb.vendor_id = 5218  (0x1462)  (int)
  usb.version = 2.0 (2) (double)

[1]  And now the bug and some more notes:  I meanwhile found the hal
port's files/patch-hald_freebsd_probing_probe-video4linux.c and
briefly looked at it to see if I could easily extend it for dvb
myself, but found two problems:

a) I'm not sure if we also need code like dvb_add() and friends
from hald/linux/device.c and I don't know how that gets invoked,
i.e. how hal knows that devices are dvb and need to be handled by
dvb_add() (does Linux' udev tell it that?), and

b) (this is the bug) hald's current handling of multiple devices
in hfp_v4l_get_unit() is broken (the last number in webcamd's pidfile
name is _not_ the device index, it's always 0 or at least it is
here), and also it would have to be extended/adjusted for webcamd
svn which now supports dvb devices with multiple tuners, like
the dual dvb-t one I have here.

 Because of the latter webcamd now allocates each device's first tuner
index in increments of 8 (I think that's the max number of tuners on
a single device the Linux code will handle), and so if I use webcamd
with my two devices for a total of three tuners I get e.g.
/dev/dvb/adapter0/*, /dev/dvb/adapter8/*, and /dev/dvb/adapter9/*
(and I have to symlink adapter8 to adapter1 and adapter9 to adapter2
if I want vdr to find all of them, but of course that shouldn't
affect hal and kdelibs/kaffeine.)

 I have Cc'd hps, maybe he has an idea how to get the device index
out of a running webcamd for hal to use... (maybe webcamd should
also do a setproctitle()?)

 Oh and also I wondered whether there might be races in case of
hotplugging a device, i.e. if probe-video4linux.c gets run right
at the moment after plugging a device in webcamd and the Linux code it
runs might not yet have finished initializing and device nodes might
not (all?) have been created yet?

 Ok, and that's all I have for now, :)
	Juergen


More information about the freebsd-gnome mailing list