Johannes Stezenbach wrote:

A one-bit field can either be 0 or 1 (unsigned), or 0 or -1 (signed).



t->we_flag = buf[8] & 0x7f;



t->we_flag = (buf[8] & 0x80) != 0;


meanwhile i found another solution bit shift right.

Here is the patch.

cu
Florian
diff -uNr DVB.orig/apps/scan/dump-vdr.c DVB/apps/scan/dump-vdr.c
--- DVB.orig/apps/scan/dump-vdr.c       2003-06-10 15:25:37.000000000 +0200
+++ DVB/apps/scan/dump-vdr.c    2003-06-13 17:43:46.000000000 +0200
@@ -22,7 +22,6 @@
        "999"
 };
 
-
 static const char *qam_name [] = {
        "0",
        "16",
@@ -65,12 +64,19 @@
        "999"
 };
 
+static const char *west_east_flag_name [] = {
+       "W",
+       "E"
+};
 
-void vdr_dump_dvb_parameters (FILE *f, fe_type_t type, struct dvb_frontend_parameters 
*p)
+void vdr_dump_dvb_parameters (FILE *f, fe_type_t type, struct dvb_frontend_parameters 
*p, char polarity, int orbital_pos, int we_flag)
 {
        switch (type) {
        case FE_QPSK:
-               fprintf (f, "VDR/DVB-S-OUTPUT-NOT-IMPLEMENTED-YET");
+               fprintf (f, "%i:", p->frequency / 1000);
+               fprintf (f, "%c:", polarity);
+               fprintf (f, "S%i%s:", orbital_pos, west_east_flag_name[we_flag]);
+               fprintf (f, "%i:", p->u.qpsk.symbol_rate);
                break;
 
        case FE_QAM:
@@ -99,8 +105,10 @@
 
 void vdr_dump_service_parameter_set (FILE *f, 
                                 const char *service_name,
+                                const char *provider_name,
                                 fe_type_t type,
                                 struct dvb_frontend_parameters *p,
+                                char polarity,
                                 int video_pid,
                                 uint16_t *audio_pid,
                                  int audio_num,
@@ -108,18 +116,26 @@
                                 int scrambled,
                                  int service_id,
                                 int network_id,
-                                int transport_stream_id)
+                                int transport_stream_id,
+                                int orbital_pos,
+                                int we_flag,
+                                int dump_provider)
 {
         int i;
-        
-       fprintf (f, "%s:", service_name);
-       vdr_dump_dvb_parameters (f, type, p);
-       fprintf (f, ":%i:", video_pid);
-       fprintf (f, "%i", audio_pid[0]);
-        for (i=1; i<audio_num; i++)
-               fprintf (f, ",%i", audio_pid[i]);        
-       fprintf (f, ":%d:%d:%d:%d:%d:0", teletext_pid, scrambled,
-                       service_id, network_id, transport_stream_id);
-       fprintf (f, "\n");
+
+       if (video_pid | audio_pid[0])
+       {
+               if (dump_provider == 1)
+                       fprintf (f, "%s:", provider_name);
+               fprintf (f, "%s:", service_name);
+               vdr_dump_dvb_parameters (f, type, p, polarity, orbital_pos, we_flag);
+               fprintf (f, ":%i:", video_pid);
+               fprintf (f, "%i", audio_pid[0]);
+               for (i=1; i<audio_num; i++)
+                       fprintf (f, ",%i", audio_pid[i]);        
+               fprintf (f, ":%d:%d:%d:%d:%d:0", teletext_pid, scrambled,
+                               service_id, network_id, transport_stream_id);
+               fprintf (f, "\n");
+       }
 }
 
diff -uNr DVB.orig/apps/scan/dump-vdr.h DVB/apps/scan/dump-vdr.h
--- DVB.orig/apps/scan/dump-vdr.h       2003-06-10 15:25:37.000000000 +0200
+++ DVB/apps/scan/dump-vdr.h    2003-06-13 14:07:12.000000000 +0200
@@ -4,13 +4,15 @@
 #include <linux/dvb/frontend.h>
 
 extern 
-void vdr_dump_dvb_parameters (FILE *f, fe_type_t type, struct dvb_frontend_parameters 
*p);
+void vdr_dump_dvb_parameters (FILE *f, fe_type_t type, struct dvb_frontend_parameters 
*p, char polarity, int orbital_pos, int we_flag);
 
 extern
 void vdr_dump_service_parameter_set (FILE *f,
                                 const char *service_name,
+                                const char *provider_name,
                                 fe_type_t type,
                                 struct dvb_frontend_parameters *p,
+                                char polarity,
                                 int video_pid,
                                 uint16_t *audio_pid,
                                  int audio_num,
@@ -18,7 +20,10 @@
                                 int scrambled,
                                  int service_id,
                                 int network_id,
-                                int transport_stream_id);
+                                int transport_stream_id,
+                                int orbital_pos,
+                                int we_flag,
+                                int dump_provider);
 
 #endif
 
diff -uNr DVB.orig/apps/scan/scan.c DVB/apps/scan/scan.c
--- DVB.orig/apps/scan/scan.c   2003-06-10 15:25:37.000000000 +0200
+++ DVB/apps/scan/scan.c        2003-06-13 17:23:41.000000000 +0200
@@ -36,6 +36,7 @@
 
 static int long_timeout;
 static int current_tp_only;
+static int vdr_dump_provider;
 
 enum table_type {
        PAT,
@@ -85,7 +86,9 @@
        int transport_stream_id;
        fe_type_t type;
        struct dvb_frontend_parameters param;
-       enum polarisation polarisation : 2;        /*  only for DVB-S */
+       enum polarisation polarisation : 2;        /* only for DVB-S */
+       int orbital_pos;                        /* only for DVB-S */
+       int we_flag;            /* West/East Flag - only for DVB-S */
        int scan_done             : 1;
        int last_tuning_failed    : 1;
        int other_frequency_flag  : 1;          /* DVB-T */
@@ -102,6 +105,7 @@
 };
 
 #define AUDIO_CHAN_MAX (5)
+#define CA_SYSTEM_ID_MAX (15) /* (255 Bit/16 Bit = 15) */
 
 struct service {
        int transport_stream_id;
@@ -113,7 +117,9 @@
        uint16_t video_pid;
        uint16_t audio_pid[AUDIO_CHAN_MAX];
        char audio_lang[AUDIO_CHAN_MAX][4];
-        int audio_num;
+       int audio_num;
+       char ca_id[CA_SYSTEM_ID_MAX];
+       int ca_num;
        uint16_t teletext_pid;
        uint16_t subtitling_pid;
        uint16_t ac3_pid;
@@ -239,6 +245,20 @@
        return (void*) ((long) list->entry + n * list->entry_size);
 }
 
+static
+void parse_ca_identifier_descriptor (const unsigned char *buf,
+                                                struct service *s)
+{
+       unsigned char len = buf [1];
+
+       buf += 2;
+
+       if (len >= 16) {
+               MSG("    CA_ID=%.3s %d", buf, buf[3]);
+               memcpy(s->ca_id[s->ca_num], buf, 15);
+       }
+}
+
 
 static
 void parse_iso639_language_descriptor (const unsigned char *buf, struct service *s)
@@ -324,7 +344,6 @@
        fprintf (stderr, "\n");
 }
 
-
 static
 void parse_satellite_delivery_system_descriptor (const unsigned char *buf,
                                                 struct transponder *t)
@@ -340,6 +359,13 @@
        t->polarisation = (buf[8] >> 5) & 0x03;
        t->param.inversion = INVERSION_AUTO;
 
+       t->orbital_pos = bcd32_to_cpu (0x00,
+                                      0x00,
+                                      buf[6],
+                                      buf[7]);
+       /*t->we_flag =  buf[8] & 0x7f;*/
+       t->we_flag = buf[8]>>7;
+
        dump_dvb_parameters (stderr, t);
        if (t->scan_done)
                fprintf (stderr, " (done)");
@@ -556,6 +582,11 @@
                                parse_service_descriptor (buf, data);
                        break;
 
+               case 0x53:
+                       if (t == SDT)
+                               parse_ca_identifier_descriptor (buf, data);
+                       break;
+
                case 0x5a:
                        if (t == NIT)
                                parse_terrestrial_delivery_system_descriptor (buf, 
data);
@@ -1433,8 +1464,10 @@
                           case OUTPUT_VDR:
                                 vdr_dump_service_parameter_set (stdout,
                                                    s->service_name,
+                                                   s->provider_name,
                                                    t->type,
                                                    &t->param,
+                                                   sat_polarisation(t),
                                                    s->video_pid,
                                                    s->audio_pid,
                                                    //FIXME: s->audio_lang
@@ -1445,7 +1478,10 @@
                                                    //FIXME: s->ac3_pid
                                                     s->service_id,
                                                    t->network_id,
-                                                   s->transport_stream_id);
+                                                   s->transport_stream_id,
+                                                   t->orbital_pos,
+                                                   t->we_flag,
+                                                   vdr_dump_provider);
                                 break;
                           case OUTPUT_ZAP:
                                zap_dump_service_parameter_set (stdout,
@@ -1469,11 +1505,12 @@
 
 
 static const char *usage =
-"\nusage: %s [-c] [-o output_format] [-a adapter_num] [-f frontend_id] [-d demux_id] 
[-s switch_pos]\n"
+"\nusage: %s [-c] [-o output_format] [-a adapter_num] [-f frontend_id] [-d demux_id] 
[-s switch_pos] [-p]\n"
 "\t-c\tscan on currently tuned transponder only\n"
 "\t-5\tmultiply all filter timeouts by factor 5\n"
 "\t\tfor non-DVB-compliant section repitition rates\n"
-"\t-o\tSelect output format: 'zap' (default) or 'vdr' or 'pids' (default with -c)\n";
+"\t-o\tSelect output format: 'zap' (default) or 'vdr' or 'pids' (default with -c)\n"
+"\t-p\tONLY for vdr output format: dump provider name\n";
 
 
 int main (int argc, char **argv)
@@ -1481,8 +1518,9 @@
        char frontend_devname [80];
        int adapter = 0, frontend = 0, demux = 0;
        int opt, i;
+       vdr_dump_provider = 0;
 
-       while ((opt = getopt(argc, argv, "5ca:f:d:s:o:")) != -1) {
+       while ((opt = getopt(argc, argv, "5cpa:f:d:s:o:")) != -1) {
                switch (opt) {
                case 'a':
                        adapter = strtoul(optarg, NULL, 0);
@@ -1497,6 +1535,9 @@
                case 'f':
                        frontend = strtoul(optarg, NULL, 0);
                        break;
+               case 'p':
+                       if (output_format == OUTPUT_VDR) vdr_dump_provider = 1;
+                       break;
                case 's':
                        switch_pos = strtoul(optarg, NULL, 0);
                        break;
@@ -1547,7 +1588,7 @@
   switch (output_format) {
     case OUTPUT_PIDS:
     case OUTPUT_VDR:
-        vdr_dump_dvb_parameters (f, t->type, &t->param);
+        vdr_dump_dvb_parameters (f, t->type, &t->param, sat_polarisation (t), 
t->orbital_pos, t->we_flag);
         break;
     case OUTPUT_ZAP:
         zap_dump_dvb_parameters (f, t->type, &t->param, sat_polarisation (t), 
sat_number (t));
Bin�rdateien DVB.orig/apps/scan.tar.bz2 and DVB/apps/scan.tar.bz2 sind verschieden.

Reply via email to