mirror of
				https://projects.vdr-developer.org/git/vdr-plugin-streamdev.git
				synced 2023-10-10 17:16:51 +00:00 
			
		
		
		
	now there's a common baseclass for all remuxers, make use of it
Modified Files: HISTORY remux/ts2pes.c remux/ts2pes.h remux/tsremux.h server/livestreamer.c server/livestreamer.h
This commit is contained in:
		
							
								
								
									
										1
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								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 | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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)  | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user