summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY1
-rw-r--r--remux/ts2pes.c22
-rw-r--r--remux/ts2pes.h6
-rw-r--r--remux/tsremux.h4
-rw-r--r--server/livestreamer.c108
-rw-r--r--server/livestreamer.h11
6 files changed, 39 insertions, 113 deletions
diff --git a/HISTORY b/HISTORY
index b38b73c..9f2d3c4 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,6 +1,7 @@
VDR Plugin 'streamdev' Revision History
---------------------------------------
+- now there's a common baseclass for all remuxers, make use of it
- added cDevice::NumProvidedSystems() which was introduced in VDR 1.7.0
- added namespace to remuxers
- increased WRITERBUFSIZE - buffer was too small for high bandwidth content
diff --git a/remux/ts2pes.c b/remux/ts2pes.c
index baa57bb..eeb56d5 100644
--- a/remux/ts2pes.c
+++ b/remux/ts2pes.c
@@ -10,7 +10,7 @@
* The cRepacker family's code was originally written by Reinhard Nissl <rnissl@gmx.de>,
* and adapted to the VDR coding style by Klaus.Schmidinger@cadsoft.de.
*
- * $Id: ts2pes.c,v 1.1 2009/06/19 06:32:40 schmirl Exp $
+ * $Id: ts2pes.c,v 1.2 2009/06/30 06:04:33 schmirl Exp $
*/
#include "remux/ts2pes.h"
@@ -1931,7 +1931,7 @@ int cTS2PESRemux::Put(const uchar *Data, int Count)
return used;
}
-uchar *cTS2PESRemux::Get(int &Count, uchar *PictureType)
+uchar *cTS2PESRemux::Get(int &Count)
{
// Remove any previously skipped data from the result buffer:
@@ -1940,18 +1940,8 @@ uchar *cTS2PESRemux::Get(int &Count, uchar *PictureType)
resultSkipped = 0;
}
-#if 0
- // Test recording without determining the real frame borders:
- if (PictureType)
- *PictureType = I_FRAME;
- return resultBuffer->Get(Count);
-#endif
-
// Check for frame borders:
- if (PictureType)
- *PictureType = NO_PICTURE;
-
Count = 0;
uchar *resultData = NULL;
int resultCount = 0;
@@ -1972,8 +1962,6 @@ uchar *cTS2PESRemux::Get(int &Count, uchar *PictureType)
}
else if (!synced) {
if (pt == I_FRAME) {
- if (PictureType)
- *PictureType = pt;
resultSkipped = i; // will drop everything before this position
cTSRemux::SetBrokenLink(data + i, l);
synced = true;
@@ -1981,8 +1969,6 @@ uchar *cTS2PESRemux::Get(int &Count, uchar *PictureType)
}
else if (Count)
return resultData;
- else if (PictureType)
- *PictureType = pt;
}
}
else { //if (AUDIO_STREAM_S <= StreamType && StreamType <= AUDIO_STREAM_E || StreamType == PRIVATE_STREAM1) {
@@ -1991,15 +1977,11 @@ uchar *cTS2PESRemux::Get(int &Count, uchar *PictureType)
return resultData;
if (noVideo) {
if (!synced) {
- if (PictureType)
- *PictureType = I_FRAME;
resultSkipped = i; // will drop everything before this position
synced = true;
}
else if (Count)
return resultData;
- else if (PictureType)
- *PictureType = I_FRAME;
}
}
if (synced) {
diff --git a/remux/ts2pes.h b/remux/ts2pes.h
index 2867a41..61ac857 100644
--- a/remux/ts2pes.h
+++ b/remux/ts2pes.h
@@ -4,7 +4,7 @@
* This file is based on a copy of remux.h from Klaus Schmidinger's
* VDR, version 1.6.0.
*
- * $Id: ts2pes.h,v 1.2 2009/06/29 06:23:33 schmirl Exp $
+ * $Id: ts2pes.h,v 1.3 2009/06/30 06:04:33 schmirl Exp $
*/
#ifndef VDR_STREAMDEV_TS2PES_H
@@ -38,11 +38,9 @@ public:
int Put(const uchar *Data, int Count);
///< Puts at most Count bytes of Data into the remuxer.
///< \return Returns the number of bytes actually consumed from Data.
- uchar *Get(int &Count, uchar *PictureType = NULL);
+ uchar *Get(int &Count);
///< Gets all currently available data from the remuxer.
///< \return Count contains the number of bytes the result points to, and
- ///< PictureType (if not NULL) will contain one of NO_PICTURE, I_FRAME, P_FRAME
- ///< or B_FRAME.
void Del(int Count);
///< Deletes Count bytes from the remuxer. Count must be the number returned
///< from a previous call to Get(). Several calls to Del() with fractions of
diff --git a/remux/tsremux.h b/remux/tsremux.h
index 09a5372..dbcb9ff 100644
--- a/remux/tsremux.h
+++ b/remux/tsremux.h
@@ -14,6 +14,10 @@ namespace Streamdev {
class cTSRemux {
public:
+ virtual int Put(const uchar *Data, int Count) = 0;
+ virtual uchar *Get(int &Count) = 0;
+ virtual void Del(int Count) = 0;
+
static void SetBrokenLink(uchar *Data, int Length);
static int GetPid(const uchar *Data);
static int GetPacketLength(const uchar *Data, int Count, int Offset);
diff --git a/server/livestreamer.c b/server/livestreamer.c
index 684e701..71a3565 100644
--- a/server/livestreamer.c
+++ b/server/livestreamer.c
@@ -340,10 +340,7 @@ cStreamdevLiveStreamer::cStreamdevLiveStreamer(int Priority, std::string Paramet
m_Device(NULL),
m_Receiver(NULL),
m_PatFilter(NULL),
- m_PESRemux(NULL),
- m_ESRemux(NULL),
- m_PSRemux(NULL),
- m_ExtRemux(NULL)
+ m_Remux(NULL)
{
}
@@ -356,10 +353,7 @@ cStreamdevLiveStreamer::~cStreamdevLiveStreamer()
DELETENULL(m_PatFilter);
}
DELETENULL(m_Receiver);
- delete m_PESRemux;
- delete m_ESRemux;
- delete m_PSRemux;
- delete m_ExtRemux;
+ delete m_Remux;
}
bool cStreamdevLiveStreamer::HasPid(int Pid)
@@ -466,17 +460,17 @@ bool cStreamdevLiveStreamer::SetChannel(const cChannel *Channel, eStreamType Str
int pid = ISRADIO(m_Channel) ? m_Channel->Apid(0) : m_Channel->Vpid();
if (Apid != 0)
pid = Apid;
- m_ESRemux = new cTS2ESRemux(pid);
+ m_Remux = new cTS2ESRemux(pid);
return SetPids(pid);
}
case stPES:
- m_PESRemux = new cTS2PESRemux(m_Channel->Vpid(), m_Channel->Apids(), m_Channel->Dpids(),
+ m_Remux = new cTS2PESRemux(m_Channel->Vpid(), m_Channel->Apids(), m_Channel->Dpids(),
m_Channel->Spids());
return SetPids(m_Channel->Vpid(), Apids, Dpids, m_Channel->Spids());
case stPS:
- m_PSRemux = new cTS2PSRemux(m_Channel->Vpid(), m_Channel->Apids(), m_Channel->Dpids(),
+ m_Remux = new cTS2PSRemux(m_Channel->Vpid(), m_Channel->Apids(), m_Channel->Dpids(),
m_Channel->Spids());
return SetPids(m_Channel->Vpid(), Apids, Dpids, m_Channel->Spids());
@@ -495,7 +489,7 @@ bool cStreamdevLiveStreamer::SetChannel(const cChannel *Channel, eStreamType Str
return true;
case stExtern:
- m_ExtRemux = new cExternRemux(m_Channel->Vpid(), m_Channel->Apids(), m_Channel->Dpids(),
+ m_Remux = new cExternRemux(m_Channel->Vpid(), m_Channel->Apids(), m_Channel->Dpids(),
m_Channel->Spids(), m_Parameter);
return SetPids(m_Channel->Vpid(), Apids, Dpids, m_Channel->Spids());
@@ -508,87 +502,39 @@ bool cStreamdevLiveStreamer::SetChannel(const cChannel *Channel, eStreamType Str
int cStreamdevLiveStreamer::Put(const uchar *Data, int Count)
{
- switch (m_StreamType) {
- case stTS:
- // insert si data
- if (m_PatFilter) {
- int got;
- uchar *si = m_PatFilter->Get(got);
- if (si) {
- int count = cStreamdevStreamer::Put(si, got);
- if (count)
- m_PatFilter->Del(count);
- }
+ // insert si data
+ if (m_PatFilter) {
+ int siCount;
+ uchar *siData = m_PatFilter->Get(siCount);
+ if (siData) {
+ if (m_Remux)
+ siCount = m_Remux->Put(siData, siCount);
+ else
+ siCount = cStreamdevStreamer::Put(siData, siCount);
+ if (siCount)
+ m_PatFilter->Del(siCount);
}
- // fall through
- case stTSPIDS:
- return cStreamdevStreamer::Put(Data, Count);
-
- case stPES:
- return m_PESRemux->Put(Data, Count);
-
- case stES:
- return m_ESRemux->Put(Data, Count);
-
- case stPS:
- return m_PSRemux->Put(Data, Count);
-
- case stExtern:
- return m_ExtRemux->Put(Data, Count);
-
- default: // shouldn't happen???
- return 0;
}
+ if (m_Remux)
+ return m_Remux->Put(Data, Count);
+ else
+ return cStreamdevStreamer::Put(Data, Count);
}
uchar *cStreamdevLiveStreamer::Get(int &Count)
{
- switch (m_StreamType) {
- case stTS:
- case stTSPIDS:
+ if (m_Remux)
+ return m_Remux->Get(Count);
+ else
return cStreamdevStreamer::Get(Count);
-
- case stPES:
- return m_PESRemux->Get(Count);
-
- case stES:
- return m_ESRemux->Get(Count);
-
- case stPS:
- return m_PSRemux->Get(Count);
-
- case stExtern:
- return m_ExtRemux->Get(Count);
-
- default: // shouldn't happen???
- return 0;
- }
}
void cStreamdevLiveStreamer::Del(int Count)
{
- switch (m_StreamType) {
- case stTS:
- case stTSPIDS:
+ if (m_Remux)
+ m_Remux->Del(Count);
+ else
cStreamdevStreamer::Del(Count);
- break;
-
- case stPES:
- m_PESRemux->Del(Count);
- break;
-
- case stES:
- m_ESRemux->Del(Count);
- break;
-
- case stPS:
- m_PSRemux->Del(Count);
- break;
-
- case stExtern:
- m_ExtRemux->Del(Count);
- break;
- }
}
void cStreamdevLiveStreamer::Attach(void)
diff --git a/server/livestreamer.h b/server/livestreamer.h
index cf64559..7f442ba 100644
--- a/server/livestreamer.h
+++ b/server/livestreamer.h
@@ -5,13 +5,11 @@
#include <vdr/receiver.h>
#include "server/streamer.h"
+#include "remux/tsremux.h"
#include "common.h"
namespace Streamdev {
- class cTS2PSRemux;
- class cTS2ESRemux;
- class cExternRemux;
- class cTS2PESRemux;
+ class cTSRemux;
}
class cStreamdevPatFilter;
class cStreamdevLiveReceiver;
@@ -29,10 +27,7 @@ private:
cDevice *m_Device;
cStreamdevLiveReceiver *m_Receiver;
cStreamdevPatFilter *m_PatFilter;
- Streamdev::cTS2PESRemux *m_PESRemux;
- Streamdev::cTS2ESRemux *m_ESRemux;
- Streamdev::cTS2PSRemux *m_PSRemux;
- Streamdev::cExternRemux *m_ExtRemux;
+ Streamdev::cTSRemux *m_Remux;
void StartReceiver(void);
bool HasPid(int Pid);