[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