diff options
author | Youness Alaoui <youness.alaoui@collabora.co.uk> | 2012-10-17 19:42:59 -0400 |
---|---|---|
committer | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2016-01-21 12:44:37 -0500 |
commit | 7b8dbd32db8baca19163e2ff783710ce2b8af421 (patch) | |
tree | de3b083b02501cc45d5fc4d5f4f1b6aebbe75701 /sys | |
parent | fff14b255cef63db8f8d1b88e6751c51c8fc8553 (diff) | |
download | gstreamer-plugins-bad-7b8dbd32db8baca19163e2ff783710ce2b8af421.tar.gz |
Calculate timestamp at reception of the buffer, not when pushing it out
Diffstat (limited to 'sys')
-rw-r--r-- | sys/androidcamera/gstahcsrc.c | 27 | ||||
-rw-r--r-- | sys/androidcamera/gstahcsrc.h | 1 |
2 files changed, 22 insertions, 6 deletions
diff --git a/sys/androidcamera/gstahcsrc.c b/sys/androidcamera/gstahcsrc.c index 5745bd543..bf5adab7b 100644 --- a/sys/androidcamera/gstahcsrc.c +++ b/sys/androidcamera/gstahcsrc.c @@ -116,7 +116,7 @@ gst_ahc_src_init (GstAHCSrc * self, GstAHCSrcClass * klass) { gst_base_src_set_live (GST_BASE_SRC (self), TRUE); gst_base_src_set_format (GST_BASE_SRC (self), GST_FORMAT_TIME); - gst_base_src_set_do_timestamp (GST_BASE_SRC (self), TRUE); + gst_base_src_set_do_timestamp (GST_BASE_SRC (self), FALSE); self->camera = NULL; self->texture = gst_ag_surfacetexture_new (0); @@ -216,8 +216,9 @@ gst_ahc_src_on_preview_frame (jbyteArray data, gpointer user_data) GstBuffer *buffer; GstDataQueueItem *item = g_slice_new0 (GstDataQueueItem); FreeFuncBuffer *malloc_data = g_slice_new0 (FreeFuncBuffer); + GstClock *clock; - GST_WARNING_OBJECT (self, "Received data buffer %p", data); + //GST_WARNING_OBJECT (self, "Received data buffer %p", data); malloc_data->self = self; malloc_data->array = (*env)->NewGlobalRef (env, data); malloc_data->data = (*env)->GetByteArrayElements (env, data, NULL); @@ -227,7 +228,21 @@ gst_ahc_src_on_preview_frame (jbyteArray data, gpointer user_data) GST_BUFFER_SIZE (buffer) = self->buffer_size; GST_BUFFER_MALLOCDATA (buffer) = (gpointer) malloc_data; GST_BUFFER_FREE_FUNC (buffer) = gst_ahc_src_buffer_free_func; - GST_BUFFER_DURATION (buffer) = (1.0 / 30.0) * GST_SECOND; + GST_BUFFER_DURATION (buffer) = 0; + GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE; + if ((clock = GST_ELEMENT_CLOCK (self))) { + GstClockTime base_time = GST_ELEMENT_CAST (self)->base_time; + GstClockTime current_ts; + + gst_object_ref (clock); + current_ts = gst_clock_get_time (clock) - base_time; + if (GST_CLOCK_TIME_IS_VALID (self->previous_ts)) { + GST_BUFFER_TIMESTAMP (buffer) = self->previous_ts; + GST_BUFFER_DURATION (buffer) = current_ts - self->previous_ts; + } + self->previous_ts = current_ts; + gst_object_unref (clock); + } gst_buffer_set_caps (buffer, self->caps); @@ -287,8 +302,6 @@ gst_ahc_src_open (GstAHCSrc * self) gst_ah_camera_set_preview_texture (self->camera, self->texture); gst_ah_camera_set_error_callback (self->camera, gst_ahc_src_on_error, self); - gst_ah_camera_set_preview_callback_with_buffer (self->camera, - gst_ahc_src_on_preview_frame, self); for (i = 0; i < NUM_CALLBACK_BUFFERS; i++) { jbyteArray array = (*env)->NewByteArray (env, self->buffer_size); @@ -404,9 +417,11 @@ gst_ahc_src_start (GstBaseSrc * bsrc) GST_WARNING_OBJECT (self, "Starting preview"); if (self->camera) { gboolean ret = gst_ah_camera_start_preview (self->camera); - if (ret) + if (ret) { + self->previous_ts = GST_CLOCK_TIME_NONE; gst_ah_camera_set_preview_callback_with_buffer (self->camera, gst_ahc_src_on_preview_frame, self); + } return ret; } else { return FALSE; diff --git a/sys/androidcamera/gstahcsrc.h b/sys/androidcamera/gstahcsrc.h index 71956eecf..c28f0b640 100644 --- a/sys/androidcamera/gstahcsrc.h +++ b/sys/androidcamera/gstahcsrc.h @@ -55,6 +55,7 @@ struct _GstAHCSrc GList *data; GstDataQueue *queue; gint buffer_size; + GstClockTime previous_ts; }; struct _GstAHCSrcClass |