Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[vdr] Re: DD/AC3 dropouts with Teletext Plugin



On Thu, Mar 13, 2003 at 09:08:59AM +0100, Christian Jacobsen wrote:
> Hallo,
> 
> I was wondering if I am the only one having this or if it is a known
> problem.
> 
> If I use Bitstream or AC3overDVB togehter with the Teletext pluggin I have
> sound dropouts on Pro7 and in Replaying AC3/DD recordings !?
> 
> I think that the Teletext plugin in the background does something that takes
> to long and thereby "steals" time from bitstream so that the sound drops.
> After that the Sound and picture on pro7 is out of sync :(
> 
> I cannot remeber if Pro7 sound was out of sync with AC3overDVB - but
> replaying recodings was having dropouts.
> 
> Tested in these konfigurations :
> VDR 1.1.20 + DVB 1.0.0 pre2 + Bitstream 0.43c + Teletext 0.7.6 + VDRC 0.0.8
> + Mplayer 0.7.8
> VDR 1.1.25 + DVB 1.0.0 pre2 + Bitstream 0.43c + Teletext 0.7.6 + VDRC 0.0.8
> + Mplayer (don't remember what version)
> VDR 1.1.25 + DVB 1.0.0 pre2 + Ac3overDVB 0.1.3 + Teletext 0.7.6 + VDRC 0.0.8
> 
> When i don't load the Teletext-plugin the problem is gone

The problem is the Receiver function of the Teletext plugin, see txtrecv.c:

  void cTxtReceiver::Receive(uchar *Data, int Length)
  {
   uchar *Datai=(uchar *)malloc(Length+60);
   memset(Datai,0x00,Length);
   memcpy(Datai,Data,Length);
   for (int i=0; i < 4; i++)
    {
     if (Datai[4+i*46]==2) {
       for (int j=(8+i*46);j<(50+i*46);j++)
        Datai[j]=invtab[Datai[j]];
       DecodeTXT(&Datai[i*46]);
     }
    } 
   free(Datai);
  }

.. in other words the CPU time which is required for decoding will block
any other Receiver attachted to the device.
IMHO a ring buffer would be the correct solution. OK this would also
require an other thread for decoding:

<cite src="vdr-1.1.25/receiver.h">
  virtual void Receive(uchar *Data, int Length) = 0;
               // This function is called from the cDevice we are attached to, and
               // delivers one TS packet from the set of PIDs the cReceiver has requested.
               // The data packet must be accepted immediately, and the call must return
               // as soon as possible, without any unnecessary delay. Each TS packet
               // will be delivered only ONCE, so the cReceiver must make sure that
               // it will be able to buffer the data if necessary.
</cite>


       Werner


-- 
Info:
To unsubscribe send a mail to listar@linuxtv.org with "unsubscribe vdr" as subject.



Home | Main Index | Thread Index