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 , * 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 #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);