summaryrefslogtreecommitdiffstats
path: root/gst/speed
diff options
context:
space:
mode:
Diffstat (limited to 'gst/speed')
-rw-r--r--gst/speed/gstspeed.c135
1 files changed, 47 insertions, 88 deletions
diff --git a/gst/speed/gstspeed.c b/gst/speed/gstspeed.c
index 9bf97c6e..1d65f4f1 100644
--- a/gst/speed/gstspeed.c
+++ b/gst/speed/gstspeed.c
@@ -221,47 +221,41 @@ static gboolean
speed_src_event (GstPad * pad, GstEvent * event)
{
GstSpeed *filter;
- gboolean ret = TRUE;
+ gboolean ret = FALSE;
filter = GST_SPEED (gst_pad_get_parent (pad));
switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_SEEK:
- {
-
+ case GST_EVENT_SEEK:{
gdouble rate;
GstFormat format;
GstSeekFlags flags;
GstSeekType start_type, stop_type;
gint64 start, stop;
- gst_event_parse_seek (event, &rate, &format, &flags,
- &start_type, &start, &stop_type, &stop);
- switch (format) {
- case GST_FORMAT_DEFAULT:
- /* fall through */
- case GST_FORMAT_BYTES:
- /* fall through */
- case GST_FORMAT_TIME:
- gst_event_unref (event);
-
- if (start_type != GST_SEEK_TYPE_NONE) {
- start *= filter->speed;
- }
+ gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
+ &stop_type, &stop);
+ gst_event_unref (event);
- if (stop_type != GST_SEEK_TYPE_NONE) {
- stop *= filter->speed;
- }
+ if (format != GST_FORMAT_TIME) {
+ GST_DEBUG_OBJECT (filter, "only support seeks in TIME format");
+ break;
+ }
- event = gst_event_new_seek (rate, format, flags, start_type, start,
- stop_type, stop);
+ if (start_type != GST_SEEK_TYPE_NONE && start != -1) {
+ start *= filter->speed;
+ }
- ret = gst_pad_send_event (GST_PAD_PEER (filter->sinkpad), event);
- break;
- default:
- break;
+ if (stop_type != GST_SEEK_TYPE_NONE && stop != -1) {
+ stop *= filter->speed;
}
+ event = gst_event_new_seek (rate, format, flags, start_type, start,
+ stop_type, stop);
+
+ GST_LOG ("sending seek event: %" GST_PTR_FORMAT, event->structure);
+
+ ret = gst_pad_send_event (GST_PAD_PEER (filter->sinkpad), event);
break;
}
default:
@@ -589,87 +583,47 @@ speed_chain_float32 (GstSpeed * filter, GstBuffer * in_buf, GstBuffer * out_buf,
static gboolean
speed_sink_event (GstPad * pad, GstEvent * event)
{
-
-
GstSpeed *filter;
- gboolean ret;
+ gboolean ret = FALSE;
filter = GST_SPEED (gst_pad_get_parent (pad));
switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_NEWSEGMENT:
- {
-
+ case GST_EVENT_NEWSEGMENT:{
gdouble rate;
gboolean update = FALSE;
- GstFormat format, conv_format;
+ GstFormat format;
gint64 start_value, stop_value, base;
gst_event_parse_new_segment (event, &update, &rate, &format, &start_value,
&stop_value, &base);
-
- g_assert (filter->speed > 0);
-
- start_value /= filter->speed;
- stop_value /= filter->speed;
-
- if (format == GST_FORMAT_TIME) {
-
- conv_format = GST_FORMAT_BYTES;
-
- filter->timestamp = start_value;
- ret = gst_speed_convert (pad, GST_FORMAT_TIME, filter->timestamp,
- &conv_format, &filter->offset);
-
-
- } else if (format == GST_FORMAT_BYTES) {
-
- conv_format = GST_FORMAT_TIME;
-
- filter->offset = start_value;
- ret = gst_speed_convert (pad, GST_FORMAT_BYTES, filter->offset,
- &conv_format, &filter->timestamp);
-
-
- } else if (format == GST_FORMAT_DEFAULT) {
-
- conv_format = GST_FORMAT_TIME;
-
- ret = gst_speed_convert (pad, GST_FORMAT_BYTES, start_value,
- &conv_format, &filter->timestamp);
-
- conv_format = GST_FORMAT_BYTES;
-
- ret = gst_speed_convert (pad, GST_FORMAT_TIME, start_value,
- &conv_format, &filter->offset);
-
- }
-
gst_event_unref (event);
- event =
- gst_event_new_new_segment (update, rate, format, start_value,
- stop_value, base);
-
- if (!(ret = gst_pad_event_default (pad, event))) {
- gst_event_unref (event);
+ if (format != GST_FORMAT_TIME) {
+ GST_WARNING_OBJECT (filter, "newsegment event not in TIME format!");
+ break;
}
- ret = TRUE;
-
- break;
- }
+ g_assert (filter->speed > 0);
- case GST_EVENT_EOS:
+ if (start_value >= 0)
+ start_value /= filter->speed;
+ if (stop_value >= 0)
+ stop_value /= filter->speed;
+ base /= filter->speed;
- if (!(ret = gst_pad_event_default (pad, event))) {
- gst_event_unref (event);
- }
+ /* this would only really be correct if we clipped incoming data */
+ filter->timestamp = start_value;
- ret = TRUE;
+ /* set to NONE so it gets reset later based on the timestamp when we have
+ * the samplerate */
+ filter->offset = GST_BUFFER_OFFSET_NONE;
+ ret =
+ gst_pad_event_default (pad, gst_event_new_new_segment (update, rate,
+ format, start_value, stop_value, base));
break;
-
+ }
default:
ret = gst_pad_event_default (pad, event);
break;
@@ -698,6 +652,11 @@ speed_chain (GstPad * pad, GstBuffer * in_buf)
goto done;
}
+ if (G_UNLIKELY (filter->offset == GST_BUFFER_OFFSET_NONE)) {
+ filter->offset =
+ gst_util_uint64_scale_int (filter->timestamp, filter->rate, GST_SECOND);
+ }
+
/* buffersize has to be aligned by samplesize */
out_size = ceil ((gfloat) GST_BUFFER_SIZE (in_buf) / filter->speed);
out_size = ((out_size + filter->sample_size - 1) / filter->sample_size) *
@@ -788,7 +747,7 @@ speed_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_READY_TO_PAUSED:
- speed->offset = 0;
+ speed->offset = GST_BUFFER_OFFSET_NONE;
speed->timestamp = 0;
break;
default: