VDR constantly tries to change transponder frequency

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

 



Anssi Hannula wrote:
> ...
> Okay, attached is a patch for nit.c that checks for all the frequencies
> in frequency_list_descriptor for the channel's frequency and if found,
> use it so that channel's frequency is not changed.
> 
> Also in the detection of new transponders all frequencies are added for
> the EITscanner.
> 
> I tested it by removing a transponder from channels.conf, and VDR found
> it again (though it took a while, as there are *many* frequencies in the
> frequency_list_descriptor). This too hasn't been working before on the
> DVB-T network of Finland.
> 
> Note that the patch uses list from C++ STL. If you wish to implement the
> list with something else, it should be trivial to modify.
> 
> 
> 
> ------------------------------------------------------------------------
> 
> --- vdr-vanilla/nit.c	2006-04-15 17:10:42.000000000 +0300
> +++ vdr-vanilla/nit.c.new	2006-05-27 00:14:16.000000000 +0300
> @@ -7,6 +7,7 @@
>   * $Id: nit.c 1.11 2006/04/15 14:10:42 kls Exp $
>   */
>  
> +#include <list>
>  #include "nit.h"
>  #include <linux/dvb/frontend.h>
>  #include "channels.h"
> @@ -95,39 +96,75 @@ void cNitFilter::Process(u_short Pid, u_
>    SI::NIT::TransportStream ts;
>    for (SI::Loop::Iterator it; nit.transportStreamLoop.getNext(ts, it); ) {
>        SI::Descriptor *d;
> +      std::list<int> Frequencies;
> +      std::list<int>::iterator frequency;
> +      for (SI::Loop::Iterator it2; (d = ts.transportStreamDescriptors.getNext(it2, SI::FrequencyListDescriptorTag)); ) {
> +          SI::FrequencyListDescriptor *fld = (SI::FrequencyListDescriptor *)d;
> +          int coding_type = fld->getCodingType();
> +          switch (coding_type) {
> +            case 1: // Satellite
> +                 for (SI::Loop::Iterator it3; fld->frequencies.hasNext(it3); )
> +                     Frequencies.push_back(BCD2INT(fld->frequencies.getNext(it3)) / 100);
> +                 break;
> +            case 2: // Cable
> +                 for (SI::Loop::Iterator it3; fld->frequencies.hasNext(it3); )
> +                     Frequencies.push_back(BCD2INT(fld->frequencies.getNext(it3)) / 10);
> +                 break;
> +            case 3: // Terrestrial
> +                 for (SI::Loop::Iterator it3; fld->frequencies.hasNext(it3); )
> +                     Frequencies.push_back(fld->frequencies.getNext(it3) * 10);
> +                 break;
> +            default: ;
> +            }

I believe there is a 'delete d' missing here.

> +          }

I guess it's fair to assume that each TransportStream can contain
at most one FrequencyListDescriptor, right? Otherwise the above
loop could mix frequencies from different coding types, which would
lead to confusion later on.

Klaus


[Index of Archives]     [Linux Media]     [Asterisk]     [DCCP]     [Netdev]     [Xorg]     [Util Linux NG]     [Xfree86]     [Big List of Linux Books]     [Fedora Users]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux