[linux-dvb] szap-pmt.diff
Johannes Stezenbach
js at linuxtv.org
Sun Jun 12 14:55:41 CEST 2005
On Sat, Jun 11, 2005 at 08:43:33PM +0200, Matthias Mueller wrote:
> static int set_demux(int dmxfd, int pid, int audio, int dvr)
> {
> struct dmx_pes_filter_params pesfilter;
>
> - if (pid <= 0 || pid >= 0x1fff) /* ignore this pid to allow radio services */
> + if (pid < 0 || pid >= 0x1fff) /* ignore this pid to allow radio services */
> return TRUE;
Unfortunately there are channels.conf files which
use 0 for "no video/audio pid" which is OK since 0 is no valid
video/audio pid. You need to handle this in read_channels.
> - pesfilter.pes_type = audio ? DMX_PES_AUDIO : DMX_PES_VIDEO;
> + pesfilter.pes_type = audio;
> +int get_pmt(char *dmxdev, int sid)
> +{
> + int patfd,count;
> + int pmt=0;
> + int patread=0;
How about some whitespace?
> + int section_length;
> + unsigned char buft[4096];
> + unsigned char *buf = buft;
> + struct dmx_sct_filter_params f;
> +
> + memset(&f, 0, sizeof(f));
> + f.pid = 0;
> + f.filter.filter[0] = (uint8_t) 0x42;
> + f.filter.filter[0] = 0xff;
Huh?
- you should rename this function to get_pmt_pid()
- the PAT has table_id 0, not 0x42
- the (uint8_t) cast is unnecessary
- you probably meant to set f.filter.mask[0], but luckily this
error cancels out your previous one :-)
> @@ -230,10 +290,12 @@
> static
> int zap_to(unsigned int adapter, unsigned int frontend, unsigned int demux,
> unsigned int sat_no, unsigned int freq, unsigned int pol,
> - unsigned int sr, unsigned int vpid, unsigned int apid, int dvr)
> + unsigned int sr, unsigned int vpid, unsigned int apid, int sid,
This line adds trailing whitespace
> @@ -293,13 +374,30 @@
>
> if (diseqc(fefd, sat_no, pol, hiband))
> if (do_tune(fefd, ifreq, sr))
> - if (set_demux(videofd, vpid, 0, dvr))
> - if (set_demux(audiofd, apid, 1, dvr))
> - result = TRUE;
> + if (set_demux(videofd, vpid, DMX_PES_OTHER, dvr))
> + if (set_demux(audiofd, apid, DMX_PES_OTHER, dvr)) {
Argh! This just disabled live decoding on FF cards :-(
> + if (pmt) {
> + pmtpid=get_pmt(dmxdev, sid);
> + if (pmtpid < 0) {
> + result = FALSE;
> + }
> + if (pmtpid == 0) {
> + fprintf(stderr,"couldn't find pmt for sid %04x\n",sid);
> + result = FALSE;
> + }
> + if (set_demux(patfd, 0, DMX_PES_OTHER, dvr))
> + if (set_demux(pmtfd, pmtpid, DMX_PES_OTHER, dvr))
indentation
> + result = TRUE;
> + } else {
> + result = TRUE;
> + }
> + }
> + unsigned int demux, int dvr, int pmt)
please rename "pmt" to something more descriptive, e.g. "rec_psi"
Johannes
More information about the linux-dvb
mailing list