summaryrefslogtreecommitdiffstats
path: root/gst/flv/gstflvdemux.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/flv/gstflvdemux.c')
-rw-r--r--gst/flv/gstflvdemux.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/gst/flv/gstflvdemux.c b/gst/flv/gstflvdemux.c
index dc148507..8cc74f1d 100644
--- a/gst/flv/gstflvdemux.c
+++ b/gst/flv/gstflvdemux.c
@@ -443,6 +443,38 @@ gst_flv_demux_loop (GstPad * pad)
break;
default:
ret = gst_flv_demux_pull_header (pad, demux);
+
+ /* If we parsed the header successfully try to get an
+ * approximate duration by looking at the last tag's timestamp */
+ if (ret == GST_FLOW_OK) {
+ gint64 size;
+ GstFormat fmt = GST_FORMAT_BYTES;
+
+ if (gst_pad_query_peer_duration (pad, &fmt, &size) &&
+ fmt == GST_FORMAT_BYTES && size != -1 && size > FLV_HEADER_SIZE) {
+ GstBuffer *buffer;
+
+ if (gst_flv_demux_pull_range (demux, pad, size - 4, 4,
+ &buffer) == GST_FLOW_OK) {
+ guint32 prev_tag_size =
+ GST_READ_UINT32_BE (GST_BUFFER_DATA (buffer));
+
+ gst_buffer_unref (buffer);
+
+ if (size - 4 - prev_tag_size > FLV_HEADER_SIZE &&
+ prev_tag_size >= 8 &&
+ gst_flv_demux_pull_range (demux, pad,
+ size - prev_tag_size - 4, prev_tag_size,
+ &buffer) == GST_FLOW_OK) {
+ demux->duration =
+ gst_flv_parse_tag_timestamp (demux,
+ GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer));
+
+ gst_buffer_unref (buffer);
+ }
+ }
+ }
+ }
}
/* pause if something went wrong */