From 8433f7a9c61547ed509201e2cedf9212fb7d7d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 8 Aug 2009 07:59:16 +0200 Subject: videoparse: Use libgstvideo for everything instead of our own calculations Also make RGB usage easier by providing xRGB, RGBx, etc. formats instead of requiring to set red_mask and friends. --- gst/rawparse/Makefile.am | 2 +- gst/rawparse/gstrawparse.h | 6 +- gst/rawparse/gstvideoparse.c | 362 ++++++++++--------------------------------- gst/rawparse/gstvideoparse.h | 18 +-- 4 files changed, 92 insertions(+), 296 deletions(-) (limited to 'gst/rawparse') diff --git a/gst/rawparse/Makefile.am b/gst/rawparse/Makefile.am index 88e4e8c0..b56db45b 100644 --- a/gst/rawparse/Makefile.am +++ b/gst/rawparse/Makefile.am @@ -3,7 +3,7 @@ plugin_LTLIBRARIES = libgstrawparse.la libgstrawparse_la_SOURCES = gstrawparse.c gstaudioparse.c gstvideoparse.c plugin.c libgstrawparse_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) -libgstrawparse_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +libgstrawparse_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ libgstrawparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstrawparse_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/gst/rawparse/gstrawparse.h b/gst/rawparse/gstrawparse.h index da0de444..3536d289 100644 --- a/gst/rawparse/gstrawparse.h +++ b/gst/rawparse/gstrawparse.h @@ -55,9 +55,9 @@ struct _GstRawParse GstActivateMode mode; GstAdapter *adapter; - int framesize; - int fps_d; - int fps_n; + gint framesize; + gint fps_d; + gint fps_n; gboolean discont; guint64 n_frames; diff --git a/gst/rawparse/gstvideoparse.c b/gst/rawparse/gstvideoparse.c index d245fa75..99d4a7f6 100644 --- a/gst/rawparse/gstvideoparse.c +++ b/gst/rawparse/gstvideoparse.c @@ -1,6 +1,6 @@ /* GStreamer * Copyright (C) 2006 David A. Schleef - * Copyright (C) 2007 Sebastian Dröge + * Copyright (C) 2007,2009 Sebastian Dröge * * gstvideoparse.c: * @@ -31,23 +31,6 @@ #include "gstvideoparse.h" -typedef enum -{ - GST_VIDEO_PARSE_FORMAT_I420, - GST_VIDEO_PARSE_FORMAT_YV12, - GST_VIDEO_PARSE_FORMAT_YUY2, - GST_VIDEO_PARSE_FORMAT_UYVY, - GST_VIDEO_PARSE_FORMAT_v210, - GST_VIDEO_PARSE_FORMAT_RGB = 10, - GST_VIDEO_PARSE_FORMAT_GRAY -} GstVideoParseFormat; - -typedef enum -{ - GST_VIDEO_PARSE_ENDIANNESS_LITTLE = 1234, - GST_VIDEO_PARSE_ENDIANNESS_BIG = 4321 -} GstVideoParseEndianness; - static void gst_video_parse_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_video_parse_get_property (GObject * object, guint prop_id, @@ -62,76 +45,18 @@ static void gst_video_parse_update_frame_size (GstVideoParse * vp); GST_DEBUG_CATEGORY_STATIC (gst_video_parse_debug); #define GST_CAT_DEFAULT gst_video_parse_debug -static const GstElementDetails gst_video_parse_details = -GST_ELEMENT_DETAILS ("Video Parse", - "Filter/Video", - "Converts stream into video frames", - "David Schleef , " - "Sebastian Dröge "); - enum { - ARG_0, - ARG_WIDTH, - ARG_HEIGHT, - ARG_FORMAT, - ARG_PAR, - ARG_FRAMERATE, - ARG_INTERLACED, - ARG_TOP_FIELD_FIRST, - ARG_BPP, - ARG_DEPTH, - ARG_ENDIANNESS, - ARG_RED_MASK, - ARG_GREEN_MASK, - ARG_BLUE_MASK, - ARG_ALPHA_MASK + PROP_0, + PROP_FORMAT, + PROP_WIDTH, + PROP_HEIGHT, + PROP_PAR, + PROP_FRAMERATE, + PROP_INTERLACED, + PROP_TOP_FIELD_FIRST }; - -#define GST_VIDEO_PARSE_FORMAT (gst_video_parse_format_get_type ()) -static GType -gst_video_parse_format_get_type (void) -{ - static GType video_parse_format_type = 0; - static const GEnumValue format_types[] = { - {GST_VIDEO_PARSE_FORMAT_I420, "I420", "I420"}, - {GST_VIDEO_PARSE_FORMAT_YV12, "YV12", "YV12"}, - {GST_VIDEO_PARSE_FORMAT_YUY2, "YUY2", "YUY2"}, - {GST_VIDEO_PARSE_FORMAT_UYVY, "UYVY", "UYVY"}, - {GST_VIDEO_PARSE_FORMAT_v210, "v210", "v210"}, - {GST_VIDEO_PARSE_FORMAT_RGB, "RGB", "RGB"}, - {GST_VIDEO_PARSE_FORMAT_GRAY, "GRAY", "GRAY"}, - {0, NULL, NULL} - }; - - if (!video_parse_format_type) { - video_parse_format_type = - g_enum_register_static ("GstVideoParseFormat", format_types); - } - - return video_parse_format_type; -} - -#define GST_VIDEO_PARSE_ENDIANNESS (gst_video_parse_endianness_get_type ()) -static GType -gst_video_parse_endianness_get_type (void) -{ - static GType video_parse_endianness_type = 0; - static const GEnumValue endian_types[] = { - {GST_VIDEO_PARSE_ENDIANNESS_LITTLE, "Little Endian", "little"}, - {GST_VIDEO_PARSE_ENDIANNESS_BIG, "Big Endian", "big"}, - {0, NULL, NULL} - }; - - if (!video_parse_endianness_type) { - video_parse_endianness_type = - g_enum_register_static ("GstVideoParseEndianness", endian_types); - } - - return video_parse_endianness_type; -} - GST_BOILERPLATE (GstVideoParse, gst_video_parse, GstRawParse, GST_TYPE_RAW_PARSE); @@ -145,12 +70,33 @@ gst_video_parse_base_init (gpointer g_class) GST_DEBUG_CATEGORY_INIT (gst_video_parse_debug, "videoparse", 0, "videoparse element"); - gst_element_class_set_details (gstelement_class, &gst_video_parse_details); - - caps = - gst_caps_from_string (GST_VIDEO_CAPS_YUV - ("{ I420, YV12, YUY2, UYVY, v210 }") ";" - "video/x-raw-rgb; video/x-raw-gray"); + gst_element_class_set_details_simple (gstelement_class, "Video Parse", + "Filter/Video", + "Converts stream into video frames", + "David Schleef , " + "Sebastian Dröge "); + + caps = gst_caps_from_string (GST_VIDEO_CAPS_YUV ("I420") ";" + GST_VIDEO_CAPS_YUV ("YV12") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" + GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("AYUV") ";" + GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_BGRx ";" + GST_VIDEO_CAPS_xRGB ";" + GST_VIDEO_CAPS_xBGR ";" + GST_VIDEO_CAPS_RGBA ";" + GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ARGB ";" + GST_VIDEO_CAPS_ABGR ";" + GST_VIDEO_CAPS_RGB ";" + GST_VIDEO_CAPS_BGR ";" + GST_VIDEO_CAPS_YUV ("Y41B") ";" + GST_VIDEO_CAPS_YUV ("Y42B") ";" + GST_VIDEO_CAPS_YUV ("YVYU") ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" + GST_VIDEO_CAPS_YUV ("Y210") ";" GST_VIDEO_CAPS_YUV ("Y216") + ); gst_raw_parse_class_set_src_pad_template (rp_class, caps); gst_raw_parse_class_set_multiple_frames_per_buffer (rp_class, FALSE); @@ -169,57 +115,32 @@ gst_video_parse_class_init (GstVideoParseClass * klass) rp_class->get_caps = gst_video_parse_get_caps; rp_class->set_buffer_flags = gst_video_parse_set_buffer_flags; - g_object_class_install_property (gobject_class, ARG_WIDTH, + g_object_class_install_property (gobject_class, PROP_FORMAT, + g_param_spec_enum ("format", "Format", "Format of images in raw stream", + GST_TYPE_VIDEO_FORMAT, GST_VIDEO_FORMAT_I420, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_WIDTH, g_param_spec_int ("width", "Width", "Width of images in raw stream", - 0, INT_MAX, 320, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_HEIGHT, + 0, INT_MAX, 320, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_HEIGHT, g_param_spec_int ("height", "Height", "Height of images in raw stream", - 0, INT_MAX, 240, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_FORMAT, - g_param_spec_enum ("format", "Format", "Format of images in raw stream", - GST_VIDEO_PARSE_FORMAT, GST_VIDEO_PARSE_FORMAT_I420, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_FRAMERATE, + 0, INT_MAX, 240, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_FRAMERATE, gst_param_spec_fraction ("framerate", "Frame Rate", "Frame rate of images in raw stream", 0, 1, 100, 1, 25, 1, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_INTERLACED, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PAR, + gst_param_spec_fraction ("pixel-aspect-ratio", "Pixel Aspect Ratio", + "Pixel aspect ratio of images in raw stream", 1, 100, 100, 1, 1, 1, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_INTERLACED, g_param_spec_boolean ("interlaced", "Interlaced flag", - "True if video is interlaced", FALSE, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_TOP_FIELD_FIRST, + "True if video is interlaced", FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_TOP_FIELD_FIRST, g_param_spec_boolean ("top-field-first", "Top field first", "True if top field is earlier than bottom field", TRUE, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_PAR, - gst_param_spec_fraction ("pixel_aspect_ratio", "Pixel Aspect Ratio", - "Pixel aspect ratio of images in raw stream", 1, 100, 100, 1, 1, 1, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_BPP, - g_param_spec_int ("bpp", "Bpp", "Bits per pixel of images in raw stream", - 0, INT_MAX, 24, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_DEPTH, - g_param_spec_int ("depth", "Depth", "Depth of images in raw stream", 0, - INT_MAX, 24, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_ENDIANNESS, - g_param_spec_enum ("endianness", "Endianness", - "Endianness of images in raw stream", GST_VIDEO_PARSE_ENDIANNESS, - G_BYTE_ORDER, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_RED_MASK, - g_param_spec_int ("red-mask", "Red mask", - "Red mask of images in raw stream", INT_MIN, INT_MAX, - GST_VIDEO_BYTE1_MASK_24_INT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_GREEN_MASK, - g_param_spec_int ("green-mask", "Green mask", - "Green mask of images in raw stream", INT_MIN, INT_MAX, - GST_VIDEO_BYTE2_MASK_24_INT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_BLUE_MASK, - g_param_spec_int ("blue-mask", "Blue mask", - "Blue mask of images in raw stream", INT_MIN, INT_MAX, - GST_VIDEO_BYTE3_MASK_24_INT, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_ALPHA_MASK, - g_param_spec_int ("alpha-mask", "Alpha mask", - "Alpha mask of images in raw stream", INT_MIN, INT_MAX, 0, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void @@ -227,16 +148,9 @@ gst_video_parse_init (GstVideoParse * vp, GstVideoParseClass * g_class) { vp->width = 320; vp->height = 240; - vp->format = GST_VIDEO_PARSE_FORMAT_I420; + vp->format = GST_VIDEO_FORMAT_I420; vp->par_n = 1; vp->par_d = 1; - vp->bpp = 24; - vp->depth = 24; - vp->endianness = G_BYTE_ORDER; - vp->red_mask = GST_VIDEO_BYTE1_MASK_24_INT; - vp->green_mask = GST_VIDEO_BYTE2_MASK_24_INT; - vp->blue_mask = GST_VIDEO_BYTE3_MASK_24_INT; - vp->alpha_mask = 0; gst_video_parse_update_frame_size (vp); gst_raw_parse_set_fps (GST_RAW_PARSE (vp), 25, 1); @@ -251,50 +165,29 @@ gst_video_parse_set_property (GObject * object, guint prop_id, g_return_if_fail (!gst_raw_parse_is_negotiated (GST_RAW_PARSE (vp))); switch (prop_id) { - case ARG_WIDTH: + case PROP_FORMAT: + vp->format = g_value_get_enum (value); + break; + case PROP_WIDTH: vp->width = g_value_get_int (value); break; - case ARG_HEIGHT: + case PROP_HEIGHT: vp->height = g_value_get_int (value); break; - case ARG_FORMAT: - vp->format = g_value_get_enum (value); - break; - case ARG_FRAMERATE: + case PROP_FRAMERATE: gst_raw_parse_set_fps (GST_RAW_PARSE (vp), gst_value_get_fraction_numerator (value), gst_value_get_fraction_denominator (value)); break; - case ARG_INTERLACED: - vp->interlaced = g_value_get_boolean (value); - break; - case ARG_TOP_FIELD_FIRST: - vp->top_field_first = g_value_get_boolean (value); - break; - case ARG_PAR: + case PROP_PAR: vp->par_n = gst_value_get_fraction_numerator (value); vp->par_d = gst_value_get_fraction_denominator (value); break; - case ARG_BPP: - vp->bpp = g_value_get_int (value); - break; - case ARG_DEPTH: - vp->depth = g_value_get_int (value); - break; - case ARG_ENDIANNESS: - vp->endianness = g_value_get_enum (value); - break; - case ARG_RED_MASK: - vp->red_mask = g_value_get_int (value); - break; - case ARG_GREEN_MASK: - vp->green_mask = g_value_get_int (value); - break; - case ARG_BLUE_MASK: - vp->blue_mask = g_value_get_int (value); + case PROP_INTERLACED: + vp->interlaced = g_value_get_boolean (value); break; - case ARG_ALPHA_MASK: - vp->alpha_mask = g_value_get_int (value); + case PROP_TOP_FIELD_FIRST: + vp->top_field_first = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -311,51 +204,30 @@ gst_video_parse_get_property (GObject * object, guint prop_id, GValue * value, GstVideoParse *vp = GST_VIDEO_PARSE (object); switch (prop_id) { - case ARG_WIDTH: + case PROP_FORMAT: + g_value_set_enum (value, vp->format); + break; + case PROP_WIDTH: g_value_set_int (value, vp->width); break; - case ARG_HEIGHT: + case PROP_HEIGHT: g_value_set_int (value, vp->height); break; - case ARG_FORMAT: - g_value_set_enum (value, vp->format); - break; - case ARG_FRAMERATE:{ + case PROP_FRAMERATE:{ gint fps_n, fps_d; gst_raw_parse_get_fps (GST_RAW_PARSE (vp), &fps_n, &fps_d); gst_value_set_fraction (value, fps_n, fps_d); break; } - case ARG_INTERLACED: - g_value_set_boolean (value, vp->interlaced); - break; - case ARG_TOP_FIELD_FIRST: - g_value_set_boolean (value, vp->top_field_first); - break; - case ARG_PAR: + case PROP_PAR: gst_value_set_fraction (value, vp->par_n, vp->par_d); break; - case ARG_BPP: - g_value_set_int (value, vp->bpp); - break; - case ARG_DEPTH: - g_value_set_int (value, vp->depth); - break; - case ARG_ENDIANNESS: - g_value_set_enum (value, vp->endianness); - break; - case ARG_RED_MASK: - g_value_set_int (value, vp->red_mask); - break; - case ARG_GREEN_MASK: - g_value_set_int (value, vp->green_mask); - break; - case ARG_BLUE_MASK: - g_value_set_int (value, vp->blue_mask); + case PROP_INTERLACED: + g_value_set_boolean (value, vp->interlaced); break; - case ARG_ALPHA_MASK: - g_value_set_int (value, vp->alpha_mask); + case PROP_TOP_FIELD_FIRST: + g_value_set_boolean (value, vp->top_field_first); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -363,47 +235,12 @@ gst_video_parse_get_property (GObject * object, guint prop_id, GValue * value, } } -static guint32 -gst_video_parse_format_to_fourcc (GstVideoParseFormat format) -{ - switch (format) { - case GST_VIDEO_PARSE_FORMAT_I420: - return GST_MAKE_FOURCC ('I', '4', '2', '0'); - case GST_VIDEO_PARSE_FORMAT_YV12: - return GST_MAKE_FOURCC ('Y', 'V', '1', '2'); - case GST_VIDEO_PARSE_FORMAT_YUY2: - return GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'); - case GST_VIDEO_PARSE_FORMAT_UYVY: - return GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); - case GST_VIDEO_PARSE_FORMAT_v210: - return GST_MAKE_FOURCC ('v', '2', '1', '0'); - default: - g_assert_not_reached (); - } - return 0; -} - void gst_video_parse_update_frame_size (GstVideoParse * vp) { gint framesize; - if (vp->format == GST_VIDEO_PARSE_FORMAT_I420 || - vp->format == GST_VIDEO_PARSE_FORMAT_YV12) { - framesize = GST_ROUND_UP_4 (vp->width) * GST_ROUND_UP_2 (vp->height) - + - 2 * (GST_ROUND_UP_8 (vp->width) / 2) * (GST_ROUND_UP_2 (vp->height) / - 2); - } else if (vp->format == GST_VIDEO_PARSE_FORMAT_YUY2 - || vp->format == GST_VIDEO_PARSE_FORMAT_UYVY) { - framesize = GST_ROUND_UP_4 (vp->width * 2) * vp->height; - } else if (vp->format == GST_VIDEO_PARSE_FORMAT_v210) { - framesize = ((vp->width + 47) / 48) * 128 * vp->height; - } else if (vp->format == GST_VIDEO_PARSE_FORMAT_RGB) { - framesize = GST_ROUND_UP_4 (vp->width * vp->bpp / 8) * vp->height; - } else { - framesize = GST_ROUND_UP_4 (vp->width * vp->bpp / 8) * vp->height; - } + framesize = gst_video_format_get_size (vp->format, vp->width, vp->height); gst_raw_parse_set_framesize (GST_RAW_PARSE (vp), framesize); } @@ -418,39 +255,10 @@ gst_video_parse_get_caps (GstRawParse * rp) gst_raw_parse_get_fps (rp, &fps_n, &fps_d); - if (vp->format < GST_VIDEO_PARSE_FORMAT_RGB) { - caps = gst_caps_new_simple ("video/x-raw-yuv", - "width", G_TYPE_INT, vp->width, - "height", G_TYPE_INT, vp->height, - "format", GST_TYPE_FOURCC, - gst_video_parse_format_to_fourcc (vp->format), "framerate", - GST_TYPE_FRACTION, fps_n, fps_d, "pixel-aspect-ratio", - GST_TYPE_FRACTION, vp->par_n, vp->par_d, - "interlaced", G_TYPE_BOOLEAN, vp->interlaced, NULL); - } else if (vp->format == GST_VIDEO_PARSE_FORMAT_RGB) { - caps = gst_caps_new_simple ("video/x-raw-rgb", - "width", G_TYPE_INT, vp->width, - "height", G_TYPE_INT, vp->height, - "bpp", G_TYPE_INT, vp->bpp, - "depth", G_TYPE_INT, vp->depth, - "framerate", GST_TYPE_FRACTION, fps_n, fps_d, - "interlaced", G_TYPE_BOOLEAN, vp->interlaced, - "pixel-aspect-ratio", GST_TYPE_FRACTION, vp->par_n, vp->par_d, - "red_mask", G_TYPE_INT, vp->red_mask, - "green_mask", G_TYPE_INT, vp->green_mask, - "blue_mask", G_TYPE_INT, vp->blue_mask, - "alpha_mask", G_TYPE_INT, vp->alpha_mask, - "endianness", G_TYPE_INT, vp->endianness, NULL); - } else { - caps = gst_caps_new_simple ("video/x-raw-gray", - "width", G_TYPE_INT, vp->width, - "height", G_TYPE_INT, vp->height, - "bpp", G_TYPE_INT, vp->bpp, - "depth", G_TYPE_INT, vp->depth, - "framerate", GST_TYPE_FRACTION, fps_n, fps_d, - "interlaced", G_TYPE_BOOLEAN, vp->interlaced, - "pixel-aspect-ratio", GST_TYPE_FRACTION, vp->par_n, vp->par_d, NULL); - } + caps = + gst_video_format_new_caps_interlaced (vp->format, vp->width, vp->height, + fps_n, fps_d, vp->par_n, vp->par_d, vp->interlaced); + return caps; } @@ -459,10 +267,6 @@ gst_video_parse_set_buffer_flags (GstRawParse * rp, GstBuffer * buffer) { GstVideoParse *vp = GST_VIDEO_PARSE (rp); -/* remove this after -bad deps on -base-0.10.23 */ -#ifndef GST_VIDEO_BUFFER_TFF -#define GST_VIDEO_BUFFER_TFF (GST_MINI_OBJECT_FLAG_LAST << 5) -#endif if (vp->interlaced) { if (vp->top_field_first) { GST_BUFFER_FLAG_SET (buffer, GST_VIDEO_BUFFER_TFF); diff --git a/gst/rawparse/gstvideoparse.h b/gst/rawparse/gstvideoparse.h index da210ea1..d2e2b363 100644 --- a/gst/rawparse/gstvideoparse.h +++ b/gst/rawparse/gstvideoparse.h @@ -1,6 +1,6 @@ /* GStreamer * Copyright (C) 2006 David A. Schleef - * Copyright (C) 2007 Sebastian Dröge + * Copyright (C) 2007,2009 Sebastian Dröge * * gstvideoparse.h: * @@ -49,20 +49,12 @@ struct _GstVideoParse GstRawParse parent; /* properties */ - int width; - int height; - guint32 format; - int par_n; - int par_d; + GstVideoFormat format; + gint width; + gint height; + gint par_n, par_d; gboolean interlaced; gboolean top_field_first; - int bpp; - int depth; - int endianness; - int red_mask; - int blue_mask; - int green_mask; - int alpha_mask; }; struct _GstVideoParseClass -- cgit v1.2.1 From 60a5d37683805b50e746aa68b653b6594ca99e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 8 Aug 2009 08:27:24 +0200 Subject: audioparse: Small cleanups --- gst/rawparse/gstaudioparse.c | 86 ++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 43 deletions(-) (limited to 'gst/rawparse') diff --git a/gst/rawparse/gstaudioparse.c b/gst/rawparse/gstaudioparse.c index f7eb6651..37a4f69d 100644 --- a/gst/rawparse/gstaudioparse.c +++ b/gst/rawparse/gstaudioparse.c @@ -56,22 +56,16 @@ static void gst_audio_parse_update_frame_size (GstAudioParse * ap); GST_DEBUG_CATEGORY_STATIC (gst_audio_parse_debug); #define GST_CAT_DEFAULT gst_audio_parse_debug -static const GstElementDetails gst_audio_parse_details = -GST_ELEMENT_DETAILS ("Audio Parse", - "Filter/Audio", - "Converts stream into audio frames", - "Sebastian Dröge "); - enum { - ARG_0, - ARG_FORMAT, - ARG_RATE, - ARG_CHANNELS, - ARG_ENDIANNESS, - ARG_WIDTH, - ARG_DEPTH, - ARG_SIGNED + PROP_0, + PROP_FORMAT, + PROP_RATE, + PROP_CHANNELS, + PROP_ENDIANNESS, + PROP_WIDTH, + PROP_DEPTH, + PROP_SIGNED }; @@ -128,7 +122,10 @@ gst_audio_parse_base_init (gpointer g_class) GST_DEBUG_CATEGORY_INIT (gst_audio_parse_debug, "audioparse", 0, "audioparse element"); - gst_element_class_set_details (gstelement_class, &gst_audio_parse_details); + gst_element_class_set_details_simple (gstelement_class, "Audio Parse", + "Filter/Audio", + "Converts stream into audio frames", + "Sebastian Dröge "); caps = gst_caps_from_string ("audio/x-raw-int," @@ -161,38 +158,41 @@ gst_audio_parse_class_init (GstAudioParseClass * klass) rp_class->get_caps = gst_audio_parse_get_caps; - g_object_class_install_property (gobject_class, ARG_FORMAT, + g_object_class_install_property (gobject_class, PROP_FORMAT, g_param_spec_enum ("format", "Format", "Format of audio samples in raw stream", GST_AUDIO_PARSE_FORMAT, - GST_AUDIO_PARSE_FORMAT_INT, G_PARAM_READWRITE)); + GST_AUDIO_PARSE_FORMAT_INT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, ARG_RATE, + g_object_class_install_property (gobject_class, PROP_RATE, g_param_spec_int ("rate", "Rate", "Rate of audio samples in raw stream", - 1, INT_MAX, 44100, G_PARAM_READWRITE)); + 1, INT_MAX, 44100, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, ARG_CHANNELS, + g_object_class_install_property (gobject_class, PROP_CHANNELS, g_param_spec_int ("channels", "Channels", "Number of channels in raw stream", 1, INT_MAX, 2, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, ARG_WIDTH, + g_object_class_install_property (gobject_class, PROP_WIDTH, g_param_spec_int ("width", "Width", "Width of audio samples in raw stream", 1, INT_MAX, 16, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, ARG_DEPTH, + g_object_class_install_property (gobject_class, PROP_DEPTH, g_param_spec_int ("depth", "Depth", "Depth of audio samples in raw stream", 1, INT_MAX, 16, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, ARG_SIGNED, + g_object_class_install_property (gobject_class, PROP_SIGNED, g_param_spec_boolean ("signed", "signed", - "Sign of audio samples in raw stream", TRUE, G_PARAM_READWRITE)); + "Sign of audio samples in raw stream", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, ARG_ENDIANNESS, + g_object_class_install_property (gobject_class, PROP_ENDIANNESS, g_param_spec_enum ("endianness", "Endianness", "Endianness of audio samples in raw stream", - GST_AUDIO_PARSE_ENDIANNESS, G_BYTE_ORDER, G_PARAM_READWRITE)); + GST_AUDIO_PARSE_ENDIANNESS, G_BYTE_ORDER, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void @@ -218,25 +218,25 @@ gst_audio_parse_set_property (GObject * object, guint prop_id, g_return_if_fail (!gst_raw_parse_is_negotiated (GST_RAW_PARSE (ap))); switch (prop_id) { - case ARG_FORMAT: + case PROP_FORMAT: ap->format = g_value_get_enum (value); break; - case ARG_RATE: + case PROP_RATE: gst_raw_parse_set_fps (GST_RAW_PARSE (ap), g_value_get_int (value), 1); break; - case ARG_CHANNELS: + case PROP_CHANNELS: ap->channels = g_value_get_int (value); break; - case ARG_WIDTH: + case PROP_WIDTH: ap->width = g_value_get_int (value); break; - case ARG_DEPTH: + case PROP_DEPTH: ap->depth = g_value_get_int (value); break; - case ARG_SIGNED: + case PROP_SIGNED: ap->signedness = g_value_get_boolean (value); break; - case ARG_ENDIANNESS: + case PROP_ENDIANNESS: ap->endianness = g_value_get_enum (value); break; default: @@ -254,29 +254,29 @@ gst_audio_parse_get_property (GObject * object, guint prop_id, GValue * value, GstAudioParse *ap = GST_AUDIO_PARSE (object); switch (prop_id) { - case ARG_FORMAT: + case PROP_FORMAT: g_value_set_enum (value, ap->format); break; - case ARG_RATE:{ + case PROP_RATE:{ gint fps_n, fps_d; gst_raw_parse_get_fps (GST_RAW_PARSE (ap), &fps_n, &fps_d); g_value_set_int (value, fps_n); break; } - case ARG_CHANNELS: + case PROP_CHANNELS: g_value_set_int (value, ap->channels); break; - case ARG_WIDTH: + case PROP_WIDTH: g_value_set_int (value, ap->width); break; - case ARG_DEPTH: + case PROP_DEPTH: g_value_set_int (value, ap->depth); break; - case ARG_SIGNED: + case PROP_SIGNED: g_value_set_boolean (value, ap->signedness); break; - case ARG_ENDIANNESS: + case PROP_ENDIANNESS: g_value_set_enum (value, ap->endianness); break; default: -- cgit v1.2.1 From 5c11f80c047f95b5301071282521bf92eb39c8f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 8 Aug 2009 10:27:52 +0200 Subject: rawparse: Small cleanups and implement SEEKING query --- gst/rawparse/gstrawparse.c | 31 ++++++++++++++++++++++++++----- gst/rawparse/gstrawparse.h | 2 +- 2 files changed, 27 insertions(+), 6 deletions(-) (limited to 'gst/rawparse') diff --git a/gst/rawparse/gstrawparse.c b/gst/rawparse/gstrawparse.c index d5dae600..07e42c28 100644 --- a/gst/rawparse/gstrawparse.c +++ b/gst/rawparse/gstrawparse.c @@ -100,8 +100,6 @@ gst_raw_parse_init (GstRawParse * rp, GstRawParseClass * g_class) rp->sinkpad = gst_pad_new_from_static_template (&gst_raw_parse_sink_pad_template, "sink"); - gst_element_add_pad (GST_ELEMENT (rp), rp->sinkpad); - gst_pad_set_chain_function (rp->sinkpad, GST_DEBUG_FUNCPTR (gst_raw_parse_chain)); gst_pad_set_event_function (rp->sinkpad, @@ -110,6 +108,7 @@ gst_raw_parse_init (GstRawParse * rp, GstRawParseClass * g_class) GST_DEBUG_FUNCPTR (gst_raw_parse_sink_activate)); gst_pad_set_activatepull_function (rp->sinkpad, GST_DEBUG_FUNCPTR (gst_raw_parse_sink_activatepull)); + gst_element_add_pad (GST_ELEMENT (rp), rp->sinkpad); src_pad_template = gst_element_class_get_pad_template (element_class, "src"); @@ -120,15 +119,13 @@ gst_raw_parse_init (GstRawParse * rp, GstRawParseClass * g_class) g_assert_not_reached (); } - gst_element_add_pad (GST_ELEMENT (rp), rp->srcpad); - gst_pad_set_event_function (rp->srcpad, GST_DEBUG_FUNCPTR (gst_raw_parse_src_event)); - gst_pad_set_query_type_function (rp->srcpad, GST_DEBUG_FUNCPTR (gst_raw_parse_src_query_type)); gst_pad_set_query_function (rp->srcpad, GST_DEBUG_FUNCPTR (gst_raw_parse_src_query)); + gst_element_add_pad (GST_ELEMENT (rp), rp->srcpad); rp->adapter = gst_adapter_new (); @@ -914,6 +911,7 @@ gst_raw_parse_src_query_type (GstPad * pad) GST_QUERY_POSITION, GST_QUERY_DURATION, GST_QUERY_CONVERT, + GST_QUERY_SEEKING, 0 }; @@ -992,6 +990,29 @@ gst_raw_parse_src_query (GstPad * pad, GstQuery * query) gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); break; } + case GST_QUERY_SEEKING:{ + GstFormat fmt; + + ret = TRUE; + gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); + if (fmt != GST_FORMAT_TIME && fmt != GST_FORMAT_DEFAULT + && fmt != GST_FORMAT_BYTES) { + gst_query_set_seeking (query, fmt, FALSE, -1, -1); + } else if (rp->mode == GST_ACTIVATE_PUSH) { + GstQuery *peerquery = gst_query_new_seeking (GST_FORMAT_BYTES); + gboolean seekable; + + seekable = gst_pad_peer_query (rp->sinkpad, peerquery); + if (seekable) + gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL); + + gst_query_unref (peerquery); + gst_query_set_seeking (query, fmt, seekable, seekable ? 0 : -1, -1); + } else { + gst_query_set_seeking (query, fmt, TRUE, 0, -1); + } + break; + } default: /* else forward upstream */ ret = gst_pad_peer_query (rp->sinkpad, query); diff --git a/gst/rawparse/gstrawparse.h b/gst/rawparse/gstrawparse.h index 3536d289..0a2c01b3 100644 --- a/gst/rawparse/gstrawparse.h +++ b/gst/rawparse/gstrawparse.h @@ -48,7 +48,7 @@ struct _GstRawParse { GstElement parent; - /* private */ + /* */ GstPad *sinkpad; GstPad *srcpad; -- cgit v1.2.1 From 282479b4434dbfd6541d71a8891943603a12de89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 8 Aug 2009 10:30:11 +0200 Subject: videoparse: Only provide very fundamental caps in the pad template We can't easily know which caps will can be used because we rely on libgstvideo's support for video formats. --- gst/rawparse/gstvideoparse.c | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) (limited to 'gst/rawparse') diff --git a/gst/rawparse/gstvideoparse.c b/gst/rawparse/gstvideoparse.c index 99d4a7f6..16dde999 100644 --- a/gst/rawparse/gstvideoparse.c +++ b/gst/rawparse/gstvideoparse.c @@ -76,27 +76,9 @@ gst_video_parse_base_init (gpointer g_class) "David Schleef , " "Sebastian Dröge "); - caps = gst_caps_from_string (GST_VIDEO_CAPS_YUV ("I420") ";" - GST_VIDEO_CAPS_YUV ("YV12") ";" - GST_VIDEO_CAPS_YUV ("YUY2") ";" - GST_VIDEO_CAPS_YUV ("UYVY") ";" - GST_VIDEO_CAPS_YUV ("AYUV") ";" - GST_VIDEO_CAPS_RGBx ";" - GST_VIDEO_CAPS_BGRx ";" - GST_VIDEO_CAPS_xRGB ";" - GST_VIDEO_CAPS_xBGR ";" - GST_VIDEO_CAPS_RGBA ";" - GST_VIDEO_CAPS_BGRA ";" - GST_VIDEO_CAPS_ARGB ";" - GST_VIDEO_CAPS_ABGR ";" - GST_VIDEO_CAPS_RGB ";" - GST_VIDEO_CAPS_BGR ";" - GST_VIDEO_CAPS_YUV ("Y41B") ";" - GST_VIDEO_CAPS_YUV ("Y42B") ";" - GST_VIDEO_CAPS_YUV ("YVYU") ";" - GST_VIDEO_CAPS_YUV ("Y444") ";" - GST_VIDEO_CAPS_YUV ("Y210") ";" GST_VIDEO_CAPS_YUV ("Y216") - ); + caps = + gst_caps_from_string + ("video/x-raw-rgb; video/x-raw-yuv; video/x-raw-gray; video/x-raw-bayer"); gst_raw_parse_class_set_src_pad_template (rp_class, caps); gst_raw_parse_class_set_multiple_frames_per_buffer (rp_class, FALSE); -- cgit v1.2.1