Erfahrungsbereicht "DVBSKy S950CI DVB-S/S2 PCIe with CI"

Moderators: dekarl, daschatten

Post Reply
lomion0815
Newcomer
Posts: 10
Joined: Fri Apr 24, 2015 8:23 pm
Austria

Erfahrungsbereicht "DVBSKy S950CI DVB-S/S2 PCIe with CI"

Post by lomion0815 » Thu Feb 16, 2017 6:50 pm

Ich war auf der Suche nach einer DVB-S2 Karte inklusive CI-Slot für die Verwendung mit Astra 19,2°E und ORF-Karte.
Nach einiger Recherche habe ich mich für diese "DVBSKy S950CI DVB-S/S2 PCIe with CI" entschieden.

Unter Xubuntu 14.04 lädt man sich von der Homepage die entsprechenden Treiber herunter und dann läuft die Karte sehr gut und zuverlässig.

Ich hatte auch einen Versuch mit einem neueren Kernel gestartet, wobei dann der CI-Slot nicht mehr funktionierte. Ich habe das Problem dann nicht mehr weiter analysiert und bin wieder auf den 14.04-Kernel zurückgestiegen. Das nur als Hinweis.

Ein Problem gibt es jedoch mit dieser Karte: Das CI-Modul kann nur einen Stream verarbeiten. Das heisst, wenn man auf dem selben Multiplex eine zweite Sendung parallel aufnehmen möchte schlägt dies für verschlüsselte Streams fehl. Bei unverschlüsselten Streams kann man mehrere Streams parallel aufnehmen.
Lösungsansatz 1: Einfach die Anzahl der parallelen Aufzeichnungen im Mythtv-Setup auf 1 setzen.
Lösungsansatz 2: Man bringt Mythtv bei nur dann parallel aufzuzeichnen, wenn es kein verschlüsselter Multiplex ist. Hier ein Patch dazu. Die mplex-IDs sind die passenden für die ORF-Karte.

Code: Select all

diff --git a/mythtv/programs/mythbackend/scheduler.cpp b/mythtv/programs/mythbackend/scheduler.cpp
index 9d90016..1690592 100644
--- a/mythtv/programs/mythbackend/scheduler.cpp
+++ b/mythtv/programs/mythbackend/scheduler.cpp
@@ -1128,10 +1128,12 @@ bool Scheduler::FindNextConflict(
         // unless the programs are on the same multiplex.
         // It is also a conflict if the mplex uses a CA-Module
         if (mplexid_ok && 
-            p->mplexid != 39 && q->mplexid != 39 &&
-            p->mplexid != 12 && q->mplexid != 12 &&
-            p->mplexid != 6 && q->mplexid != 6 &&
-            p->mplexid != 33 && q->mplexid != 33)
+            p->mplexid != 39 && q->mplexid != 39 && //TID 1007
+            p->mplexid != 11 && q->mplexid != 11 &&  // TID 1115
+            p->mplexid != 12 && q->mplexid != 12 &&  // TID 1117
+            p->mplexid != 6 && q->mplexid != 6 && //TID 1082
+            p->mplexid != 75 && q->mplexid != 75 && // TID 1005
+            p->mplexid != 33 && q->mplexid != 33) // TID 1003
         {
             ++affinity;
             continue;

Code: Select all

diff --git a/mythtv/libs/libmythtv/recorders/dvbcam.cpp b/mythtv/libs/libmythtv/recorders/dvbcam.cpp
index fc0cae2..5db398d 100644
--- a/mythtv/libs/libmythtv/recorders/dvbcam.cpp
+++ b/mythtv/libs/libmythtv/recorders/dvbcam.cpp
@@ -207,7 +207,7 @@ void DVBCam::HandlePMT(void)
     LOG(VB_DVBCAM, LOG_INFO, LOC + "CiHandler needs CA_PMT");
     QMutexLocker locker(&pmt_lock);
 
-    if (pmt_sent && pmt_added && !pmt_updated)
+/*    if (pmt_sent && pmt_added && !pmt_updated)
     {
         // Send added PMT
         while (PMTAddList.size() > 0)
@@ -234,11 +234,11 @@ void DVBCam::HandlePMT(void)
         PMTList[chan] = pmt;
         PMTAddList.erase(it);
     }
-
+*/
     uint length = PMTList.size();
     uint count  = 0;
 
-    pmt_list_t::const_iterator pmtit;
+/*    pmt_list_t::const_iterator pmtit;
     for (pmtit = PMTList.begin(); pmtit != PMTList.end(); ++pmtit)
     {
         uint cplm = (count     == 0)      ? CPLM_FIRST : CPLM_MORE;
@@ -248,7 +248,9 @@ void DVBCam::HandlePMT(void)
         SendPMT(**pmtit, cplm);
 
         count++;
-    }
+    }*/
+
+    SendPMT(**PMTList.begin(), CPLM_ONLY);
 
     pmt_sent    = true;
     pmt_updated = false;
@@ -289,20 +291,20 @@ void DVBCam::SetPMT(const ChannelBase *chan, const ProgramMapTable *pmt)
     QMutexLocker locker(&pmt_lock);
 
     pmt_list_t::iterator it = PMTList.find(chan);
-    pmt_list_t::iterator it2 = PMTAddList.find(chan);
+    //pmt_list_t::iterator it2 = PMTAddList.find(chan);
     if (!pmt && (it != PMTList.end()))
     {
         delete *it;
         PMTList.erase(it);
         pmt_updated = true;
     }
-    else if (!pmt && (it2 != PMTAddList.end()))
+    /*else if (!pmt && (it2 != PMTAddList.end()))
     {
         delete *it2;
         PMTAddList.erase(it2);
         pmt_added = !PMTAddList.empty();
-    }
-    else if (pmt && (PMTList.empty() || (it != PMTList.end())))
+    }*/
+    else if (pmt)
     {
         if (it != PMTList.end())
             delete *it;
@@ -310,11 +312,11 @@ void DVBCam::SetPMT(const ChannelBase *chan, const ProgramMapTable *pmt)
         have_pmt    = true;
         pmt_updated = true;
     }
-    else if (pmt && (it == PMTList.end()))
+    /*else if (pmt && (it == PMTList.end()))
     {
         PMTAddList[chan] = new ProgramMapTable(*pmt);
         pmt_added = true;
-    }
+    }*/
 }
 
 void DVBCam::SetTimeOffset(double offset_in_seconds)

Post Reply