theoradec: expose telemetry properties only if libtheora was compiled with --enable...
authorTim-Philipp Müller <tim.muller@collabora.co.uk>
Sat, 9 Oct 2010 23:52:13 +0000 (00:52 +0100)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Sun, 10 Oct 2010 17:20:46 +0000 (18:20 +0100)
Since this is just a debugging feature and libtheora will usually not be
compiled with that option enabled, we should maybe just hide these properties,
since they won't work anyway, and avoid confusing warnings.

Also rename properties to make them less cryptic.

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

ext/theora/gsttheoradec.c

index d1aa114..96e12ee 100644 (file)
@@ -123,6 +123,13 @@ gst_theora_dec_base_init (gpointer g_class)
       "Benjamin Otte <otte@gnome.org>, Wim Taymans <wim@fluendo.com>");
 }
 
+static gboolean
+gst_theora_dec_ctl_is_supported (int req)
+{
+  /* should return TH_EFAULT or TH_EINVAL if supported, and TH_EIMPL if not */
+  return (th_decode_ctl (NULL, req, NULL, 0) != TH_EIMPL);
+}
+
 static void
 gst_theora_dec_class_init (GstTheoraDecClass * klass)
 {
@@ -137,34 +144,49 @@ gst_theora_dec_class_init (GstTheoraDecClass * klass)
           "Crop the image to the visible region", THEORA_DEF_CROP,
           (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
-  g_object_class_install_property (gobject_class, PROP_TELEMETRY_MV,
-      g_param_spec_int ("vis-mv", "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, PROP_TELEMETRY_MBMODE,
-      g_param_spec_int ("vis-mbmode",
-          "Visualise macroblock modes",
-          "Show macroblock mode selection overlaid on image. "
-          "Value gives a mask for MB modes to show.",
-          0, 0xffff, THEORA_DEF_TELEMETRY_MBMODE,
-          (GParamFlags) G_PARAM_READWRITE));
-
-  g_object_class_install_property (gobject_class, PROP_TELEMETRY_QI,
-      g_param_spec_int ("vis-qi",
-          "Visualise adaptive quantization modes",
-          "Show adaptive quantization mode selection overlaid on image. "
-          "Value gives a mask for QI modes to show.",
-          0, 0xffff, THEORA_DEF_TELEMETRY_QI, (GParamFlags) G_PARAM_READWRITE));
-
-  g_object_class_install_property (gobject_class, PROP_TELEMETRY_BITS,
-      g_param_spec_int ("vis-bits",
-          "Visualise bitstream breakdown modes",
-          "Show bitstream breakdown mode selection overlaid on image. "
-          "Value gives a mask for BITS modes to show.",
-          0, 0xffff, THEORA_DEF_TELEMETRY_BITS,
-          (GParamFlags) G_PARAM_READWRITE));
+  if (gst_theora_dec_ctl_is_supported (TH_DECCTL_SET_TELEMETRY_MV)) {
+    g_object_class_install_property (gobject_class, PROP_TELEMETRY_MV,
+        g_param_spec_int ("visualize-motion-vectors",
+            "Visualize motion vectors",
+            "Show motion vector selection overlaid on image. "
+            "Value gives a mask for motion vector (MV) modes to show",
+            0, 0xffff, THEORA_DEF_TELEMETRY_MV,
+            G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  }
+
+  if (gst_theora_dec_ctl_is_supported (TH_DECCTL_SET_TELEMETRY_MBMODE)) {
+    g_object_class_install_property (gobject_class, PROP_TELEMETRY_MBMODE,
+        g_param_spec_int ("visualize-macroblock-modes",
+            "Visualize macroblock modes",
+            "Show macroblock mode selection overlaid on image. "
+            "Value gives a mask for macroblock (MB) modes to show",
+            0, 0xffff, THEORA_DEF_TELEMETRY_MBMODE,
+            G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  }
+
+  if (gst_theora_dec_ctl_is_supported (TH_DECCTL_SET_TELEMETRY_QI)) {
+    g_object_class_install_property (gobject_class, PROP_TELEMETRY_QI,
+        g_param_spec_int ("visualize-quantization-modes",
+            "Visualize adaptive quantization modes",
+            "Show adaptive quantization mode selection overlaid on image. "
+            "Value gives a mask for quantization (QI) modes to show",
+            0, 0xffff, THEORA_DEF_TELEMETRY_QI,
+            G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  }
+
+  if (gst_theora_dec_ctl_is_supported (TH_DECCTL_SET_TELEMETRY_BITS)) {
+    /* FIXME: make this a boolean instead? The value scales the bars so
+     * they're less wide. Default is to use full width, and anything else
+     * doesn't seem particularly useful, since the smaller bars just disappear
+     * then (they almost disappear for a value of 2 already). */
+    g_object_class_install_property (gobject_class, PROP_TELEMETRY_BITS,
+        g_param_spec_int ("visualize-bit-usage",
+            "Visualize bitstream usage breakdown",
+            "Sets the bitstream breakdown visualization mode. "
+            "Values influence the width of the bit usage bars to show",
+            0, 0xff, THEORA_DEF_TELEMETRY_BITS,
+            G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  }
 
   gstelement_class->change_state = theora_dec_change_state;
 
@@ -869,20 +891,21 @@ theora_handle_type_packet (GstTheoraDec * dec, ogg_packet * packet)
   dec->decoder = th_decode_alloc (&dec->info, dec->setup);
 
   if (th_decode_ctl (dec->decoder, TH_DECCTL_SET_TELEMETRY_MV,
-          &dec->telemetry_mv, sizeof (dec->telemetry_mv)))
+          &dec->telemetry_mv, sizeof (dec->telemetry_mv)) != TH_EIMPL) {
     GST_WARNING_OBJECT (dec, "Could not enable MV visualisation");
-
+  }
   if (th_decode_ctl (dec->decoder, TH_DECCTL_SET_TELEMETRY_MBMODE,
-          &dec->telemetry_mbmode, sizeof (dec->telemetry_mbmode)))
+          &dec->telemetry_mbmode, sizeof (dec->telemetry_mbmode)) != TH_EIMPL) {
     GST_WARNING_OBJECT (dec, "Could not enable MB mode visualisation");
-
+  }
   if (th_decode_ctl (dec->decoder, TH_DECCTL_SET_TELEMETRY_QI,
-          &dec->telemetry_qi, sizeof (dec->telemetry_qi)))
+          &dec->telemetry_qi, sizeof (dec->telemetry_qi)) != TH_EIMPL) {
     GST_WARNING_OBJECT (dec, "Could not enable QI mode visualisation");
-
+  }
   if (th_decode_ctl (dec->decoder, TH_DECCTL_SET_TELEMETRY_BITS,
-          &dec->telemetry_bits, sizeof (dec->telemetry_bits)))
+          &dec->telemetry_bits, sizeof (dec->telemetry_bits)) != TH_EIMPL) {
     GST_WARNING_OBJECT (dec, "Could not enable BITS mode visualisation");
+  }
 
   caps = gst_caps_new_simple ("video/x-raw-yuv",
       "format", GST_TYPE_FOURCC, fourcc,