From 818b452ea77ffe24b4bafc1f06d763f04f14beb6 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Fri, 18 Jun 2004 22:32:44 +0000 Subject: [PATCH] ext/dvdnav/gst-dvd: Grab the gconf key from the right spot Original commit message from CVS: * ext/dvdnav/gst-dvd: Grab the gconf key from the right spot * gst/debug/gstnavseek.c: (gst_navseek_init), (gst_navseek_segseek), (gst_navseek_handle_src_event), (gst_navseek_chain): * gst/debug/gstnavseek.h: Add 's', 'e' and 'l' keypresses to navseek to define the start,end and loop parameters of a segment seek. * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_init), (gst_videotestsrc_get_event_masks), (gst_videotestsrc_handle_src_event), (gst_videotestsrc_get): * gst/videotestsrc/gstvideotestsrc.h: Add seeking support to videotestsrc Initialise the timestamp_offset variable. --- ChangeLog | 16 +++++ gst/videotestsrc/gstvideotestsrc.c | 133 ++++++++++++++++++++++++++++++++++--- gst/videotestsrc/gstvideotestsrc.h | 4 ++ 3 files changed, 145 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 663126f..69908e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2004-06-19 Jan Schmidt + * ext/dvdnav/gst-dvd: + Grab the gconf key from the right spot + * gst/debug/gstnavseek.c: (gst_navseek_init), + (gst_navseek_segseek), (gst_navseek_handle_src_event), + (gst_navseek_chain): + * gst/debug/gstnavseek.h: + Add 's', 'e' and 'l' keypresses to navseek to define the start,end + and loop parameters of a segment seek. + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_init), + (gst_videotestsrc_get_event_masks), + (gst_videotestsrc_handle_src_event), (gst_videotestsrc_get): + * gst/videotestsrc/gstvideotestsrc.h: + Add seeking support to videotestsrc + Initialise the timestamp_offset variable. + 2004-06-18 Wim Taymans * ext/sidplay/gstsiddec.cc: diff --git a/gst/videotestsrc/gstvideotestsrc.c b/gst/videotestsrc/gstvideotestsrc.c index dc7e007..fb57cc4 100644 --- a/gst/videotestsrc/gstvideotestsrc.c +++ b/gst/videotestsrc/gstvideotestsrc.c @@ -75,6 +75,9 @@ static GstData *gst_videotestsrc_get (GstPad * pad); static const GstQueryType *gst_videotestsrc_get_query_types (GstPad * pad); static gboolean gst_videotestsrc_src_query (GstPad * pad, GstQueryType type, GstFormat * format, gint64 * value); +static const GstEventMask *gst_videotestsrc_get_event_masks (GstPad * pad); +static gboolean gst_videotestsrc_handle_src_event (GstPad * pad, + GstEvent * event); static GstElementClass *parent_class = NULL; @@ -355,12 +358,22 @@ gst_videotestsrc_init (GstVideotestsrc * videotestsrc) gst_pad_set_query_function (videotestsrc->srcpad, gst_videotestsrc_src_query); gst_pad_set_query_type_function (videotestsrc->srcpad, gst_videotestsrc_get_query_types); + gst_pad_set_event_mask_function (videotestsrc->srcpad, + gst_videotestsrc_get_event_masks); + gst_pad_set_event_function (videotestsrc->srcpad, + gst_videotestsrc_handle_src_event); + gst_videotestsrc_set_pattern (videotestsrc, GST_VIDEOTESTSRC_SMPTE); videotestsrc->num_buffers = -1; videotestsrc->num_buffers_left = -1; videotestsrc->sync = TRUE; + videotestsrc->need_discont = FALSE; + videotestsrc->loop = FALSE; + videotestsrc->segment_start_frame = -1; + videotestsrc->segment_end_frame = -1; + videotestsrc->timestamp_offset = 0; } @@ -405,6 +418,91 @@ gst_videotestsrc_src_query (GstPad * pad, return res; } +static const GstEventMask * +gst_videotestsrc_get_event_masks (GstPad * pad) +{ + static const GstEventMask src_event_masks[] = { + {GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH}, + {0,} + }; + + return src_event_masks; +} + +static gboolean +gst_videotestsrc_handle_src_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstVideotestsrc *videotestsrc; + gint64 new_n_frames; + + g_return_val_if_fail (pad != NULL, FALSE); + g_return_val_if_fail (GST_IS_PAD (pad), FALSE); + + videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); + new_n_frames = videotestsrc->n_frames; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + { + switch (GST_EVENT_SEEK_FORMAT (event)) { + case GST_FORMAT_TIME: + new_n_frames = + GST_EVENT_SEEK_OFFSET (event) * (double) videotestsrc->rate / + GST_SECOND; + videotestsrc->segment_start_frame = -1; + videotestsrc->segment_end_frame = -1; + break; + case GST_FORMAT_DEFAULT: + new_n_frames = GST_EVENT_SEEK_OFFSET (event); + videotestsrc->segment_start_frame = -1; + videotestsrc->segment_end_frame = -1; + break; + default: + res = FALSE; + break; + } + break; + } + case GST_EVENT_SEEK_SEGMENT: + { + switch (GST_EVENT_SEEK_FORMAT (event)) { + case GST_FORMAT_TIME: + new_n_frames = + GST_EVENT_SEEK_OFFSET (event) * (double) videotestsrc->rate / + GST_SECOND; + videotestsrc->segment_start_frame = new_n_frames; + videotestsrc->segment_end_frame = + GST_EVENT_SEEK_ENDOFFSET (event) * (double) videotestsrc->rate / + GST_SECOND; + videotestsrc->loop = + GST_EVENT_SEEK_TYPE (event) & GST_SEEK_FLAG_SEGMENT_LOOP; + break; + case GST_FORMAT_DEFAULT: + new_n_frames = GST_EVENT_SEEK_OFFSET (event); + videotestsrc->segment_start_frame = new_n_frames; + videotestsrc->segment_end_frame = GST_EVENT_SEEK_ENDOFFSET (event); + videotestsrc->loop = + GST_EVENT_SEEK_TYPE (event) & GST_SEEK_FLAG_SEGMENT_LOOP; + break; + default: + res = FALSE; + break; + } + break; + } + default: + res = FALSE; + break; + } + + if (videotestsrc->n_frames != new_n_frames) { + videotestsrc->n_frames = new_n_frames; + videotestsrc->need_discont = TRUE; + } + + return res; +} static GstData * gst_videotestsrc_get (GstPad * pad) @@ -426,6 +524,33 @@ gst_videotestsrc_get (GstPad * pad) return NULL; } + if (videotestsrc->need_discont) { + GstClockTime ts = videotestsrc->timestamp_offset + + (videotestsrc->n_frames * GST_SECOND) / (double) videotestsrc->rate; + + videotestsrc->need_discont = FALSE; + return GST_DATA (gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, ts, + NULL)); + } + + if ((videotestsrc->segment_end_frame != -1) && + (videotestsrc->n_frames > videotestsrc->segment_end_frame)) { + if (videotestsrc->loop) { + return GST_DATA (gst_event_new (GST_EVENT_SEGMENT_DONE)); + } else { + gst_element_set_eos (GST_ELEMENT (videotestsrc)); + return GST_DATA (gst_event_new (GST_EVENT_EOS)); + } + } + + if (videotestsrc->num_buffers_left == 0) { + gst_element_set_eos (GST_ELEMENT (videotestsrc)); + return GST_DATA (gst_event_new (GST_EVENT_EOS)); + } else { + if (videotestsrc->num_buffers_left > 0) + videotestsrc->num_buffers_left--; + } + newsize = gst_videotestsrc_get_size (videotestsrc, videotestsrc->width, videotestsrc->height); g_return_val_if_fail (newsize > 0, NULL); @@ -455,14 +580,6 @@ gst_videotestsrc_get (GstPad * pad) } GST_BUFFER_DURATION (buf) = GST_SECOND / (double) videotestsrc->rate; - if (videotestsrc->num_buffers_left == 0) { - gst_element_set_eos (GST_ELEMENT (videotestsrc)); - return GST_DATA (gst_event_new (GST_EVENT_EOS)); - } else { - if (videotestsrc->num_buffers_left > 0) - videotestsrc->num_buffers_left--; - } - return GST_DATA (buf); } diff --git a/gst/videotestsrc/gstvideotestsrc.h b/gst/videotestsrc/gstvideotestsrc.h index 1f0eb84..1a48d6b 100644 --- a/gst/videotestsrc/gstvideotestsrc.h +++ b/gst/videotestsrc/gstvideotestsrc.h @@ -69,6 +69,10 @@ struct _GstVideotestsrc { int type; GstClock *clock; gint num_buffers, num_buffers_left; + gboolean need_discont; + gboolean loop; + gint64 segment_start_frame; + gint64 segment_end_frame; void (*make_image)(GstVideotestsrc *v, unsigned char *dest, int w, int h); }; -- 2.7.4