audiodecoder: Add max-errors property
authorSebastian Dröge <sebastian@centricular.com>
Mon, 22 Jun 2020 18:43:44 +0000 (21:43 +0300)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Tue, 23 Jun 2020 07:17:00 +0000 (07:17 +0000)
The number of consecutive decode errors that should be tolerated before
returning flow error should be up to the application, not the element.

Hence max-error should be exposed as a property.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/720>

docs/plugins/gst_plugins_cache.json
gst-libs/gst/audio/gstaudiodecoder.c

index b991083d6b48c6896a0b22bab91f2ffdf8202d3a..f16c11e2c2e990125486cd82b77297e83f01fb5b 100644 (file)
                         "type": "gboolean",
                         "writable": true
                     },
+                    "max-errors": {
+                        "blurb": "Max consecutive decoder errors before returning flow error",
+                        "conditionally-available": false,
+                        "construct": false,
+                        "construct-only": false,
+                        "controllable": false,
+                        "default": "10",
+                        "max": "2147483647",
+                        "min": "-1",
+                        "mutable": "null",
+                        "readable": true,
+                        "type": "gint",
+                        "writable": true
+                    },
                     "min-latency": {
                         "blurb": "Aggregate output data to a minimum of latency time (ns)",
                         "conditionally-available": false,
                     }
                 },
                 "properties": {
+                    "max-errors": {
+                        "blurb": "Max consecutive decoder errors before returning flow error",
+                        "conditionally-available": false,
+                        "construct": false,
+                        "construct-only": false,
+                        "controllable": false,
+                        "default": "10",
+                        "max": "2147483647",
+                        "min": "-1",
+                        "mutable": "null",
+                        "readable": true,
+                        "type": "gint",
+                        "writable": true
+                    },
                     "qos": {
                         "blurb": "Handle Quality-of-Service events from downstream",
                         "conditionally-available": false,
                     }
                 },
                 "properties": {
+                    "max-errors": {
+                        "blurb": "Max consecutive decoder errors before returning flow error",
+                        "conditionally-available": false,
+                        "construct": false,
+                        "construct-only": false,
+                        "controllable": false,
+                        "default": "10",
+                        "max": "2147483647",
+                        "min": "-1",
+                        "mutable": "null",
+                        "readable": true,
+                        "type": "gint",
+                        "writable": true
+                    },
                     "min-latency": {
                         "blurb": "Aggregate output data to a minimum of latency time (ns)",
                         "conditionally-available": false,
index 028824733b400bd20f9bd37787d24d53a00a347a..cef4cbbd658df3010649bf1d4bcc0c9464a747c0 100644 (file)
@@ -142,7 +142,8 @@ enum
   PROP_0,
   PROP_LATENCY,
   PROP_TOLERANCE,
-  PROP_PLC
+  PROP_PLC,
+  PROP_MAX_ERRORS
 };
 
 #define DEFAULT_LATENCY    0
@@ -150,6 +151,7 @@ enum
 #define DEFAULT_PLC        FALSE
 #define DEFAULT_DRAINABLE  TRUE
 #define DEFAULT_NEEDS_FORMAT  FALSE
+#define DEFAULT_MAX_ERRORS GST_AUDIO_DECODER_MAX_ERRORS
 
 typedef struct _GstAudioDecoderContext
 {
@@ -408,6 +410,20 @@ gst_audio_decoder_class_init (GstAudioDecoderClass * klass)
           "Perform packet loss concealment (if supported)",
           DEFAULT_PLC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  /**
+   * GstAudioDecoder:max-errors:
+   *
+   * Maximum number of tolerated consecutive decode errors. See
+   * gst_audio_decoder_set_max_errors() for more details.
+   *
+   * Since: 1.18
+   */
+  g_object_class_install_property (gobject_class, PROP_MAX_ERRORS,
+      g_param_spec_int ("max-errors", "Max errors",
+          "Max consecutive decoder errors before returning flow error",
+          -1, G_MAXINT, DEFAULT_MAX_ERRORS,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   audiodecoder_class->sink_event =
       GST_DEBUG_FUNCPTR (gst_audio_decoder_sink_eventfunc);
   audiodecoder_class->src_event =
@@ -3104,6 +3120,9 @@ gst_audio_decoder_get_property (GObject * object, guint prop_id,
     case PROP_PLC:
       g_value_set_boolean (value, dec->priv->plc);
       break;
+    case PROP_MAX_ERRORS:
+      g_value_set_int (value, gst_audio_decoder_get_max_errors (dec));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -3128,6 +3147,9 @@ gst_audio_decoder_set_property (GObject * object, guint prop_id,
     case PROP_PLC:
       dec->priv->plc = g_value_get_boolean (value);
       break;
+    case PROP_MAX_ERRORS:
+      gst_audio_decoder_set_max_errors (dec, g_value_get_int (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;