aboutsummaryrefslogtreecommitdiff
path: root/libs/gst
diff options
context:
space:
mode:
Diffstat (limited to 'libs/gst')
-rw-r--r--libs/gst/Makefile.in2
-rw-r--r--libs/gst/base/Makefile.in2
-rw-r--r--libs/gst/base/gstbaseparse.c114
-rw-r--r--libs/gst/base/gstcollectpads.c7
-rw-r--r--libs/gst/check/Makefile.in2
-rw-r--r--libs/gst/check/libcheck/Makefile.in2
-rw-r--r--libs/gst/controller/Makefile.in2
-rw-r--r--libs/gst/helpers/Makefile.in2
-rw-r--r--libs/gst/net/Makefile.in2
9 files changed, 82 insertions, 53 deletions
diff --git a/libs/gst/Makefile.in b/libs/gst/Makefile.in
index 08eb87c..5eaf2f1 100644
--- a/libs/gst/Makefile.in
+++ b/libs/gst/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.14 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
diff --git a/libs/gst/base/Makefile.in b/libs/gst/base/Makefile.in
index 9c97366..21884e8 100644
--- a/libs/gst/base/Makefile.in
+++ b/libs/gst/base/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.14 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c
index 629b92b..07e0e6a 100644
--- a/libs/gst/base/gstbaseparse.c
+++ b/libs/gst/base/gstbaseparse.c
@@ -330,8 +330,10 @@ struct _GstBaseParsePrivate
/* Pending serialized events */
GList *pending_events;
- /* Newsegment event to be sent after SEEK */
- gboolean pending_segment;
+
+ /* If baseparse has checked the caps to identify if it is
+ * handling video or audio */
+ gboolean checked_media;
/* offset of last parsed frame/data */
gint64 prev_offset;
@@ -471,11 +473,14 @@ static GstFlowReturn gst_base_parse_locate_time (GstBaseParse * parse,
static GstFlowReturn gst_base_parse_start_fragment (GstBaseParse * parse);
static GstFlowReturn gst_base_parse_finish_fragment (GstBaseParse * parse,
gboolean prev_head);
+static GstFlowReturn gst_base_parse_send_buffers (GstBaseParse * parse);
static inline GstFlowReturn gst_base_parse_check_sync (GstBaseParse * parse);
static gboolean gst_base_parse_is_seekable (GstBaseParse * parse);
+static void gst_base_parse_push_pending_events (GstBaseParse * parse);
+
static void
gst_base_parse_clear_queues (GstBaseParse * parse)
{
@@ -507,7 +512,8 @@ gst_base_parse_clear_queues (GstBaseParse * parse)
g_list_foreach (parse->priv->pending_events, (GFunc) gst_event_unref, NULL);
g_list_free (parse->priv->pending_events);
parse->priv->pending_events = NULL;
- parse->priv->pending_segment = FALSE;
+
+ parse->priv->checked_media = FALSE;
}
static void
@@ -526,7 +532,6 @@ gst_base_parse_finalize (GObject * object)
NULL);
g_list_free (parse->priv->pending_events);
parse->priv->pending_events = NULL;
- parse->priv->pending_segment = FALSE;
if (parse->priv->index) {
gst_object_unref (parse->priv->index);
@@ -826,6 +831,7 @@ gst_base_parse_reset (GstBaseParse * parse)
parse->priv->idx_byte_interval = 0;
parse->priv->exact_position = TRUE;
parse->priv->seen_keyframe = FALSE;
+ parse->priv->checked_media = FALSE;
parse->priv->last_dts = GST_CLOCK_TIME_NONE;
parse->priv->last_pts = GST_CLOCK_TIME_NONE;
@@ -835,7 +841,6 @@ gst_base_parse_reset (GstBaseParse * parse)
NULL);
g_list_free (parse->priv->pending_events);
parse->priv->pending_events = NULL;
- parse->priv->pending_segment = FALSE;
if (parse->priv->cache) {
gst_buffer_unref (parse->priv->cache);
@@ -1083,6 +1088,7 @@ gst_base_parse_sink_event_default (GstBaseParse * parse, GstEvent * event)
* whatever else it might claim */
parse->priv->upstream_seekable = FALSE;
next_dts = in_segment->start;
+ gst_event_copy_segment (event, &out_segment);
}
memcpy (&parse->segment, &out_segment, sizeof (GstSegment));
@@ -1092,13 +1098,11 @@ gst_base_parse_sink_event_default (GstBaseParse * parse, GstEvent * event)
applied_rate, format, start, stop, start);
*/
- /* save the segment for later, right before we push a new buffer so that
- * the caps are fixed and the next linked element can receive
- * the segment. */
- parse->priv->pending_segment = TRUE;
ret = TRUE;
- /* but finish the current segment */
+ /* save the segment for later, right before we push a new buffer so that
+ * the caps are fixed and the next linked element can receive
+ * the segment but finish the current segment */
GST_DEBUG_OBJECT (parse, "draining current segment");
if (in_segment->rate > 0.0)
gst_base_parse_drain (parse);
@@ -1149,16 +1153,8 @@ gst_base_parse_sink_event_default (GstBaseParse * parse, GstEvent * event)
("No valid frames found before end of stream"), (NULL));
}
/* newsegment and other serialized events before eos */
- if (G_UNLIKELY (parse->priv->pending_events)) {
- GList *l;
+ gst_base_parse_push_pending_events (parse);
- for (l = parse->priv->pending_events; l != NULL; l = l->next) {
- gst_pad_push_event (parse->srcpad, GST_EVENT (l->data));
- }
- g_list_free (parse->priv->pending_events);
- parse->priv->pending_events = NULL;
- parse->priv->pending_segment = FALSE;
- }
if (parse->priv->framecount < MIN_FRAMES_TO_POST_BITRATE) {
/* We've not posted bitrate tags yet - do so now */
gst_base_parse_post_bitrates (parse, TRUE, TRUE, TRUE);
@@ -1192,6 +1188,9 @@ gst_base_parse_sink_event_default (GstBaseParse * parse, GstEvent * event)
case GST_EVENT_GAP:
{
GST_DEBUG_OBJECT (parse, "draining current data due to gap event");
+
+ gst_base_parse_push_pending_events (parse);
+
if (parse->segment.rate > 0.0)
gst_base_parse_drain (parse);
else
@@ -1859,6 +1858,7 @@ gst_base_parse_check_media (GstBaseParse * parse)
if (caps)
gst_caps_unref (caps);
+ parse->priv->checked_media = TRUE;
GST_DEBUG_OBJECT (parse, "media is video: %d", parse->priv->is_video);
}
@@ -2008,6 +2008,26 @@ gst_base_parse_handle_buffer (GstBaseParse * parse, GstBuffer * buffer,
return ret;
}
+/* gst_base_parse_push_pending_events:
+ * @parse: #GstBaseParse
+ *
+ * Pushes the pending events
+ */
+static void
+gst_base_parse_push_pending_events (GstBaseParse * parse)
+{
+ if (G_UNLIKELY (parse->priv->pending_events)) {
+ GList *r = g_list_reverse (parse->priv->pending_events);
+ GList *l;
+
+ parse->priv->pending_events = NULL;
+ for (l = r; l != NULL; l = l->next) {
+ gst_pad_push_event (parse->srcpad, GST_EVENT_CAST (l->data));
+ }
+ g_list_free (r);
+ }
+}
+
/* gst_base_parse_handle_and_push_frame:
* @parse: #GstBaseParse.
* @klass: #GstBaseParseClass.
@@ -2174,23 +2194,13 @@ gst_base_parse_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
if (!gst_pad_has_current_caps (parse->srcpad))
goto no_caps;
- if (G_UNLIKELY (parse->priv->pending_segment)) {
+ if (G_UNLIKELY (!parse->priv->checked_media)) {
/* have caps; check identity */
gst_base_parse_check_media (parse);
}
/* Push pending events, including SEGMENT events */
- if (G_UNLIKELY (parse->priv->pending_events)) {
- GList *r = g_list_reverse (parse->priv->pending_events);
- GList *l;
-
- parse->priv->pending_events = NULL;
- for (l = r; l != NULL; l = l->next) {
- gst_pad_push_event (parse->srcpad, GST_EVENT (l->data));
- }
- g_list_free (r);
- parse->priv->pending_segment = FALSE;
- }
+ gst_base_parse_push_pending_events (parse);
/* segment adjustment magic; only if we are running the whole show */
if (!parse->priv->passthrough && parse->segment.rate > 0.0 &&
@@ -2288,6 +2298,34 @@ gst_base_parse_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
size);
ret = gst_pad_push (parse->srcpad, buffer);
GST_LOG_OBJECT (parse, "frame pushed, flow %s", gst_flow_get_name (ret));
+ } else if (!parse->priv->disable_passthrough && parse->priv->passthrough) {
+
+ /* in backwards playback mode, if on passthrough we need to push buffers
+ * directly without accumulating them into the buffers_queued as baseparse
+ * will never check for a DISCONT while on passthrough and those buffers
+ * will never be pushed.
+ *
+ * also, as we are on reverse playback, it might be possible that
+ * passthrough might have just been enabled, so make sure to drain the
+ * buffers_queued list */
+ if (G_UNLIKELY (parse->priv->buffers_queued != NULL)) {
+ gst_base_parse_finish_fragment (parse, TRUE);
+ ret = gst_base_parse_send_buffers (parse);
+ }
+
+ if (ret == GST_FLOW_OK) {
+ GST_LOG_OBJECT (parse,
+ "pushing frame (%" G_GSIZE_FORMAT " bytes) now..", size);
+ ret = gst_pad_push (parse->srcpad, buffer);
+ GST_LOG_OBJECT (parse, "frame pushed, flow %s",
+ gst_flow_get_name (ret));
+ } else {
+ GST_LOG_OBJECT (parse,
+ "frame (%" G_GSIZE_FORMAT " bytes) not pushed: %s", size,
+ gst_flow_get_name (ret));
+ gst_buffer_unref (buffer);
+ }
+
} else {
GST_LOG_OBJECT (parse, "frame (%" G_GSIZE_FORMAT " bytes) queued for now",
size);
@@ -3206,17 +3244,7 @@ pause:
}
if (push_eos) {
/* Push pending events, including SEGMENT events */
- if (G_UNLIKELY (parse->priv->pending_events)) {
- GList *r = g_list_reverse (parse->priv->pending_events);
- GList *l;
-
- parse->priv->pending_events = NULL;
- for (l = r; l != NULL; l = l->next) {
- gst_pad_push_event (parse->srcpad, GST_EVENT (l->data));
- }
- g_list_free (r);
- parse->priv->pending_segment = FALSE;
- }
+ gst_base_parse_push_pending_events (parse);
gst_pad_push_event (parse->srcpad, gst_event_new_eos ());
}
@@ -3321,7 +3349,6 @@ gst_base_parse_sink_activate_mode (GstPad * pad, GstObject * parent,
parse->priv->pending_events =
g_list_prepend (parse->priv->pending_events,
gst_event_new_segment (&parse->segment));
- parse->priv->pending_segment = TRUE;
result = TRUE;
} else {
result = gst_pad_stop_task (pad);
@@ -4213,7 +4240,6 @@ gst_base_parse_handle_seek (GstBaseParse * parse, GstEvent * event)
/* store the newsegment event so it can be sent from the streaming thread. */
/* This will be sent later in _loop() */
- parse->priv->pending_segment = TRUE;
segment_event = gst_event_new_segment (&parse->segment);
gst_event_set_seqnum (segment_event, seqnum);
parse->priv->pending_events =
diff --git a/libs/gst/base/gstcollectpads.c b/libs/gst/base/gstcollectpads.c
index 799835a..a30e10a 100644
--- a/libs/gst/base/gstcollectpads.c
+++ b/libs/gst/base/gstcollectpads.c
@@ -504,7 +504,8 @@ gst_collect_pads_clip_running_time (GstCollectPads * pads,
if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) {
time = gst_segment_to_running_time (&cdata->segment, GST_FORMAT_TIME, time);
if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) {
- GST_DEBUG_OBJECT (cdata->pad, "clipping buffer on pad outside segment");
+ GST_DEBUG_OBJECT (cdata->pad, "clipping buffer on pad outside segment %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_PTS (buf)));
gst_buffer_unref (buf);
*outbuf = NULL;
} else {
@@ -1716,7 +1717,8 @@ gst_collect_pads_event_default (GstCollectPads * pads, GstCollectData * data,
GST_COLLECT_PADS_STATE_SET (data, GST_COLLECT_PADS_STATE_NEW_SEGMENT);
/* now we can use for e.g. running time */
- seg.position = gst_collect_pads_clip_time (pads, data, seg.start);
+ seg.position =
+ gst_collect_pads_clip_time (pads, data, seg.start + seg.offset);
/* update again */
data->segment = seg;
@@ -1739,6 +1741,7 @@ gst_collect_pads_event_default (GstCollectPads * pads, GstCollectData * data,
GST_COLLECT_PADS_STREAM_LOCK (pads);
gst_event_parse_gap (event, &start, &duration);
+ /* FIXME, handle reverse playback case */
if (GST_CLOCK_TIME_IS_VALID (duration))
start += duration;
/* we do not expect another buffer until after gap,
diff --git a/libs/gst/check/Makefile.in b/libs/gst/check/Makefile.in
index ddafe7f..ce1bce9 100644
--- a/libs/gst/check/Makefile.in
+++ b/libs/gst/check/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.14 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
diff --git a/libs/gst/check/libcheck/Makefile.in b/libs/gst/check/libcheck/Makefile.in
index 893eb88..ad69bac 100644
--- a/libs/gst/check/libcheck/Makefile.in
+++ b/libs/gst/check/libcheck/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.14 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
diff --git a/libs/gst/controller/Makefile.in b/libs/gst/controller/Makefile.in
index c5f1df2..3badfc6 100644
--- a/libs/gst/controller/Makefile.in
+++ b/libs/gst/controller/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.14 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
diff --git a/libs/gst/helpers/Makefile.in b/libs/gst/helpers/Makefile.in
index 25ffee3..6e640f6 100644
--- a/libs/gst/helpers/Makefile.in
+++ b/libs/gst/helpers/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.14 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
diff --git a/libs/gst/net/Makefile.in b/libs/gst/net/Makefile.in
index c713399..2ec6f6e 100644
--- a/libs/gst/net/Makefile.in
+++ b/libs/gst/net/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.14 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.