vp9enc: expose row-mt property
authorMathieu Duponchelle <mathieu@centricular.com>
Fri, 28 Aug 2020 16:09:15 +0000 (18:09 +0200)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 9 Sep 2020 18:05:31 +0000 (18:05 +0000)
With recent libvpx versions, multithreading can be enabled on
a per-tile basis, instead of on a per tile-column basis.

In combination with the new tile-rows property, this allows the
encoder to make much better use of the available CPU power.

Bump minimum libvpx version to 1.7.0

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

docs/gst_plugins_cache.json
ext/vpx/gstvp9enc.c
ext/vpx/gstvp9enc.h
ext/vpx/meson.build

index 460635e..e7f2313 100644 (file)
                     }
                 },
                 "properties": {
+                    "row-mt": {
+                        "blurb": "Whether each row should be encoded using multiple threads",
+                        "conditionally-available": false,
+                        "construct": false,
+                        "construct-only": false,
+                        "controllable": false,
+                        "default": "false",
+                        "mutable": "null",
+                        "readable": true,
+                        "type": "gboolean",
+                        "writable": true
+                    },
                     "tile-columns": {
                         "blurb": "Number of tile columns, log2",
                         "conditionally-available": false,
index 4ac8ffa..47fe47f 100644 (file)
@@ -70,11 +70,14 @@ GST_DEBUG_CATEGORY_STATIC (gst_vp9enc_debug);
 
 #define DEFAULT_TILE_COLUMNS 6
 #define DEFAULT_TILE_ROWS 0
+#define DEFAULT_ROW_MT 0
+
 enum
 {
   PROP_0,
   PROP_TILE_COLUMNS,
   PROP_TILE_ROWS,
+  PROP_ROW_MT,
 };
 
 /* FIXME: Y42B do not work yet it seems */
@@ -157,6 +160,19 @@ gst_vp9_enc_class_init (GstVP9EncClass * klass)
           0, 2, DEFAULT_TILE_ROWS,
           (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
+  /**
+   * GstVP9Enc:row-mt:
+   *
+   * Whether each row should be encoded using multiple threads
+   *
+   * Since: 1.20
+   */
+  g_object_class_install_property (gobject_class, PROP_ROW_MT,
+      g_param_spec_boolean ("row-mt", "Row Multithreading",
+          "Whether each row should be encoded using multiple threads",
+          DEFAULT_ROW_MT,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
+
   gst_element_class_add_static_pad_template (element_class,
       &gst_vp9_enc_src_template);
   gst_element_class_add_static_pad_template (element_class,
@@ -204,6 +220,7 @@ gst_vp9_enc_init (GstVP9Enc * gst_vp9_enc)
 
   gst_vp9_enc->tile_columns = DEFAULT_TILE_COLUMNS;
   gst_vp9_enc->tile_rows = DEFAULT_TILE_ROWS;
+  gst_vp9_enc->row_mt = DEFAULT_ROW_MT;
 }
 
 static void
@@ -243,6 +260,18 @@ gst_vp9_enc_set_property (GObject * object, guint prop_id,
         }
       }
       break;
+    case PROP_ROW_MT:
+      gst_vp9_enc->row_mt = g_value_get_boolean (value);
+      if (gst_vpx_enc->inited) {
+        status =
+            vpx_codec_control (&gst_vpx_enc->encoder, VP9E_SET_ROW_MT,
+            gst_vp9_enc->row_mt ? 1 : 0);
+        if (status != VPX_CODEC_OK) {
+          GST_WARNING_OBJECT (gst_vpx_enc,
+              "Failed to set VP9E_SET_ROW_MT: %s", gst_vpx_error_name (status));
+        }
+      }
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -267,6 +296,9 @@ gst_vp9_enc_get_property (GObject * object, guint prop_id, GValue * value,
     case PROP_TILE_ROWS:
       g_value_set_int (value, gst_vp9_enc->tile_rows);
       break;
+    case PROP_ROW_MT:
+      g_value_set_boolean (value, gst_vp9_enc->row_mt);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -296,6 +328,13 @@ gst_vp9_enc_configure_encoder (GstVPXEnc * encoder)
     GST_DEBUG_OBJECT (encoder, "Failed to set VP9E_SET_TILE_ROWS: %s",
         gst_vpx_error_name (status));
   }
+  status =
+      vpx_codec_control (&encoder->encoder, VP9E_SET_ROW_MT,
+      vp9enc->row_mt ? 1 : 0);
+  if (status != VPX_CODEC_OK) {
+    GST_DEBUG_OBJECT (encoder,
+        "Failed to set VP9E_SET_ROW_MT: %s", gst_vpx_error_name (status));
+  }
 
   return TRUE;
 }
index c20a4d4..4e52336 100644 (file)
@@ -47,6 +47,9 @@ struct _GstVP9Enc
 
   guint tile_columns;
   guint tile_rows;
+#ifdef VPX_CTRL_VP9E_SET_ROW_MT
+  gboolean row_mt;
+#endif
 };
 
 G_END_DECLS
index 349915c..bedaff0 100644 (file)
@@ -17,7 +17,7 @@ vpx_features = [
 ]
 
 vpx_option = get_option('vpx')
-vpx_dep = dependency('vpx', version : '>=1.5.0', required : vpx_option)
+vpx_dep = dependency('vpx', version : '>=1.7.0', required : vpx_option)
 
 if vpx_dep.found()
   vpx_args = []