summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorYouness Alaoui <youness.alaoui@collabora.co.uk>2012-10-17 19:42:59 -0400
committerNicolas Dufresne <nicolas.dufresne@collabora.com>2016-01-21 12:44:37 -0500
commit7b8dbd32db8baca19163e2ff783710ce2b8af421 (patch)
treede3b083b02501cc45d5fc4d5f4f1b6aebbe75701 /sys
parentfff14b255cef63db8f8d1b88e6751c51c8fc8553 (diff)
downloadgstreamer-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.c27
-rw-r--r--sys/androidcamera/gstahcsrc.h1
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