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:11:16 -0500 |
commit | 4cbfe6fa134cc9d59e845c097d1d00ee131bed1d (patch) | |
tree | cb1f09ae68cd65d15234b95b5898542a25015f0a /sys | |
parent | af47c1ebdc182c17b88c59cf393aea3bcd280bdb (diff) | |
download | gstreamer-plugins-bad-4cbfe6fa134cc9d59e845c097d1d00ee131bed1d.tar.gz |
Use the buffer's free_func to map byteArray data without making a copy
Diffstat (limited to 'sys')
-rw-r--r-- | sys/androidcamera/gstahcsrc.c | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/sys/androidcamera/gstahcsrc.c b/sys/androidcamera/gstahcsrc.c index 9afc6ca19..ec86ecf0f 100644 --- a/sys/androidcamera/gstahcsrc.c +++ b/sys/androidcamera/gstahcsrc.c @@ -385,11 +385,33 @@ gst_ahc_src_unlock_stop (GstBaseSrc * bsrc) return TRUE; } +typedef struct { + GstAHCSrc *self; + jbyteArray array; + jbyte *data; +} FreeFuncBuffer; + +static void +gst_ahc_src_buffer_free_func (gpointer priv) +{ + FreeFuncBuffer *data = (FreeFuncBuffer *) priv; + GstAHCSrc *self = data->self; + JNIEnv *env = gst_dvm_get_env (); + + (*env)->ReleaseByteArrayElements(env, data->array, data->data, JNI_ABORT); + if (self->camera) + gst_ah_camera_add_callback_buffer (self->camera, data->array); + (*env)->DeleteGlobalRef (env, data->array); + + g_slice_free (FreeFuncBuffer, data); +} + static GstFlowReturn gst_ahc_src_create (GstPushSrc * src, GstBuffer ** buffer) { GstAHCSrc *self = GST_AHC_SRC (src); JNIEnv *env = gst_dvm_get_env (); + FreeFuncBuffer *user_data; jbyteArray data = NULL; while (data == NULL) { @@ -398,13 +420,19 @@ gst_ahc_src_create (GstPushSrc * src, GstBuffer ** buffer) return GST_FLOW_WRONG_STATE; } - *buffer = gst_buffer_new_and_alloc (self->buffer_size); - (*env)->GetByteArrayRegion (env, data, 0, self->buffer_size, - (jbyte *) GST_BUFFER_DATA (*buffer)); - gst_buffer_set_caps (*buffer, self->caps); + //GST_WARNING_OBJECT (self, "Received data buffer %p", data); + + user_data = g_slice_new0 (FreeFuncBuffer); + user_data->self = self; + user_data->array = data; + user_data->data = (*env)->GetByteArrayElements (env, data, NULL); - gst_ah_camera_add_callback_buffer (self->camera, data); - (*env)->DeleteGlobalRef (env, data); + *buffer = gst_buffer_new (); + GST_BUFFER_DATA (*buffer) = (guint8 *) user_data->data; + GST_BUFFER_SIZE (*buffer) = self->buffer_size; + GST_BUFFER_MALLOCDATA (*buffer) = (gpointer) user_data; + GST_BUFFER_FREE_FUNC (*buffer) = gst_ahc_src_buffer_free_func; + gst_buffer_set_caps (*buffer, self->caps); return GST_FLOW_OK; } |