summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2010-06-06 13:57:06 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2010-06-06 13:57:06 +0200
commitfdf159817332cbaba22337db549c4ae54b0eaba9 (patch)
tree7704de5c58d2973ac595ca676451852f9bbe9b4b
parent21f976066c8c0d58f05632f4338daff2563e3484 (diff)
rtmpsrc: Handle timestamps and the position query
This is not very accurate but better than nothing. The demuxer after the source knows more accurate timestamps.
-rw-r--r--ext/rtmp/gstrtmpsrc.c28
-rw-r--r--ext/rtmp/gstrtmpsrc.h3
2 files changed, 23 insertions, 8 deletions
diff --git a/ext/rtmp/gstrtmpsrc.c b/ext/rtmp/gstrtmpsrc.c
index 692f128ae..2f708d8fd 100644
--- a/ext/rtmp/gstrtmpsrc.c
+++ b/ext/rtmp/gstrtmpsrc.c
@@ -153,7 +153,8 @@ gst_rtmp_src_class_init (GstRTMPSrcClass * klass)
static void
gst_rtmp_src_init (GstRTMPSrc * rtmpsrc, GstRTMPSrcClass * klass)
{
- rtmpsrc->curoffset = 0;
+ rtmpsrc->cur_offset = 0;
+ rtmpsrc->last_timestamp = 0;
}
static void
@@ -314,7 +315,7 @@ gst_rtmp_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer)
size = GST_BASE_SRC_CAST (pushsrc)->blocksize;
GST_DEBUG ("reading from %" G_GUINT64_FORMAT
- ", size %u", src->curoffset, size);
+ ", size %u", src->cur_offset, size);
buf = gst_buffer_try_new_and_alloc (size);
if (G_UNLIKELY (buf == NULL)) {
@@ -324,7 +325,6 @@ gst_rtmp_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer)
data = GST_BUFFER_DATA (buf);
- /* FIXME add FLV header first time around? */
read = 0;
todo = size;
@@ -345,8 +345,11 @@ gst_rtmp_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer)
}
GST_LOG (" got size %" G_GUINT64_FORMAT, read);
}
- GST_BUFFER_OFFSET (buf) = src->curoffset;
- src->curoffset += size;
+
+ src->last_timestamp = src->rtmp->m_mediaStamp * GST_MSECOND;
+ GST_BUFFER_TIMESTAMP (buf) = src->last_timestamp;
+ GST_BUFFER_OFFSET (buf) = src->cur_offset;
+ src->cur_offset += size;
/* we're done, return the buffer */
*buffer = buf;
@@ -379,6 +382,16 @@ gst_rtmp_src_query (GstBaseSrc * basesrc, GstQuery * query)
gst_query_set_uri (query, src->uri);
ret = TRUE;
break;
+ case GST_QUERY_POSITION:{
+ GstFormat format;
+
+ gst_query_parse_position (query, &format, NULL);
+ if (format == GST_FORMAT_TIME) {
+ gst_query_set_duration (query, format, src->last_timestamp);
+ ret = TRUE;
+ }
+ break;
+ }
case GST_QUERY_DURATION:{
GstFormat format;
gdouble duration;
@@ -435,7 +448,7 @@ gst_rtmp_src_start (GstBaseSrc * basesrc)
return FALSE;
}
- src->curoffset = 0;
+ src->cur_offset = 0;
uri_copy = g_strdup (src->uri);
src->rtmp = RTMP_Alloc ();
@@ -492,7 +505,8 @@ gst_rtmp_src_stop (GstBaseSrc * basesrc)
src->rtmp = NULL;
}
- src->curoffset = 0;
+ src->cur_offset = 0;
+ src->last_timestamp = GST_CLOCK_TIME_NONE;
return TRUE;
}
diff --git a/ext/rtmp/gstrtmpsrc.h b/ext/rtmp/gstrtmpsrc.h
index f7224b9db..7bd62e285 100644
--- a/ext/rtmp/gstrtmpsrc.h
+++ b/ext/rtmp/gstrtmpsrc.h
@@ -64,7 +64,8 @@ struct _GstRTMPSrc
RTMP *rtmp;
- gint64 curoffset;
+ gint64 cur_offset;
+ GstClockTime last_timestamp;
};
struct _GstRTMPSrcClass