diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2015-03-28 15:08:15 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-04-11 19:37:20 +0200 |
commit | 448867f0aa6ede612684310562926c5ba7585689 (patch) | |
tree | 52c1e28134c652eb006c84c4129982d9d6a37326 /sys | |
parent | 0dbf5d322f4e2ba9b1cda47b06c221cbbcd62985 (diff) | |
download | gstreamer-plugins-bad-448867f0aa6ede612684310562926c5ba7585689.tar.gz |
amc: Add helper function for getting a direct buffer array
Diffstat (limited to 'sys')
-rw-r--r-- | sys/androidmedia/gstjniutils.c | 62 | ||||
-rw-r--r-- | sys/androidmedia/gstjniutils.h | 11 |
2 files changed, 73 insertions, 0 deletions
diff --git a/sys/androidmedia/gstjniutils.c b/sys/androidmedia/gstjniutils.c index 4e9bce2c0..a0d466ecc 100644 --- a/sys/androidmedia/gstjniutils.c +++ b/sys/androidmedia/gstjniutils.c @@ -827,3 +827,65 @@ GET_STATIC_TYPE_FIELD (gint64, long, Long); GET_STATIC_TYPE_FIELD (gfloat, float, Float); GET_STATIC_TYPE_FIELD (gdouble, double, Double); GET_STATIC_TYPE_FIELD (jobject, object, Object); + +gboolean +gst_amc_jni_get_buffer_array (JNIEnv * env, GError ** err, jobject array, + GstAmcBuffer ** buffers, gsize * n_buffers) +{ + jsize i; + + *n_buffers = (*env)->GetArrayLength (env, array); + *buffers = g_new0 (GstAmcBuffer, *n_buffers); + + for (i = 0; i < *n_buffers; i++) { + jobject buffer = NULL; + + buffer = (*env)->GetObjectArrayElement (env, array, i); + if ((*env)->ExceptionCheck (env) || !buffer) { + gst_amc_jni_set_error (env, GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, + err, "Failed to get buffer %d", i); + goto error; + } + + (*buffers)[i].object = gst_amc_jni_object_make_global (env, buffer); + if (!(*buffers)[i].object) { + gst_amc_jni_set_error (env, GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, + err, "Failed to create global buffer reference %d", i); + goto error; + } + + (*buffers)[i].data = + (*env)->GetDirectBufferAddress (env, (*buffers)[i].object); + if (!(*buffers)[i].data) { + gst_amc_jni_set_error (env, GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, + err, "Failed to get buffer address %d", i); + goto error; + } + (*buffers)[i].size = + (*env)->GetDirectBufferCapacity (env, (*buffers)[i].object); + } + + return TRUE; + +error: + if (*buffers) + gst_amc_jni_free_buffer_array (env, *buffers, *n_buffers); + *buffers = NULL; + *n_buffers = 0; + return FALSE; +} + +void +gst_amc_jni_free_buffer_array (JNIEnv * env, GstAmcBuffer * buffers, + gsize n_buffers) +{ + jsize i; + + g_return_if_fail (buffers != NULL); + + for (i = 0; i < n_buffers; i++) { + if (buffers[i].object) + gst_amc_jni_object_unref (env, buffers[i].object); + } + g_free (buffers); +} diff --git a/sys/androidmedia/gstjniutils.h b/sys/androidmedia/gstjniutils.h index 4dcf43fdc..3a267d52a 100644 --- a/sys/androidmedia/gstjniutils.h +++ b/sys/androidmedia/gstjniutils.h @@ -164,4 +164,15 @@ DEF_GET_STATIC_TYPE_FIELD (gfloat, float, Float); DEF_GET_STATIC_TYPE_FIELD (gdouble, double, Double); DEF_GET_STATIC_TYPE_FIELD (jobject, object, Object); +typedef struct _GstAmcBuffer GstAmcBuffer; + +struct _GstAmcBuffer { + jobject object; /* global reference */ + guint8 *data; + gsize size; +}; + +gboolean gst_amc_jni_get_buffer_array (JNIEnv * env, GError ** err, jobject array, GstAmcBuffer ** buffers, gsize * n_buffers); +void gst_amc_jni_free_buffer_array (JNIEnv * env, GstAmcBuffer * buffers, gsize n_buffers); + #endif |