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.
This commit is contained in:
Jan Schmidt 2004-06-18 22:32:44 +00:00
parent 1ea7b04126
commit 818b452ea7
3 changed files with 145 additions and 8 deletions

View file

@ -1,3 +1,19 @@
2004-06-19 Jan Schmidt <thaytan@mad.scientist.com>
* 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 <wim@fluendo.com>
* ext/sidplay/gstsiddec.cc:

View file

@ -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);
}

View file

@ -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);
};