Index: gsttheoradec.h
===================================================================
RCS file: /cvs/gstreamer/gst-plugins-base/ext/theora/gsttheoradec.h,v
retrieving revision 1.8
diff -u -r1.8 gsttheoradec.h
--- gsttheoradec.h	14 Jan 2008 17:00:02 -0000	1.8
+++ gsttheoradec.h	12 Mar 2008 11:53:45 -0000
@@ -75,6 +75,8 @@
   gint offset_x, offset_y;
 
   gboolean crop;
+  gint telemetry_mv;
+  gint telemetry_mbmodes;
 
   /* list of buffers that need timestamps */
   GList *queued;
Index: theoradec.c
===================================================================
RCS file: /cvs/gstreamer/gst-plugins-base/ext/theora/theoradec.c,v
retrieving revision 1.97
diff -u -r1.97 theoradec.c
--- theoradec.c	6 Feb 2008 13:35:58 -0000	1.97
+++ theoradec.c	12 Mar 2008 11:53:46 -0000
@@ -52,10 +52,14 @@
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
 
 #define THEORA_DEF_CROP         TRUE
+#define THEORA_DEF_TELEMETRY_MV 0
+#define THEORA_DEF_TELEMETRY_MBMODES 0
 enum
 {
   ARG_0,
-  ARG_CROP
+  ARG_CROP,
+  ARG_TELEMETRY_MV,
+  ARG_TELEMETRY_MBMODES
 };
 
 static const GstElementDetails theora_dec_details =
@@ -138,6 +142,20 @@
           "Crop the image to the visible region", THEORA_DEF_CROP,
           (GParamFlags) G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class, ARG_TELEMETRY_MV,
+      g_param_spec_int ("visualise-motion-vectors", "Visualise motion vectors",
+          "Show motion vector selection overlaid on image. "
+          "Value gives a mask for MV modes to show.",
+          0, 0xffff, THEORA_DEF_TELEMETRY_MV, (GParamFlags) G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class, ARG_TELEMETRY_MBMODES,
+      g_param_spec_int ("visualise-macroblock-modes", 
+          "Visualise macroblock modes",
+          "Show macroblock mode selection overlaid on image. "
+          "Value gives a mask for MB modes to show.",
+          0, 0xffff, THEORA_DEF_TELEMETRY_MBMODES, 
+          (GParamFlags) G_PARAM_READWRITE));
+
   gstelement_class->change_state = theora_dec_change_state;
 
   GST_DEBUG_CATEGORY_INIT (theoradec_debug, "theoradec", 0, "Theora decoder");
@@ -163,6 +181,8 @@
   gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad);
 
   dec->crop = THEORA_DEF_CROP;
+  dec->telemetry_mv = THEORA_DEF_TELEMETRY_MV;
+  dec->telemetry_mbmodes = THEORA_DEF_TELEMETRY_MBMODES;
   dec->gather = NULL;
   dec->decode = NULL;
   dec->queued = NULL;
@@ -848,6 +867,24 @@
   /* done */
   theora_decode_init (&dec->state, &dec->info);
 
+  if (dec->telemetry_mv) {
+    int code = 11;
+    int ret = theora_control (&dec->state, code,
+        &dec->telemetry_mv,sizeof(dec->telemetry_mv));
+    if (ret) {
+      GST_WARNING_OBJECT (dec, "Could not enable MV visualisation: %d", ret);
+    }
+  }
+  if (dec->telemetry_mbmodes) {
+    int code = 9;
+    int ret = theora_control (&dec->state, code,
+        &dec->telemetry_mbmodes,sizeof(dec->telemetry_mbmodes));
+    if (ret) {
+      GST_WARNING_OBJECT (dec, "Could not enable MB mode visualisation: %d", 
+          ret);
+    }
+  }
+
   caps = gst_caps_new_simple ("video/x-raw-yuv",
       "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
       "framerate", GST_TYPE_FRACTION,
@@ -1524,6 +1561,12 @@
     case ARG_CROP:
       dec->crop = g_value_get_boolean (value);
       break;
+    case ARG_TELEMETRY_MV:
+      dec->telemetry_mv = g_value_get_int (value);
+      break;
+    case ARG_TELEMETRY_MBMODES:
+      dec->telemetry_mbmodes = g_value_get_int (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1540,6 +1583,12 @@
     case ARG_CROP:
       g_value_set_boolean (value, dec->crop);
       break;
+    case ARG_TELEMETRY_MV:
+      g_value_set_int (value, dec->telemetry_mv);
+      break;
+    case ARG_TELEMETRY_MBMODES:
+      g_value_set_int (value, dec->telemetry_mbmodes);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
