Mailing List archive

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

[linux-dvb] Re: "scan" utility



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.

Home | Main Index | Thread Index