Blank screen when switching channels on same transponderwithDpid

Message ID
State New

Commit Message

Klaus Schmidinger Aug. 12, 2006, 1:05 p.m. UTC
  Tomas Berglund wrote:
> Now I can switch channels with Dpid without problem. The following patch in cDvbDevice::SetChannelDevice fixes it.
> The PRINTPIDs debug function now show adding and deleting Dpids.
> But when I select the Dolby track my kernel panics... Well.. I'm not Klaus ;-) 

Just tried you patch, and my system also freezed.

> @@ -849,15 +857,16 @@
>    if (TurnOnLivePIDs) {
>       SetAudioBypass(false);
> -     if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(Channel->Vpid(), ptVideo) && AddPid(Channel->Apid(0), ptAudio))) {
> +     if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(Channel->Vpid(), ptVideo) && AddPid(Channel->Apid(0), ptAudio) &&
> AddPid(Channel->Dpid(0), ptDolby))) {

I guess the basic problem is with your CAM, which probably only
supports a very limited number of PIDs to decode at the same time.

There is indeed an unsymmetry in the way VDR handles the additional
live audio PIDs, which doesn't matter too much if the CAM is powerful
enough to handle many PIDs. Once you switch to a different transponder
the problem should be gone, since then all PIDs are cleared in the CAM.

What I could suggest as a quick workaround is this:

This would at least not set the DPID if you don't use Dolby.

The change you have suggested above actually sets up a PID
filter in the DVB device for the DPID, which apparently causes
trouble when actually trying to switch to live Dolby.

I can see that this is a bit messy right now, but improving the
CAM handling is the first thing I'm going to do in version 1.5...



--- dvbdevice.c 2006/06/11 09:03:55     1.159
+++ dvbdevice.c 2006/08/12 12:42:12
@@ -856,7 +856,8 @@ 
       //XXX quick workaround for additional live audio PIDs:
       if (ciHandler) {
          ciHandler->SetPid(Channel->Apid(1), true);
-        ciHandler->SetPid(Channel->Dpid(0), true);
+        if (Setup.UseDolbyDigital)
+           ciHandler->SetPid(Channel->Dpid(0), true);
       if (IsPrimaryDevice())
          AddPid(Channel->Tpid(), ptTeletext);