codecparsers: vc1: fix bitplanes decoding.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Tue, 22 Jan 2013 17:01:24 +0000 (18:01 +0100)
committerTim-Philipp Müller <tim@centricular.net>
Fri, 25 Jan 2013 00:04:29 +0000 (00:04 +0000)
Fix decoding of DIFF2 or NORM2 bitplanes with an odd number of macroblocks.
In particular, account for the first bit that was already parsed so that to
avoid a buffer overflow after all pairs are parsed.

This fixes SA00040.vc1 conformance test.

https://bugzilla.gnome.org/show_bug.cgi?id=692312

Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
gst-libs/gst/codecparsers/gstvc1parser.c

index 0cc1230f5bc066a47a24e0a8eac870bd56d4d38f..19b88a4348273efeae5e63cb6055bdc6fc15843b 100644 (file)
@@ -435,7 +435,7 @@ bitplane_decoding (GstBitReader * br, guint8 * data,
   const guint height = seqhdr->mb_height;
   const guint stride = seqhdr->mb_stride;
   guint imode, invert, invert_mask;
-  guint x, y, v;
+  guint x, y, v, o;
   guint8 *pdata = data;
 
   *is_raw = FALSE;
@@ -464,7 +464,8 @@ bitplane_decoding (GstBitReader * br, guint8 * data,
       GST_DEBUG ("Parsing IMODE_DIFF2 or IMODE_NORM2 biplane");
 
       x = 0;
-      if ((height * width) & 1) {
+      o = (height * width) & 1;
+      if (o) {
         GET_BITS (br, 1, &v);
         if (pdata) {
           *pdata++ = (v ^ invert_mask) & 1;
@@ -475,7 +476,7 @@ bitplane_decoding (GstBitReader * br, guint8 * data,
         }
       }
 
-      for (y = 0; y < height * width; y += 2) {
+      for (y = o; y < height * width; y += 2) {
         if (!decode_vlc (br, &v, vc1_norm2_vlc_table,
                 G_N_ELEMENTS (vc1_norm2_vlc_table)))
           goto failed;