[gst-cvs] gst-plugins-bad: rtmpsrc: Handle timestamps and the position query

Sebastian Dröge slomo at kemper.freedesktop.org
Sun Jun 6 06:09:56 PDT 2010


Module: gst-plugins-bad
Branch: master
Commit: fdf159817332cbaba22337db549c4ae54b0eaba9
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=fdf159817332cbaba22337db549c4ae54b0eaba9

Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date:   Sun Jun  6 13:57:06 2010 +0200

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.

---

 ext/rtmp/gstrtmpsrc.c |   28 +++++++++++++++++++++-------
 ext/rtmp/gstrtmpsrc.h |    3 ++-
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/ext/rtmp/gstrtmpsrc.c b/ext/rtmp/gstrtmpsrc.c
index 692f128..2f708d8 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 f7224b9..7bd62e2 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





More information about the Gstreamer-commits mailing list