[gst-cvs] gst-plugins-base: Edward Hervey : video: Add flags for interlaced video along with convenience methods for interlaced caps .

Edward Hervey bilboed at kemper.freedesktop.org
Thu Feb 19 07:14:10 PST 2009


Module: gst-plugins-base
Branch: master
Commit: c44b06781752ae6d002e87e083ae993912ed6d09
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=c44b06781752ae6d002e87e083ae993912ed6d09

Author: Edward Hervey <bilboed at bilboed.com>
Date:   Mon Jan 26 10:30:53 2009 +0100

video: Add flags for interlaced video along with convenience methods for interlaced caps.

These three flags allow all know combinations of interlaced formats. They should
only be used when the caps contain 'interlaced=True'.

Fixes #163577 (yes, it's a 4 year old bug).

---

 docs/libs/gst-plugins-base-libs-sections.txt |    5 ++
 gst-libs/gst/video/video.c                   |   71 +++++++++++++++++++++++--
 gst-libs/gst/video/video.h                   |   27 ++++++++++
 3 files changed, 97 insertions(+), 6 deletions(-)

diff --git a/docs/libs/gst-plugins-base-libs-sections.txt b/docs/libs/gst-plugins-base-libs-sections.txt
index 4842f39..83b1474 100644
--- a/docs/libs/gst-plugins-base-libs-sections.txt
+++ b/docs/libs/gst-plugins-base-libs-sections.txt
@@ -1552,12 +1552,16 @@ GST_VIDEO_RED_MASK_15_INT
 GST_VIDEO_RED_MASK_16
 GST_VIDEO_RED_MASK_16_INT
 GST_VIDEO_SIZE_RANGE
+GST_VIDEO_BUFFER_TFF
+GST_VIDEO_BUFFER_RFF
+GST_VIDEO_BUFFER_ONEFIELD
 GstVideoFormat
 gst_video_calculate_display_ratio
 gst_video_frame_rate
 gst_video_get_size
 gst_video_format_convert
 gst_video_format_new_caps
+gst_video_format_new_caps_interlaced
 gst_video_format_get_component_height
 gst_video_format_get_component_offset
 gst_video_format_get_component_width
@@ -1570,6 +1574,7 @@ gst_video_format_is_yuv
 gst_video_format_to_fourcc
 gst_video_format_from_fourcc
 gst_video_format_parse_caps
+gst_video_format_parse_caps_interlaced
 gst_video_parse_caps_framerate
 gst_video_parse_caps_pixel_aspect_ratio
 </SECTION>
diff --git a/gst-libs/gst/video/video.c b/gst-libs/gst/video/video.c
index 97ee6cd..09915bb 100644
--- a/gst-libs/gst/video/video.c
+++ b/gst-libs/gst/video/video.c
@@ -220,6 +220,36 @@ error_overflow:
 }
 
 /**
+ * gst_video_format_parse_caps_interlaced:
+ * @caps: the fixed #GstCaps to parse
+ * @interlaced: whether @caps represents interlaced video or not, may be NULL (output)
+ *
+ * Extracts whether the caps represents interlaced content or not and places it
+ * in @interlaced.
+ *
+ * Since: 0.10.22
+ *
+ * Returns: TRUE if @caps was parsed correctly.
+ */
+gboolean
+gst_video_format_parse_caps_interlaced (GstCaps * caps, gboolean * interlaced)
+{
+  GstStructure *structure;
+
+  if (!gst_caps_is_fixed (caps))
+    return FALSE;
+
+  structure = gst_caps_get_structure (caps, 0);
+
+  if (interlaced) {
+    if (!gst_structure_get_boolean (structure, "interlaced", interlaced))
+      *interlaced = FALSE;
+  }
+
+  return TRUE;
+}
+
+/**
  * gst_video_format_parse_caps:
  * @caps: the #GstCaps to parse
  * @format: the #GstVideoFormat of the video represented by @caps (output)
@@ -314,6 +344,7 @@ gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
   return ok;
 }
 
+
 /**
  * gst_video_parse_caps_framerate:
  * @caps: pointer to a #GstCaps instance
@@ -380,7 +411,7 @@ gst_video_parse_caps_pixel_aspect_ratio (GstCaps * caps, int *par_n, int *par_d)
 }
 
 /**
- * gst_video_format_new_caps:
+ * gst_video_format_new_caps_interlaced:
  * @format: the #GstVideoFormat describing the raw video format
  * @width: width of video
  * @height: height of video
@@ -388,16 +419,18 @@ gst_video_parse_caps_pixel_aspect_ratio (GstCaps * caps, int *par_n, int *par_d)
  * @framerate_d: denominator of frame rate
  * @par_n: numerator of pixel aspect ratio
  * @par_d: denominator of pixel aspect ratio
+ * @interlaced: #TRUE if the format is interlaced
  *
  * Creates a new #GstCaps object based on the parameters provided.
  *
- * Since: 0.10.16
+ * Since: 0.10.22
  *
  * Returns: a new #GstCaps object, or NULL if there was an error
  */
 GstCaps *
-gst_video_format_new_caps (GstVideoFormat format, int width, int height,
-    int framerate_n, int framerate_d, int par_n, int par_d)
+gst_video_format_new_caps_interlaced (GstVideoFormat format, int width,
+    int height, int framerate_n, int framerate_d, int par_n, int par_d,
+    gboolean interlaced)
 {
   g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, NULL);
   g_return_val_if_fail (width > 0 && height > 0, NULL);
@@ -408,7 +441,8 @@ gst_video_format_new_caps (GstVideoFormat format, int width, int height,
         "width", G_TYPE_INT, width,
         "height", G_TYPE_INT, height,
         "framerate", GST_TYPE_FRACTION, framerate_n, framerate_d,
-        "pixel-aspect-ratio", GST_TYPE_FRACTION, par_n, par_d, NULL);
+        "pixel-aspect-ratio", GST_TYPE_FRACTION, par_n, par_d,
+        "interlaced", G_TYPE_BOOLEAN, interlaced, NULL);
   }
   if (gst_video_format_is_rgb (format)) {
     GstCaps *caps;
@@ -472,7 +506,8 @@ gst_video_format_new_caps (GstVideoFormat format, int width, int height,
         "width", G_TYPE_INT, width,
         "height", G_TYPE_INT, height,
         "framerate", GST_TYPE_FRACTION, framerate_n, framerate_d,
-        "pixel-aspect-ratio", GST_TYPE_FRACTION, par_n, par_d, NULL);
+        "pixel-aspect-ratio", GST_TYPE_FRACTION, par_n, par_d,
+        "interlaced", G_TYPE_BOOLEAN, interlaced, NULL);
     if (have_alpha) {
       alpha_mask =
           mask >> (8 * gst_video_format_get_component_offset (format, 3, width,
@@ -485,6 +520,30 @@ gst_video_format_new_caps (GstVideoFormat format, int width, int height,
 }
 
 /**
+ * gst_video_format_new_caps:
+ * @format: the #GstVideoFormat describing the raw video format
+ * @width: width of video
+ * @height: height of video
+ * @framerate_n: numerator of frame rate
+ * @framerate_d: denominator of frame rate
+ * @par_n: numerator of pixel aspect ratio
+ * @par_d: denominator of pixel aspect ratio
+ *
+ * Creates a new #GstCaps object based on the parameters provided.
+ *
+ * Since: 0.10.16
+ *
+ * Returns: a new #GstCaps object, or NULL if there was an error
+ */
+GstCaps *
+gst_video_format_new_caps (GstVideoFormat format, int width, int height,
+    int framerate_n, int framerate_d, int par_n, int par_d)
+{
+  return gst_video_format_new_caps_interlaced (format, width, height,
+      framerate_n, framerate_d, par_n, par_d, FALSE);
+}
+
+/**
  * gst_video_format_from_fourcc:
  * @fourcc: a FOURCC value representing raw YUV video
  *
diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h
index 45b415b..22c4a4b 100644
--- a/gst-libs/gst/video/video.h
+++ b/gst-libs/gst/video/video.h
@@ -229,6 +229,29 @@ typedef enum {
         "height = " GST_VIDEO_SIZE_RANGE ", "                           \
         "framerate = " GST_VIDEO_FPS_RANGE
 
+/* buffer flags */
+
+/**
+ * GST_VIDEO_BUFFER_TFF:
+ * If the @GstBuffer is interlaced, then the first field in the video frame is
+ * the top field.  If unset, the bottom field is first.
+ */
+#define GST_VIDEO_BUFFER_TFF GST_BUFFER_FLAG_MEDIA1
+
+/**
+ * GST_VIDEO_BUFFER_RFF:
+ * If the @GstBuffer is interlaced, then the first field (as defined by the
+ * @GST_VIDEO_BUFFER_TFF flag setting) is repeated.
+ */
+#define GST_VIDEO_BUFFER_RFF GST_BUFFER_FLAG_MEDIA2
+
+/**
+ * GST_VIDEO_BUFFER_ONEFIELD:
+ * If the #GstBuffer is interlaced, the only the first field (as defined by the
+ * @GST_VIDEO_BUFFER_TFF flag setting) is to be displayed.
+ */
+#define GST_VIDEO_BUFFER_ONEFIELD GST_BUFFER_FLAG_MEDIA3
+
 /* functions */
 const GValue *gst_video_frame_rate (GstPad *pad);
 gboolean gst_video_get_size   (GstPad *pad,
@@ -242,6 +265,7 @@ gboolean gst_video_calculate_display_ratio (guint *dar_n, guint *dar_d,
 
 gboolean gst_video_format_parse_caps (GstCaps *caps, GstVideoFormat *format,
     int *width, int *height);
+gboolean gst_video_format_parse_caps_interlaced (GstCaps *caps, gboolean *interlaced);
 gboolean gst_video_parse_caps_framerate (GstCaps *caps,
     int *fps_n, int *fps_d);
 gboolean gst_video_parse_caps_pixel_aspect_ratio (GstCaps *caps,
@@ -249,6 +273,9 @@ gboolean gst_video_parse_caps_pixel_aspect_ratio (GstCaps *caps,
 GstCaps * gst_video_format_new_caps (GstVideoFormat format,
     int width, int height, int framerate_n, int framerate_d,
     int par_n, int par_d);
+GstCaps * gst_video_format_new_caps_interlaced (GstVideoFormat format,
+    int width, int height, int framerate_n, int framerate_d,
+						int par_n, int par_d, gboolean interlaced);
 GstVideoFormat gst_video_format_from_fourcc (guint32 fourcc);
 guint32 gst_video_format_to_fourcc (GstVideoFormat format);
 gboolean gst_video_format_is_rgb (GstVideoFormat format);





More information about the Gstreamer-commits mailing list