diff options
author | David Schleef <ds@schleef.org> | 2003-12-22 01:47:09 +0000 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2003-12-22 01:47:09 +0000 |
commit | ce51f6173ca1c37d90f8e2e316d90316583d7755 (patch) | |
tree | 270b121765a11455f5bf8166b526d7ac336dc56c /sys | |
parent | f43f0a9fd781bafab689e46bd936af9cb5ed2690 (diff) |
Merge CAPS branch
Original commit message from CVS:
Merge CAPS branch
Diffstat (limited to 'sys')
-rw-r--r-- | sys/oss/gstosselement.c | 40 | ||||
-rw-r--r-- | sys/oss/gstosselement.h | 4 | ||||
-rw-r--r-- | sys/oss/gstosssink.c | 56 | ||||
-rw-r--r-- | sys/oss/gstosssink.h | 1 | ||||
-rw-r--r-- | sys/oss/gstosssrc.c | 60 | ||||
-rw-r--r-- | sys/v4l2/gstv4l2src.c | 228 | ||||
-rw-r--r-- | sys/v4l2/gstv4l2src.h | 3 |
7 files changed, 146 insertions, 246 deletions
diff --git a/sys/oss/gstosselement.c b/sys/oss/gstosselement.c index 79321622..48402cf5 100644 --- a/sys/oss/gstosselement.c +++ b/sys/oss/gstosselement.c @@ -486,19 +486,22 @@ gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width, gint de } gboolean -gst_osselement_parse_caps (GstOssElement *oss, GstCaps *caps) +gst_osselement_parse_caps (GstOssElement *oss, const GstCaps *caps) { gint bps, format; + GstStructure *structure; - gst_caps_get_int (caps, "width", &oss->width); - gst_caps_get_int (caps, "depth", &oss->depth); + structure = gst_caps_get_structure (caps, 0); + + gst_structure_get_int (structure, "width", &oss->width); + gst_structure_get_int (structure, "depth", &oss->depth); if (oss->width != oss->depth) return FALSE; - gst_caps_get_int (caps, "law", &oss->law); - gst_caps_get_int (caps, "endianness", &oss->endianness); - gst_caps_get_boolean (caps, "signed", &oss->sign); + gst_structure_get_int (structure, "law", &oss->law); + gst_structure_get_int (structure, "endianness", &oss->endianness); + gst_structure_get_boolean (structure, "signed", &oss->sign); if (!gst_ossformat_get (oss->law, oss->endianness, oss->sign, oss->width, oss->depth, &format, &bps)) @@ -507,8 +510,8 @@ gst_osselement_parse_caps (GstOssElement *oss, GstCaps *caps) return FALSE; } - gst_caps_get_int (caps, "channels", &oss->channels); - gst_caps_get_int (caps, "rate", &oss->rate); + gst_structure_get_int (structure, "channels", &oss->channels); + gst_structure_get_int (structure, "rate", &oss->rate); oss->bps = bps * oss->channels * oss->rate; oss->format = format; @@ -519,25 +522,28 @@ gst_osselement_parse_caps (GstOssElement *oss, GstCaps *caps) #define GET_FIXED_INT(caps, name, dest) \ G_STMT_START { \ if (gst_caps_has_fixed_property (caps, name)) \ - gst_caps_get_int (caps, name, dest); \ + gst_structure_get_int (structure, name, dest); \ } G_STMT_END #define GET_FIXED_BOOLEAN(caps, name, dest) \ G_STMT_START { \ if (gst_caps_has_fixed_property (caps, name)) \ - gst_caps_get_boolean (caps, name, dest); \ + gst_structure_get_boolean (structure, name, dest); \ } G_STMT_END gboolean gst_osselement_merge_fixed_caps (GstOssElement *oss, GstCaps *caps) { gint bps, format; + GstStructure *structure; + structure = gst_caps_get_structure (caps, 0); + /* peel off fixed stuff from the caps */ - GET_FIXED_INT (caps, "law", &oss->law); - GET_FIXED_INT (caps, "endianness", &oss->endianness); - GET_FIXED_BOOLEAN (caps, "signed", &oss->sign); - GET_FIXED_INT (caps, "width", &oss->width); - GET_FIXED_INT (caps, "depth", &oss->depth); + gst_structure_get_int (structure, "law", &oss->law); + gst_structure_get_int (structure, "endianness", &oss->endianness); + gst_structure_get_boolean (structure, "signed", &oss->sign); + gst_structure_get_int (structure, "width", &oss->width); + gst_structure_get_int (structure, "depth", &oss->depth); if (!gst_ossformat_get (oss->law, oss->endianness, oss->sign, oss->width, oss->depth, &format, &bps)) @@ -545,8 +551,8 @@ gst_osselement_merge_fixed_caps (GstOssElement *oss, GstCaps *caps) return FALSE; } - GET_FIXED_INT (caps, "rate", &oss->rate); - GET_FIXED_INT (caps, "channels", &oss->channels); + gst_structure_get_int (structure, "rate", &oss->rate); + gst_structure_get_int (structure, "channels", &oss->channels); oss->bps = bps * oss->channels * oss->rate; oss->format = format; diff --git a/sys/oss/gstosselement.h b/sys/oss/gstosselement.h index f9d8182e..36e1281e 100644 --- a/sys/oss/gstosselement.h +++ b/sys/oss/gstosselement.h @@ -101,9 +101,9 @@ GType gst_osselement_get_type (void); /* some useful functions */ gboolean gst_osselement_parse_caps (GstOssElement *oss, - GstCaps *caps); + const GstCaps *caps); gboolean gst_osselement_merge_fixed_caps (GstOssElement *oss, - GstCaps *caps); + GstCaps *caps); gboolean gst_osselement_sync_parms (GstOssElement *oss); void gst_osselement_reset (GstOssElement *oss); diff --git a/sys/oss/gstosssink.c b/sys/oss/gstosssink.c index d93912ed..b1402b29 100644 --- a/sys/oss/gstosssink.c +++ b/sys/oss/gstosssink.c @@ -58,7 +58,7 @@ static gboolean gst_osssink_query (GstElement *element, GstQueryType type, static gboolean gst_osssink_sink_query (GstPad *pad, GstQueryType type, GstFormat *format, gint64 *value); -static GstPadLinkReturn gst_osssink_sinkconnect (GstPad *pad, GstCaps *caps); +static GstPadLinkReturn gst_osssink_sinkconnect (GstPad *pad, const GstCaps *caps); static void gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); @@ -83,28 +83,18 @@ enum { /* FILL ME */ }; -GST_PAD_TEMPLATE_FACTORY (osssink_sink_factory, +static GstStaticPadTemplate osssink_sink_factory = +GST_STATIC_PAD_TEMPLATE ( "sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "osssink_sink", - "audio/x-raw-int", - "endianness", GST_PROPS_INT (G_BYTE_ORDER), - "signed", GST_PROPS_LIST ( - GST_PROPS_BOOLEAN (FALSE), - GST_PROPS_BOOLEAN (TRUE) - ), - "width", GST_PROPS_LIST ( - GST_PROPS_INT (8), - GST_PROPS_INT (16) - ), - "depth", GST_PROPS_LIST ( - GST_PROPS_INT (8), - GST_PROPS_INT (16) - ), - "rate", GST_PROPS_INT_RANGE (1000, 48000), - "channels", GST_PROPS_INT_RANGE (1, 2) + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " + "rate = (int) [ 1000, 48000 ], " + "channels = (int) [ 1, 2 ]" ) ); @@ -134,20 +124,6 @@ gst_osssink_get_type (void) return osssink_type; } -static GstBufferPool* -gst_osssink_get_bufferpool (GstPad *pad) -{ - GstOssSink *oss; - - oss = GST_OSSSINK (gst_pad_get_parent(pad)); - - /* 6 buffers per chunk by default */ - if (!oss->sinkpool) - oss->sinkpool = gst_buffer_pool_get_default (oss->bufsize, 6); - - return oss->sinkpool; -} - static void gst_osssink_dispose (GObject *object) { @@ -164,7 +140,7 @@ gst_osssink_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details (element_class, &gst_osssink_details); - gst_element_class_add_pad_template (element_class, GST_PAD_TEMPLATE_GET (osssink_sink_factory)); + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&osssink_sink_factory)); } static void gst_osssink_class_init (GstOssSinkClass *klass) @@ -214,10 +190,9 @@ static void gst_osssink_init (GstOssSink *osssink) { osssink->sinkpad = gst_pad_new_from_template ( - GST_PAD_TEMPLATE_GET (osssink_sink_factory), "sink"); + gst_static_pad_template_get (&osssink_sink_factory), "sink"); gst_element_add_pad (GST_ELEMENT (osssink), osssink->sinkpad); gst_pad_set_link_function (osssink->sinkpad, gst_osssink_sinkconnect); - gst_pad_set_bufferpool_function (osssink->sinkpad, gst_osssink_get_bufferpool); gst_pad_set_convert_function (osssink->sinkpad, gst_osssink_convert); gst_pad_set_query_function (osssink->sinkpad, gst_osssink_sink_query); gst_pad_set_query_type_function (osssink->sinkpad, gst_osssink_get_query_types); @@ -230,7 +205,6 @@ gst_osssink_init (GstOssSink *osssink) osssink->resync = FALSE; osssink->mute = FALSE; osssink->sync = TRUE; - osssink->sinkpool = NULL; osssink->provided_clock = gst_audio_clock_new ("ossclock", gst_osssink_get_time, osssink); gst_object_set_parent (GST_OBJECT (osssink->provided_clock), GST_OBJECT (osssink)); osssink->handled = 0; @@ -241,13 +215,10 @@ gst_osssink_init (GstOssSink *osssink) static GstPadLinkReturn -gst_osssink_sinkconnect (GstPad *pad, GstCaps *caps) +gst_osssink_sinkconnect (GstPad *pad, const GstCaps *caps) { GstOssSink *osssink = GST_OSSSINK (gst_pad_get_parent (pad)); - if (!GST_CAPS_IS_FIXED (caps)) - return GST_PAD_LINK_DELAYED; - if (!gst_osselement_parse_caps (GST_OSSELEMENT (osssink), caps)) return GST_PAD_LINK_REFUSED; @@ -529,7 +500,6 @@ gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, G break; case ARG_BUFFER_SIZE: osssink->bufsize = g_value_get_uint (value); - osssink->sinkpool = gst_buffer_pool_get_default (osssink->bufsize, 6); g_object_notify (object, "buffer_size"); break; case ARG_SYNC: diff --git a/sys/oss/gstosssink.h b/sys/oss/gstosssink.h index 33bf13fe..f484007b 100644 --- a/sys/oss/gstosssink.h +++ b/sys/oss/gstosssink.h @@ -56,7 +56,6 @@ struct _GstOssSink { GstOssElement element; GstPad *sinkpad; - GstBufferPool *sinkpool; GstClock *provided_clock; GstClock *clock; diff --git a/sys/oss/gstosssrc.c b/sys/oss/gstosssrc.c index 01d74fb1..1edba80f 100644 --- a/sys/oss/gstosssrc.c +++ b/sys/oss/gstosssrc.c @@ -57,37 +57,27 @@ enum { ARG_FRAGMENT, }; -GST_PAD_TEMPLATE_FACTORY (osssrc_src_factory, +static GstStaticPadTemplate osssrc_src_factory = +GST_STATIC_PAD_TEMPLATE ( "src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "osssrc_src", - "audio/x-raw-int", - "endianness", GST_PROPS_INT (G_BYTE_ORDER), - "signed", GST_PROPS_LIST ( - GST_PROPS_BOOLEAN (TRUE), - GST_PROPS_BOOLEAN (FALSE) - ), - "width", GST_PROPS_LIST ( - GST_PROPS_INT (8), - GST_PROPS_INT (16) - ), - "depth", GST_PROPS_LIST ( - GST_PROPS_INT (8), - GST_PROPS_INT (16) - ), - "rate", GST_PROPS_INT_RANGE (1000, 48000), - "channels", GST_PROPS_INT_RANGE (1, 2) + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " + "rate = (int) [ 1000, 48000 ], " + "channels = (int) [ 1, 2 ]" ) -) +); static void gst_osssrc_base_init (gpointer g_class); static void gst_osssrc_class_init (GstOssSrcClass *klass); static void gst_osssrc_init (GstOssSrc *osssrc); static void gst_osssrc_dispose (GObject *object); -static GstPadLinkReturn gst_osssrc_srcconnect (GstPad *pad, GstCaps *caps); +static GstPadLinkReturn gst_osssrc_srcconnect (GstPad *pad, const GstCaps *caps); static const GstFormat* gst_osssrc_get_formats (GstPad *pad); static gboolean gst_osssrc_convert (GstPad *pad, GstFormat src_format, gint64 src_value, @@ -143,7 +133,7 @@ gst_osssrc_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details (element_class, &gst_osssrc_details); - gst_element_class_add_pad_template (element_class, GST_PAD_TEMPLATE_GET (osssrc_src_factory)); + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&osssrc_src_factory)); } static void gst_osssrc_class_init (GstOssSrcClass *klass) @@ -179,7 +169,7 @@ static void gst_osssrc_init (GstOssSrc *osssrc) { osssrc->srcpad = gst_pad_new_from_template ( - GST_PAD_TEMPLATE_GET (osssrc_src_factory), "src"); + gst_static_pad_template_get (&osssrc_src_factory), "src"); gst_pad_set_get_function (osssrc->srcpad, gst_osssrc_get); gst_pad_set_link_function (osssrc->srcpad, gst_osssrc_srcconnect); gst_pad_set_convert_function (osssrc->srcpad, gst_osssrc_convert); @@ -212,15 +202,12 @@ gst_osssrc_dispose (GObject *object) } static GstPadLinkReturn -gst_osssrc_srcconnect (GstPad *pad, GstCaps *caps) +gst_osssrc_srcconnect (GstPad *pad, const GstCaps *caps) { GstOssSrc *src; src = GST_OSSSRC(gst_pad_get_parent (pad)); - if (!GST_CAPS_IS_FIXED (caps)) - return GST_PAD_LINK_DELAYED; - if (!gst_osselement_parse_caps (GST_OSSELEMENT (src), caps)) return GST_PAD_LINK_REFUSED; @@ -248,17 +235,14 @@ gst_osssrc_negotiate (GstPad *pad) /* set caps on src pad */ if (gst_pad_try_set_caps (src->srcpad, - GST_CAPS_NEW ( - "oss_src", - "audio/x-raw-int", - "endianness", GST_PROPS_INT (GST_OSSELEMENT (src)->endianness), - "signed", GST_PROPS_BOOLEAN (GST_OSSELEMENT (src)->sign), - "width", GST_PROPS_INT (GST_OSSELEMENT (src)->width), - "depth", GST_PROPS_INT (GST_OSSELEMENT (src)->depth), - "rate", GST_PROPS_INT (GST_OSSELEMENT (src)->rate), - "channels", GST_PROPS_INT (GST_OSSELEMENT (src)->channels) - )) <= 0) - { + gst_caps_new_simple("audio/x-raw-int", + "endianness", G_TYPE_INT, GST_OSSELEMENT (src)->endianness, + "signed", G_TYPE_BOOLEAN, GST_OSSELEMENT (src)->sign, + "width", G_TYPE_INT, GST_OSSELEMENT (src)->width, + "depth", G_TYPE_INT, GST_OSSELEMENT (src)->depth, + "rate", G_TYPE_INT, GST_OSSELEMENT (src)->rate, + "channels", G_TYPE_INT, GST_OSSELEMENT (src)->channels, + NULL)) <= 0) { return FALSE; } return TRUE; diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c index cd98162f..b6e86b0a 100644 --- a/sys/v4l2/gstv4l2src.c +++ b/sys/v4l2/gstv4l2src.c @@ -62,29 +62,25 @@ static void gst_v4l2src_base_init (GstV4l2SrcClass *klass); static void gst_v4l2src_init (GstV4l2Src *v4l2src); /* signal functions */ -static void gst_v4l2src_open (GstElement *element, - const gchar *device); -static void gst_v4l2src_close (GstElement *element, - const gchar *device); - -/* pad/info functions */ -static gboolean gst_v4l2src_src_convert (GstPad *pad, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value); -static gboolean gst_v4l2src_src_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value); - -/* buffer functions */ -static GstPadLinkReturn - gst_v4l2src_srcconnect (GstPad *pad, - GstCaps *caps); -static GstCaps *gst_v4l2src_getcaps (GstPad *pad, - GstCaps *caps); -static GstData *gst_v4l2src_get (GstPad *pad); +static void gst_v4l2src_open (GstElement *element, + const gchar *device); +static void gst_v4l2src_close (GstElement *element, + const gchar *device); + +/* pad/buffer functions */ +static GstPadLinkReturn gst_v4l2src_srcconnect (GstPad *pad, + const GstCaps *caps); +static GstCaps * gst_v4l2src_getcaps (GstPad *pad); +static GstData * gst_v4l2src_get (GstPad *pad); +static gboolean gst_v4l2src_src_convert (GstPad *pad, + GstFormat src_format, + gint64 src_value, + GstFormat *dest_format, + gint64 *dest_value); +static gboolean gst_v4l2src_src_query (GstPad *pad, + GstQueryType type, + GstFormat *format, + gint64 *value); /* get/set params */ static void gst_v4l2src_set_property (GObject *object, @@ -104,16 +100,6 @@ static GstElementStateReturn static void gst_v4l2src_set_clock (GstElement *element, GstClock *clock); -/* bufferpool functions */ -static GstBuffer *gst_v4l2src_buffer_new (GstBufferPool *pool, - guint64 offset, - guint size, - gpointer user_data); -static void gst_v4l2src_buffer_free (GstBufferPool *pool, - GstBuffer *buf, - gpointer user_data); - - static GstPadTemplate *src_template; static GstElementClass *parent_class = NULL; @@ -240,12 +226,6 @@ gst_v4l2src_init (GstV4l2Src *v4l2src) gst_pad_set_query_type_function (v4l2src->srcpad, gst_v4l2src_get_query_types); - v4l2src->bufferpool = gst_buffer_pool_new(NULL, NULL, - gst_v4l2src_buffer_new, - NULL, - gst_v4l2src_buffer_free, - v4l2src); - v4l2src->breq.count = 0; v4l2src->formats = NULL; @@ -386,21 +366,16 @@ gst_v4l2src_src_query (GstPad *pad, } -static GstCaps * +static GstStructure * gst_v4l2src_v4l2fourcc_to_caps (guint32 fourcc, - GstPropsEntry *width, - GstPropsEntry *height, - GstPropsEntry *fps, gboolean compressed) { - GstCaps *caps = NULL; + GstStructure *structure; switch (fourcc) { case V4L2_PIX_FMT_MJPEG: /* Motion-JPEG */ case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */ - caps = GST_CAPS_NEW("v4l2src_caps", - "video/x-jpeg", - NULL); + structure = gst_structure_new ("video/x-jpeg", NULL); break; case V4L2_PIX_FMT_RGB332: case V4L2_PIX_FMT_RGB555: @@ -488,15 +463,14 @@ gst_v4l2src_v4l2fourcc_to_caps (guint32 fourcc, break; } - caps = GST_CAPS_NEW("v4l2src_caps", - "video/x-raw-rgb", - "bpp", GST_PROPS_INT(bpp), - "depth", GST_PROPS_INT(depth), - "red_mask", GST_PROPS_INT(r_mask), - "green_mask", GST_PROPS_INT(g_mask), - "blue_mask", GST_PROPS_INT(b_mask), - "endianness", GST_PROPS_INT(endianness), - NULL); + structure = gst_structure_new ("video/x-raw-rgb", + "bpp", G_TYPE_INT, bpp, + "depth", G_TYPE_INT, depth, + "red_mask", G_TYPE_INT, r_mask, + "green_mask", G_TYPE_INT, g_mask, + "blue_mask", G_TYPE_INT, b_mask, + "endianness", G_TYPE_INT, endianness, + NULL); break; } case V4L2_PIX_FMT_YUV420: /* I420/IYUV */ @@ -527,10 +501,9 @@ gst_v4l2src_v4l2fourcc_to_caps (guint32 fourcc, break; } - caps = GST_CAPS_NEW("v4l2src_caps", - "video/x-raw-yuv", - "format", GST_PROPS_FOURCC(fcc), - NULL); + structure = gst_structure_new ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, fcc, + NULL); break; } default: @@ -550,26 +523,24 @@ gst_v4l2src_v4l2fourcc_to_caps (guint32 fourcc, } string_format = g_strdup_printf("video/%4.4s", print_format_str); - caps = GST_CAPS_NEW("v4l2src_caps", - string_format, - NULL); + structure = gst_structure_new (string_format, NULL); g_free(string_format); } else { - caps = GST_CAPS_NEW("v4l2src_caps", - "video/x-raw-yuv", - "format",GST_PROPS_FOURCC(fourcc), - NULL); + structure = gst_structure_new ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, fourcc, NULL); } break; } - if (!caps->properties) - caps->properties = gst_props_empty_new(); - gst_props_add_entry(caps->properties, width); - gst_props_add_entry(caps->properties, height); - gst_props_add_entry(caps->properties, fps); +#if 0 + gst_caps_set_simple (caps, + "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, + "framerate", G_TYPE_DOUBLE, fps, + NULL); +#endif - return caps; + return structure; } #define gst_v4l2src_v4l2fourcc_to_caps_fixed(f, width, height, fps, c) \ @@ -594,19 +565,19 @@ gst_v4l2src_v4l2fourcc_to_caps (guint32 fourcc, static struct v4l2_fmtdesc * gst_v4l2_caps_to_v4l2fourcc (GstV4l2Src *v4l2src, - GstCaps *caps) + GstStructure *structure) { gint i; guint32 fourcc = 0; struct v4l2_fmtdesc *end_fmt = NULL; - const gchar *format = gst_caps_get_mime(caps); + const gchar *format = gst_structure_get_name (structure); if (!strcmp(format, "video/x-raw-yuv") || !strcmp(format, "video/x-raw-rgb")) { if (!strcmp(format, "video/x-raw-rgb")) fourcc = GST_MAKE_FOURCC('R','G','B',' '); else - gst_caps_get_fourcc_int(caps, "format", &fourcc); + gst_structure_get_fourcc (structure, "format", &fourcc); switch (fourcc) { case GST_MAKE_FOURCC('I','4','2','0'): @@ -628,8 +599,8 @@ gst_v4l2_caps_to_v4l2fourcc (GstV4l2Src *v4l2src, case GST_MAKE_FOURCC('R','G','B',' '): { gint depth, endianness; - gst_caps_get_int(caps, "depth", &depth); - gst_caps_get_int(caps, "endianness", &endianness); + gst_structure_get_int (structure, "depth", &depth); + gst_structure_get_int (structure, "endianness", &endianness); switch (depth) { case 8: @@ -721,17 +692,19 @@ gst_v4l2_caps_to_v4l2fourcc (GstV4l2Src *v4l2src, static GstPadLinkReturn gst_v4l2src_srcconnect (GstPad *pad, - GstCaps *vscapslist) + const GstCaps *vscapslist) { GstV4l2Src *v4l2src; GstV4l2Element *v4l2element; - GstCaps *caps; struct v4l2_fmtdesc *format; int w, h; + GstStructure *structure; v4l2src = GST_V4L2SRC(gst_pad_get_parent (pad)); v4l2element = GST_V4L2ELEMENT(v4l2src); + structure = gst_caps_get_structure (vscapslist, 0); + /* clean up if we still haven't cleaned up our previous * capture session */ if (GST_V4L2_IS_ACTIVE(v4l2element)) { @@ -741,52 +714,18 @@ gst_v4l2src_srcconnect (GstPad *pad, return GST_PAD_LINK_DELAYED; } - for (caps = vscapslist; caps != NULL; caps = caps->next) { - /* we want our own v4l2 type of fourcc codes */ - if (!(format = gst_v4l2_caps_to_v4l2fourcc(v4l2src, caps))) { - continue; - } - if (gst_caps_has_property(caps, "width")) { - if (gst_caps_has_fixed_property(caps, "width")) { - gst_caps_get_int(caps, "width", &w); - } else { - int max; - gst_caps_get_int_range(caps, "width", &max, &w); - } - } - if (gst_caps_has_property(caps, "height")) { - if (gst_caps_has_fixed_property(caps, "height")) { - gst_caps_get_int(caps, "height", &h); - } else { - int max; - gst_caps_get_int_range(caps, "height", &max, &h); - } - } + /* we want our own v4l2 type of fourcc codes */ + if (!(format = gst_v4l2_caps_to_v4l2fourcc(v4l2src, structure))) { + return GST_PAD_LINK_REFUSED; + } - /* we found the pixelformat! - try it out */ - if (gst_v4l2src_set_capture(v4l2src, format, w, h)) { - /* it fits! Now, get the proper counterpart and retry - * it on the other side (again...) - if it works, we're - * done -> GST_PAD_LINK_OK */ - GstCaps *lastcaps; - GstPadLinkReturn ret_val; - - lastcaps = gst_v4l2src_v4l2fourcc_to_caps_fixed(format->pixelformat, - v4l2src->format.fmt.pix.width, - v4l2src->format.fmt.pix.height, - gst_v4l2src_get_fps(v4l2src), - format->flags & V4L2_FMT_FLAG_COMPRESSED); - - ret_val = gst_pad_try_set_caps(v4l2src->srcpad, - lastcaps); - - if (ret_val > 0) { - if (gst_v4l2src_capture_init(v4l2src)) { - return GST_PAD_LINK_DONE; - } - } else if (ret_val == GST_PAD_LINK_DELAYED) { - return GST_PAD_LINK_DELAYED; - } + gst_structure_get_int (structure, "width", &w); + gst_structure_get_int (structure, "height", &h); + + /* we found the pixelformat! - try it out */ + if (gst_v4l2src_set_capture(v4l2src, format, w, h)) { + if (gst_v4l2src_capture_init(v4l2src)) { + return GST_PAD_LINK_OK; } } @@ -795,11 +734,10 @@ gst_v4l2src_srcconnect (GstPad *pad, static GstCaps * -gst_v4l2src_getcaps (GstPad *pad, - GstCaps *caps) +gst_v4l2src_getcaps (GstPad *pad) { GstV4l2Src *v4l2src = GST_V4L2SRC(gst_pad_get_parent (pad)); - GstCaps *list = NULL; + GstCaps *caps; gint i; struct v4l2_fmtdesc *format; int min_w, max_w, min_h, max_h; @@ -809,7 +747,10 @@ gst_v4l2src_getcaps (GstPad *pad, } /* build our own capslist */ + caps = gst_caps_new_empty(); for (i=0;i<g_list_length(v4l2src->formats);i++) { + GstStructure *structure; + format = g_list_nth_data(v4l2src->formats, i); /* get size delimiters */ @@ -820,15 +761,19 @@ gst_v4l2src_getcaps (GstPad *pad, } /* add to list */ - caps = gst_v4l2src_v4l2fourcc_to_caps_range(format->pixelformat, - min_w, max_w, - min_h, max_h, - format->flags & V4L2_FMT_FLAG_COMPRESSED); + structure = gst_v4l2src_v4l2fourcc_to_caps (format->pixelformat, + format->flags & V4L2_FMT_FLAG_COMPRESSED); - list = gst_caps_append(list, caps); + gst_structure_set (structure, + "width", GST_TYPE_INT_RANGE, min_w, max_w, + "height", GST_TYPE_INT_RANGE, min_h, max_h, + "framerate", GST_TYPE_DOUBLE_RANGE, 0, G_MAXDOUBLE, + NULL); + + gst_caps_append_structure (caps, structure); } - return list; + return caps; } @@ -848,13 +793,6 @@ gst_v4l2src_get (GstPad *pad) (fps = gst_v4l2src_get_fps(v4l2src)) == 0) return NULL; - buf = gst_buffer_new_from_pool(v4l2src->bufferpool, 0, 0); - if (!buf) { - gst_element_error(GST_ELEMENT(v4l2src), - "Failed to create a new GstBuffer"); - return NULL; - } - if (v4l2src->need_writes > 0) { /* use last frame */ num = v4l2src->last_frame; @@ -929,8 +867,10 @@ gst_v4l2src_get (GstPad *pad) v4l2src->use_num_times[num] = 1; } + buf = gst_buffer_new (); GST_BUFFER_DATA(buf) = gst_v4l2src_get_buffer(v4l2src, num); GST_BUFFER_SIZE(buf) = v4l2src->bufsettings.bytesused; + GST_BUFFER_FLAG_SET(buf, GST_BUFFER_READONLY); if (v4l2src->use_fixed_fps) GST_BUFFER_TIMESTAMP(buf) = v4l2src->handled * GST_SECOND / fps; else /* calculate time based on our own clock */ @@ -1074,6 +1014,7 @@ gst_v4l2src_set_clock (GstElement *element, } +#if 0 static GstBuffer* gst_v4l2src_buffer_new (GstBufferPool *pool, guint64 offset, @@ -1097,8 +1038,9 @@ gst_v4l2src_buffer_new (GstBufferPool *pool, return buffer; } +#endif - +#if 0 static void gst_v4l2src_buffer_free (GstBufferPool *pool, GstBuffer *buf, @@ -1126,3 +1068,5 @@ gst_v4l2src_buffer_free (GstBufferPool *pool, /* free the buffer itself */ gst_buffer_default_free(buf); } +#endif + diff --git a/sys/v4l2/gstv4l2src.h b/sys/v4l2/gstv4l2src.h index 1b4ab095..bae60900 100644 --- a/sys/v4l2/gstv4l2src.h +++ b/sys/v4l2/gstv4l2src.h @@ -80,9 +80,6 @@ struct _GstV4l2Src { /* how are we going to push buffers? */ gboolean use_fixed_fps; - - /* bufferpool for the buffers we're gonna use */ - GstBufferPool *bufferpool; }; struct _GstV4l2SrcClass { |