mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-19 00:01:23 +00:00
gst/videoparse/gstvideoparse.c: Implement a query type function for the src pad, implement seeking and use ANY caps f...
Original commit message from CVS: * gst/videoparse/gstvideoparse.c: (gst_video_parse_init), (gst_video_parse_src_event), (gst_video_parse_src_query_type): Implement a query type function for the src pad, implement seeking and use ANY caps for the sink pad as the element doesn't care what caps the input has and everything is handled via properties.
This commit is contained in:
parent
e29787776c
commit
9adb4f7870
2 changed files with 76 additions and 1 deletions
|
@ -1,3 +1,11 @@
|
|||
2007-12-13 Sebastian Dröge <slomo@circular-chaos.org>
|
||||
|
||||
* gst/videoparse/gstvideoparse.c: (gst_video_parse_init),
|
||||
(gst_video_parse_src_event), (gst_video_parse_src_query_type):
|
||||
Implement a query type function for the src pad, implement seeking
|
||||
and use ANY caps for the sink pad as the element doesn't care what
|
||||
caps the input has and everything is handled via properties.
|
||||
|
||||
2007-12-13 Sebastian Dröge <slomo@circular-chaos.org>
|
||||
|
||||
* gst/videoparse/gstvideoparse.c: (gst_video_parse_convert),
|
||||
|
|
|
@ -101,6 +101,8 @@ static void gst_video_parse_get_property (GObject * object, guint prop_id,
|
|||
|
||||
static GstFlowReturn gst_video_parse_chain (GstPad * pad, GstBuffer * buffer);
|
||||
static gboolean gst_video_parse_sink_event (GstPad * pad, GstEvent * event);
|
||||
static gboolean gst_video_parse_src_event (GstPad * pad, GstEvent * event);
|
||||
static const GstQueryType *gst_video_parse_src_query_type (GstPad * pad);
|
||||
static gboolean gst_video_parse_src_query (GstPad * pad, GstQuery * query);
|
||||
static gboolean gst_video_parse_convert (GstVideoParse * vp,
|
||||
GstFormat src_format, gint64 src_value,
|
||||
|
@ -118,7 +120,7 @@ static GstStaticPadTemplate gst_video_parse_sink_pad_template =
|
|||
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ I420, YV12, YUY2, UYVY }")));
|
||||
GST_STATIC_CAPS_ANY);
|
||||
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_video_parse_debug);
|
||||
#define GST_CAT_DEFAULT gst_video_parse_debug
|
||||
|
@ -226,7 +228,11 @@ gst_video_parse_init (GstVideoParse * vp, GstVideoParseClass * g_class)
|
|||
"src");
|
||||
gst_element_add_pad (GST_ELEMENT (vp), vp->srcpad);
|
||||
|
||||
gst_pad_set_event_function (vp->srcpad, gst_video_parse_src_event);
|
||||
|
||||
if (1) {
|
||||
gst_pad_set_query_type_function (vp->srcpad,
|
||||
gst_video_parse_src_query_type);
|
||||
gst_pad_set_query_function (vp->srcpad, gst_video_parse_src_query);
|
||||
}
|
||||
|
||||
|
@ -551,6 +557,67 @@ gst_video_parse_sink_event (GstPad * pad, GstEvent * event)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_video_parse_src_event (GstPad * pad, GstEvent * event)
|
||||
{
|
||||
GstVideoParse *vp = GST_VIDEO_PARSE (gst_pad_get_parent (pad));
|
||||
gboolean ret;
|
||||
|
||||
switch (GST_EVENT_TYPE (event)) {
|
||||
case GST_EVENT_SEEK:{
|
||||
GstFormat format;
|
||||
gdouble rate;
|
||||
GstSeekFlags flags;
|
||||
GstSeekType start_type, stop_type;
|
||||
gint64 start, stop;
|
||||
|
||||
gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
|
||||
&stop_type, &stop);
|
||||
|
||||
/* We only handle TIME and DEFAULT (aka frames), forward everything
|
||||
* upstream */
|
||||
if (format != GST_FORMAT_TIME && format != GST_FORMAT_DEFAULT) {
|
||||
gst_event_ref (event);
|
||||
ret = gst_pad_push_event (vp->sinkpad, event);
|
||||
} else {
|
||||
ret =
|
||||
gst_video_parse_convert (vp, format, start, GST_FORMAT_BYTES,
|
||||
&start);
|
||||
ret &=
|
||||
gst_video_parse_convert (vp, format, stop, GST_FORMAT_BYTES, &stop);
|
||||
|
||||
if (ret) {
|
||||
event =
|
||||
gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, start_type,
|
||||
start, stop_type, stop);
|
||||
|
||||
ret = gst_pad_push_event (vp->sinkpad, event);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ret = gst_pad_event_default (vp->srcpad, event);
|
||||
break;
|
||||
}
|
||||
|
||||
gst_object_unref (vp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const GstQueryType *
|
||||
gst_video_parse_src_query_type (GstPad * pad)
|
||||
{
|
||||
static const GstQueryType types[] = {
|
||||
GST_QUERY_POSITION,
|
||||
GST_QUERY_DURATION,
|
||||
GST_QUERY_CONVERT,
|
||||
0
|
||||
};
|
||||
|
||||
return types;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_video_parse_src_query (GstPad * pad, GstQuery * query)
|
||||
|
|
Loading…
Reference in a new issue