[mythtv] [PATCH] DVB support

Ben Bucksch linux.news at bucksch.org
Fri May 2 05:12:36 EDT 2003

I think I am done so far with DVB support, as far as I can get from here 
without an card locally.

 1. State

 1.1. DVB

Tuning works, the initial channel is set correctly. I am not sure, if 
switching channels works, because the box with the DVB card is a few 
thousand km away :-) (thanks again Edward).

Recording of the data also works. I fetch an MPEG TS from the card, 
either prefiltered to the right channel or the full TS, filter out the 
right channel, convert it to MPEG PS and write it into the 
nuppelfile/ringbuffer the same way Isaac did it with the PVR (incl. his 
recent seeking support).

The resulting file plays correctly in mplayer, although the same file 
seems to have framedrops or the like when streamed via MythTV, I have no 
clue why that is, Edward should write more about that.

Tuning to several channels at the same time should work in theory, 
although I haven't tested it and the required support within MythTV (to 
know that it can get 2 channels from the same card) does not exist yet.

Channels must be entered manually into the database (see docs posted 
earlier). Somebody needs to write a importer from a channel listing 
format, e.g. dvbtune's XML output (data directly from the DVB feed) or 
channels.conf. Ideally, we should one day have a manual graphical config 
tool as well, at least to change the names and presets of the channels.

 1.2. Stream

I have a simple recorder and channel implementation (the normal external 
channel impl. had some dependencies on analog TV tuning) which should 
allow people to use an external program to tune and to receive an MPEG 
stream via stdout/pipe. If there was no built-in DVB support in MythTV, 
though would have allowed to use dvbstream to add DVB support in a 
hackish / home-brewn way. It is meant to allow "Unix toolsmith" users 
without programming knowledge to extend/adapt MythTV for their purposes. 
However, the implementation I have is rudimentaty, unfinished and 
completely untested, so it's probably not ready to be checked in, and I 
don't know, if I'll further work on it, given that I have no immediate 
need for it. It is included for your possible enjoyment or adoption and 
as a simple example on how to use the new baseclasses / add new data 
sources / add new tuning/recording methods. It should be renamed as 
well, "stream" is confusing.

 1.3. General changes

I had to make some changes to the design of MythTV. I checked analog TV 
on my box, and it still seems to work for me.

 2. Changes

Here a high-level overview over the changes I did.

 2.1. libdvbdev

This new library adds DVB- and MPEG-specific functions required for DVB 
support. Mainly, there are 3 functions:

   * tune_it() tunes the DVB card. implemented solely by tune.c/h.
   * set_ts_filter() sets the PID filters in the DVB hardware or
     driver. Implemented solely within dvbdev.c.
   * ts_to_ps() filters for certain (currently 2) PIDs in (userlevel)
     software and also converts an MPEG TS to an MPEG PS. (I can't
     believe that I spent 3 days to write this simple function,
     including finding a suitable base lib). Implemented using the
     prestine mpegtools files transform.c/h, ringbuffy.c/h, remux.c/h
     and ctools.c/h.

 2.2. Base classes

Both the |Channel| (used for tuning) and the |MpegRecorder| (used to 
record MPEG data) have fairly large dependencies on V4L / analog TV 
(/dev/video devices etc.). While I needed some generic functionality in 
these classes, and other classes (TVRec, most notably) use the Channel 
interface extensively, the dependency on V4L of course broke DVB 
support, because there is no /dev/video. So, I separated the generic 
functionality and interface from the V4L dependencies, kept the generic 
functionality where it was and introduced new subclasses for analog TV, 
which then contain the V4L-specific parts. The new hierarchy is:

 2.3. New tuning parameter storage

As discussed recently, DVB tuning needs quite a number of new tuning 
parameters for each channel. I tried to come up with a generic and 
future-proof method how to store them. Unfortunately, Isaac didn't like 
my first solution, I haven't gotten any feedback on my other suggestion. 
I hope we'll see a good solution being proposed later, and it'll be 
implemented, but for now, I kept the method I already implemented, 
namely to store a list of parameters/properties in one field.

Analog tuning can optionally (per a compile-time flag, defaulf off) use 
the new way to store tuning parameters. If used, the channum column can 
be (ab)used as "preset" the way Europeans expect or even need (I can't 
enter a channum like "SE11" on my remote, and many of my analog channels 
have that format). In that case, the UI will show the preset in all 
places where it now shows the channum.
For DVB, the channum is free to be used as preset anyways.

For a documentation of the parameters and the format, see an earlier 
post of mine to the dev list.

 2.4. SetOption

Currently, the RecorderBase takes a SetBaseOption(QString, QString) and 
the MpegRecorder and nuppelrecorder take a SetEncodingOption(QString, 
int). Both functions have basically the same purpose. Because I needed a 
string in the streamrecorder, and I didn't see a point in the 
distinction, I merged these 2 functions and used overloading and 
inheritance/polymorphy to (optionally) have both the string and the int 
version in the base and the encoder. Because the trigger for this change 
was the StreamRecorder (not the DVBRecorder as I thought), this change 
is not strictly necessary, but would need some rework to remove it. 
However, I believe this change makes the purpose of these functions 
clearer and is more flexible.

 2.5. Don't use device in DB query

TVRec uses the videodevice as parameter for almost every query. This 
breaks, if there is no video device, e.g. for StreamChannel, maybe also 
for DVBChannel. I don't think that's needed anyways, the card id should 
work just as well, so I queried for that instead.

 3. Patches

Many of these changes have interdependencies, at least on the patch 
level. There are too many changes next to each other to separate them 
all cleanly, it often was just not possible without several complete 
DVB support even inherently depends on all of these changes apart from 
SetOption (but still depends on the latter on the patch level).

Nevertheless, Isaac requested that I separate the changes into different 
patches. I can understand that, to more easily see which changes are 
related. I tried my best to keep them separate and created a number of 
patches, each with a different change. But, as said, in some places, the 
changes were so close to each other (or depending on each other) that 
|diff| stuffed them together. In these cases, I placed them in 
mixed.diff, you'll have to sort out these changes manually, I'm sorry. 
But that way, I could separate the bulk of the changes, without needing 
to rewrite/change the code itself. The patches add up to the cumulative 
patch in dvb-N.tar.bz2, but the latter also contains the required new files.

The new base class files already use SetOption() and newtuning and thus 
depend on those patches. nodevice depends on base classes (GetCardID is 
implemented there). DVB depends on all other changes apart from the 
StreamChannel/Recorder and misc.diff.

The current patch is at <http://www.bucksch.org/xfer/dvb-21.tar.bz2>, 
with the separated diffs at 
<http://www.bucksch.org/xfer/separated-21.tar.bz2>. The attachment was 
too large. These URLs are temporary.


More information about the mythtv-dev mailing list