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