changeset 9169:f49a2bf04229

- fixed the input buffering (don't read input unless we're already processed all decoded samples) - fix 100l bug: uninitialized ogg_packet structure caused tremor to hang
author arpi
date Wed, 29 Jan 2003 22:45:07 +0000
parents 3081f6796183
children bcf4bf10f9c7
files libmpcodecs/ad_libvorbis.c
diffstat 1 files changed, 15 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/libmpcodecs/ad_libvorbis.c	Wed Jan 29 22:37:39 2003 +0000
+++ b/libmpcodecs/ad_libvorbis.c	Wed Jan 29 22:45:07 2003 +0000
@@ -188,22 +188,24 @@
         int samples;
         float **pcm;
         float scale;
-        ogg_packet op;
         struct ov_struct_st *ov = sh->context;
-        op.b_o_s =  op.e_o_s = 0;
 	while(len < minlen) {
-	  op.bytes = ds_get_packet(sh->ds,&op.packet);
-	  if(!op.packet)
-	    break;
-	  if(vorbis_synthesis(&ov->vb,&op)==0) /* test for success! */
-	    vorbis_synthesis_blockin(&ov->vd,&ov->vb);
-	  while((samples=vorbis_synthesis_pcmout(&ov->vd,&pcm))>0){
+	  while((samples=vorbis_synthesis_pcmout(&ov->vd,&pcm))<=0){
+	    ogg_packet op;
+	    memset(&op,0,sizeof(op)); //op.b_o_s = op.e_o_s = 0;
+	    op.bytes = ds_get_packet(sh->ds,&op.packet);
+	    if(op.bytes<=0) break;
+	    if(vorbis_synthesis(&ov->vb,&op)==0) /* test for success! */
+	      vorbis_synthesis_blockin(&ov->vd,&ov->vb);
+	  }
+	  if(samples<=0) break; // error/EOF
+	  while(samples>0){
 	    int i,j;
 	    int clipflag=0;
 	    int convsize=(maxlen-len)/(2*ov->vi.channels); // max size!
-	    int bout=(samples<convsize?samples:convsize);
+	    int bout=((samples<convsize)?samples:convsize);
 	  
-	    if(bout<=0) break;
+	    if(bout<=0) break; // no buffer space
 
 	    /* convert floats to 16 bit signed ints (host order) and
 	       interleave */
@@ -265,10 +267,12 @@
 	      mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"Clipping in frame %ld\n",(long)(ov->vd.sequence));
 	    len+=2*ov->vi.channels*bout;
 	    mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"\n[decoded: %d / %d ]\n",bout,samples);
+	    samples-=bout;
 	    vorbis_synthesis_read(&ov->vd,bout); /* tell libvorbis how
 						    many samples we
 						    actually consumed */
-	  }
+	  } //while(samples>0)
+//          if (!samples) break; // why? how?
 	}