changeset 3332:09f972eef7a3

fixed Video 1 bug which cut off decoding too soon, resulting in torn frames
author melanson
date Wed, 05 Dec 2001 04:17:24 +0000
parents 00ebfe9072e8
children 5c6cdf5490f0
files msvidc.c
diffstat 1 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/msvidc.c	Wed Dec 05 04:16:04 2001 +0000
+++ b/msvidc.c	Wed Dec 05 04:17:24 2001 +0000
@@ -43,6 +43,7 @@
   int bytes_per_pixel)
 {
   int block_ptr, pixel_ptr;
+  int total_blocks;
   int pixel_x, pixel_y;  // pixel width and height iterators
   int block_x, block_y;  // block width and height iterators
   int blocks_wide, blocks_high;  // width and height in 4x4 blocks
@@ -59,6 +60,7 @@
   skip_blocks = 0;
   blocks_wide = width / 4;
   blocks_high = height / 4;
+  total_blocks = blocks_wide * blocks_high;
   block_inc = 4 * bytes_per_pixel;
   row_dec = (width + 4) * bytes_per_pixel;
 
@@ -72,6 +74,7 @@
       {
         block_ptr += block_inc;
         skip_blocks--;
+        total_blocks--;
         continue;
       }
 
@@ -82,7 +85,7 @@
       byte_b = encoded[stream_ptr++];
 
       // check if the decode is finished
-      if ((byte_a == 0) && (byte_b == 0))
+      if ((byte_a == 0) && (byte_b == 0) && (total_blocks == 0))
         return;
 
       // check if this is a skip code
@@ -204,6 +207,7 @@
       }
 
       block_ptr += block_inc;
+      total_blocks--;
     }
   }
 }
@@ -218,6 +222,7 @@
   int bytes_per_pixel)
 {
   int block_ptr, pixel_ptr;
+  int total_blocks;
   int pixel_x, pixel_y;  // pixel width and height iterators
   int block_x, block_y;  // block width and height iterators
   int blocks_wide, blocks_high;  // width and height in 4x4 blocks
@@ -234,6 +239,7 @@
   skip_blocks = 0;
   blocks_wide = width / 4;
   blocks_high = height / 4;
+  total_blocks = blocks_wide * blocks_high;
   block_inc = 4 * bytes_per_pixel;
   row_dec = (width + 4) * bytes_per_pixel;
 
@@ -247,6 +253,7 @@
       {
         block_ptr += block_inc;
         skip_blocks--;
+        total_blocks--;
         continue;
       }
 
@@ -257,7 +264,7 @@
       byte_b = encoded[stream_ptr++];
 
       // check if the decode is finished
-      if ((byte_a == 0) && (byte_b == 0))
+      if ((byte_a == 0) && (byte_b == 0) && (total_blocks == 0))
         return;
 
       // check if this is a skip code
@@ -376,6 +383,7 @@
       }
 
       block_ptr += block_inc;
+      total_blocks--;
     }
   }
 }