Ticket #11021: 0002-decrypt_two_channels_in_parallel.commit

File 0002-decrypt_two_channels_in_parallel.commit, 12.2 KB (added by Shinck@…, 13 years ago)
Line 
1From 5638a2a40bba939604200aa0c330b819313f89ac Mon Sep 17 00:00:00 2001
2From: root <SHinck@web.de>
3Date: Sun, 9 Jun 2013 22:06:24 +0200
4Subject: [PATCH] Fix for decrypting 2 channels in parallel.
5
6If CAM-Module decrypts one channel it's now possible to add a second
7recording which needs also decryption without destroying the first or
8both recordings. During LiveTV it speeds up decryption at channel
9changes.
10---
11 mythtv/libs/libmythtv/dtvrecorder.cpp | 1 +
12 mythtv/libs/libmythtv/dtvsignalmonitor.cpp | 11 ----
13 mythtv/libs/libmythtv/dtvsignalmonitor.h | 2 -
14 mythtv/libs/libmythtv/dvbcam.cpp | 86 +++++++++++++++++++++----
15 mythtv/libs/libmythtv/dvbcam.h | 1 +
16 mythtv/libs/libmythtv/dvbchannel.cpp | 4 ++
17 mythtv/libs/libmythtv/dvbrecorder.cpp | 3 +
18 mythtv/libs/libmythtv/dvbsignalmonitor.cpp | 15 +++--
19 mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp | 2 +-
20 9 files changed, 94 insertions(+), 31 deletions(-)
21
22diff --git a/mythtv/libs/libmythtv/dtvrecorder.cpp b/mythtv/libs/libmythtv/dtvrecorder.cpp
23index c87ed36..489d73b 100644
24--- a/mythtv/libs/libmythtv/dtvrecorder.cpp
25+++ b/mythtv/libs/libmythtv/dtvrecorder.cpp
26@@ -1222,6 +1222,7 @@ void DTVRecorder::HandlePMT(uint progNum, const ProgramMapTable *_pmt)
27 }
28 _has_no_av = has_no_av;
29
30+ _stream_data->TestDecryption(_input_pmt);
31 SetCAMPMT(_input_pmt);
32 delete oldpmt;
33 }
34diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.cpp b/mythtv/libs/libmythtv/dtvsignalmonitor.cpp
35index 06cdd42..e80596f 100644
36--- a/mythtv/libs/libmythtv/dtvsignalmonitor.cpp
37+++ b/mythtv/libs/libmythtv/dtvsignalmonitor.cpp
38@@ -4,7 +4,6 @@
39 using namespace std;
40
41 #include "dtvchannel.h"
42-#include "dvbchannel.h"
43 #include "dtvsignalmonitor.h"
44 #include "scanstreamdata.h"
45 #include "mpegtables.h"
46@@ -370,12 +369,7 @@ void DTVSignalMonitor::HandlePMT(uint, const ProgramMapTable *pmt)
47 {
48 if (pmt->IsEncrypted(GetDTVChannel()->GetSIStandard()) &&
49 !ignore_encrypted)
50- {
51- DVBChannel *dvbchannel = GetDVBChannel();
52- if (dvbchannel)
53- dvbchannel->SetPMT(pmt);
54 AddFlags(kDTVSigMon_WaitForCrypt);
55- }
56
57 AddFlags(kDTVSigMon_PMTMatch);
58 }
59@@ -539,11 +533,6 @@ const ScanStreamData *DTVSignalMonitor::GetScanStreamData() const
60 return dynamic_cast<const ScanStreamData*>(stream_data);
61 }
62
63-DVBChannel *DTVSignalMonitor::GetDVBChannel(void)
64-{
65- return dynamic_cast<DVBChannel*>(channel);
66-}
67-
68 bool DTVSignalMonitor::IsAllGood(void) const
69 {
70 QMutexLocker locker(&statusLock);
71diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.h b/mythtv/libs/libmythtv/dtvsignalmonitor.h
72index 2be4302..0d14b7f 100644
73--- a/mythtv/libs/libmythtv/dtvsignalmonitor.h
74+++ b/mythtv/libs/libmythtv/dtvsignalmonitor.h
75@@ -11,7 +11,6 @@ using namespace std;
76 #include "streamlisteners.h"
77
78 class DTVChannel;
79-class DVBChannel;
80
81 class DTVSignalMonitor : public SignalMonitor,
82 public MPEGStreamListener,
83@@ -104,7 +103,6 @@ class DTVSignalMonitor : public SignalMonitor,
84
85 protected:
86 DTVChannel *GetDTVChannel(void);
87- DVBChannel *GetDVBChannel(void);
88 void UpdateMonitorValues(void);
89 void UpdateListeningForEIT(void);
90
91diff --git a/mythtv/libs/libmythtv/dvbcam.cpp b/mythtv/libs/libmythtv/dvbcam.cpp
92index 74a2e96..36dfe86 100644
93--- a/mythtv/libs/libmythtv/dvbcam.cpp
94+++ b/mythtv/libs/libmythtv/dvbcam.cpp
95@@ -146,6 +146,7 @@ bool DVBCam::Stop(void)
96 for (it = PMTAddList.begin(); it != PMTAddList.end(); ++it)
97 delete *it;
98 PMTAddList.clear();
99+ progNumAdded.clear();
100
101 return true;
102 }
103@@ -156,7 +157,7 @@ void DVBCam::HandleUserIO(void)
104 if (enq != NULL)
105 {
106 if (enq->Text() != NULL)
107- LOG(VB_DVBCAM, LOG_INFO, LOC + QString("CAM: Received message: %1")
108+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("CAM: Received message: %1")
109 .arg(enq->Text()));
110 delete enq;
111 }
112@@ -165,18 +166,18 @@ void DVBCam::HandleUserIO(void)
113 if (menu != NULL)
114 {
115 if (menu->TitleText() != NULL)
116- LOG(VB_DVBCAM, LOG_INFO, LOC + QString("CAM: Menu Title: %1")
117+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("CAM: Menu Title: %1")
118 .arg(menu->TitleText()));
119 if (menu->SubTitleText() != NULL)
120- LOG(VB_DVBCAM, LOG_INFO, LOC + QString("CAM: Menu SubTitle: %1")
121+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("CAM: Menu SubTitle: %1")
122 .arg(menu->SubTitleText()));
123 if (menu->BottomText() != NULL)
124- LOG(VB_DVBCAM, LOG_INFO, LOC + QString("CAM: Menu BottomText: %1")
125+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("CAM: Menu BottomText: %1")
126 .arg(menu->BottomText()));
127
128 for (int i=0; i<menu->NumEntries(); i++)
129 if (menu->Entry(i) != NULL)
130- LOG(VB_DVBCAM, LOG_INFO, LOC + QString("CAM: Menu Entry: %1")
131+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("CAM: Menu Entry: %1")
132 .arg(menu->Entry(i)));
133
134 if (menu->Selectable())
135@@ -203,7 +204,7 @@ void DVBCam::HandlePMT(void)
136 LOG(VB_DVBCAM, LOG_INFO, LOC + "CiHandler needs CA_PMT");
137 QMutexLocker locker(&pmt_lock);
138
139- if (pmt_sent && pmt_added && !pmt_updated)
140+ if (pmt_sent && pmt_added && pmt_updated)
141 {
142 // Send added PMT
143 while (PMTAddList.size() > 0)
144@@ -286,30 +287,91 @@ void DVBCam::SetPMT(const ChannelBase *chan, const ProgramMapTable *pmt)
145
146 pmt_list_t::iterator it = PMTList.find(chan);
147 pmt_list_t::iterator it2 = PMTAddList.find(chan);
148+ int currentProgramNumber;
149+ if (pmt)
150+ currentProgramNumber = pmt->ProgramNumber();
151 if (!pmt && (it != PMTList.end()))
152 {
153+ LOG(VB_DVBCAM, LOG_INFO, LOC +
154+ QString("Program %1 not used any more")
155+ .arg(chan->GetCurrentName()));
156 delete *it;
157 PMTList.erase(it);
158- pmt_updated = true;
159+ if (PMTList.size() == 1)
160+ {
161+ progNumAdded.clear();
162+ progNumAdded.append((*PMTList.begin())->ProgramNumber());
163+ LOG(VB_DVBCAM, LOG_INFO, LOC +
164+ QString("Decrypted PID List cleared"));
165+ }
166+// pmt_updated = true;
167 }
168 else if (!pmt && (it2 != PMTAddList.end()))
169 {
170+ LOG(VB_DVBCAM, LOG_INFO, LOC +
171+ QString("Take Program %1 from AddList")
172+ .arg(chan->GetCurrentName()));
173 delete *it2;
174 PMTAddList.erase(it2);
175 pmt_added = !PMTAddList.empty();
176 }
177- else if (pmt && (PMTList.empty() || (it != PMTList.end())))
178+ else if (pmt && (PMTList.empty()))
179 {
180- if (it != PMTList.end())
181- delete *it;
182+ LOG(VB_DVBCAM, LOG_INFO, LOC +
183+ QString("Sending Program %1 to CAM")
184+ .arg(currentProgramNumber));
185 PMTList[chan] = new ProgramMapTable(*pmt);
186+ progNumAdded.append(currentProgramNumber);
187 have_pmt = true;
188 pmt_updated = true;
189 }
190+ else if (pmt && (it != PMTList.end()))
191+ {
192+ int oldProgramNumber = (*it)->ProgramNumber();
193+ if (currentProgramNumber != oldProgramNumber)
194+ {
195+ LOG(VB_DVBCAM, LOG_INFO, LOC +
196+ QString("Updating Program %1 to Program %2")
197+ .arg(oldProgramNumber)
198+ .arg(currentProgramNumber));
199+ progNumAdded.removeAll(oldProgramNumber);
200+ delete *it;
201+ PMTList.erase(it);
202+ if (PMTList.empty())
203+ {
204+ LOG(VB_DVBCAM, LOG_INFO, LOC +
205+ QString("Sending Program %1 to CAM")
206+ .arg(currentProgramNumber));
207+ PMTList[chan] = new ProgramMapTable(*pmt);
208+ progNumAdded.append(currentProgramNumber);
209+ pmt_updated = true;
210+ }
211+ else if (!progNumAdded.contains(currentProgramNumber))
212+ {
213+ LOG(VB_DVBCAM, LOG_INFO, LOC +
214+ QString("Add Program %1 to AddList")
215+ .arg(currentProgramNumber));
216+ PMTAddList[chan] = new ProgramMapTable(*pmt);
217+ progNumAdded.append(oldProgramNumber);
218+ progNumAdded.append(currentProgramNumber);
219+ pmt_added = true;
220+ pmt_updated = true;
221+ }
222+ else
223+ progNumAdded.append(oldProgramNumber);
224+ }
225+ }
226 else if (pmt && (it == PMTList.end()))
227 {
228- PMTAddList[chan] = new ProgramMapTable(*pmt);
229- pmt_added = true;
230+ if (!progNumAdded.contains(currentProgramNumber))
231+ {
232+ LOG(VB_DVBCAM, LOG_INFO, LOC +
233+ QString("Add Program %1 to AddList")
234+ .arg(currentProgramNumber));
235+ PMTAddList[chan] = new ProgramMapTable(*pmt);
236+ progNumAdded.append(currentProgramNumber);
237+ pmt_added = true;
238+ }
239 }
240 }
241
242diff --git a/mythtv/libs/libmythtv/dvbcam.h b/mythtv/libs/libmythtv/dvbcam.h
243index 03a5a5e..317a172 100644
244--- a/mythtv/libs/libmythtv/dvbcam.h
245+++ b/mythtv/libs/libmythtv/dvbcam.h
246@@ -61,6 +61,7 @@ class DVBCam : public QRunnable
247 bool pmt_sent;
248 bool pmt_updated;
249 bool pmt_added;
250+ QList<int> progNumAdded;
251 };
252
253 #endif // DVBCAM_H
254diff --git a/mythtv/libs/libmythtv/dvbchannel.cpp b/mythtv/libs/libmythtv/dvbchannel.cpp
255index 0d6f6bd..5a129e2 100644
256--- a/mythtv/libs/libmythtv/dvbchannel.cpp
257+++ b/mythtv/libs/libmythtv/dvbchannel.cpp
258@@ -124,7 +124,11 @@ DVBChannel::~DVBChannel()
259 master_map_lock.lockForRead();
260 MasterMap::iterator mit = master_map.find(devname);
261 if ((*mit).empty())
262+ {
263+ if (dvbcam->IsRunning())
264+ dvbcam->Stop();
265 delete dvbcam;
266+ }
267 dvbcam = NULL;
268 master_map_lock.unlock();
269
270diff --git a/mythtv/libs/libmythtv/dvbrecorder.cpp b/mythtv/libs/libmythtv/dvbrecorder.cpp
271index 92f3413..7a66648 100644
272--- a/mythtv/libs/libmythtv/dvbrecorder.cpp
273+++ b/mythtv/libs/libmythtv/dvbrecorder.cpp
274@@ -182,7 +182,10 @@ QString DVBRecorder::GetSIStandard(void) const
275 void DVBRecorder::SetCAMPMT(const ProgramMapTable *pmt)
276 {
277 if (pmt->IsEncrypted(_channel->GetSIStandard()))
278+ {
279+ LOG(VB_DVBCAM, LOG_INFO, LOC + "DVBRecorder SetPMT and decrypt channel");
280 _channel->SetPMT(pmt);
281+ }
282 }
283
284 void DVBRecorder::UpdateCAMTimeOffset(void)
285diff --git a/mythtv/libs/libmythtv/dvbsignalmonitor.cpp b/mythtv/libs/libmythtv/dvbsignalmonitor.cpp
286index 33bcf26..bdabd6c 100644
287--- a/mythtv/libs/libmythtv/dvbsignalmonitor.cpp
288+++ b/mythtv/libs/libmythtv/dvbsignalmonitor.cpp
289@@ -17,6 +17,7 @@
290 #include "cardutil.h"
291
292 #include "dvbtypes.h"
293+#include "dvbchannel.h"
294 #include "dvbrecorder.h"
295 #include "dvbstreamhandler.h"
296
297@@ -171,13 +172,17 @@ void DVBSignalMonitor::HandlePMT(uint program_num, const ProgramMapTable *pmt)
298 {
299 DTVSignalMonitor::HandlePMT(program_num, pmt);
300
301-/* if (pmt->ProgramNumber() == (uint)programNumber)
302+ if (pmt->ProgramNumber() == (uint)programNumber)
303 {
304- DVBChannel *dvbchannel = GetDVBChannel();
305- if (dvbchannel)
306- dvbchannel->SetPMT(pmt);
307+ if (pmt->IsEncrypted(GetDVBChannel()->GetSIStandard()) &&
308+ !ignore_encrypted)
309+ {
310+ LOG(VB_DVBCAM, LOG_INFO, LOC + "DVBSignalmonitor SetPMT and decrypt channel");
311+ DVBChannel *dvbchannel = GetDVBChannel();
312+ if (dvbchannel)
313+ dvbchannel->SetPMT(pmt);
314+ }
315 }
316-*/
317 }
318
319 void DVBSignalMonitor::HandleSTT(const SystemTimeTable *stt)
320diff --git a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp
321index 0191064..448b8c0 100644
322--- a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp
323+++ b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp
324@@ -1821,7 +1821,7 @@ void MPEGStreamData::AddEncryptionTestPID(uint pnum, uint pid, bool isvideo)
325
326 AddListeningPID(pid);
327
328- _encryption_pid_to_info[pid] = CryptInfo((isvideo) ? 10000 : 500, 8);
329+ _encryption_pid_to_info[pid] = CryptInfo((isvideo) ? 1000 : 50, (isvideo) ? 1000 : 50);
330
331 _encryption_pid_to_pnums[pid].push_back(pnum);
332 _encryption_pnum_to_pids[pnum].push_back(pid);