[linux-dvb] Tuning problems with loss of TS packets

Josef Wolf jw at raven.inka.de
Sat Feb 7 02:57:44 CET 2009


sometimes, I experience non-deterministic problems with tuning on some
transponders with dvb-s.  For example, on astra-H-11954, I have about
50% chance to get a good tune.  If I get a bad tune, I still receive
TS packets from the chosen transponder, but about 10%..20% of the
packets are lost.  The (remaining) packets contain PAT/PMT/PES packets
from the chosen transponder, so it is pretty safe to assume that
actual tuning worked properly.

What I do is pretty much straight forward:

  1. open frontend/dmx/dvr devices
  2. send diseqc command to switch to desired input
  3. use FE_SET_FRONTEND ioctl to tune to desired transponder
  4. wait for FE_HAS_LOCK
  5. set dmx_pesfilter_params to:
         pid:      0x2000  /* yes, I want the whole transponder */
         input:    DMX_IN_FRONTEND
         output:   DMX_OUT_TS_TAP
         pes_type: DMX_PES_OTHER
         flags:    DMX_IMMEDIATE_START

With this sequence, I have about 50% chance to receive a proper TS
stream.  When the stream is not OK, I can see about 10%..20% loss
of TS packets.

I have checked signal quality, but there is no significant difference
from working to non-working:

   Status:1f sig:ac80 snr:d9e0 ber:00000000 unc:fffffffe FE_HAS_LOCK
   Status:1f sig:adbe snr:dac4 ber:00000000 unc:fffffffe FE_HAS_LOCK

So I have tried to narrow the problem, and I think I've come pretty
close (but still no cigar):

Once the sequence (which is listed above) is completed, I can easily
(but randomly, IOW: I have to try 1..3 times) switch from proper stream
to broken stream and vice-versa simply by repeating step 3 with _exactly_
the _same_ values.

To be precise: on an already set-up transponder, re-executing this

  static void tune_frequency (int ifreq, int sr)
      struct dvb_frontend_parameters tuneto;
      tuneto.frequency = ifreq*1000;
      tuneto.inversion = INVERSION_AUTO;
      tuneto.u.qpsk.symbol_rate = sr*1000;
      tuneto.u.qpsk.fec_inner = FEC_AUTO;
      if (ioctl(fefd, FE_SET_FRONTEND, &tuneto) == -1) {
          fatal ("FE_SET_FRONTEND failed: %s\n", strerror (errno));

with _exactly_ the same values for ifreq and sr, is able to toggle from
good TS stream to bad TS stream or vice-versa.  As long as I avoid to
call this function, the quality of the stream does _not_ change.

I have tried to use fixed values instead of *_AUTO for FEC and INVERSION,
but that did not help either.

Any ideas?

 $ lspci -v
 [ ... ]
 03:07.0 Multimedia controller: Philips Semiconductors SAA7146 (rev 01)
         Subsystem: Technotrend Systemtechnik GmbH Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card
         Flags: bus master, medium devsel, latency 32, IRQ 21
         Memory at fdcfe000 (32-bit, non-prefetchable) [size=512]
         Kernel driver in use: budget_ci dvb
         Kernel modules: snd-aw2, budget-ci
 $ uname -a
 Linux raven #1 SMP 2008-12-04 18:10:04 +0100 x86_64 x86_64 x86_64 GNU/Linux

More information about the linux-dvb mailing list