mirror of
				https://projects.vdr-developer.org/git/vdr-plugin-streamdev.git
				synced 2023-10-10 17:16:51 +00:00 
			
		
		
		
	Compatiblity to Network Media Tank (#496)
- minor fixes of PAT repacker - repack and send every PAT packet we receive
This commit is contained in:
		@@ -29,6 +29,7 @@ Rolf Ahrenberg
 | 
			
		||||
  for fixing output format of some debug messages
 | 
			
		||||
  for replacing private members by cThread::Running()/Active()
 | 
			
		||||
  for improving externremux script termination
 | 
			
		||||
  for fixing PAT repacker version field
 | 
			
		||||
 | 
			
		||||
Rantanen Teemu
 | 
			
		||||
  for providing vdr-incompletesections.diff
 | 
			
		||||
@@ -97,3 +98,6 @@ Anssi Hannula
 | 
			
		||||
 | 
			
		||||
wirbel
 | 
			
		||||
  for pointing out that section filtering is optional for VDR devices
 | 
			
		||||
 | 
			
		||||
Jori Hamalainen
 | 
			
		||||
  for extensive testing while making stream compatible to Network Media Tank
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								HISTORY
									
									
									
									
									
								
							@@ -1,6 +1,8 @@
 | 
			
		||||
VDR Plugin 'streamdev' Revision History
 | 
			
		||||
---------------------------------------
 | 
			
		||||
 | 
			
		||||
- minor fixes of PAT repacker
 | 
			
		||||
- repack and send every PAT packet we receive
 | 
			
		||||
- fixed null pointer in server.c when cConnection::Accept() failes
 | 
			
		||||
- consider Pids from channels.conf when HTTP TS streaming. Section filtering
 | 
			
		||||
  is an optional feature for VDR devices, so we must not rely on the PMT
 | 
			
		||||
 
 | 
			
		||||
@@ -211,7 +211,7 @@ int cStreamdevPatFilter::GetPid(SI::PMT::Stream& stream)
 | 
			
		||||
void cStreamdevPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
 | 
			
		||||
{
 | 
			
		||||
	if (Pid == 0x00) {
 | 
			
		||||
		if (Tid == 0x00 && !pmtPid) {
 | 
			
		||||
		if (Tid == 0x00) {
 | 
			
		||||
			SI::PAT pat(Data, false);
 | 
			
		||||
			if (!pat.CheckCRCAndParse())
 | 
			
		||||
				return;
 | 
			
		||||
@@ -220,6 +220,7 @@ void cStreamdevPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, i
 | 
			
		||||
				if (!assoc.isNITPid()) {
 | 
			
		||||
					const cChannel *Channel =  Channels.GetByServiceID(Source(), Transponder(), assoc.getServiceId());
 | 
			
		||||
					if (Channel && (Channel == m_Channel)) {
 | 
			
		||||
						int prevPmtPid = pmtPid;
 | 
			
		||||
						if (0 != (pmtPid = assoc.getPid())) {
 | 
			
		||||
							Dprintf("cStreamdevPatFilter: PMT pid for channel %s: %d\n", Channel->Name(), pmtPid);
 | 
			
		||||
							pmtSid = assoc.getServiceId();
 | 
			
		||||
@@ -233,25 +234,27 @@ void cStreamdevPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, i
 | 
			
		||||
								int ts_id;
 | 
			
		||||
								unsigned int crc, i, len;
 | 
			
		||||
								uint8_t *tmp, tspat_buf[TS_SIZE];
 | 
			
		||||
								static uint8_t ccounter = 0;
 | 
			
		||||
								ccounter = (ccounter + 1) % 16;
 | 
			
		||||
								memset(tspat_buf, 0xff, TS_SIZE);
 | 
			
		||||
								memset(tspat_buf, 0x0, 4 + 12 + 5);   // TS_HDR_LEN + PAT_TABLE_LEN + 5
 | 
			
		||||
								ts_id = Channel->Tid();               // Get transport stream id of the channel
 | 
			
		||||
								tspat_buf[0] = TS_SYNC_BYTE;          // Transport packet header sunchronization byte (1000011 = 0x47h)
 | 
			
		||||
								tspat_buf[1] = 0x40;                  // Set payload unit start indicator bit
 | 
			
		||||
								tspat_buf[2] = 0x0;                   // PID
 | 
			
		||||
								tspat_buf[3] = 0x10;                  // Set payload flag to indicate precence of payload data
 | 
			
		||||
								tspat_buf[4] = 0x0;                   // PSI
 | 
			
		||||
								tspat_buf[3] = 0x10 | ccounter;       // Set payload flag, Continuity counter
 | 
			
		||||
								tspat_buf[4] = 0x0;                   // SI pointer field
 | 
			
		||||
								tspat_buf[5] = 0x0;                   // PAT table id
 | 
			
		||||
								tspat_buf[6] = 0xb0;                  // Section syntax indicator bit and reserved bits set
 | 
			
		||||
								tspat_buf[7] = 12 + 1;                // Section length (12 bit): PAT_TABLE_LEN + 1
 | 
			
		||||
								tspat_buf[8] = (ts_id >> 8) & 0xff;   // Transport stream ID (bits 8-15)
 | 
			
		||||
								tspat_buf[8] = (ts_id >> 8);          // Transport stream ID (bits 8-15)
 | 
			
		||||
								tspat_buf[9] = (ts_id & 0xff);        // Transport stream ID (bits 0-7)
 | 
			
		||||
								tspat_buf[10] = 0x01;                 // Version number 0, Current next indicator bit set  
 | 
			
		||||
								tspat_buf[10] = 0xc0 | ((pat.getVersionNumber() << 1) & 0x3e) |
 | 
			
		||||
									pat.getCurrentNextIndicator();// Version number, Current next indicator
 | 
			
		||||
								tspat_buf[11] = 0x0;                  // Section number
 | 
			
		||||
								tspat_buf[12] = 0x0;                  // Last section number
 | 
			
		||||
								tspat_buf[13] = (pmtSid >> 8) & 0xff; // Program number (bits 8-15)
 | 
			
		||||
								tspat_buf[13] = (pmtSid >> 8);        // Program number (bits 8-15)
 | 
			
		||||
								tspat_buf[14] = (pmtSid & 0xff);      // Program number (bits 0-7)
 | 
			
		||||
								tspat_buf[15] = (pmtPid >> 8) & 0xff; // Network ID (bits 8-12)
 | 
			
		||||
								tspat_buf[15] = 0xe0 | (pmtPid >> 8); // Network ID (bits 8-12)
 | 
			
		||||
								tspat_buf[16] = (pmtPid & 0xff);      // Network ID (bits 0-7)
 | 
			
		||||
								crc = 0xffffffff;
 | 
			
		||||
								len = 12;                             // PAT_TABLE_LEN
 | 
			
		||||
@@ -269,9 +272,11 @@ void cStreamdevPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, i
 | 
			
		||||
#endif
 | 
			
		||||
							} else 
 | 
			
		||||
								isyslog("cStreamdevPatFilter: PAT size %d too large to fit in one TS", Length);
 | 
			
		||||
							m_Streamer->SetPids(pmtPid);
 | 
			
		||||
							Add(pmtPid, 0x02);
 | 
			
		||||
							pmtVersion = -1;
 | 
			
		||||
							if (pmtPid != prevPmtPid) {
 | 
			
		||||
								m_Streamer->SetPids(pmtPid);
 | 
			
		||||
								Add(pmtPid, 0x02);
 | 
			
		||||
								pmtVersion = -1;
 | 
			
		||||
							}
 | 
			
		||||
							return;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user