vp9enc: Move colorspace configuration in VP9 enc
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 6 May 2021 18:51:31 +0000 (14:51 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 6 May 2021 20:00:47 +0000 (16:00 -0400)
This is not supported by VP8 and was causing a warning.

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

ext/vpx/gstvp9enc.c
ext/vpx/gstvpxenc.c

index e7522f5ace171f90b0c0d3425e8e48d70f20e2f6..fca6e116867e0060fea0eea6b0f50c168eaec06c 100644 (file)
@@ -119,7 +119,8 @@ static void gst_vp9_enc_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec);
 static void gst_vp9_enc_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec);
-static gboolean gst_vp9_enc_configure_encoder (GstVPXEnc * encoder);
+static gboolean gst_vp9_enc_configure_encoder (GstVPXEnc * encoder,
+    GstVideoCodecState * state);
 
 #define DEFAULT_BITS_PER_PIXEL 0.0289
 
@@ -310,12 +311,75 @@ gst_vp9_enc_get_property (GObject * object, guint prop_id, GValue * value,
   g_mutex_unlock (&gst_vpx_enc->encoder_lock);
 }
 
+static vpx_color_space_t
+gst_vp9_get_vpx_colorspace (GstVPXEnc * encoder, GstVideoColorimetry * cinfo,
+    GstVideoFormat format)
+{
+  vpx_color_space_t colorspace = VPX_CS_UNKNOWN;
+  gchar *colorimetry_str;
+  guint i;
+
+  static const struct
+  {
+    const gchar *str;
+    vpx_color_space_t vpx_color_space;
+  } colorimetry_map[] = {
+    {
+    GST_VIDEO_COLORIMETRY_BT601, VPX_CS_BT_601}, {
+    GST_VIDEO_COLORIMETRY_BT709, VPX_CS_BT_709}, {
+    GST_VIDEO_COLORIMETRY_SMPTE240M, VPX_CS_SMPTE_240}, {
+    GST_VIDEO_COLORIMETRY_BT2020, VPX_CS_BT_2020}
+  };
+
+  colorimetry_str = gst_video_colorimetry_to_string (cinfo);
+
+  if (colorimetry_str != NULL) {
+    for (i = 0; i < G_N_ELEMENTS (colorimetry_map); ++i) {
+      if (g_strcmp0 (colorimetry_map[i].str, colorimetry_str) == 0) {
+        colorspace = colorimetry_map[i].vpx_color_space;
+        break;
+      }
+    }
+  }
+
+  if (colorspace == VPX_CS_UNKNOWN) {
+    if (format == GST_VIDEO_FORMAT_GBR
+        || format == GST_VIDEO_FORMAT_GBR_10BE
+        || format == GST_VIDEO_FORMAT_GBR_10LE
+        || format == GST_VIDEO_FORMAT_GBR_12BE
+        || format == GST_VIDEO_FORMAT_GBR_12LE) {
+      /* Currently has no effect because vp*enc elements only accept YUV video
+       * formats.
+       *
+       * FIXME: Support encoding GST_VIDEO_FORMAT_GBR and its high bits variants.
+       */
+      colorspace = VPX_CS_SRGB;
+    } else {
+      GST_WARNING_OBJECT (encoder, "Unsupported colorspace \"%s\"",
+          GST_STR_NULL (colorimetry_str));
+    }
+  }
+
+  g_free (colorimetry_str);
+
+  return colorspace;
+}
+
 static gboolean
 gst_vp9_enc_configure_encoder (GstVPXEnc * encoder, GstVideoCodecState * state)
 {
   GstVP9Enc *vp9enc = GST_VP9_ENC (encoder);
+  GstVideoInfo *info = &state->info;
   vpx_codec_err_t status;
 
+  status = vpx_codec_control (&encoder->encoder, VP9E_SET_COLOR_SPACE,
+      gst_vp9_get_vpx_colorspace (encoder, &GST_VIDEO_INFO_COLORIMETRY (info),
+          GST_VIDEO_INFO_FORMAT (info)));
+  if (status != VPX_CODEC_OK) {
+    GST_WARNING_OBJECT (encoder,
+        "Failed to set VP9E_SET_COLOR_SPACE: %s", gst_vpx_error_name (status));
+  }
+
   status =
       vpx_codec_control (&encoder->encoder, VP9E_SET_TILE_COLUMNS,
       vp9enc->tile_columns);
index b817ba40a694cc3bfac6bad9727d37537a254a0f..0fe0f7a980e8e3a26aa34609d2a2d4aa2d0fac9f 100644 (file)
@@ -1710,60 +1710,6 @@ gst_vpx_enc_get_downstream_profile (GstVPXEnc * encoder, GstVideoInfo * info)
   return profile;
 }
 
-static vpx_color_space_t
-gst_vpx_get_vpx_colorspace (GstVPXEnc * encoder, GstVideoColorimetry * cinfo,
-    GstVideoFormat format)
-{
-  vpx_color_space_t colorspace = VPX_CS_UNKNOWN;
-  gchar *colorimetry_str;
-  guint i;
-
-  static const struct
-  {
-    const gchar *str;
-    vpx_color_space_t vpx_color_space;
-  } colorimetry_map[] = {
-    {
-    GST_VIDEO_COLORIMETRY_BT601, VPX_CS_BT_601}, {
-    GST_VIDEO_COLORIMETRY_BT709, VPX_CS_BT_709}, {
-    GST_VIDEO_COLORIMETRY_SMPTE240M, VPX_CS_SMPTE_240}, {
-    GST_VIDEO_COLORIMETRY_BT2020, VPX_CS_BT_2020}
-  };
-
-  colorimetry_str = gst_video_colorimetry_to_string (cinfo);
-
-  if (colorimetry_str != NULL) {
-    for (i = 0; i < G_N_ELEMENTS (colorimetry_map); ++i) {
-      if (g_strcmp0 (colorimetry_map[i].str, colorimetry_str) == 0) {
-        colorspace = colorimetry_map[i].vpx_color_space;
-        break;
-      }
-    }
-  }
-
-  if (colorspace == VPX_CS_UNKNOWN) {
-    if (format == GST_VIDEO_FORMAT_GBR
-        || format == GST_VIDEO_FORMAT_GBR_10BE
-        || format == GST_VIDEO_FORMAT_GBR_10LE
-        || format == GST_VIDEO_FORMAT_GBR_12BE
-        || format == GST_VIDEO_FORMAT_GBR_12LE) {
-      /* Currently has no effect because vp*enc elements only accept YUV video
-       * formats.
-       *
-       * FIXME: Support encoding GST_VIDEO_FORMAT_GBR and its high bits variants.
-       */
-      colorspace = VPX_CS_SRGB;
-    } else {
-      GST_WARNING_OBJECT (encoder, "Unsupported colorspace \"%s\"",
-          GST_STR_NULL (colorimetry_str));
-    }
-  }
-
-  g_free (colorimetry_str);
-
-  return colorspace;
-}
-
 static gboolean
 gst_vpx_enc_set_format (GstVideoEncoder * video_encoder,
     GstVideoCodecState * state)
@@ -1968,13 +1914,6 @@ gst_vpx_enc_set_format (GstVideoEncoder * video_encoder,
         "Failed to set VP8E_SET_MAX_INTRA_BITRATE_PCT: %s",
         gst_vpx_error_name (status));
   }
-  status = vpx_codec_control (&encoder->encoder, VP9E_SET_COLOR_SPACE,
-      gst_vpx_get_vpx_colorspace (encoder, &GST_VIDEO_INFO_COLORIMETRY (info),
-          GST_VIDEO_INFO_FORMAT (info)));
-  if (status != VPX_CODEC_OK) {
-    GST_WARNING_OBJECT (encoder,
-        "Failed to set VP9E_SET_COLOR_SPACE: %s", gst_vpx_error_name (status));
-  }
 
   if (vpx_enc_class->configure_encoder
       && !vpx_enc_class->configure_encoder (encoder, state)) {