changeset 22909:94183c81ec0c

reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
author nicodvb
date Sat, 07 Apr 2007 08:51:26 +0000
parents af17e1f03199
children 0aaf6309be25
files libmpdemux/muxer_mpeg.c
diffstat 1 files changed, 24 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/muxer_mpeg.c	Fri Apr 06 23:29:00 2007 +0000
+++ b/libmpdemux/muxer_mpeg.c	Sat Apr 07 08:51:26 2007 +0000
@@ -1460,6 +1460,8 @@
 	muxer_stream_t *s, *vs, *as;
 	muxer_headers_t *vpriv = NULL, *apriv = NULL;
 	muxer_priv_t *priv = (muxer_priv_t *) muxer->priv;
+	double duration;
+	uint64_t iduration, iaduration;
 	
 	/* 
 		analyzes all streams and decides what to flush
@@ -1495,11 +1497,30 @@
 		mp_msg(MSGT_MUXER, MSGL_DBG2, "\nVIDEO, FLUSH %d frames (of %d), 0 to %d\n", n, vpriv->framebuf_used, n-1);
 
 		vpriv = (muxer_headers_t*) vs->priv;
-
-		if(as != NULL) apriv = (muxer_headers_t*) as->priv;
+		
+		duration = 0;
+		iduration = 0;
+		for(i = 0; i < n; i++)
+			iduration += vpriv->framebuf[i].idur;
+		duration = (double) (iduration / 27000000.0);
+		
+		if(as != NULL)
+		{
+			apriv = (muxer_headers_t*) as->priv;
+			iaduration = 0;
+			for(i = 0; i < apriv->framebuf_used; i++)
+			{
+				iaduration += apriv->framebuf[i].idur;
+			}
+			if(iaduration < iduration)
+			{
+				mp_msg(MSGT_MUXER, MSGL_DBG2, "Not enough audio data exit\n");
+				return 0;
+			}
+		}
+		
 		if(as != NULL && (apriv->size == 0))
 		{
-			apriv = (muxer_headers_t*) as->priv;
 			init_delay = vpriv->framebuf[0].pts - vpriv->framebuf[0].dts;
 		
 			for(i = 0; i < apriv->framebuf_cnt; i++)