changeset 11620:39ae20e6ad9d

fix bug when bmovl can't read the whole pic at once patch by Detlev Droege <droege@uni-koblenz.de>
author attila
date Wed, 10 Dec 2003 12:28:20 +0000
parents 179138947307
children cc2bbda6db52
files libmpcodecs/vf_bmovl.c
diffstat 1 files changed, 17 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libmpcodecs/vf_bmovl.c	Wed Dec 10 12:19:13 2003 +0000
+++ b/libmpcodecs/vf_bmovl.c	Wed Dec 10 12:28:20 2003 +0000
@@ -199,6 +199,7 @@
 static int
 put_image(struct vf_instance_s* vf, mp_image_t* mpi){
 	int buf_x=0, buf_y=0, buf_pos=0;
+	int have, got, want;
 	int xpos=0, ypos=0, pos=0;
 	unsigned char red=0, green=0, blue=0;
 	int  alpha;
@@ -267,7 +268,22 @@
 			    	mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl: Couldn't allocate temporary buffer! Skipping...\n\n");
 					return vf_next_put_image(vf, dmpi);
 			    }
-			    mp_msg(MSGT_VFILTER, MSGL_DBG2, "Got %d bytes...\n", read( vf->priv->stream_fd, buffer, (imgw*imgh*pxsz) ) );
+  				/* pipes/sockets might need multiple calls to read(): */
+			    want = (imgw*imgh*pxsz);
+			    have = 0;
+			    while (have < want) {
+				got = read( vf->priv->stream_fd, buffer+have, want-have );
+				if (got == 0) {
+			    	    mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl: premature EOF...\n\n");
+				    break;
+				}
+				if (got < 0) {
+			    	    mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl: read error: %s\n\n", strerror(errno));
+				    break;
+				}
+				have += got;
+			    }
+			    mp_msg(MSGT_VFILTER, MSGL_DBG2, "Got %d bytes... (wanted %d)\n", have, want );
 
 				if(clear) {
 					memset( vf->priv->bitmap.y,   0, vf->priv->w*vf->priv->h );