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:11:16 -0500
commit4cbfe6fa134cc9d59e845c097d1d00ee131bed1d (patch)
treecb1f09ae68cd65d15234b95b5898542a25015f0a /sys
parentaf47c1ebdc182c17b88c59cf393aea3bcd280bdb (diff)
downloadgstreamer-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.c40
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;
}