[MPlayer-dev-eng] PATCH for demux_ts

Nico Sabbi nsabbi at tiscali.it
Sat Nov 20 12:42:51 CET 2004


Marcus Metzler wrote:

>Hi,
>
>I have a patch for demux_ts.c that checks for and allows TS packets
>larger than 188 bytes. Those packages exits if the FEC information is
>not stripped from the packets received by a DVB card (204 bytes), or
>if some cards add time stamp information to the packets (192 bytes).
>
>Here is a diff -u against the latest CVS:
>
>Index: demux_ts.c
>===================================================================
>RCS file: /cvsroot/mplayer/main/libmpdemux/demux_ts.c,v
>retrieving revision 1.20
>diff -u -r1.20 demux_ts.c
>--- demux_ts.c	15 Nov 2004 20:56:10 -0000	1.20
>+++ demux_ts.c	20 Nov 2004 11:28:20 -0000
>@@ -37,6 +37,7 @@
> #include "bswap.h"
> #include "../unrarlib.h"
> 
>+#define TS_PH_PACKET_SIZE 192
> #define TS_FEC_PACKET_SIZE 204
> #define TS_PACKET_SIZE 188
> #define NB_PID_MAX 8192
>@@ -173,10 +174,20 @@
> try_fec:
> 	for(i=0; i<NUM_CONSECUTIVE_TS_PACKETS; i++)
> 	{
>-		if (buf[i * TS_FEC_PACKET_SIZE] != 0x47)
>-		return 0;
>+		if (buf[i * TS_FEC_PACKET_SIZE] != 0x47){
>+			mp_msg(MSGT_DEMUX, MSGL_DBG2, "GET_PACKET_SIZE, pos %d, char: %2x\n", i, buf[i * TS_PACKET_SIZE]);
>+			goto try_philips;
>+		}
> 	}
> 	return TS_FEC_PACKET_SIZE;
>+
>+ try_philips:
>+	for(i=0; i<NUM_CONSECUTIVE_TS_PACKETS; i++)
>+	{
>+		if (buf[i * TS_PH_PACKET_SIZE] != 0x47)
>+		return 0;
>+	}
>+	return TS_PH_PACKET_SIZE;
> }
> 
> 
>@@ -1682,7 +1693,7 @@
> 	demux_packet_t **dp = NULL;
> 	int *dp_offset = 0, *buffer_size = 0;
> 	int32_t progid, pid_type, bad, ts_error;
>-
>+	int junk = 0;
> 
> 	while(! done)
> 	{
>@@ -1692,6 +1703,7 @@
> 		dp_offset = buffer_size = NULL;
> 
> 		buf_size = priv->ts.packet_size;
>+		junk = buf_size-TS_PACKET_SIZE;
> 
> 		if(stream_eof(stream))
> 		{
>@@ -1804,11 +1816,11 @@
> 
> 		//TABLE PARSING
> 
>-		base = priv->ts.packet_size - buf_size;
>+		base = priv->ts.packet_size - buf_size-junk;
> 		if(pid  == 0)
> 		{
>-			stream_read(stream,&packet[base], buf_size);
>-			parse_pat(priv, is_start, &packet[base], buf_size);
>+			stream_read(stream,&packet[base], buf_size-junk);
>+			parse_pat(priv, is_start, &packet[base], buf_size-junk);
> 			continue;
> 		}
> 		else
>@@ -1818,8 +1830,8 @@
> 			{
> 				if(pid != demuxer->video->id && pid != demuxer->audio->id && pid != demuxer->sub->id)
> 				{
>-					stream_read(stream,&packet[base], buf_size);
>-					parse_pmt(priv, progid, pid, is_start, &packet[base], buf_size);
>+					stream_read(stream,&packet[base], buf_size-junk);
>+					parse_pmt(priv, progid, pid, is_start, &packet[base], buf_size-junk);
> 					continue;
> 				}
> 				else
>@@ -1949,7 +1961,7 @@
> 			p = &packet[base];
> 			stream_read(stream, p, buf_size);
> 
>-			len = pes_parse2(p, buf_size, es, pid_type);
>+			len = pes_parse2(p, buf_size-junk, es, pid_type);
> 			es->pid = tss->pid;
> 					
> 			if(probe)
>@@ -1960,7 +1972,7 @@
> 				{
> 					if(tss->type != UNKNOWN)
> 					{
>-						es->size = buf_size;
>+						es->size = buf_size-junk;
> 						es->start = p;
> 						return 1;
> 					}
>@@ -1988,7 +2000,7 @@
> 				{
> 					if(tss->type != UNKNOWN)
> 					{
>-						len = es->size = buf_size;		//push the whole packet to the fifo 
>+						len = es->size = buf_size-junk;		//push the whole packet to the fifo 
> 											//(we already learned what it is during the probe phase)
> 						es->start = p;
> 					}
>@@ -2058,7 +2070,7 @@
> 
> 			if(tss->payload_size > 0)
> 			{
>-				sz = min(tss->payload_size, buf_size);
>+				sz = min(tss->payload_size, buf_size-junk);
> 				tss->payload_size -= sz;
> 				es->size = sz;
> 			}
>@@ -2066,7 +2078,7 @@
> 			{
> 				if(is_video)
> 				{
>-					sz = es->size = buf_size;
>+					sz = es->size = buf_size-junk;
> 				}
> 				else
> 				{
>
>
>I tested it with streams that have 188 and 192 byte packets.
>
>Marcus
>
>  
>

can you upload a sample to ftp://www.mplayerhq.hu:/MPlayer/incoming and 
tell us the filename, please?
Thanks for your patch, I'll test it this afternoon.

    Nico




More information about the MPlayer-dev-eng mailing list