Beiträge von HelmutB
-
-
mighty-p : Hast du zufällig noch das Log eines kompletten Scans von VDR oder von t2scan in dem die NIT Infos enthalten sind?
Wenn es nicht zu kompliziert ist, kannst du es mir zukommen lassen.
LG Helmut
-
Die Informationen in der NIT haben eigentlich nichts mit dem aktuell getunten Kanal zu tun, deshalb glaube ich auch, dass ein einfaches Hinzufügen dieser Frequenz nicht ganz richtig wäre. Ich werde mir aber (wieder einmal) die T2-Dokumente zu Gemüte führen. Irgendwie passen deine Ergebnisse nicht mit meinen Verständnis von T2 zusammen.
LG Helmut
-
Ja, da ist das Problem mit der fehlenden getunten Frequenz:
CodeApr 26 22:24:44 lana vdr: [32192] NIT: Nid 8468 Tid 16481 Apr 26 22:24:44 lana vdr: [32192] T2 Cell 13100: center frequency[1] 642000000 Apr 26 22:24:44 lana vdr: [32192] T2 0 7766 PLP 0 0 8000000 1 6
Das wäre ja die Nid/Tid die mit "P-1" auf 666 Mhz gefunden wird. Auf 642 Mhz empfängst du nichts. Ob man nicht immer automatisch die getunte Frequenz dazunehmen sollte? Ich werde nachdenken.
LG Helmut
-
Mein Scanner macht (fast) nichts anderes als der VDR beim EPG-Scan, ich fülle die ScanList nur mit vordefinierten Werten für Transponder und Tuning Parameter. Beim VDR werden neue Programme/Services in sdt.c angelegt, aber nur für gewisse StreamTypes und auch nur, wenn es einen gültigen Namen gibt. Es wäre daher zuindest der Streamtype der fehlenden Services interessant.
Auf 666 Mhz werden vermutlich die Programme mit der PLP0 (Tid 16481) gefunden, aber in der NIT wird nur ein T2-Descriptor für die PLP1 (Tid 16497) gesendet. Daher bleibt bei bei der ersten PLP der Wert von "P-1" für "NO_STREAM_ID_FILTER" stehen weil die genauen Parameter und die PLP-Id nicht bekannt sind.
Wenn du die beiden Patches im Anhang dazu nimmst, wird angezeigt welche DeliverySystemDescriptoren empfangen werden und welche StreamTypes unberücksichtigt bleiben.
LG Helmut
-
Eine kleine Ergänzung: Wenn der fix3 das Problem löst, sollte auch diese kleine Änderung zum Originalpatch von Klaus genügen:
Diff
Alles anzeigen--- sdt.c.scr06 2020-04-24 20:55:01.833372015 +0200 +++ sdt.c 2020-04-25 18:33:06.160596954 +0200 @@ -58,7 +58,7 @@ void cSdtFilter::Process(u_short Pid, u_ // The transponder can be verified with any section, no sync required: int Nid = sdt.getOriginalNetworkId(); int Tid = sdt.getTransportStreamId(); - if (Source() != lastSource || Transponder() != lastTransponder) { + if (Source() != lastSource || !ISTRANSPONDER(Transponder(), lastTransponder)) { // We expect a change in NID/TID: if (Nid && Tid && Nid == lastNid && Tid == lastTid) { transponderState = tsWrong;
LG Helmut
-
Jetzt ist es klar:
vdr: [6911] SDT: Source/Transponder current: 1392509120/111052 last: 1392509120/111053 -> tsUnknown
11052 Mhz und 11053 Mhz sind natürlich der gleiche Transponder
Hier der fix3 der mit ISTRANSPONDER prüft (+/- 4 Mhz).
LG Helmut
-
Wenn das alle NIT Informationen sind, wird es schon so sein das ZDF-HD keine Verbindung zu MB angibt, umgekehrt aber schon.
Da muß man dann doch die PLP-Id wissen und mit "-p" gesondert scannen.
Das mit den Frequenzen ist mir auch schon aufgefallen, und es ist mir auch nicht klar, warum die getunte Frequenz manchmal in den Frequenzlisten fehlt.
Wenn es dich interessiert, kannst du ja meinen Patch für einen internen DVB-T/T2 Scanner ausprobieren und das Ergebnis vergleichen.
Dazu braucht es:
1.) vdr-2-4-1-s2-multistream4-patch
2.) vdr-2-4-1-s2-multistream4-t2-patch
3.) vdr-2-4-1-s2-multistream4-t2-scantcsv3-patch
und den
4.) vdr-2-4-1-sdt-hevc-support-patch
Am besten den VDR mit einer leeren Kanalliste starten und unter Einstellungen->EPG den DVB-T Scan mit der gelben Taste starten.
Es dauert ca. 6-8 Minuten, man sieht den Scanfortschritt aber nur im Syslog. Ein Tastendruck bricht den Scan ab (wie beim EPG).
LG Helmut
-
Das verwirrt mich immer wieder:
Apr 25 16:17:16 vdr vdr: [13122] SDT: channel 20 NID/TID (1/1039) not found, got 1/1039
wieso stimmen lastNid/lastTid überein aber nicht lastSource oder lastTransponder?
Hier der fix2 mit Debug-Ausgabe von Source() und Transponder() beim Vergleich in SetStatus().
LG Helmut
-
Doch etwas hartnäckiger. Hier ein neuer Versuch. Jetzt ist das "else if (...)" aber Absicht.
Diff
Alles anzeigen--- sdt.c.scr06 2020-04-24 20:55:01.833372015 +0200 +++ sdt.c 2020-04-25 14:26:16.126871506 +0200 @@ -37,9 +37,11 @@ void cSdtFilter::SetStatus(bool On) cMutexLock MutexLock(&mutex); cFilter::SetStatus(On); sectionSyncer.Reset(); + transponderState = tsAccepted; if (!On) source = cSource::stNone; - transponderState = tsUnknown; + else if (Source() != lastSource || Transponder() != lastTransponder) + transponderState = tsUnknown; } void cSdtFilter::Trigger(int Source) @@ -58,13 +60,11 @@ void cSdtFilter::Process(u_short Pid, u_ // The transponder can be verified with any section, no sync required: int Nid = sdt.getOriginalNetworkId(); int Tid = sdt.getTransportStreamId(); - if (Source() != lastSource || Transponder() != lastTransponder) { - // We expect a change in NID/TID: - if (Nid && Tid && Nid == lastNid && Tid == lastTid) { - transponderState = tsWrong; - dsyslog("SDT: channel %d NID/TID (%d/%d) not found, got %d/%d", Channel()->Number(), Channel()->Nid(), Channel()->Tid(), Nid, Tid); - return; - } + // We expect a change in NID/TID: + if (Nid && Tid && Nid == lastNid && Tid == lastTid) { + transponderState = tsWrong; + dsyslog("SDT: channel %d NID/TID (%d/%d) not found, got %d/%d", Channel()->Number(), Channel()->Nid(), Channel()->Tid(), Nid, Tid); + return; } // NID/TID is acceptable: lastSource = Source();
LG Helmut
-
Murry : Kannst du im fix1 patch in dieser Zeile das "else" wegnehmen:
+ else if (Source() != lastSource || Transponder() != lastTransponder)
sollte dann so aussehen:
+ if (Source() != lastSource || Transponder() != lastTransponder)
Helmut
-
Das war möglicherweise ein Gedankenfehler und dieser Patch hilft:
Nach einem SetStatus(true) ist transponderState nur dann "tsUnknown" wenn sich Source() oder Transponder() gegenüber dem letzten SetStatus(true) geändert haben, anderenfalls ist er unverändert - wie auch bei einem SetStatus(false).
Dieser Patch ist wäre zusätzlich und nach dem "vdr-2.4.1-test-check-scr-06.diff" einzuspielen.
Diff
Alles anzeigen--- a/sdt.c.scr06 2020-04-24 20:55:01.833372015 +0200 +++ b/sdt.c 2020-04-24 20:59:26.973379024 +0200 @@ -39,7 +39,8 @@ void cSdtFilter::SetStatus(bool On) sectionSyncer.Reset(); if (!On) source = cSource::stNone; - transponderState = tsUnknown; + else if (Source() != lastSource || Transponder() != lastTransponder) + transponderState = tsUnknown; } void cSdtFilter::Trigger(int Source) @@ -58,13 +59,11 @@ void cSdtFilter::Process(u_short Pid, u_ // The transponder can be verified with any section, no sync required: int Nid = sdt.getOriginalNetworkId(); int Tid = sdt.getTransportStreamId(); - if (Source() != lastSource || Transponder() != lastTransponder) { - // We expect a change in NID/TID: - if (Nid && Tid && Nid == lastNid && Tid == lastTid) { - transponderState = tsWrong; - dsyslog("SDT: channel %d NID/TID (%d/%d) not found, got %d/%d", Channel()->Number(), Channel()->Nid(), Channel()->Tid(), Nid, Tid); - return; - } + // We expect a change in NID/TID: + if (Nid && Tid && Nid == lastNid && Tid == lastTid) { + transponderState = tsWrong; + dsyslog("SDT: channel %d NID/TID (%d/%d) not found, got %d/%d", Channel()->Number(), Channel()->Nid(), Channel()->Tid(), Nid, Tid); + return; } // NID/TID is acceptable: lastSource = Source();
Helmut
PS: wenn man im fix1 bei SetStatus() das "else if" in "if" ändert, wäre es noch klarer.
-
mighty-p : vergiss das was ich oben wegen dem überschreiben gesagt habe, das parse_descriptor kommt ja erst nach dem copy-fe_data(). Also doch einmal nachsehen, ob es in der NIT nur einen T2-Descriptor gibt.
LG Helmut
-
Ich habe nicht alles int t2scan angesehen, aber möglicherweise gibt es bei MPLP ein Problem in scan.c/parse_nit()
Code
Alles anzeigen// only use the NIT entry for current TSID, NID to get ONID and exact tuning data if ((current_tp->type != SCAN_TERRESTRIAL) || ((transport_stream_id == current_tp->transport_stream_id) && (network_id == current_tp->network_id))) { memset(&tn, 0, sizeof(tn)); tn.type = current_tp->type; tn.network_PID = current_tp->network_PID; tn.network_id = network_id; tn.original_network_id = original_network_id; tn.transport_stream_id = transport_stream_id; tn.network_name = NULL; tn.services = &tn._services; NewList(tn.services, "tn_services"); tn.cells = &tn._cells; NewList(tn.cells, "tn_cells"); if ((current_tp->original_network_id == original_network_id) && (current_tp->transport_stream_id == transport_stream_id) && (table_id == TABLE_NIT_ACT)) { // if we've found the current tp by onid && ts_id and update it from nit(act), use actual settings as default. copy_fe_params(&tn, current_tp); // tn.param = current_tp->param; } parse_descriptors(table_id, buf + 6, descriptors_loop_len, &tn, flags.scantype); tn.source |= table_id << 8; current_tp->original_network_id = original_network_id; // we ignore the frequency, but set all other things //current_tp->bandwidth = tn.bandwidth; if (current_tp->plp_id==NO_STREAM_ID_FILTER) current_tp->plp_id = tn.plp_id;
Es wird in eine mehr oder weniger leeren struct transponder "tn" der T2-Descriptor eingelesen, danach - weil klarereweise ONID und TID mit dem von current_tp ident sind - die fe_params von current_tp als default genommen - und damit auch die PLP-ID.
Mit der Option "-vvvv" würdest du da vielleicht etwas erkennen.
LG Helmut
-
interessant dass bei dir beim ORF die richtige PLP ID aus dem Delivery Descriptor gelesen wird.
Das ist normalerweise auch so. Nur schafft es der ORF in Wien auf einem von 7 Transponder eine falsche PLP-Id 0 zu übertragen. Aber nicht nur in Wien, ich habe es auch z.B. in Oberösterreich bemrkt. Da braucht es dann eine Sonderbehandlung.
Zu MPLP: ich würde für jede PLP die im Transportstream enthalten ist, eine T2DeliverySystemDescriptor erwarten. Es kann aber sein, dass die ""extendet_info" nur in einem T2Descriptor vorhanden ist da diese Information für alle PLPs gilt.
Schau einmal ob es wiklich nur einen T2Descriptor gibt, falls es doch einen weiten gibt fehlt da vielleicht diese extendet_info und dein default Wert für z.B. "bandwidth" ist nicht brauchbar.
ich habe mir hier eine Ergänzung für DVB-T2 im VDR ausgedacht [Patch] DVB-S2 Multi Input Stream (ungetestet) DVB-T2 MPLP+Scan. Schau dir diesen Patch einmal an.
LG Helmut
-
Die Option "-p -1" funktioniert nicht weil #define NO_STREAM_ID_FILTER (~0U) als int dann -1 ergibt.
Dadurch wird bei test.plp_id = (flags.override_plp_id<0) ? dvbt2_plp_id : flags.override_plp_id; der Default Wert genommen (bei dir 0, bei mir 1).
Sind bei dir PLP0 und PLP1 wirklich auf einem Transponder? Ich hätte gedacht, dass bei Multi-PLP dann in der NIT für jede PLP ein T2DeliverSystemDescriptor übertragen wird. kannst du dir NIT-Daten von diesem Transponder ausgeben lassen.
LG Helmut
---
Edit: nur als schneller Test gedacht: mit
test.plp_id = (flags.override_plp_id<-2) ? dvbt2_plp_id : flags.override_plp_id; in scan.c und
uint32_t plp_id; /* DVB-C2, DVB-T2 35 */ in si_types.h geht es:
Code498000 (CH24): (time: 01:39.216) signal ok: QAM_AUTO f = 498000 kHz I999B8C999D999T999G999Y999P-1 (0:0:0) QAM_AUTO f = 498000 kHz I999B8C999D0T32G16Y0P1 (8232:13101:101) : scanning for services service = ORF1 HD (ORF) service = ORF2 W HD (ORF) service = ORF2 N HD (ORF) service = ORF2 B HD (ORF) service = ORF III HD (ORF) service = ORF Sport+ HD (ORF) service = ORF1 (ORF) service = ORF2 W (ORF)
-
mighty-p : Verwende "NO_STREAM_ID_FILTER" als Wert für StreamID/PLP. Damit wird die PLP automatisch vom Demodulator ausgewählt und es kommt zu einem Lock. Über den T2DeliversystemDescriptor der NIT erfährt man dann die PLP-ID für diesem Transponder.
Hier ein paar Zeilen wie ich es in meinem S2-multistream4-T2 patch in SetFrontend mache.
Diff
Alles anzeigen--- vdr-2.4.1-S2-mis4/dvbdevice.c 2019-10-27 14:24:05.503936466 +0100 +++ vdr-2.4.1-S2-mis4_T2/dvbdevice.c 2019-10-27 14:25:16.110605001 +0100 @@ -1712,12 +1712,15 @@ bool cDvbTuner::SetFrontend(void) if (frontendType == SYS_DVBT2) { // DVB-T2 SETCMD(DTV_INNER_FEC, dtp.CoderateH()); + // user defineable StreamId autodetection: StreamId == -1 + int streamId = (dtp.StreamId() == -1) ? NO_STREAM_ID_FILTER : dtp.StreamId(); if (DvbApiVersion >= 0x0508) { - SETCMD(DTV_STREAM_ID, dtp.StreamId()); + SETCMD(DTV_STREAM_ID, streamId); } else if (DvbApiVersion >= 0x0503) - SETCMD(DTV_DVBT2_PLP_ID_LEGACY, dtp.StreamId()); + SETCMD(DTV_DVBT2_PLP_ID_LEGACY, streamId); .....
Helmut
-
Du hattest da zuletzt einige Abfragen bzgl. ScrLastTp, ScrLastNid und ScrLastTid eingebaut. Meinst du, dass die in dieser oder ähnlicher Form (dann in cSdtFilter::Process() unter 'if (transponderVerificationState == tvsUnknown) {') noch nötig sind?
Die habe ich deshalb eingebaut, weil immer wieder Programme (Transportstreams) abgeschalten und/oder auf andere Transponder verschoben werden. Dadurch kann die channels.conf irgendwann Programmeinträge mit für den Transponder zwar passenden Tuningparametern aber inzwischen ungültiger NID/TID enthalten, die dann immer wieder ein Retune ergeben würden da NID/TID nie zur SDT passen können.
Ein Retune sollte es aber nur geben wenn eine Änderung von NID/TID erwartet wird, diese aber nach SetFrontend() immer noch die alten Werte haben. Für den Vergleich braucht es die LastTNid/LastTid (LastTp ist wahrscheinlich nicht notwendig, wenn man es ganz genau nimmt eher ein LastSource). Deshalb auch die Prüfung in DvbTuner::Action() und nicht in sdt.c.
Ich habe den Patch inzwischen auch um einen Sdt-Trigger() erweitert, wo erst nach positiver Transponderprüfung der sdt Filter getriggert wird um dann in den sdt.serviceloop einzusteigen. Ich kann dir diese Variante mailen, ich muss ihn aber vorher von meinem etwas gepatchten VDR noch für den original VDR-2.4.1 umschreiben.
LG Helmut
-
Schau dir mal inttypes.h an
%"PRIu64"Du has recht, das ist vielleicht die richtige und damit bessere Lösung. Ich habe es in meinen Programmen aber noch nie verwenden müssen.
Helmut
-
Mir ist aufgefallen, dass auf einigen Transpondern die lange Beschreibung nicht richtig dagestellt wird. Der Grund ist, dass Texte die länger als 256 Byte sind auf mehrere ExtendedEventDescriptors aufgeteilt werden müssen. Manche Provider geben die CharacerTable aber nur im Text des ersten Descriptors bekannt, die weiteren Textteile werden dann fälschlicherweise mit der Default- oder Override Table decodiert.
Ich habe dazu einen Patch, der beim Langtext sicherstellt, dass immer das Charset des 1. Descriptors als Default verwendet wird. Sozusagen ein Over-Override.
Hier die lange Beschreibung des Senders "Bibel TV" auf 19.2E 12552Mhz ohne und mit Patch:
Codevdr[2702]: [2906] ---- decode[ UTF-8] Bibel TV das Gespräch vdr[2702]: [2906] ---- decode[ UTF-8] Die Familien der Verschwörer --- Langtext ohne Patch vdr[2702]: [2906] ---- decode[ UTF-8] 20. Juli 1944. In Paris läuft der Umsturz nach Plan, doch mit dem Scheitern in ... vdr[2702]: [2906] ---- decode[ ISO-8859-15] rau Lotte und die beiden Àltesten Kinder ab - Sippenhaft in GefÀngnissen und ... --- Langtext mit Patch vdr[9380]: [9401] ---- decode[ UTF-8] 20. Juli 1944. In Paris läuft der Umsturz nach Plan, doch mit dem Scheitern in ... vdr[9380]: [9401] ---- decode[* UTF-8] rau Lotte und die beiden ältesten Kinder ab - Sippenhaft in Gefängnissen und ...
oder beim Sender "Cherie 25"
Code
Alles anzeigenohne Patch: vdr[25374]: [25396] ---- decode[ ISO-8859-15] 'une rivalité amoureuse... vdr[25374]: [25396] ---- decode[ UTF-8] CRIMES vdr[25374]: [25396] ---- decode[ UTF-8] vdr[25374]: [25396] ---- decode[ UTF-8] Affaire FOURNIRETA ce jour, " L'Ogre des Ardennes ", alias Michel Fourniret, est le seul ... vdr[25374]: [25396] ---- decode[ ISO-8859-15] ée avait 21 ans et la plus jeune, seulement 12 ans. 7 crimes commis entre 1987 et 2001, ... vdr[25374]: [25396] ---- decode[ ISO-8859-15] uer le siÚcle. Au final, une sentence attendue, la condamnation à perpétuité pour ... vdr[25374]: [25396] ---- decode[ ISO-8859-15] té ? Le passé de Michel Fourniret peut-il expliquer ses actes abominables ? Et lui qui ... mit Patch: vdr[23285]: [23307] ---- decode[ UTF-8] 'une rivalité amoureuse... vdr[23285]: [23307] ---- decode[ UTF-8] CRIMES vdr[23285]: [23307] ---- decode[ UTF-8] vdr[23285]: [23307] ---- decode[ UTF-8] Affaire FOURNIRETA ce jour, " L'Ogre des Ardennes ", alias Michel Fourniret, est le seul ... vdr[23285]: [23307] ---- decode[ UTF-8] ée avait 21 ans et la plus jeune, seulement 12 ans. 7 crimes commis entre 1987 et 2001, ... vdr[23285]: [23307] ---- decode[ UTF-8] uer le siècle. Au final, une sentence attendue, la condamnation à perpétuité pour ... vdr[23285]: [23307] ---- decode[ UTF-8] té ? Le passé de Michel Fourniret peut-il expliquer ses actes abominables ? Et lui qui ...
Zusätzlich noch ein Patch der die "override character table" auf Gültigkeit prüft und anzeigt.
CodeApr 20 20:29:47 gentoo64vdr vdr[13625]: [13625] codeset is 'ISO-8859-15' - known Apr 20 20:29:47 gentoo64vdr vdr[13625]: [13625] override character table is 'ISO-8859-15' - known
Die beide Patches sind leider nicht ganz zu trennen und müssen daher gemeinsam verwendet werden.
Helmut