codecparsers: VC1: Implement bitplanes diff operator
authorThibault Saunier <thibault.saunier@collabora.com>
Tue, 4 Oct 2011 20:39:42 +0000 (17:39 -0300)
committerThibault Saunier <thibault.saunier@collabora.com>
Mon, 17 Oct 2011 11:17:39 +0000 (13:17 +0200)
gst-libs/gst/codecparsers/gstvc1parser.c

index b724a9e..1725347 100644 (file)
@@ -485,7 +485,7 @@ bitplane_decoding (GstBitReader * br, guint8 * data,
 
       GST_DEBUG ("Parsing IMODE_DIFF6 or IMODE_NORM6 biplane");
 
-      if (!(height % 3) && (width % 3)) {   /* decode 2x3 "vertical" tiles */
+      if (!(height % 3) && (width % 3)) {       /* decode 2x3 "vertical" tiles */
         for (y = 0; y < height; y += 3) {
           for (x = width & 1; x < width; x += 2) {
             if (!decode_vlc (br, &v, vc1_norm6_vlc_table,
@@ -508,7 +508,7 @@ bitplane_decoding (GstBitReader * br, guint8 * data,
 
         x = width & 1;
         y = 0;
-      } else {                              /* decode 3x2 "horizontal" tiles */
+      } else {                  /* decode 3x2 "horizontal" tiles */
 
         if (pdata)
           pdata += (height & 1) * width;
@@ -564,6 +564,30 @@ bitplane_decoding (GstBitReader * br, guint8 * data,
       break;
   }
 
+  if (!data)
+    return TRUE;
+
+  /* Applying diff operator */
+  if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6) {
+    pdata = data;
+    pdata[0] ^= invert;
+
+    for (x = 1; x < width; x++)
+      pdata[x] ^= pdata[x - 1];
+
+    for (y = 1; y < height; y++) {
+      pdata[stride] ^= pdata[0];
+
+      for (x = 1; x < width; x++) {
+        if (pdata[stride + x - 1] != pdata[x])
+          pdata[stride + x] ^= invert;
+        else
+          pdata[stride + x] ^= pdata[stride + x - 1];
+      }
+      pdata += stride;
+    }
+  }
+
   return TRUE;
 
 failed: