[linux-dvb] [PATCH] dvb-apps: fix a few problems in scan wrt VDR
Darren Salt
linux at youmustbejoking.demon.co.uk
Sun Oct 23 00:47:28 CEST 2005
The attached patches fix the following bugs in scan.
- duplicate "0x" in some debug text
- "0x%#04x" => "0x0x1234"
- breakage in Freeview channel number parsing
- was applying the wrong mask for bits 8 and 9 due to operator precedence
- always output the stream ID (needed for EPG data association in VDR)
- may be the wrong method...?
- output of audio language information (for VDR 1.3.x)
- assumption: audio language 0 is also applicable to the AC3 stream
--
| Darren Salt | nr. Ashington, | RISC OS,
| ds at youmustbejoking.demon.co.uk | Northumberland | Linux
| ds at zap.tartarus.org | *Toon Army* |
| Down with the Mackems!
Small change can often be found under seat cushions.
-------------- next part --------------
Index: util/scan/scan.c
===================================================================
RCS file: /cvs/linuxtv/dvb-apps/util/scan/scan.c,v
retrieving revision 1.19
diff -u -r1.19 scan.c
--- util/scan/scan.c 28 Aug 2005 22:52:21 -0000 1.19
+++ util/scan/scan.c 22 Oct 2005 22:22:26 -0000
@@ -401,7 +403,7 @@
t->param.inversion = spectral_inversion;
if (verbosity >= 5) {
- debug("0x%#04x/0x%#04x ", t->network_id, t->transport_stream_id);
+ debug("%#04x/%#04x ", t->network_id, t->transport_stream_id);
dump_dvb_parameters (stderr, t);
if (t->scan_done)
dprintf(5, " (done)");
@@ -433,7 +435,7 @@
t->we_flag = buf[8] >> 7;
if (verbosity >= 5) {
- debug("0x%#04x/0x%#04x ", t->network_id, t->transport_stream_id);
+ debug("%#04x/%#04x ", t->network_id, t->transport_stream_id);
dump_dvb_parameters (stderr, t);
if (t->scan_done)
dprintf(5, " (done)");
@@ -487,7 +489,7 @@
t->other_frequency_flag = (buf[8] & 0x01);
if (verbosity >= 5) {
- debug("0x%#04x/0x%#04x ", t->network_id, t->transport_stream_id);
+ debug("%#04x/%#04x ", t->network_id, t->transport_stream_id);
dump_dvb_parameters (stderr, t);
if (t->scan_done)
dprintf(5, " (done)");
-------------- next part --------------
Index: util/scan/scan.c
===================================================================
RCS file: /cvs/linuxtv/dvb-apps/util/scan/scan.c,v
retrieving revision 1.19
diff -u -r1.19 scan.c
--- util/scan/scan.c 28 Aug 2005 22:52:21 -0000 1.19
+++ util/scan/scan.c 22 Oct 2005 22:22:26 -0000
@@ -343,7 +345,7 @@
buf += 2;
for (i = 0; i < n; i++) {
service_id = (buf[0]<<8)|(buf[1]&0xff);
- channel_num = (buf[2]&0x03<<8)|(buf[3]&0xff);
+ channel_num = ((buf[2]&0x03)<<8)|(buf[3]&0xff);
debug("Service ID 0x%x has channel number %d ", service_id, channel_num);
list_for_each(p1, &scanned_transponders) {
t = list_entry(p1, struct transponder, list);
-------------- next part --------------
Index: util/scan/scan.c
===================================================================
RCS file: /cvs/linuxtv/dvb-apps/util/scan/scan.c,v
retrieving revision 1.19
diff -u -r1.19 scan.c
--- util/scan/scan.c 28 Aug 2005 22:52:21 -0000 1.19
+++ util/scan/scan.c 22 Oct 2005 22:22:26 -0000
@@ -257,11 +257,13 @@
* (the DVB standards say theay should be unique within one
* network, but in real life...)
*/
-static struct service *alloc_service(struct transponder *tp, int service_id)
+static struct service *alloc_service(struct transponder *tp, int service_id,
+ int transport_stream_id)
{
struct service *s = calloc(1, sizeof(*s));
INIT_LIST_HEAD(&s->list);
s->service_id = service_id;
+ s->transport_stream_id = transport_stream_id;
list_add_tail(&s->list, &tp->services);
return s;
}
@@ -702,7 +704,7 @@
/* SDT might have been parsed first... */
s = find_service(current_tp, service_id);
if (!s)
- s = alloc_service(current_tp, service_id);
+ s = alloc_service(current_tp, service_id, transport_stream_id);
s->pmt_pid = ((buf[2] & 0x1f) << 8) | buf[3];
if (!s->priv && s->pmt_pid) {
s->priv = malloc(sizeof(struct section_buf));
@@ -892,7 +894,7 @@
s = find_service(current_tp, service_id);
if (!s)
/* maybe PAT has not yet been parsed... */
- s = alloc_service(current_tp, service_id);
+ s = alloc_service(current_tp, service_id, transport_stream_id);
s->running = (buf[3] >> 5) & 0x7;
s->scrambled = (buf[3] >> 4) & 1;
@@ -1020,7 +1022,7 @@
s = find_service(current_tp, ch.program_number);
if (!s)
- s = alloc_service(current_tp, ch.program_number);
+ s = alloc_service(current_tp, ch.program_number, transport_stream_id);
if (s->service_name)
free(s->service_name);
-------------- next part --------------
Index: util/scan/dump-vdr.c
===================================================================
RCS file: /cvs/linuxtv/dvb-apps/util/scan/dump-vdr.c,v
retrieving revision 1.4
diff -u -r1.4 dump-vdr.c
--- util/scan/dump-vdr.c 10 May 2005 20:29:17 -0000 1.4
+++ util/scan/dump-vdr.c 22 Oct 2005 22:22:21 -0000
@@ -120,6 +120,7 @@
int video_pid,
int pcr_pid,
uint16_t *audio_pid,
+ char audio_lang[][4],
int audio_num,
int teletext_pid,
int scrambled,
@@ -138,6 +139,11 @@
int i;
if ((video_pid || audio_pid[0]) && ((ca_select > 0) || ((ca_select == 0) && (scrambled == 0)))) {
+ if (vdr_version <= 2) {
+ audio_lang = NULL;
+ network_id = 0;
+ transport_stream_id = 0;
+ }
if ((dump_channum == 1) && (channel_num > 0))
fprintf(f, ":@%i\n", channel_num);
if (vdr_version >= 3)
@@ -154,15 +160,21 @@
else
fprintf (f, "%i:", video_pid);
fprintf (f, "%i", audio_pid[0]);
+ if (audio_lang && audio_lang[0][0])
+ fprintf (f, "=%.4s", audio_lang[0]);
for (i = 1; i < audio_num; i++)
+ {
fprintf (f, ",%i", audio_pid[i]);
+ if (audio_lang && audio_lang[i][0])
+ fprintf (f, "=%.4s", audio_lang[i]);
+ }
if (ac3_pid)
+ {
fprintf (f, ";%i", ac3_pid);
+ if (audio_lang && audio_lang[0][0])
+ fprintf (f, "=%.4s", audio_lang[0]);
+ }
if (scrambled == 1) scrambled = ca_select;
- if (vdr_version == 2) {
- network_id = 0;
- transport_stream_id = 0;
- }
fprintf (f, ":%d:%d:%d:%d:%d:0", teletext_pid, scrambled,
service_id, network_id, transport_stream_id);
fprintf (f, "\n");
Index: util/scan/dump-vdr.h
===================================================================
RCS file: /cvs/linuxtv/dvb-apps/util/scan/dump-vdr.h,v
retrieving revision 1.2
diff -u -r1.2 dump-vdr.h
--- util/scan/dump-vdr.h 19 Jan 2004 20:43:07 -0000 1.2
+++ util/scan/dump-vdr.h 22 Oct 2005 22:22:21 -0000
@@ -19,6 +19,7 @@
int video_pid,
int pcr_pid,
uint16_t *audio_pid,
+ char audio_lang[][4],
int audio_num,
int teletext_pid,
int scrambled,
Index: util/scan/scan.c
===================================================================
RCS file: /cvs/linuxtv/dvb-apps/util/scan/scan.c,v
retrieving revision 1.19
diff -u -r1.19 scan.c
--- util/scan/scan.c 28 Aug 2005 22:52:21 -0000 1.19
+++ util/scan/scan.c 22 Oct 2005 22:22:26 -0000
@@ -1968,7 +1970,7 @@
s->video_pid,
s->pcr_pid,
s->audio_pid,
- //FIXME: s->audio_lang
+ s->audio_lang,
s->audio_num,
s->teletext_pid,
s->scrambled,
More information about the linux-dvb
mailing list