Skip to content

Instantly share code, notes, and snippets.

@ndufresne
Created June 6, 2014 19:20
Show Gist options
  • Save ndufresne/39c48630b3c6ff653be1 to your computer and use it in GitHub Desktop.
Save ndufresne/39c48630b3c6ff653be1 to your computer and use it in GitHub Desktop.
From ee5933f05e160e80ccbe4b8af2bec7661d8b88cd Mon Sep 17 00:00:00 2001
From: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
Date: Fri, 6 Jun 2014 15:19:58 -0400
Subject: [PATCH] flvmux: Add support for compensation time
Add support for compensation time. It does not work yet, as
GStreamer don't support negative DTS.
---
gst/flv/gstflvmux.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/gst/flv/gstflvmux.c b/gst/flv/gstflvmux.c
index 9b11b4b..d9b24c9 100644
--- a/gst/flv/gstflvmux.c
+++ b/gst/flv/gstflvmux.c
@@ -1001,7 +1001,7 @@ gst_flv_mux_buffer_to_tag_internal (GstFlvMux * mux, GstBuffer * buffer,
GstMapInfo map;
guint size;
guint32 timestamp =
- (GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) ? GST_BUFFER_TIMESTAMP (buffer) /
+ (GST_BUFFER_PTS_IS_VALID (buffer)) ? GST_BUFFER_PTS (buffer) /
GST_MSECOND : cpad->last_timestamp / GST_MSECOND;
guint8 *data, *bdata;
gsize bsize;
@@ -1027,7 +1027,6 @@ gst_flv_mux_buffer_to_tag_internal (GstFlvMux * mux, GstBuffer * buffer,
size += 4;
_gst_buffer_new_and_alloc (size, &tag, &data);
- GST_BUFFER_TIMESTAMP (tag) = timestamp * GST_MSECOND;
memset (data, 0, size);
data[0] = (cpad->video) ? 9 : 8;
@@ -1054,10 +1053,23 @@ gst_flv_mux_buffer_to_tag_internal (GstFlvMux * mux, GstBuffer * buffer,
data[11] |= cpad->video_codec & 0x0f;
if (cpad->video_codec == 7) {
+ gint64 comp_offset = 0;
+
data[12] = is_codec_data ? 0 : 1;
- /* FIXME: what to do about composition time */
- data[13] = data[14] = data[15] = 0;
+ if (GST_BUFFER_DTS_IS_VALID (buffer)) {
+ gint64 dts;
+
+ dts = (GST_BUFFER_DTS (buffer)) / GST_MSECOND;
+
+ /* FIXME GStreamer don't support negative DTS, hence shift forward the DTS
+ * to an unknown offset, which lead to PTS being bigger to DTS
+ * sometimes */
+ if (timestamp >= dts)
+ comp_offset = timestamp - dts;
+ }
+
+ GST_WRITE_UINT24_BE (data + 13, comp_offset);
memcpy (data + 11 + 1 + 4, bdata, bsize);
} else {
@@ -1082,8 +1094,9 @@ gst_flv_mux_buffer_to_tag_internal (GstFlvMux * mux, GstBuffer * buffer,
GST_WRITE_UINT32_BE (data + size - 4, size - 4);
- GST_BUFFER_TIMESTAMP (tag) = GST_BUFFER_TIMESTAMP (buffer);
- GST_BUFFER_DURATION (tag) = GST_BUFFER_DURATION (buffer);
+ GST_BUFFER_PTS (tag) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DTS (tag) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (tag) = GST_BUFFER_DTS (buffer);
GST_BUFFER_OFFSET (tag) = GST_BUFFER_OFFSET (buffer);
GST_BUFFER_OFFSET_END (tag) = GST_BUFFER_OFFSET_END (buffer);
--
1.9.3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment