vaapipostproc: move gst_vaapipostproc_fixate_srccaps()
authorVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
Thu, 5 May 2016 13:32:36 +0000 (15:32 +0200)
committerVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
Mon, 9 May 2016 14:56:10 +0000 (16:56 +0200)
Move gst_vaapipostproc_fixate_srccaps() to gstvaapiposptprocutil.

No functional changes.

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

gst/vaapi/gstvaapipostproc.c
gst/vaapi/gstvaapipostprocutil.c
gst/vaapi/gstvaapipostprocutil.h

index 819b423..a29b2a6 100644 (file)
@@ -831,25 +831,6 @@ error_invalid_buffer:
 }
 
 static gboolean
-is_deinterlace_enabled (GstVaapiPostproc * postproc, GstVideoInfo * vip)
-{
-  gboolean deinterlace;
-
-  switch (postproc->deinterlace_mode) {
-    case GST_VAAPI_DEINTERLACE_MODE_AUTO:
-      deinterlace = GST_VIDEO_INFO_IS_INTERLACED (vip);
-      break;
-    case GST_VAAPI_DEINTERLACE_MODE_INTERLACED:
-      deinterlace = TRUE;
-      break;
-    default:
-      deinterlace = FALSE;
-      break;
-  }
-  return deinterlace;
-}
-
-static gboolean
 video_info_changed (GstVideoInfo * old_vip, GstVideoInfo * new_vip)
 {
   if (GST_VIDEO_INFO_FORMAT (old_vip) != GST_VIDEO_INFO_FORMAT (new_vip))
@@ -1020,35 +1001,6 @@ ensure_allowed_srcpad_caps (GstVaapiPostproc * postproc)
   return postproc->allowed_srcpad_caps != NULL;
 }
 
-static void
-find_best_size (GstVaapiPostproc * postproc, GstVideoInfo * vip,
-    guint * width_ptr, guint * height_ptr)
-{
-  guint width, height;
-
-  width = GST_VIDEO_INFO_WIDTH (vip);
-  height = GST_VIDEO_INFO_HEIGHT (vip);
-  if (postproc->width && postproc->height) {
-    width = postproc->width;
-    height = postproc->height;
-  } else if (postproc->keep_aspect) {
-    const gdouble ratio = (gdouble) width / height;
-    if (postproc->width) {
-      width = postproc->width;
-      height = postproc->width / ratio;
-    } else if (postproc->height) {
-      height = postproc->height;
-      width = postproc->height * ratio;
-    }
-  } else if (postproc->width)
-    width = postproc->width;
-  else if (postproc->height)
-    height = postproc->height;
-
-  *width_ptr = width;
-  *height_ptr = height;
-}
-
 static GstCaps *
 gst_vaapipostproc_transform_caps_impl (GstBaseTransform * trans,
     GstPadDirection direction, GstCaps * caps)
@@ -1091,70 +1043,6 @@ gst_vaapipostproc_transform_caps (GstBaseTransform * trans,
 }
 
 static GstCaps *
-gst_vaapipostproc_fixate_srccaps (GstVaapiPostproc * postproc,
-    GstCaps * sinkcaps, GstCaps * srccaps)
-{
-  GstVideoInfo vi;
-  GstVideoFormat out_format;
-  GstCaps *out_caps;
-  GstVaapiCapsFeature feature;
-  const gchar *feature_str;
-  guint width, height;
-  GstPad *srcpad;
-
-  /* Generate the expected src pad caps, from the current fixated sink
-     pad caps */
-  if (!gst_video_info_from_caps (&vi, sinkcaps))
-    return NULL;
-
-  // Set double framerate in interlaced mode
-  if (is_deinterlace_enabled (postproc, &vi)) {
-    gint fps_n = GST_VIDEO_INFO_FPS_N (&vi);
-    gint fps_d = GST_VIDEO_INFO_FPS_D (&vi);
-    if (!gst_util_fraction_multiply (fps_n, fps_d, 2, 1, &fps_n, &fps_d))
-      return NULL;
-    GST_VIDEO_INFO_FPS_N (&vi) = fps_n;
-    GST_VIDEO_INFO_FPS_D (&vi) = fps_d;
-  }
-  // Signal the other pad that we only generate progressive frames
-  GST_VIDEO_INFO_INTERLACE_MODE (&vi) = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
-
-  // Update size from user-specified parameters
-  find_best_size (postproc, &vi, &width, &height);
-
-  // Update format from user-specified parameters
-  srcpad = GST_BASE_TRANSFORM_SRC_PAD (postproc);
-  feature = gst_vaapi_find_preferred_caps_feature (srcpad, srccaps,
-      &out_format);
-
-  if (postproc->format != DEFAULT_FORMAT)
-    out_format = postproc->format;
-
-  if (feature == GST_VAAPI_CAPS_FEATURE_NOT_NEGOTIATED)
-    return NULL;
-
-  gst_video_info_change_format (&vi, out_format, width, height);
-  out_caps = gst_video_info_to_caps (&vi);
-  if (!out_caps)
-    return NULL;
-
-  if (feature) {
-    feature_str = gst_vaapi_caps_feature_to_string (feature);
-    if (feature_str)
-      gst_caps_set_features (out_caps, 0,
-          gst_caps_features_new (feature_str, NULL));
-  }
-
-  /* we don't need to do format conversion if GL_TEXTURE_UPLOAD_META
-   * is negotiated */
-  if (feature != GST_VAAPI_CAPS_FEATURE_GL_TEXTURE_UPLOAD_META &&
-      postproc->format != out_format) {
-    postproc->format = out_format;
-  }
-  return out_caps;
-}
-
-static GstCaps *
 gst_vaapipostproc_fixate_caps (GstBaseTransform * trans,
     GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
 {
index b2a64d9..9358800 100644 (file)
@@ -124,3 +124,126 @@ gst_vaapipostproc_transform_srccaps (GstVaapiPostproc * postproc)
 
   return out_caps;
 }
+
+gboolean
+is_deinterlace_enabled (GstVaapiPostproc * postproc, GstVideoInfo * vip)
+{
+  gboolean deinterlace;
+
+  switch (postproc->deinterlace_mode) {
+    case GST_VAAPI_DEINTERLACE_MODE_AUTO:
+      deinterlace = GST_VIDEO_INFO_IS_INTERLACED (vip);
+      break;
+    case GST_VAAPI_DEINTERLACE_MODE_INTERLACED:
+      deinterlace = TRUE;
+      break;
+    default:
+      deinterlace = FALSE;
+      break;
+  }
+  return deinterlace;
+}
+
+static void
+find_best_size (GstVaapiPostproc * postproc, GstVideoInfo * vip,
+    guint * width_ptr, guint * height_ptr)
+{
+  guint width, height;
+
+  width = GST_VIDEO_INFO_WIDTH (vip);
+  height = GST_VIDEO_INFO_HEIGHT (vip);
+  if (postproc->width && postproc->height) {
+    width = postproc->width;
+    height = postproc->height;
+  } else if (postproc->keep_aspect) {
+    const gdouble ratio = (gdouble) width / height;
+    if (postproc->width) {
+      width = postproc->width;
+      height = postproc->width / ratio;
+    } else if (postproc->height) {
+      height = postproc->height;
+      width = postproc->height * ratio;
+    }
+  } else if (postproc->width)
+    width = postproc->width;
+  else if (postproc->height)
+    height = postproc->height;
+
+  *width_ptr = width;
+  *height_ptr = height;
+}
+
+/**
+ * gst_vaapipostproc_fixate_srccaps:
+ * @postproc: a #GstVaapiPostproc instance
+ * @sinkcaps: fixed #GstCaps from sink pad
+ * @srccaps: #GstCaps from src pad to fixate
+ *
+ * Given @srccaps and @sinkcaps returns a new allocated #GstCaps with
+ * the fixated caps for the src pad.
+ *
+ * Returns: A new allocated #GstCaps
+ **/
+GstCaps *
+gst_vaapipostproc_fixate_srccaps (GstVaapiPostproc * postproc,
+    GstCaps * sinkcaps, GstCaps * srccaps)
+{
+  GstVideoInfo vi;
+  GstVideoFormat out_format;
+  GstCaps *out_caps;
+  GstVaapiCapsFeature feature;
+  const gchar *feature_str;
+  guint width, height;
+  GstPad *srcpad;
+
+  /* Generate the expected src pad caps, from the current fixated sink
+     pad caps */
+  if (!gst_video_info_from_caps (&vi, sinkcaps))
+    return NULL;
+
+  // Set double framerate in interlaced mode
+  if (is_deinterlace_enabled (postproc, &vi)) {
+    gint fps_n = GST_VIDEO_INFO_FPS_N (&vi);
+    gint fps_d = GST_VIDEO_INFO_FPS_D (&vi);
+    if (!gst_util_fraction_multiply (fps_n, fps_d, 2, 1, &fps_n, &fps_d))
+      return NULL;
+    GST_VIDEO_INFO_FPS_N (&vi) = fps_n;
+    GST_VIDEO_INFO_FPS_D (&vi) = fps_d;
+  }
+  // Signal the other pad that we only generate progressive frames
+  GST_VIDEO_INFO_INTERLACE_MODE (&vi) = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
+
+  // Update size from user-specified parameters
+  find_best_size (postproc, &vi, &width, &height);
+
+  // Update format from user-specified parameters
+  srcpad = GST_BASE_TRANSFORM_SRC_PAD (postproc);
+  feature = gst_vaapi_find_preferred_caps_feature (srcpad, srccaps,
+      &out_format);
+
+  if (postproc->format != DEFAULT_FORMAT)
+    out_format = postproc->format;
+
+  if (feature == GST_VAAPI_CAPS_FEATURE_NOT_NEGOTIATED)
+    return NULL;
+
+  gst_video_info_change_format (&vi, out_format, width, height);
+  out_caps = gst_video_info_to_caps (&vi);
+  if (!out_caps)
+    return NULL;
+
+  if (feature) {
+    feature_str = gst_vaapi_caps_feature_to_string (feature);
+    if (feature_str)
+      gst_caps_set_features (out_caps, 0,
+          gst_caps_features_new (feature_str, NULL));
+  }
+
+  /* we don't need to do format conversion if GL_TEXTURE_UPLOAD_META
+   * is negotiated */
+  if (feature != GST_VAAPI_CAPS_FEATURE_GL_TEXTURE_UPLOAD_META &&
+      postproc->format != out_format) {
+    postproc->format = out_format;
+  }
+  return out_caps;
+}
index 70f6d97..db5d303 100644 (file)
@@ -34,6 +34,12 @@ G_BEGIN_DECLS
 
 GstCaps *gst_vaapipostproc_transform_srccaps (GstVaapiPostproc * postproc);
 
+GstCaps *gst_vaapipostproc_fixate_srccaps (GstVaapiPostproc * postproc,
+    GstCaps * sinkcaps, GstCaps * srccaps);
+
+gboolean is_deinterlace_enabled (GstVaapiPostproc * postproc,
+    GstVideoInfo * vip);
+
 G_END_DECLS
 
 #endif /* GST_VAAPIPOSTPROCUTIL_H */