[vls-devel] dynamic streams patch for dvb-t

Andrew de Quincey adq_dvb at lidskialf.net
Tue Dec 10 22:30:22 CET 2002


Hi, I've fixed the remaining problems in my DVB-T patch, and updated it
for todays CVS.

It now allows/fixes:
  DVB-T streams can be started and stopped dynamically.
  The timeout if you started vls, but didn't start a DVB-T stream.
  Segfaults on shutdown fixed.
  You can optionally specify the path to the dvbrc file in the dvb input
config section. (e.g. /etc/dvbrc)


--- CUT HERE ---
diff -Naur vls.ORIGINAL/src/modules/dvbinput/dvbinput.cpp vls/src/modules/dvbinput/dvbinput.cpp
--- vls.ORIGINAL/src/modules/dvbinput/dvbinput.cpp	2002-12-10 21:55:00.000000000 +0000
+++ vls/src/modules/dvbinput/dvbinput.cpp	2002-12-10 22:18:09.000000000 +0000
@@ -114,8 +114,8 @@
                                 m_cCurrentPat(0, 0, true)
 {
   dvb = new DVB;
-  m_iGotPat = 0;   // Did not get the first PAT yet
   m_iGotTpid = 0;  // Did not set the transponder yet
+  demuxUsageCount = 0; // nothing using the demux yet
   m_pConverter = NULL;
   for(int i =0; i < 512; i++)
     m_iDemuxes[i] = -1;
@@ -137,6 +137,7 @@
 {
   int iNumber;
   C_String strType;
+  C_String dvbrc;
   char filen[FILELEN];
 
   // Retrieve config
@@ -144,6 +145,10 @@
   ASSERT(pApp);
 
   iNumber = pApp->GetSetting(GetName() + ".DeviceNumber", "0").ToInt();
+  dvbrc = pApp->GetSetting(GetName() + ".Dvbrc", "");
+  if (dvbrc.Length() != 0) {
+    strncpy(filen, dvbrc.GetString(), dvbrc.Length()+1);
+  }
 
   dvb->init("", "", iNumber);
   
@@ -219,10 +224,6 @@
   cConfig.m_pEventHandler = this;
   m_pConverter = pConverterModule->NewMpegConverter(cConfig);
   ASSERT(m_pConverter);
-  
-  // Launch the demux
-  m_pConverter->Create();
-
 }
 

@@ -237,16 +238,18 @@
 
   if(m_pConverter)
   {
-    // Stop the input stream
-    try
-    {
-      m_pConverter->Stop();
-    }
-    catch(E_Exception e)
-    {
-      m_cEndInit.Release();
-      delete m_pConverter;
-      throw e;
+    // Stop the input converter if necessary
+    if (m_pConverter->IsRunning()) {
+      try
+	{
+	  m_pConverter->Stop();
+	}
+      catch(E_Exception e)
+	{
+	  m_cEndInit.Release();
+	  delete m_pConverter;
+	  throw e;
+	}
     }
 
     delete m_pConverter;
@@ -455,7 +458,6 @@
 
     // Kludge: signal the first PAT arrival.
     m_cEndInit.Protect();
-    m_iGotPat = 1;
     m_cEndInit.Signal();
     m_cEndInit.Release();
   }
@@ -471,31 +473,46 @@
   int iIndex=m_vProgramNames.Find(pBroadcast->GetProgram()->GetName());
   LogDbg(m_hLog, "DVB Channel found: "+dvb->chans[iIndex].name);
 
-  // Check that if we have already got one broadcast going that this
-  // new one is on the same mux (transponder)
-  if(m_iGotPat && m_iGotTpid != dvb->chans[iIndex].tpid)
-  {
-    LogDbg(m_hLog, "Attempting to start reception from different transponder." \
-           "Existing transponder is " + m_iGotTpid + " asked transponder is " +
-            dvb->chans[iIndex].tpid);
-    return;
-  }
-  
-  if (!m_iGotPat)
-  {
+  // lock the demux usage 
+  demuxUsageM.Lock();
+
+  // If we've not already started the demux, do so, and wait for the first
+  // PAT
+  if (demuxUsageCount == 0) {
     // Set the frontend up
     dvb->SetTP(dvb->chans[iIndex].tpid, dvb->chans[iIndex].satid);
     dvb->set_front();
 
-    // Put a filter on PAT
+    // Launch the demux
+    m_pConverter->Create();
+    
+    // Add a filter for PAT
     SelectPid(&m_cPatDecoder, 0x0000, TS_TYPE_NULL);
-
+    
     // Wait for the first PAT
     m_cEndInit.Wait();
     m_cEndInit.Release();
     m_iGotTpid = dvb->chans[iIndex].tpid; // Remember the transponder
+
+    // update demux counter and unlock
+    demuxUsageCount++;
+    demuxUsageM.UnLock();
+  } else {
+    // Check that if we have already got one broadcast going that this
+    // new one is on the same mux (transponder)
+    if (m_iGotTpid != dvb->chans[iIndex].tpid) {
+      LogDbg(m_hLog, "Attempting to start reception from different " +
+	     "transponder. Exiting transponder is " + m_iGotTpid + 
+	     " new transponder is " + dvb->chans[iIndex].tpid);
+      demuxUsageM.UnLock();
+      return;
+    }
+    
+    // update counter and unlock
+    demuxUsageCount++;
+    demuxUsageM.UnLock();
   }
-  
+
   // Get the program
   dvbpsi_pat_program_t *pProgram =
         m_cCurrentPat.GetProgram(dvb->chans[iIndex].pnr);
@@ -520,15 +537,18 @@
 
     try
     {
+
+      u16 iNumber = pBroadcast->GetProgram()->GetName().ToInt();
+
       pStreamer->Create();
 
       pMux->Attach();
 
       pMux->AttachProgram(pProgram->i_number, pProgram->i_pid);
 
-      m_cMuxes.Add(pProgram->i_number, pMux);
+      m_cMuxes.Add(iNumber, pMux);
 
-      m_cStreamers.Add(pProgram->i_number, pStreamer);
+      m_cStreamers.Add(iNumber, pStreamer);
 
     }
     catch(E_Exception e)
@@ -573,8 +593,19 @@
 {
   m_cLock.Lock();
 
-  //Unset the filter on PAT
-  UnselectPid(&m_cPatDecoder, 0x0000);
+  // lock demux counter and decrement usage counter
+  demuxUsageM.Lock();
+  demuxUsageCount--;    
+
+  // if the usage counter is 0, we'll have to remove the PAT filter
+  // and suspend the demux
+  if (demuxUsageCount == 0) {
+    UnselectPid(&m_cPatDecoder, 0x0000);
+    m_pConverter->Stop();
+  }
+  
+  // unlock
+  demuxUsageM.UnLock();
 
   u16 iNumber = pBroadcast->GetProgram()->GetName().ToInt();
 
diff -Naur vls.ORIGINAL/src/modules/dvbinput/dvbinput.h vls/src/modules/dvbinput/dvbinput.h
--- vls.ORIGINAL/src/modules/dvbinput/dvbinput.h	2002-12-10 21:55:00.000000000 +0000
+++ vls/src/modules/dvbinput/dvbinput.h	2002-12-10 22:05:12.000000000 +0000
@@ -87,8 +87,9 @@
   int m_iSendMethod;
   
   // Kludge: signal the first PAT arrival.
-  int m_iGotPat;
-  int m_iGotTpid;
+  int demuxUsageCount;
+  int m_iGotTpid; 
+  C_Mutex demuxUsageM;
   C_Condition m_cEndInit;
 
   // Demuxes' file descriptors
--- CUT HERE ---


-- 
This is the vls-devel mailing-list, see http://www.videolan.org/vls-devel/
To unsubscribe, please read http://www.videolan.org/lists.html
If you are in trouble, please contact <postmaster at videolan.org>



More information about the vls-devel mailing list