1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
|
diff -ur vdr-1.7.20/channels.c vdr-1.7.20.new/channels.c
--- vdr-1.7.20/channels.c 2010-11-07 12:24:59.000000000 +0000
+++ vdr-1.7.20.new/channels.c 2011-08-16 18:08:26.000000000 +0100
@@ -61,6 +61,7 @@
shortName = strdup("");
provider = strdup("");
portalName = strdup("");
+ defaultAuthority = strdup("");
memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__);
parameters = "";
modification = CHANNELMOD_NONE;
@@ -75,6 +76,7 @@
shortName = NULL;
provider = NULL;
portalName = NULL;
+ defaultAuthority = NULL;
schedule = NULL;
linkChannels = NULL;
refChannel = NULL;
@@ -103,6 +105,7 @@
free(shortName);
free(provider);
free(portalName);
+ free(defaultAuthority);
}
cChannel& cChannel::operator= (const cChannel &Channel)
@@ -111,6 +114,7 @@
shortName = strcpyrealloc(shortName, Channel.shortName);
provider = strcpyrealloc(provider, Channel.provider);
portalName = strcpyrealloc(portalName, Channel.portalName);
+ defaultAuthority = strcpyrealloc(defaultAuthority, Channel.defaultAuthority);
memcpy(&__BeginData__, &Channel.__BeginData__, (char *)&Channel.__EndData__ - (char *)&Channel.__BeginData__);
parameters = Channel.parameters;
return *this;
@@ -255,6 +259,13 @@
}
}
+void cChannel::SetDefaultAuthority(const char *DefaultAuthority)
+{
+ if (!isempty(DefaultAuthority) && strcmp(defaultAuthority, DefaultAuthority) != 0) {
+ defaultAuthority = strcpyrealloc(defaultAuthority, DefaultAuthority);
+ }
+}
+
#define STRDIFF 0x01
#define VALDIFF 0x02
@@ -506,11 +517,11 @@
q += IntArrayToString(q, Channel->dpids, 10, Channel->dlangs, Channel->dtypes);
}
*q = 0;
- char caidbuf[MAXCAIDS * 5 + 10]; // 5: 4 digits plus delimiting ',', 10: paranoia
+ char caidbuf[MAXCAIDS * 5 + 10 + 256]; // 5: 4 digits plus delimiting ',', 10 + max DNS domain length: paranoia
q = caidbuf;
q += IntArrayToString(q, Channel->caids, 16);
*q = 0;
- buffer = cString::sprintf("%s:%d:%s:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d\n", FullName, Channel->frequency, *Channel->parameters, *cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, Channel->tpid, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid);
+ buffer = cString::sprintf("%s:%d:%s:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d:%s\n", FullName, Channel->frequency, *Channel->parameters, *cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, Channel->tpid, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid, Channel->defaultAuthority);
}
return buffer;
}
@@ -545,13 +556,16 @@
char *vpidbuf = NULL;
char *apidbuf = NULL;
char *caidbuf = NULL;
- int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, ¶mbuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpid, &caidbuf, &sid, &nid, &tid, &rid);
+ char *dabuf = NULL;
+ int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%a[^:]:%d :%d :%d :%d :%a[^:]", &namebuf, &frequency, ¶mbuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpid, &caidbuf, &sid, &nid, &tid, &rid, &dabuf);
if (fields >= 9) {
if (fields == 9) {
// allow reading of old format
sid = atoi(caidbuf);
delete caidbuf;
caidbuf = NULL;
+ delete dabuf;
+ dabuf = NULL;
caids[0] = tpid;
caids[1] = 0;
tpid = 0;
@@ -677,12 +691,17 @@
}
name = strcpyrealloc(name, namebuf);
+ if (dabuf) {
+ defaultAuthority = strcpyrealloc(defaultAuthority, dabuf);
+ }
+
free(parambuf);
free(sourcebuf);
free(vpidbuf);
free(apidbuf);
free(caidbuf);
free(namebuf);
+ free(dabuf);
if (!GetChannelID().Valid()) {
esyslog("ERROR: channel data results in invalid ID!");
return false;
diff -ur vdr-1.7.20/channels.h vdr-1.7.20.new/channels.h
--- vdr-1.7.20/channels.h 2011-08-06 10:56:13.000000000 +0100
+++ vdr-1.7.20.new/channels.h 2011-08-16 18:08:26.000000000 +0100
@@ -96,6 +96,7 @@
char *shortName;
char *provider;
char *portalName;
+ char *defaultAuthority;
int __BeginData__;
int frequency; // MHz
int source;
@@ -141,6 +142,7 @@
const char *ShortName(bool OrName = false) const { return (OrName && isempty(shortName)) ? name : shortName; }
const char *Provider(void) const { return provider; }
const char *PortalName(void) const { return portalName; }
+ const char *DefaultAuthority(void) const { return defaultAuthority; }
int Frequency(void) const { return frequency; } ///< Returns the actual frequency, as given in 'channels.conf'
int Transponder(void) const; ///< Returns the transponder frequency in MHz, plus the polarization in case of sat
static int Transponder(int Frequency, char Polarization); ///< builds the transponder from the given Frequency and Polarization
@@ -189,6 +191,7 @@
void SetId(int Nid, int Tid, int Sid, int Rid = 0);
void SetName(const char *Name, const char *ShortName, const char *Provider);
void SetPortalName(const char *PortalName);
+ void SetDefaultAuthority(const char *DefaultAuthority);
void SetPids(int Vpid, int Ppid, int Vtype, int *Apids, int *Atypes, char ALangs[][MAXLANGCODE2], int *Dpids, int *Dtypes, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid);
void SetCaIds(const int *CaIds); // list must be zero-terminated
void SetCaDescriptors(int Level);
diff -ur vdr-1.7.20/config.c vdr-1.7.20.new/config.c
--- vdr-1.7.20/config.c 2011-06-13 15:41:01.000000000 +0100
+++ vdr-1.7.20.new/config.c 2011-08-16 18:08:26.000000000 +0100
@@ -353,6 +353,7 @@
UseSubtitle = 1;
UseVps = 0;
VpsMargin = 120;
+ VpsFallback = 0;
RecordingDirs = 1;
FoldersInTimerMenu = 1;
NumberKeysForChars = 1;
@@ -545,6 +546,7 @@
else if (!strcasecmp(Name, "UseSubtitle")) UseSubtitle = atoi(Value);
else if (!strcasecmp(Name, "UseVps")) UseVps = atoi(Value);
else if (!strcasecmp(Name, "VpsMargin")) VpsMargin = atoi(Value);
+ else if (!strcasecmp(Name, "VpsFallback")) VpsFallback = atoi(Value);
else if (!strcasecmp(Name, "RecordingDirs")) RecordingDirs = atoi(Value);
else if (!strcasecmp(Name, "FoldersInTimerMenu")) FoldersInTimerMenu = atoi(Value);
else if (!strcasecmp(Name, "NumberKeysForChars")) NumberKeysForChars = atoi(Value);
@@ -641,6 +643,7 @@
Store("UseSubtitle", UseSubtitle);
Store("UseVps", UseVps);
Store("VpsMargin", VpsMargin);
+ Store("VpsFallback", VpsFallback);
Store("RecordingDirs", RecordingDirs);
Store("FoldersInTimerMenu", FoldersInTimerMenu);
Store("NumberKeysForChars", NumberKeysForChars);
diff -ur vdr-1.7.20/config.h vdr-1.7.20.new/config.h
--- vdr-1.7.20/config.h 2011-06-21 22:43:01.000000000 +0100
+++ vdr-1.7.20.new/config.h 2011-08-16 18:08:26.000000000 +0100
@@ -252,6 +252,7 @@
int UseSubtitle;
int UseVps;
int VpsMargin;
+ int VpsFallback;
int RecordingDirs;
int FoldersInTimerMenu;
int NumberKeysForChars;
diff -ur vdr-1.7.20/eit.c vdr-1.7.20.new/eit.c
--- vdr-1.7.20/eit.c 2010-05-14 15:08:35.000000000 +0100
+++ vdr-1.7.20.new/eit.c 2011-08-16 18:08:26.000000000 +0100
@@ -265,6 +265,33 @@
}
}
break;
+ case SI::ContentIdentifierDescriptorTag: {
+ SI::ContentIdentifierDescriptor *cd = (SI::ContentIdentifierDescriptor *)d;
+ SI::ContentIdentifierDescriptor::Identifier cde;
+ for (SI::Loop::Iterator ite; (cd->identifierLoop.getNext(cde,ite)); ) {
+ if (cde.getCridLocation() == 0) {
+ char buffer[Utf8BufSize(256)];
+ strcpy (buffer, channel->DefaultAuthority());
+ int i = strlen(buffer);
+ if (i) {
+ cde.identifier.getText(buffer+i, Utf8BufSize(256)-i);
+ switch (cde.getCridType()) {
+ case 0x01: // ETSI 102 363 code
+ case 0x31: // UK Freeview private code
+ pEvent->SetItemCRID(buffer);
+ break;
+ case 0x02: // ETSI 102 363 code
+ case 0x32: // UK Freeview private code
+ pEvent->SetSeriesCRID(buffer);
+ break;
+ // ETSI 102 323 defines CRID type 0x03, which describes 'related' or 'suggested' events.
+ // Freeview broadcasts these as CRID type 0x33.
+ // There can be more than one type 0x33 descriptor per event (each with one CRID).
+ }
+ }
+ }
+ }
+ }
default: ;
}
delete d;
diff -ur vdr-1.7.20/epg.c vdr-1.7.20.new/epg.c
--- vdr-1.7.20/epg.c 2011-02-25 15:16:05.000000000 +0000
+++ vdr-1.7.20.new/epg.c 2011-08-16 18:08:26.000000000 +0100
@@ -126,6 +126,8 @@
startTime = 0;
duration = 0;
vps = 0;
+ itemCRID = NULL;
+ seriesCRID = NULL;
SetSeen();
}
@@ -134,6 +136,8 @@
free(title);
free(shortText);
free(description);
+ free(itemCRID);
+ free(seriesCRID);
delete components;
}
@@ -229,6 +233,16 @@
vps = Vps;
}
+void cEvent::SetItemCRID(const char *CRID)
+{
+ itemCRID = strcpyrealloc(itemCRID, CRID);
+}
+
+void cEvent::SetSeriesCRID(const char *CRID)
+{
+ seriesCRID = strcpyrealloc(seriesCRID, CRID);
+}
+
void cEvent::SetSeen(void)
{
seen = time(NULL);
@@ -457,6 +471,10 @@
}
if (vps)
fprintf(f, "%sV %ld\n", Prefix, vps);
+ if (!isempty(itemCRID))
+ fprintf(f, "%sY %s\n", Prefix, itemCRID);
+ if (!isempty(seriesCRID))
+ fprintf(f, "%sZ %s\n", Prefix, seriesCRID);
if (!InfoOnly)
fprintf(f, "%se\n", Prefix);
}
@@ -495,6 +513,10 @@
break;
case 'V': SetVps(atoi(t));
break;
+ case 'Y': SetItemCRID(t);
+ break;
+ case 'Z': SetSeriesCRID(t);
+ break;
default: esyslog("ERROR: unexpected tag while reading EPG data: %s", s);
return false;
}
diff -ur vdr-1.7.20/epg.h vdr-1.7.20.new/epg.h
--- vdr-1.7.20/epg.h 2011-02-25 14:14:38.000000000 +0000
+++ vdr-1.7.20.new/epg.h 2011-08-16 18:08:26.000000000 +0100
@@ -86,6 +86,8 @@
int duration; // Duration of this event in seconds
time_t vps; // Video Programming Service timestamp (VPS, aka "Programme Identification Label", PIL)
time_t seen; // When this event was last seen in the data stream
+ char *itemCRID; // Item CRID
+ char *seriesCRID; // Series CRID
public:
cEvent(tEventID EventID);
~cEvent();
@@ -106,6 +108,8 @@
time_t EndTime(void) const { return startTime + duration; }
int Duration(void) const { return duration; }
time_t Vps(void) const { return vps; }
+ const char *ItemCRID(void) const { return itemCRID; }
+ const char *SeriesCRID(void) const { return seriesCRID; }
time_t Seen(void) const { return seen; }
bool SeenWithin(int Seconds) const { return time(NULL) - seen < Seconds; }
bool HasTimer(void) const;
@@ -129,6 +133,8 @@
void SetStartTime(time_t StartTime);
void SetDuration(int Duration);
void SetVps(time_t Vps);
+ void SetItemCRID(const char *CRID);
+ void SetSeriesCRID(const char *CRID);
void SetSeen(void);
cString ToDescr(void) const;
void Dump(FILE *f, const char *Prefix = "", bool InfoOnly = false) const;
diff -ur vdr-1.7.20/menu.c vdr-1.7.20.new/menu.c
--- vdr-1.7.20/menu.c 2011-08-06 14:13:34.000000000 +0100
+++ vdr-1.7.20.new/menu.c 2011-08-16 18:08:26.000000000 +0100
@@ -3058,6 +3058,7 @@
Add(new cMenuEditBoolItem(tr("Setup.Recording$Use episode name"), &data.UseSubtitle));
Add(new cMenuEditBoolItem(tr("Setup.Recording$Use VPS"), &data.UseVps));
Add(new cMenuEditIntItem( tr("Setup.Recording$VPS margin (s)"), &data.VpsMargin, 0));
+ Add(new cMenuEditBoolItem(tr("Setup.Recording$Use running status as VPS fallback"), &data.VpsFallback));
Add(new cMenuEditBoolItem(tr("Setup.Recording$Mark instant recording"), &data.MarkInstantRecord));
Add(new cMenuEditStrItem( tr("Setup.Recording$Name instant recording"), data.NameInstantRecord, sizeof(data.NameInstantRecord)));
Add(new cMenuEditIntItem( tr("Setup.Recording$Instant rec. time (min)"), &data.InstantRecordTime, 1, MAXINSTANTRECTIME));
diff -ur vdr-1.7.20/sdt.c vdr-1.7.20.new/sdt.c
--- vdr-1.7.20/sdt.c 2010-05-16 15:23:21.000000000 +0100
+++ vdr-1.7.20.new/sdt.c 2011-08-16 18:08:26.000000000 +0100
@@ -128,6 +128,12 @@
}
}
break;
+ case SI::DefaultAuthorityDescriptorTag: {
+ SI::DefaultAuthorityDescriptor *da = (SI::DefaultAuthorityDescriptor *)d;
+ char DaBuf[Utf8BufSize(1024)];
+ da->DefaultAuthority.getText(DaBuf, sizeof(DaBuf));
+ channel->SetDefaultAuthority(DaBuf);
+ }
default: ;
}
delete d;
diff -ur vdr-1.7.20/timers.c vdr-1.7.20.new/timers.c
--- vdr-1.7.20/timers.c 2011-08-06 14:13:54.000000000 +0100
+++ vdr-1.7.20.new/timers.c 2011-08-16 18:08:26.000000000 +0100
@@ -430,7 +430,7 @@
deferred = 0;
if (HasFlags(tfActive)) {
- if (HasFlags(tfVps) && event && event->Vps()) {
+ if (HasFlags(tfVps) && event && (Setup.VpsFallback || event->Vps())) {
if (Margin || !Directly) {
startTime = event->StartTime();
stopTime = event->EndTime();
diff -ur vdr-1.7.20/vdr.5 vdr-1.7.20.new/vdr.5
--- vdr-1.7.20/vdr.5 2011-04-03 11:21:36.000000000 +0100
+++ vdr-1.7.20.new/vdr.5 2011-08-16 18:08:26.000000000 +0100
@@ -247,6 +247,9 @@
.B RID
The Radio ID of this channel (typically 0, may be used to distinguish channels where
NID, TID and SID are all equal).
+.TP
+.B Default Authority
+The Default Authority for CRIDs on this channel (TVAnytime).
.PP
A particular channel can be uniquely identified by its \fBchannel\ ID\fR,
which is a string that looks like this:
@@ -778,6 +781,8 @@
\fBR\fR@<parental rating>
\fBX\fR@<stream> <type> <language> <descr>
\fBV\fR@<vps time>
+\fBY\fR@<item CRID>
+\fBZ\fR@<series CRID>
\fBe\fR@
\fBc\fR@
.TE
@@ -812,6 +817,8 @@
<language> @is the three letter language code (optionally two codes, separated by '+')
<descr> @is the description of this stream component
<vps time> @is the Video Programming Service time of this event
+<item CRID> @is the CRID of this event (TVAnytime)
+<series CRID> @is the CRID of the series which this event is part of (TVAnytime)
.TE
This file will be read at program startup in order to restore the results of
|