[pvrusb2] Pvrusb2 feature request
Hans Verkuil
hverkuil at xs4all.nl
Mon Apr 16 02:20:57 CDT 2007
> On Sun, 15 Apr 2007, michael papet wrote:
>
>> Mike,
>>
>> Once again, thanks for your continuing efforts on the pvrusb2 driver.
>>
>> As the title suggests, I've got a feature request: closed caption
>> support. Specifically for US frequencies. Hauppauge's win32 driver
>> doesn't support it and I've got high wife acceptance factor with
>> mythtv/hauppauge's remote.
>>
>> Let me know your thoughts on the feature.
>
> This requires getting VBI capture working (which is the data pathway
> over which CC text arrives). VBI == Vertical Blanking Interval, which
> is a period of time during each frame where digital data is embedded.
> It's basically a bunch of serial bits. Decoding VBI involves knowing
> which of those scan lines (during the VBI) contain the data, sampling
> the video signal at the right time to get the bits and then reassembling
> the packet data from those bits. I'm still learning this, but "raw" VBI
> involves mainly oversampling the heck out of each scan line, and post
> processing the resulting torrent in the host to find the real bit
> boundaries - which depends on the type of VBI data being received.
> "Sliced" VBI is a "cleaner" approach whereby one programs the video
> capture chip with the attributes of the expected VBI data (e.g. which
> scan lines, baud rate of the stream), and then you just get back a
> fairly slow stream of bytes. The programming needed to capture this VBI
> data (raw or sliced) is part of the video digitizer chip (i.e. saa7115
> for 29xxx devices or cx25840 for 24xxx devices). That is not really a
> big deal. The problem lay in how we get the captured data back to the
> host. We're limited by the PVR USB2 device's hardwired USB
> configuration in how we can get this.
>
> A few months ago Pantelis and I looked at getting this working. There
> are some issues standing in the way. There are theoretically 2 methods
> to do VBI, and 3 possible implementations. The first method, and most
> straight-forward is to tell the mpeg encoder to do the work. There are
> some commands for this, but I am told by the ivtv author that this
> function does not work so I'm not even going to try.
>
> That leads to the second method which ivtv uses - getting the VBI data
> directly and extracting useful information from it within the driver.
> But here ivtv has a major advantage in that it can orchestrate and
> juggle multiple concurrent streams from the driver. An ivtv-controlled
> device exists directly on the host's PCI bus and therefore it's much
> easier to get directly at the bits.
>
> But a pvrusb2-controlled device exists at the far end of a USB cable and
> must be operated by proxy through a microcontroller within the device.
> The USB protocol has a concept known as an "endpoint", through which
> data can be exchanged. Each endpoint is logically (and overly
> simplified) a serial data stream, and multiple such endpoints can
> operate concurrently over a single USB connection. So far so good.
> The issue however is that the number, type, and characteristics of the
> available endpoints is dependant entirely on the device being operated.
> All USB devices implement "endpoint zero", which is the means by which
> USB devices are enumerated and some very basic control is performed
> (e.g. discovery of the other endpoints). The PVR USB2 hardware
> implements several additional endpoints. One endpoint is for the
> command / response communication that we use to operate the FX2
> microcontroller. Another endpoint is for the loading of device
> firmware. And another endpoint (the one with the highest bandwidth
> demands) is the path through which the mpeg data is retrieved. On 29xxx
> devices there is a very tantalizing but unused additional endpoint which
> MIGHT have been intended for VBI or perhaps raw video. However on 24xxx
> devices (which are newer than 29xxx) support for that endpoint has
> disappeared from the device. So we're left with a problem - even if we
> can get the PVR USB2 device to capture VBI data (which we should be able
> to do) I can find no decent way to transport that back to the host.
> There needs to be an endpoint for this, especially if we're talking
> about raw unprocessed VBI data (which needs more bandwidth).
>
> I suspect it might be possible to re-task the mpeg data endpoint for
> other purposes. However without the mpeg data coming out, then what
> point is there to using it for VBI?
>
> I mentioned 3 possible implementations. The first is just having the
> encoder do the work and getting it from within the mpeg stream. But
> that is known not to work. The second is retrieving it directly
> ourselves. That should require another USB endpoint, but such a thing
> does not appear to exist. The 3rd possibility MIGHT be to instead pull
> the VBI data directly from the capture chip over I2C. On the PVR USB2
> device, I2C transfers are implemented as several of the command /
> response packets over the endpoint used to control the FX2. This method
> might work, but the I2C pathway is inefficient and slow. It is really
> only meant to transfer a few bytes at a time - for control of the
> various chips in the device. Raw VBI might simply be too much for that.
> Sliced (processed) VBI might be more possible, but I'm really not sure.
> In any case, VBI transfer over I2C might actually require more CPU than
> the mpeg video itself - since it's not a pathway optimized for this sort
> of thing. But I don't really know.
>
> Oh, there is a 4th but even uglier possibility. I know Pantelis was
> looking at this. I mentioned that it might be possible to re-task the
> mpeg data endpoint. Well we think it might be possible to put the mpeg
> encoder into a sort of bypass mode and just spit out the raw video frame
> data instead. There's enough bandwidth in a USB 2.0 hi-speed connection
> to do this, but I don't know if the PVR USB2 device itself could keep
> up. In theory by doing this, then the VBI data will come along "for
> free" as part of the frame and can be extracted in the host through
> other means. However I don't think Pantelis has had much luck with this
> approach. And there's another downside: no audio. When capturing mpeg
> data, the encoder in the PVR USB2 device also compresses and combines
> the audio into that same stream. But if we were to bypass the encoding
> process then there's no means anymore to transport the audio back to the
> host :-(
>
> I'm still learning the ins & outs of VBI, but this is kind of where
> things stand right now.
>
> -Mike
There is another option: you can read the CC data directly from the
saa7115 or cx2584x registers, bypassing the cx23416 entirely. Look at the
test/vbi.c program in ivtv: the '-r' option enables reading from
registers. The tricky bit with this is that it cannot be used for teletext
(which is where subtitles are located for PAL/SECAM), and that the timing
is difficult if you want to do this in the driver. But it is a viable
alternative for CC data.
Regards,
Hans
More information about the pvrusb2
mailing list