changeset 10259:b60e89268837

- discard soon non TS files (previously it took too long, as in the case of mpeg-ps files without a registered extension) - detect sooner audio-only files (at least 64K of the chosen audio streams without a video stream) patch by Nico <nsabbi@libero.it>
author arpi
date Sun, 08 Jun 2003 11:58:05 +0000
parents d9371eecb619
children 597ad4eb02fc
files libmpdemux/demux_ts.c
diffstat 1 files changed, 41 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_ts.c	Sun Jun 08 04:03:59 2003 +0000
+++ b/libmpdemux/demux_ts.c	Sun Jun 08 11:58:05 2003 +0000
@@ -41,8 +41,10 @@
 #define NB_PID_MAX 8192
 
 #define MAX_HEADER_SIZE 6			/* enough for PES header + length */
-#define MAX_PROBE_SIZE	500000
+#define MAX_CHECK_SIZE	65535
+#define MAX_PROBE_SIZE	1000000
 #define NUM_CONSECUTIVE_TS_PACKETS 32
+#define NUM_CONSECUTIVE_AUDIO_PACKETS 348
 
 
 int ts_fastparse = 0;
@@ -99,7 +101,7 @@
 			mp_msg(MSGT_DEMUX, MSGL_DBG2, "GET_PACKET_SIZE, pos %d, char: %2x\n", i, buf[i * TS_PACKET_SIZE]);
 			goto try_fec;
 		}
-    	}
+	}
 	return TS_PACKET_SIZE;
 
 try_fec:
@@ -117,13 +119,14 @@
 {
 	const int buf_size = (TS_FEC_PACKET_SIZE * NUM_CONSECUTIVE_TS_PACKETS);
 	unsigned char buf[buf_size], done = 0, *ptr;
-	uint32_t _read, i, count = 0;
+	uint32_t _read, i, count = 0, is_ts;
 	int cc[NB_PID_MAX], last_cc[NB_PID_MAX], pid, cc_ok, c;
 	uint8_t size = 0;
 	off_t pos = 0;
 
 	mp_msg(MSGT_DEMUX, MSGL_V, "Checking for TS...\n");
 
+	is_ts = 0;
 	while(! done)
 	{
 		i = 1;
@@ -131,37 +134,50 @@
 
 		while(((c=stream_read_char(demuxer->stream)) != 0x47)
 			&& (c >= 0)
-			&& (i < MAX_PROBE_SIZE)
+			&& (i < MAX_CHECK_SIZE)
 			&& ! demuxer->stream->eof
 		) i++;
 
 
-	    if(c != 0x47)
-	    {
+		if(c != 0x47)
+		{
 			mp_msg(MSGT_DEMUX, MSGL_V, "NOT A TS FILE1\n");
+			is_ts = 0;
 			done = 1;
 			continue;
-	    }
+		}
 
-	    pos = stream_tell(demuxer->stream) - 1;
-	    buf[0] = c;
-	    _read = stream_read(demuxer->stream, &buf[1], buf_size-1);
+		pos = stream_tell(demuxer->stream) - 1;
+		buf[0] = c;
+		_read = stream_read(demuxer->stream, &buf[1], buf_size-1);
 
-	    if(_read < buf_size-1)
-	    {
+		if(_read < buf_size-1)
+		{
 			mp_msg(MSGT_DEMUX, MSGL_V, "COULDN'T READ ENOUGH DATA, EXITING TS_CHECK\n");
 			stream_reset(demuxer->stream);
 			return 0;
-	    }
+		}
 
-	    size = get_packet_size(buf, buf_size);
-	    if(size)
-		  done = 1;
+		size = get_packet_size(buf, buf_size);
+		if(size)
+		{
+			done = 1;
+			is_ts = 1;
+		}
+
+		if(pos >= MAX_CHECK_SIZE)
+		{
+			done = 1;
+			is_ts = 0;
+		}
 	}
 
-	mp_msg(MSGT_DEMUX, MSGL_V, "TRIED UP TO POSITION %u, FOUND %x, packet_size= %d\n", i, c, size);
+	mp_msg(MSGT_DEMUX, MSGL_V, "TRIED UP TO POSITION %u, FOUND %x, packet_size= %d\n", pos, c, size);
 	stream_seek(demuxer->stream, pos);
 
+	if(! is_ts)
+	  return 0;
+
 	//LET'S CHECK continuity counters
 	for(count = 0; count < NB_PID_MAX; count++)
 	{
@@ -193,9 +209,10 @@
 
 
 
+
 static void ts_detect_streams(demuxer_t *demuxer, uint32_t *a,  uint32_t *v, int *fapid, int *fvpid)
 {
-	int video_found = 0, audio_found = 0, i;
+	int video_found = 0, audio_found = 0, i, num_packets = 0;
 	off_t pos=0;
 	ES_stream_t es;
 	unsigned char tmp[TS_FEC_PACKET_SIZE];
@@ -209,6 +226,7 @@
 		{
 			mp_msg(MSGT_DEMUXER, MSGL_DBG2, "TYPE: %x, PID: %d\n", es.type, es.pid);
 
+
 			if((*fvpid == -1) || (*fvpid == es.pid))
 			{
 				if(es.type == VIDEO_MPEG2)
@@ -219,8 +237,9 @@
 				}
 			}
 
-			if((*fvpid == -2) && audio_found)
+			if(((*fvpid == -2) || (num_packets >= NUM_CONSECUTIVE_AUDIO_PACKETS)) && audio_found)
 			{
+				//novideo or we have at least 348 audio packets (64 KB) without video (TS with audio only)
 				*v = 0;
 				break;
 			}
@@ -250,6 +269,9 @@
 				}
 			}
 
+			if(audio_found && (*fapid == es.pid) && (! video_found))
+			  num_packets++;
+
 			if((*fapid == -2) && video_found)
 			{
 				*a = 0;