From: Edward Hervey Date: Mon, 26 Jan 2009 09:30:53 +0000 (+0100) Subject: video: Add flags for interlaced video along with convenience methods for interlaced... X-Git-Tag: 1.19.3~511^2~10006 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c44b06781752ae6d002e87e083ae993912ed6d09;p=platform%2Fupstream%2Fgstreamer.git 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). --- 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 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);