[MPlayer-cvslog] r19125 - trunk/libmpcodecs/ad_hwmpa.c

nicodvb subversion at mplayerhq.hu
Sun Jul 16 18:34:05 CEST 2006


Author: nicodvb
Date: Sun Jul 16 18:34:05 2006
New Revision: 19125

Modified:
   trunk/libmpcodecs/ad_hwmpa.c

Log:
prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash

Modified: trunk/libmpcodecs/ad_hwmpa.c
==============================================================================
--- trunk/libmpcodecs/ad_hwmpa.c	(original)
+++ trunk/libmpcodecs/ad_hwmpa.c	Sun Jul 16 18:34:05 2006
@@ -14,7 +14,6 @@
 #include "libmpdemux/mp3_hdr.h"
 
 //based on ad_hwac3.c and ad_libmad.c
-static int isdts = -1;
 
 static ad_info_t info = 
 {
@@ -84,23 +83,33 @@
 
 static int decode_audio(sh_audio_t *sh,unsigned char *buf,int minlen,int maxlen)
 {
-	int len, start, cnt2, tot;
+	int len, start, tot;
 	int chans, srate, spf, mpa_layer, br;
 
-	tot = cnt2 = 0;
-	while(tot < minlen && tot+4608<=maxlen)
+	tot = 0;
+
+	while(tot < minlen)
 	{
 		start = mpa_sync(sh, 1, &len, &chans, &srate, &spf, &mpa_layer, &br);
-		if(start < 0)
+		if(start < 0 || tot + len > maxlen)
 			break;
 
-		if(start + len < sh->a_in_buffer_len && start + len >= maxlen)
-			break;
-		memcpy(&buf[cnt2], &(sh->a_in_buffer[start]), len);
-		cnt2 += len;
+		if(start + len > sh->a_in_buffer_len)
+		{
+			int l;
+			l = min(sh->a_in_buffer_size - sh->a_in_buffer_len, start + len);
+			l = demux_read_data(sh->ds,&sh->a_in_buffer[sh->a_in_buffer_len], l);
+			if(! l)
+				return tot;
+			sh->a_in_buffer_len += l;
+			continue;
+		}
+
+		memcpy(&buf[tot], &(sh->a_in_buffer[start]), len);
+		tot += len;
+
 		sh->a_in_buffer_len -= start + len;
 		memmove(sh->a_in_buffer, &(sh->a_in_buffer[start + len]), sh->a_in_buffer_len);
-		tot += start + len;
 	}
 
 	return tot;



More information about the MPlayer-cvslog mailing list