summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorArun Raghavan <arun@accosted.net>2014-07-01 11:58:36 +0530
committerArun Raghavan <arun@accosted.net>2014-07-03 23:08:22 +0530
commit0b6eae66dfea18b64455c9fa1d3b76103b890058 (patch)
tree5e9b30b433434bdf333fea09820f1a55b09b905d /ext
parent6c4269c0e56e364b03ea7ea313376eb2931ddbc8 (diff)
downloadgstreamer-plugins-bad-0b6eae66dfea18b64455c9fa1d3b76103b890058.tar.gz
openni2src: Fix timestamping
OpenNI2 makes no guarantees of timestamp starting from zero, just that it will be a millisecond timestamp. Make timestamps start from zero manually so things work correctly. https://bugzilla.gnome.org/show_bug.cgi?id=732535
Diffstat (limited to 'ext')
-rw-r--r--ext/openni2/gstopenni2src.cpp35
-rw-r--r--ext/openni2/gstopenni2src.h3
2 files changed, 29 insertions, 9 deletions
diff --git a/ext/openni2/gstopenni2src.cpp b/ext/openni2/gstopenni2src.cpp
index b626bcfe4..d9b08434a 100644
--- a/ext/openni2/gstopenni2src.cpp
+++ b/ext/openni2/gstopenni2src.cpp
@@ -178,6 +178,8 @@ gst_openni2_src_init (GstOpenni2Src * ni2src)
{
gst_base_src_set_live (GST_BASE_SRC (ni2src), TRUE);
gst_base_src_set_format (GST_BASE_SRC (ni2src), GST_FORMAT_TIME);
+
+ ni2src->oni_start_ts = GST_CLOCK_TIME_NONE;
}
static void
@@ -401,7 +403,9 @@ gst_openni2_src_change_state (GstElement * element, GstStateChange transition)
}
break;
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ break;
case GST_STATE_CHANGE_PAUSED_TO_READY:
+ src->oni_start_ts = GST_CLOCK_TIME_NONE;
break;
default:
break;
@@ -592,6 +596,7 @@ openni2_read_gstbuffer (GstOpenni2Src * src, GstBuffer * buf)
openni::VideoStream * pStream = &(src->depth);
int changedStreamDummy;
GstVideoFrame vframe;
+ uint64_t oni_ts;
/* Block until we get some data */
rc = openni::OpenNI::waitForAnyStream (&pStream, 1, &changedStreamDummy,
@@ -638,10 +643,11 @@ openni2_read_gstbuffer (GstOpenni2Src * src, GstBuffer * buf)
}
gst_video_frame_unmap (&vframe);
- GST_BUFFER_PTS (buf) = src->colorFrame.getTimestamp () * 1000;
- GST_LOG_OBJECT (src, "sending buffer (%d+%d)B [%" GST_TIME_FORMAT "]",
+ oni_ts = src->colorFrame.getTimestamp () * 1000;
+
+ GST_LOG_OBJECT (src, "sending buffer (%d+%d)B",
src->colorFrame.getDataSize (),
- src->depthFrame.getDataSize (), GST_TIME_ARGS (GST_BUFFER_PTS (buf)));
+ src->depthFrame.getDataSize ());
} else if (src->depth.isValid () && src->sourcetype == SOURCETYPE_DEPTH) {
rc = src->depth.readFrame (&src->depthFrame);
if (rc != openni::STATUS_OK) {
@@ -663,11 +669,12 @@ openni2_read_gstbuffer (GstOpenni2Src * src, GstBuffer * buf)
}
gst_video_frame_unmap (&vframe);
- GST_BUFFER_PTS (buf) = src->depthFrame.getTimestamp () * 1000;
- GST_LOG_OBJECT (src, "sending buffer (%dx%d)=%dB [%" GST_TIME_FORMAT "]",
+ oni_ts = src->depthFrame.getTimestamp () * 1000;
+
+ GST_LOG_OBJECT (src, "sending buffer (%dx%d)=%dB",
src->depthFrame.getWidth (),
src->depthFrame.getHeight (),
- src->depthFrame.getDataSize (), GST_TIME_ARGS (GST_BUFFER_PTS (buf)));
+ src->depthFrame.getDataSize ());
} else if (src->color.isValid () && src->sourcetype == SOURCETYPE_COLOR) {
rc = src->color.readFrame (&src->colorFrame);
if (rc != openni::STATUS_OK) {
@@ -688,12 +695,22 @@ openni2_read_gstbuffer (GstOpenni2Src * src, GstBuffer * buf)
}
gst_video_frame_unmap (&vframe);
- GST_BUFFER_PTS (buf) = src->colorFrame.getTimestamp () * 1000;
- GST_LOG_OBJECT (src, "sending buffer (%dx%d)=%dB [%" GST_TIME_FORMAT "]",
+ oni_ts = src->colorFrame.getTimestamp () * 1000;
+
+ GST_LOG_OBJECT (src, "sending buffer (%dx%d)=%dB",
src->colorFrame.getWidth (),
src->colorFrame.getHeight (),
- src->colorFrame.getDataSize (), GST_TIME_ARGS (GST_BUFFER_PTS (buf)));
+ src->colorFrame.getDataSize ());
}
+
+ if (G_UNLIKELY (src->oni_start_ts == GST_CLOCK_TIME_NONE))
+ src->oni_start_ts = oni_ts;
+
+ GST_BUFFER_PTS (buf) = oni_ts - src->oni_start_ts;
+
+ GST_LOG_OBJECT (src, "Calculated PTS as %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_PTS (buf)));
+
return GST_FLOW_OK;
}
diff --git a/ext/openni2/gstopenni2src.h b/ext/openni2/gstopenni2src.h
index 1d5627e8c..103ff56d9 100644
--- a/ext/openni2/gstopenni2src.h
+++ b/ext/openni2/gstopenni2src.h
@@ -57,6 +57,9 @@ struct _GstOpenni2Src
GstVideoInfo info;
GstCaps *gst_caps;
+ /* Timestamp of the first frame */
+ GstClockTime oni_start_ts;
+
/* OpenNI2 variables */
openni::Device device;
openni::VideoStream depth, color;