From a50ce9c6b06cf81594be011df421f4061b127cb9 Mon Sep 17 00:00:00 2001 From: Ratchanan Srirattanamet Date: Sun, 12 Nov 2023 02:32:21 +0700 Subject: [PATCH] androidmedia: allow multiple implementations of codec and format When implementing NDK media support, it would be useful to also have JNI implementation in the same binary as NDK media compatibility is lower. As such, implement a rudimentary vtable system for gstamc-codec and gstamc-format, and allow choosing the implementation at static_init() time. Part-of: --- .../sys/androidmedia/gstamc-codec.c | 179 ++++++++++++++++++ .../sys/androidmedia/gstamc-codec.h | 77 ++++++++ .../sys/androidmedia/gstamc-format.c | 122 ++++++++++++ .../sys/androidmedia/gstamc-format.h | 62 ++++++ .../sys/androidmedia/jni/gstamc-codec-jni.c | 143 ++++++++------ .../sys/androidmedia/jni/gstamc-format-jni.c | 71 ++++--- .../sys/androidmedia/jni/gstamc-jni.c | 3 + .../sys/androidmedia/jni/gstamc-jni.h | 6 + .../androidmedia/magicleap/gstamc-codec-ml.c | 118 ++++++++---- .../androidmedia/magicleap/gstamc-format-ml.c | 73 ++++--- .../magicleap/gstamc-internal-ml.h | 8 +- .../sys/androidmedia/magicleap/gstamc-ml.c | 5 + .../sys/androidmedia/meson.build | 2 + 13 files changed, 716 insertions(+), 153 deletions(-) create mode 100644 subprojects/gst-plugins-bad/sys/androidmedia/gstamc-codec.c create mode 100644 subprojects/gst-plugins-bad/sys/androidmedia/gstamc-format.c diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-codec.c b/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-codec.c new file mode 100644 index 0000000000..ec5b0ff10b --- /dev/null +++ b/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-codec.c @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2012,2018 Collabora Ltd. + * Author: Sebastian Dröge + * Copyright (C) 2022 Ratchanan Srirattanamet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "gstamc-codec.h" + +GstAmcCodecVTable *gst_amc_codec_vtable = NULL; + +void +gst_amc_buffer_free (GstAmcBuffer * buffer) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->buffer_free (buffer); +} + +gboolean +gst_amc_buffer_set_position_and_limit (GstAmcBuffer * buffer, GError ** err, + gint position, gint limit) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->buffer_set_position_and_limit (buffer, err, + position, limit); +} + +GstAmcCodec * +gst_amc_codec_new (const gchar * name, gboolean is_encoder, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->create (name, is_encoder, err); +} + +void +gst_amc_codec_free (GstAmcCodec * codec) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->free (codec); +} + +gboolean +gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, + GstAmcSurfaceTexture * surface_texture, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->configure (codec, format, surface_texture, err); +} + +GstAmcFormat * +gst_amc_codec_get_output_format (GstAmcCodec * codec, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->get_output_format (codec, err); +} + +gboolean +gst_amc_codec_start (GstAmcCodec * codec, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->start (codec, err); +} + +gboolean +gst_amc_codec_stop (GstAmcCodec * codec, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->stop (codec, err); +} + +gboolean +gst_amc_codec_flush (GstAmcCodec * codec, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->flush (codec, err); +} + +gboolean +gst_amc_codec_release (GstAmcCodec * codec, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->release (codec, err); +} + +gboolean +gst_amc_codec_request_key_frame (GstAmcCodec * codec, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->request_key_frame (codec, err); +} + +gboolean +gst_amc_codec_have_dynamic_bitrate (void) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->have_dynamic_bitrate (); +} + +gboolean +gst_amc_codec_set_dynamic_bitrate (GstAmcCodec * codec, GError ** err, + gint bitrate) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->set_dynamic_bitrate (codec, err, bitrate); +} + +GstAmcBuffer * +gst_amc_codec_get_output_buffer (GstAmcCodec * codec, gint index, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->get_output_buffer (codec, index, err); +} + +GstAmcBuffer * +gst_amc_codec_get_input_buffer (GstAmcCodec * codec, gint index, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->get_input_buffer (codec, index, err); +} + +gint +gst_amc_codec_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs, + GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->dequeue_input_buffer (codec, timeoutUs, err); +} + +gint +gst_amc_codec_dequeue_output_buffer (GstAmcCodec * codec, + GstAmcBufferInfo * info, gint64 timeoutUs, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->dequeue_output_buffer (codec, info, timeoutUs, + err); +} + +gboolean +gst_amc_codec_queue_input_buffer (GstAmcCodec * codec, gint index, + const GstAmcBufferInfo * info, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->queue_input_buffer (codec, index, info, err); +} + +gboolean +gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, + gboolean render, GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->release_output_buffer (codec, index, render, + err); +} + +GstAmcSurfaceTexture * +gst_amc_codec_new_surface_texture (GError ** err) +{ + g_assert (gst_amc_codec_vtable != NULL); + return gst_amc_codec_vtable->new_surface_texture (err); +} diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-codec.h b/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-codec.h index ce5d5a2e64..5a77d460ff 100644 --- a/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-codec.h +++ b/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-codec.h @@ -30,6 +30,7 @@ G_BEGIN_DECLS typedef struct _GstAmcBuffer GstAmcBuffer; typedef struct _GstAmcBufferInfo GstAmcBufferInfo; +typedef struct _GstAmcCodecVTable GstAmcCodecVTable; typedef struct _GstAmcCodec GstAmcCodec; struct _GstAmcBuffer { @@ -44,6 +45,82 @@ struct _GstAmcBufferInfo { gint size; }; +struct _GstAmcCodecVTable +{ + void (* buffer_free) (GstAmcBuffer * buffer); + + gboolean (* buffer_set_position_and_limit) (GstAmcBuffer * buffer, + GError ** err, + gint position, + gint limit); + + GstAmcCodec * (* create) (const gchar * name, + gboolean is_encoder, + GError ** err); + + void (* free) (GstAmcCodec * codec); + + gboolean (* configure) (GstAmcCodec * codec, + GstAmcFormat * format, + GstAmcSurfaceTexture * surface_texture, + GError **err); + + GstAmcFormat * (* get_output_format) (GstAmcCodec * codec, + GError **err); + + gboolean (* start) (GstAmcCodec * codec, + GError **err); + + gboolean (* stop) (GstAmcCodec * codec, + GError **err); + + gboolean (* flush) (GstAmcCodec * codec, + GError **err); + + gboolean (* release) (GstAmcCodec * codec, + GError **err); + + gboolean (* request_key_frame) (GstAmcCodec * codec, + GError **err); + + gboolean (* have_dynamic_bitrate) (void); + + gboolean (* set_dynamic_bitrate) (GstAmcCodec * codec, + GError **err, + gint bitrate); + + GstAmcBuffer * (* get_output_buffer) (GstAmcCodec * codec, + gint index, + GError **err); + + GstAmcBuffer * (* get_input_buffer) (GstAmcCodec * codec, + gint index, + GError **err); + + gint (* dequeue_input_buffer) (GstAmcCodec * codec, + gint64 timeoutUs, + GError **err); + + gint (* dequeue_output_buffer) (GstAmcCodec * codec, + GstAmcBufferInfo *info, + gint64 timeoutUs, + GError **err); + + gboolean (* queue_input_buffer) (GstAmcCodec * codec, + gint index, + const GstAmcBufferInfo *info, + GError **err); + + gboolean (* release_output_buffer) (GstAmcCodec * codec, + gint index, + gboolean render, + GError **err); + + GstAmcSurfaceTexture * (* new_surface_texture) (GError ** err); +}; + +extern GstAmcCodecVTable *gst_amc_codec_vtable; + void gst_amc_buffer_free (GstAmcBuffer * buffer); gboolean gst_amc_buffer_set_position_and_limit (GstAmcBuffer * buffer, GError ** err, gint position, gint limit); diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-format.c b/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-format.c new file mode 100644 index 0000000000..72af4d6bff --- /dev/null +++ b/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-format.c @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2012,2018 Collabora Ltd. + * Author: Sebastian Dröge + * Copyright (C) 2023 Ratchanan Srirattanamet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "gstamc-format.h" + +GstAmcFormatVTable *gst_amc_format_vtable = NULL; + +GstAmcFormat * +gst_amc_format_new_audio (const gchar * mime, gint sample_rate, gint channels, + GError ** err) +{ + g_assert (gst_amc_format_vtable != NULL); + return gst_amc_format_vtable->new_audio (mime, sample_rate, channels, err); +} + +GstAmcFormat * +gst_amc_format_new_video (const gchar * mime, gint width, gint height, + GError ** err) +{ + g_assert (gst_amc_format_vtable != NULL); + return gst_amc_format_vtable->new_video (mime, width, height, err); +} + +void +gst_amc_format_free (GstAmcFormat * format) +{ + g_assert (gst_amc_format_vtable != NULL); + gst_amc_format_vtable->free (format); +} + +gchar * +gst_amc_format_to_string (GstAmcFormat * format, GError ** err) +{ + g_assert (gst_amc_format_vtable != NULL); + return gst_amc_format_vtable->to_string (format, err); +} + +gboolean +gst_amc_format_get_float (GstAmcFormat * format, const gchar * key, + gfloat * value, GError ** err) +{ + g_assert (gst_amc_format_vtable != NULL); + return gst_amc_format_vtable->get_float (format, key, value, err); +} + +gboolean +gst_amc_format_set_float (GstAmcFormat * format, const gchar * key, + gfloat value, GError ** err) +{ + g_assert (gst_amc_format_vtable != NULL); + return gst_amc_format_vtable->set_float (format, key, value, err); +} + +gboolean +gst_amc_format_get_int (GstAmcFormat * format, const gchar * key, gint * value, + GError ** err) +{ + g_assert (gst_amc_format_vtable != NULL); + return gst_amc_format_vtable->get_int (format, key, value, err); +} + +gboolean +gst_amc_format_set_int (GstAmcFormat * format, const gchar * key, gint value, + GError ** err) +{ + g_assert (gst_amc_format_vtable != NULL); + return gst_amc_format_vtable->set_int (format, key, value, err); +} + +gboolean +gst_amc_format_get_string (GstAmcFormat * format, const gchar * key, + gchar ** value, GError ** err) +{ + g_assert (gst_amc_format_vtable != NULL); + return gst_amc_format_vtable->get_string (format, key, value, err); +} + +gboolean +gst_amc_format_set_string (GstAmcFormat * format, const gchar * key, + const gchar * value, GError ** err) +{ + g_assert (gst_amc_format_vtable != NULL); + return gst_amc_format_vtable->set_string (format, key, value, err); +} + +gboolean +gst_amc_format_get_buffer (GstAmcFormat * format, const gchar * key, + guint8 ** data, gsize * size, GError ** err) +{ + g_assert (gst_amc_format_vtable != NULL); + return gst_amc_format_vtable->get_buffer (format, key, data, size, err); +} + +gboolean +gst_amc_format_set_buffer (GstAmcFormat * format, const gchar * key, + guint8 * data, gsize size, GError ** err) +{ + g_assert (gst_amc_format_vtable != NULL); + return gst_amc_format_vtable->set_buffer (format, key, data, size, err); +} diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-format.h b/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-format.h index 8126ab039d..5dc100c172 100644 --- a/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-format.h +++ b/subprojects/gst-plugins-bad/sys/androidmedia/gstamc-format.h @@ -25,9 +25,71 @@ G_BEGIN_DECLS +typedef struct _GstAmcFormatVTable GstAmcFormatVTable; typedef struct _GstAmcFormat GstAmcFormat; typedef struct _GstAmcColorFormatInfo GstAmcColorFormatInfo; +struct _GstAmcFormatVTable { + GstAmcFormat * (* new_audio) (const gchar *mime, + gint sample_rate, + gint channels, + GError **err); + + GstAmcFormat * (* new_video) (const gchar *mime, + gint width, + gint height, + GError **err); + + void (* free) (GstAmcFormat * format); + + gchar * (* to_string) (GstAmcFormat * format, + GError **err); + + gboolean (* get_float) (GstAmcFormat *format, + const gchar *key, + gfloat *value, + GError **err); + + gboolean (* set_float) (GstAmcFormat *format, + const gchar *key, + gfloat value, + GError **err); + + gboolean (* get_int) (GstAmcFormat *format, + const gchar *key, + gint *value, + GError **err); + + gboolean (* set_int) (GstAmcFormat *format, + const gchar *key, + gint value, + GError **err); + + gboolean (* get_string) (GstAmcFormat *format, + const gchar *key, + gchar **value, + GError **err); + + gboolean (* set_string) (GstAmcFormat *format, + const gchar *key, + const gchar *value, + GError **err); + + gboolean (* get_buffer) (GstAmcFormat *format, + const gchar *key, + guint8 **data, + gsize *size, + GError **err); + + gboolean (* set_buffer) (GstAmcFormat *format, + const gchar *key, + guint8 *data, + gsize size, + GError **err); +}; + +extern GstAmcFormatVTable *gst_amc_format_vtable; + GstAmcFormat * gst_amc_format_new_audio (const gchar *mime, gint sample_rate, gint channels, GError **err); GstAmcFormat * gst_amc_format_new_video (const gchar *mime, gint width, gint height, GError **err); void gst_amc_format_free (GstAmcFormat * format); diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-codec-jni.c b/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-codec-jni.c index 49a5dc643a..e255ed2304 100644 --- a/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-codec-jni.c +++ b/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-codec-jni.c @@ -413,8 +413,8 @@ error: return FALSE; } -void -gst_amc_buffer_free (GstAmcBuffer * buffer_) +static void +gst_amc_buffer_jni_free (GstAmcBuffer * buffer_) { RealBuffer *buffer = (RealBuffer *) buffer_; JNIEnv *env; @@ -470,9 +470,9 @@ gst_amc_buffer_get_position_and_limit (RealBuffer * buffer_, GError ** err, return TRUE; } -gboolean -gst_amc_buffer_set_position_and_limit (GstAmcBuffer * buffer_, GError ** err, - gint position, gint limit) +static gboolean +gst_amc_buffer_jni_set_position_and_limit (GstAmcBuffer * buffer_, + GError ** err, gint position, gint limit) { RealBuffer *buffer = (RealBuffer *) buffer_; JNIEnv *env; @@ -498,8 +498,8 @@ gst_amc_buffer_set_position_and_limit (GstAmcBuffer * buffer_, GError ** err, return TRUE; } -GstAmcCodec * -gst_amc_codec_new (const gchar * name, gboolean is_encoder, GError ** err) +static GstAmcCodec * +gst_amc_codec_jni_new (const gchar * name, gboolean is_encoder, GError ** err) { JNIEnv *env; GstAmcCodec *codec = NULL; @@ -545,8 +545,8 @@ error: goto done; } -void -gst_amc_codec_free (GstAmcCodec * codec) +static void +gst_amc_codec_jni_free (GstAmcCodec * codec) { JNIEnv *env; @@ -572,8 +572,8 @@ gst_amc_codec_free (GstAmcCodec * codec) g_slice_free (GstAmcCodec, codec); } -gboolean -gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, +static gboolean +gst_amc_codec_jni_configure (GstAmcCodec * codec, GstAmcFormat * format, GstAmcSurfaceTexture * surface, GError ** err) { JNIEnv *env; @@ -602,8 +602,8 @@ gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, codec->surface ? codec->surface->jobject : NULL, NULL, flags); } -GstAmcFormat * -gst_amc_codec_get_output_format (GstAmcCodec * codec, GError ** err) +static GstAmcFormat * +gst_amc_codec_jni_get_output_format (GstAmcCodec * codec, GError ** err) { JNIEnv *env; GstAmcFormat *ret = NULL; @@ -633,8 +633,8 @@ done: } static RealBuffer * -gst_amc_codec_get_input_buffers (GstAmcCodec * codec, gsize * n_buffers, - GError ** err) +gst_amc_codec_jni_get_input_buffers (GstAmcCodec * codec, + gsize * n_buffers, GError ** err) { JNIEnv *env; jobject input_buffers = NULL; @@ -660,8 +660,8 @@ done: } static RealBuffer * -gst_amc_codec_get_output_buffers (GstAmcCodec * codec, gsize * n_buffers, - GError ** err) +gst_amc_codec_jni_get_output_buffers (GstAmcCodec * codec, + gsize * n_buffers, GError ** err) { JNIEnv *env; jobject output_buffers = NULL; @@ -686,8 +686,8 @@ done: return ret; } -gboolean -gst_amc_codec_start (GstAmcCodec * codec, GError ** err) +static gboolean +gst_amc_codec_jni_start (GstAmcCodec * codec, GError ** err) { JNIEnv *env; gboolean ret; @@ -705,7 +705,8 @@ gst_amc_codec_start (GstAmcCodec * codec, GError ** err) gst_amc_jni_free_buffer_array (env, codec->input_buffers, codec->n_input_buffers); codec->input_buffers = - gst_amc_codec_get_input_buffers (codec, &codec->n_input_buffers, err); + gst_amc_codec_jni_get_input_buffers (codec, &codec->n_input_buffers, + err); if (!codec->input_buffers) { gst_amc_codec_stop (codec, NULL); return FALSE; @@ -715,8 +716,8 @@ gst_amc_codec_start (GstAmcCodec * codec, GError ** err) return ret; } -gboolean -gst_amc_codec_stop (GstAmcCodec * codec, GError ** err) +static gboolean +gst_amc_codec_jni_stop (GstAmcCodec * codec, GError ** err) { JNIEnv *env; @@ -740,8 +741,8 @@ gst_amc_codec_stop (GstAmcCodec * codec, GError ** err) media_codec.stop); } -gboolean -gst_amc_codec_flush (GstAmcCodec * codec, GError ** err) +static gboolean +gst_amc_codec_jni_flush (GstAmcCodec * codec, GError ** err) { JNIEnv *env; @@ -753,7 +754,7 @@ gst_amc_codec_flush (GstAmcCodec * codec, GError ** err) } static gboolean -gst_amc_codec_set_parameter (GstAmcCodec * codec, JNIEnv * env, +gst_amc_codec_jni_set_parameter (GstAmcCodec * codec, JNIEnv * env, GError ** err, const gchar * key, int value) { gboolean ret = FALSE; @@ -786,28 +787,28 @@ done: return ret; } -gboolean -gst_amc_codec_request_key_frame (GstAmcCodec * codec, GError ** err) +static gboolean +gst_amc_codec_jni_request_key_frame (GstAmcCodec * codec, GError ** err) { JNIEnv *env; g_return_val_if_fail (codec != NULL, FALSE); env = gst_amc_jni_get_env (); - return gst_amc_codec_set_parameter (codec, env, err, + return gst_amc_codec_jni_set_parameter (codec, env, err, PARAMETER_KEY_REQUEST_SYNC_FRAME, 0); } -gboolean -gst_amc_codec_have_dynamic_bitrate () +static gboolean +gst_amc_codec_jni_have_dynamic_bitrate () { /* Dynamic bitrate scaling is supported on Android >= 19, * where the setParameters() call is available */ return (media_codec.setParameters != NULL); } -gboolean -gst_amc_codec_set_dynamic_bitrate (GstAmcCodec * codec, GError ** err, +static gboolean +gst_amc_codec_jni_set_dynamic_bitrate (GstAmcCodec * codec, GError ** err, gint bitrate) { JNIEnv *env; @@ -815,12 +816,12 @@ gst_amc_codec_set_dynamic_bitrate (GstAmcCodec * codec, GError ** err, g_return_val_if_fail (codec != NULL, FALSE); env = gst_amc_jni_get_env (); - return gst_amc_codec_set_parameter (codec, env, err, + return gst_amc_codec_jni_set_parameter (codec, env, err, PARAMETER_KEY_VIDEO_BITRATE, bitrate); } -gboolean -gst_amc_codec_release (GstAmcCodec * codec, GError ** err) +static gboolean +gst_amc_codec_jni_release (GstAmcCodec * codec, GError ** err) { JNIEnv *env; @@ -844,8 +845,9 @@ gst_amc_codec_release (GstAmcCodec * codec, GError ** err) media_codec.release); } -GstAmcBuffer * -gst_amc_codec_get_output_buffer (GstAmcCodec * codec, gint index, GError ** err) +static GstAmcBuffer * +gst_amc_codec_jni_get_output_buffer (GstAmcCodec * codec, gint index, + GError ** err) { JNIEnv *env; jobject buffer = NULL; @@ -898,8 +900,9 @@ error: return NULL; } -GstAmcBuffer * -gst_amc_codec_get_input_buffer (GstAmcCodec * codec, gint index, GError ** err) +static GstAmcBuffer * +gst_amc_codec_jni_get_input_buffer (GstAmcCodec * codec, gint index, + GError ** err) { JNIEnv *env; jobject buffer = NULL; @@ -952,8 +955,8 @@ error: return NULL; } -gint -gst_amc_codec_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs, +static gint +gst_amc_codec_jni_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs, GError ** err) { JNIEnv *env; @@ -970,8 +973,8 @@ gst_amc_codec_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs, } static gboolean -gst_amc_codec_fill_buffer_info (JNIEnv * env, jobject buffer_info, - GstAmcBufferInfo * info, GError ** err) +gst_amc_codec_jni_fill_buffer_info (JNIEnv * env, + jobject buffer_info, GstAmcBufferInfo * info, GError ** err) { g_return_val_if_fail (buffer_info != NULL, FALSE); @@ -995,8 +998,8 @@ gst_amc_codec_fill_buffer_info (JNIEnv * env, jobject buffer_info, return TRUE; } -gint -gst_amc_codec_dequeue_output_buffer (GstAmcCodec * codec, +static gint +gst_amc_codec_jni_dequeue_output_buffer (GstAmcCodec * codec, GstAmcBufferInfo * info, gint64 timeoutUs, GError ** err) { JNIEnv *env; @@ -1027,8 +1030,8 @@ gst_amc_codec_dequeue_output_buffer (GstAmcCodec * codec, gst_amc_jni_free_buffer_array (env, codec->output_buffers, codec->n_output_buffers); codec->output_buffers = - gst_amc_codec_get_output_buffers (codec, - &codec->n_output_buffers, err); + gst_amc_codec_jni_get_output_buffers (codec, &codec->n_output_buffers, + err); if (!codec->output_buffers) { ret = G_MININT; goto done; @@ -1042,7 +1045,7 @@ gst_amc_codec_dequeue_output_buffer (GstAmcCodec * codec, goto done; } - if (ret >= 0 && !gst_amc_codec_fill_buffer_info (env, info_o, info, err)) { + if (ret >= 0 && !gst_amc_codec_jni_fill_buffer_info (env, info_o, info, err)) { ret = G_MININT; goto done; } @@ -1055,8 +1058,8 @@ done: return ret; } -gboolean -gst_amc_codec_queue_input_buffer (GstAmcCodec * codec, gint index, +static gboolean +gst_amc_codec_jni_queue_input_buffer (GstAmcCodec * codec, gint index, const GstAmcBufferInfo * info, GError ** err) { JNIEnv *env; @@ -1070,8 +1073,8 @@ gst_amc_codec_queue_input_buffer (GstAmcCodec * codec, gint index, info->presentation_time_us, info->flags); } -gboolean -gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, +static gboolean +gst_amc_codec_jni_release_output_buffer (GstAmcCodec * codec, gint index, gboolean render, GError ** err) { JNIEnv *env; @@ -1083,8 +1086,40 @@ gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, media_codec.release_output_buffer, index, render); } -GstAmcSurfaceTexture * -gst_amc_codec_new_surface_texture (GError ** err) +static GstAmcSurfaceTexture * +gst_amc_codec_jni_new_surface_texture (GError ** err) { return (GstAmcSurfaceTexture *) gst_amc_surface_texture_jni_new (err); } + +GstAmcCodecVTable gst_amc_codec_jni_vtable = { + .buffer_free = gst_amc_buffer_jni_free, + .buffer_set_position_and_limit = gst_amc_buffer_jni_set_position_and_limit, + + .create = gst_amc_codec_jni_new, + .free = gst_amc_codec_jni_free, + + .configure = gst_amc_codec_jni_configure, + .get_output_format = gst_amc_codec_jni_get_output_format, + + .start = gst_amc_codec_jni_start, + .stop = gst_amc_codec_jni_stop, + .flush = gst_amc_codec_jni_flush, + .request_key_frame = gst_amc_codec_jni_request_key_frame, + + .have_dynamic_bitrate = gst_amc_codec_jni_have_dynamic_bitrate, + .set_dynamic_bitrate = gst_amc_codec_jni_set_dynamic_bitrate, + + .release = gst_amc_codec_jni_release, + + .get_output_buffer = gst_amc_codec_jni_get_output_buffer, + .get_input_buffer = gst_amc_codec_jni_get_input_buffer, + + .dequeue_input_buffer = gst_amc_codec_jni_dequeue_input_buffer, + .dequeue_output_buffer = gst_amc_codec_jni_dequeue_output_buffer, + + .queue_input_buffer = gst_amc_codec_jni_queue_input_buffer, + .release_output_buffer = gst_amc_codec_jni_release_output_buffer, + + .new_surface_texture = gst_amc_codec_jni_new_surface_texture, +}; diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-format-jni.c b/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-format-jni.c index 898b76769d..bfefc80018 100644 --- a/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-format-jni.c +++ b/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-format-jni.c @@ -131,9 +131,9 @@ done: return ret; } -GstAmcFormat * -gst_amc_format_new_audio (const gchar * mime, gint sample_rate, gint channels, - GError ** err) +static GstAmcFormat * +gst_amc_format_jni_new_audio (const gchar * mime, gint sample_rate, + gint channels, GError ** err) { JNIEnv *env; GstAmcFormat *format = NULL; @@ -168,8 +168,8 @@ error: goto done; } -GstAmcFormat * -gst_amc_format_new_video (const gchar * mime, gint width, gint height, +static GstAmcFormat * +gst_amc_format_jni_new_video (const gchar * mime, gint width, gint height, GError ** err) { JNIEnv *env; @@ -205,8 +205,8 @@ error: goto done; } -void -gst_amc_format_free (GstAmcFormat * format) +static void +gst_amc_format_jni_free (GstAmcFormat * format) { JNIEnv *env; @@ -217,8 +217,8 @@ gst_amc_format_free (GstAmcFormat * format) g_slice_free (GstAmcFormat, format); } -gchar * -gst_amc_format_to_string (GstAmcFormat * format, GError ** err) +static gchar * +gst_amc_format_jni_to_string (GstAmcFormat * format, GError ** err) { JNIEnv *env; jstring v_str = NULL; @@ -238,8 +238,8 @@ done: return ret; } -gboolean -gst_amc_format_get_float (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_jni_get_float (GstAmcFormat * format, const gchar * key, gfloat * value, GError ** err) { JNIEnv *env; @@ -269,8 +269,8 @@ done: return ret; } -gboolean -gst_amc_format_set_float (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_jni_set_float (GstAmcFormat * format, const gchar * key, gfloat value, GError ** err) { JNIEnv *env; @@ -299,9 +299,9 @@ done: return ret; } -gboolean -gst_amc_format_get_int (GstAmcFormat * format, const gchar * key, gint * value, - GError ** err) +static gboolean +gst_amc_format_jni_get_int (GstAmcFormat * format, const gchar * key, + gint * value, GError ** err) { JNIEnv *env; gboolean ret = FALSE; @@ -331,9 +331,9 @@ done: } -gboolean -gst_amc_format_set_int (GstAmcFormat * format, const gchar * key, gint value, - GError ** err) +static gboolean +gst_amc_format_jni_set_int (GstAmcFormat * format, const gchar * key, + gint value, GError ** err) { JNIEnv *env; jstring key_str = NULL; @@ -361,8 +361,8 @@ done: return ret; } -gboolean -gst_amc_format_get_string (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_jni_get_string (GstAmcFormat * format, const gchar * key, gchar ** value, GError ** err) { JNIEnv *env; @@ -396,8 +396,8 @@ done: return ret; } -gboolean -gst_amc_format_set_string (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_jni_set_string (GstAmcFormat * format, const gchar * key, const gchar * value, GError ** err) { JNIEnv *env; @@ -434,8 +434,8 @@ done: return ret; } -gboolean -gst_amc_format_get_buffer (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_jni_get_buffer (GstAmcFormat * format, const gchar * key, guint8 ** data, gsize * size, GError ** err) { JNIEnv *env; @@ -489,8 +489,8 @@ done: return ret; } -gboolean -gst_amc_format_set_buffer (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_jni_set_buffer (GstAmcFormat * format, const gchar * key, guint8 * data, gsize size, GError ** err) { JNIEnv *env; @@ -537,3 +537,20 @@ done: return ret; } + +GstAmcFormatVTable gst_amc_format_jni_vtable = { + .new_audio = gst_amc_format_jni_new_audio, + .new_video = gst_amc_format_jni_new_video, + .free = gst_amc_format_jni_free, + + .to_string = gst_amc_format_jni_to_string, + + .get_float = gst_amc_format_jni_get_float, + .set_float = gst_amc_format_jni_set_float, + .get_int = gst_amc_format_jni_get_int, + .set_int = gst_amc_format_jni_set_int, + .get_string = gst_amc_format_jni_get_string, + .set_string = gst_amc_format_jni_set_string, + .get_buffer = gst_amc_format_jni_get_buffer, + .set_buffer = gst_amc_format_jni_set_buffer, +}; diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-jni.c b/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-jni.c index dde3c667ca..e20abcce7f 100644 --- a/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-jni.c +++ b/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-jni.c @@ -35,5 +35,8 @@ gst_amc_static_init (void) if (!gst_amc_surface_texture_jni_static_init ()) return FALSE; + gst_amc_format_vtable = &gst_amc_format_jni_vtable; + gst_amc_codec_vtable = &gst_amc_codec_jni_vtable; + return TRUE; } diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-jni.h b/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-jni.h index 1ecaf2741d..116f02c773 100644 --- a/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-jni.h +++ b/subprojects/gst-plugins-bad/sys/androidmedia/jni/gstamc-jni.h @@ -19,6 +19,12 @@ #include +#include "../gstamc-format.h" +#include "../gstamc-codec.h" + +extern GstAmcFormatVTable gst_amc_format_jni_vtable; +extern GstAmcCodecVTable gst_amc_codec_jni_vtable; + gboolean gst_amc_codeclist_jni_static_init (void); gboolean gst_amc_format_jni_static_init (void); gboolean gst_amc_codec_jni_static_init (void); diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-codec-ml.c b/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-codec-ml.c index 660a5b8142..1563219088 100644 --- a/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-codec-ml.c +++ b/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-codec-ml.c @@ -35,14 +35,14 @@ struct _GstAmcCodec GstAmcSurfaceTexture *surface_texture; }; -void -gst_amc_buffer_free (GstAmcBuffer * buffer) +static void +gst_amc_buffer_ml_free (GstAmcBuffer * buffer) { g_free (buffer); } -gboolean -gst_amc_buffer_set_position_and_limit (GstAmcBuffer * buffer, GError ** err, +static gboolean +gst_amc_buffer_ml_set_position_and_limit (GstAmcBuffer * buffer, GError ** err, gint position, gint limit) { /* FIXME: Do we need to do something? @@ -52,8 +52,8 @@ gst_amc_buffer_set_position_and_limit (GstAmcBuffer * buffer, GError ** err, return TRUE; } -GstAmcCodec * -gst_amc_codec_new (const gchar * name, gboolean is_encoder, GError ** err) +static GstAmcCodec * +gst_amc_codec_ml_new (const gchar * name, gboolean is_encoder, GError ** err) { GstAmcCodec *codec = NULL; MLResult result; @@ -77,8 +77,8 @@ gst_amc_codec_new (const gchar * name, gboolean is_encoder, GError ** err) return codec; } -void -gst_amc_codec_free (GstAmcCodec * codec) +static void +gst_amc_codec_ml_free (GstAmcCodec * codec) { g_return_if_fail (codec != NULL); @@ -88,8 +88,8 @@ gst_amc_codec_free (GstAmcCodec * codec) g_slice_free (GstAmcCodec, codec); } -gboolean -gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, +static gboolean +gst_amc_codec_ml_configure (GstAmcCodec * codec, GstAmcFormat * format, GstAmcSurfaceTexture * surface_texture, GError ** err) { MLResult result; @@ -107,7 +107,7 @@ gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, surface_texture); result = MLMediaCodecConfigureWithSurface (codec->handle, - gst_amc_format_get_handle (format), surface_handle, 0); + gst_amc_format_ml_get_handle (format), surface_handle, 0); if (result != MLResult_Ok) { g_set_error (err, GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, "Failed to configure codec %d", result); @@ -117,8 +117,8 @@ gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, return TRUE; } -GstAmcFormat * -gst_amc_codec_get_output_format (GstAmcCodec * codec, GError ** err) +static GstAmcFormat * +gst_amc_codec_ml_get_output_format (GstAmcCodec * codec, GError ** err) { MLHandle format_handle; MLResult result; @@ -132,11 +132,11 @@ gst_amc_codec_get_output_format (GstAmcCodec * codec, GError ** err) return NULL; } - return gst_amc_format_new_handle (format_handle); + return gst_amc_format_ml_new_handle (format_handle); } -gboolean -gst_amc_codec_start (GstAmcCodec * codec, GError ** err) +static gboolean +gst_amc_codec_ml_start (GstAmcCodec * codec, GError ** err) { MLResult result; @@ -152,8 +152,8 @@ gst_amc_codec_start (GstAmcCodec * codec, GError ** err) return TRUE; } -gboolean -gst_amc_codec_stop (GstAmcCodec * codec, GError ** err) +static gboolean +gst_amc_codec_ml_stop (GstAmcCodec * codec, GError ** err) { MLResult result; @@ -169,8 +169,8 @@ gst_amc_codec_stop (GstAmcCodec * codec, GError ** err) return TRUE; } -gboolean -gst_amc_codec_flush (GstAmcCodec * codec, GError ** err) +static gboolean +gst_amc_codec_ml_flush (GstAmcCodec * codec, GError ** err) { MLResult result; @@ -186,8 +186,8 @@ gst_amc_codec_flush (GstAmcCodec * codec, GError ** err) return TRUE; } -gboolean -gst_amc_codec_request_key_frame (GstAmcCodec * codec, GError ** err) +static gboolean +gst_amc_codec_ml_request_key_frame (GstAmcCodec * codec, GError ** err) { /* If MagicLeap adds an API for requesting a keyframe, call it here */ g_set_error (err, GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, @@ -195,8 +195,8 @@ gst_amc_codec_request_key_frame (GstAmcCodec * codec, GError ** err) return FALSE; } -gboolean -gst_amc_codec_set_dynamic_bitrate (GstAmcCodec * codec, GError ** err, +static gboolean +gst_amc_codec_ml_set_dynamic_bitrate (GstAmcCodec * codec, GError ** err, gint bitrate) { g_set_error (err, GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, @@ -204,22 +204,23 @@ gst_amc_codec_set_dynamic_bitrate (GstAmcCodec * codec, GError ** err, return FALSE; } -gboolean -gst_amc_codec_have_dynamic_bitrate () +static gboolean +gst_amc_codec_ml_have_dynamic_bitrate () { /* If MagicLeap ever provides an API for scaling bitrate, change this to TRUE */ return FALSE; } -gboolean -gst_amc_codec_release (GstAmcCodec * codec, GError ** err) +static gboolean +gst_amc_codec_ml_release (GstAmcCodec * codec, GError ** err) { g_return_val_if_fail (codec != NULL, FALSE); return TRUE; } -GstAmcBuffer * -gst_amc_codec_get_output_buffer (GstAmcCodec * codec, gint index, GError ** err) +static GstAmcBuffer * +gst_amc_codec_ml_get_output_buffer (GstAmcCodec * codec, gint index, + GError ** err) { MLResult result; GstAmcBuffer *ret; @@ -249,8 +250,9 @@ gst_amc_codec_get_output_buffer (GstAmcCodec * codec, gint index, GError ** err) return ret; } -GstAmcBuffer * -gst_amc_codec_get_input_buffer (GstAmcCodec * codec, gint index, GError ** err) +static GstAmcBuffer * +gst_amc_codec_ml_get_input_buffer (GstAmcCodec * codec, gint index, + GError ** err) { MLResult result; GstAmcBuffer *ret; @@ -273,8 +275,8 @@ gst_amc_codec_get_input_buffer (GstAmcCodec * codec, gint index, GError ** err) return ret; } -gint -gst_amc_codec_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs, +static gint +gst_amc_codec_ml_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs, GError ** err) { MLResult result; @@ -295,8 +297,8 @@ gst_amc_codec_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs, return index; } -gint -gst_amc_codec_dequeue_output_buffer (GstAmcCodec * codec, +static gint +gst_amc_codec_ml_dequeue_output_buffer (GstAmcCodec * codec, GstAmcBufferInfo * info, gint64 timeoutUs, GError ** err) { MLMediaCodecBufferInfo info_; @@ -331,8 +333,8 @@ gst_amc_codec_dequeue_output_buffer (GstAmcCodec * codec, return index; } -gboolean -gst_amc_codec_queue_input_buffer (GstAmcCodec * codec, gint index, +static gboolean +gst_amc_codec_ml_queue_input_buffer (GstAmcCodec * codec, gint index, const GstAmcBufferInfo * info, GError ** err) { MLResult result; @@ -351,8 +353,8 @@ gst_amc_codec_queue_input_buffer (GstAmcCodec * codec, gint index, return TRUE; } -gboolean -gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, +static gboolean +gst_amc_codec_ml_release_output_buffer (GstAmcCodec * codec, gint index, gboolean render, GError ** err) { MLResult result; @@ -369,8 +371,40 @@ gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, return TRUE; } -GstAmcSurfaceTexture * -gst_amc_codec_new_surface_texture (GError ** err) +static GstAmcSurfaceTexture * +gst_amc_codec_ml_new_surface_texture (GError ** err) { return (GstAmcSurfaceTexture *) gst_amc_surface_texture_ml_new (err); } + +GstAmcCodecVTable gst_amc_codec_ml_vtable = { + .buffer_free = gst_amc_buffer_ml_free, + .buffer_set_position_and_limit = gst_amc_buffer_ml_set_position_and_limit, + + .create = gst_amc_codec_ml_new, + .free = gst_amc_codec_ml_free, + + .configure = gst_amc_codec_ml_configure, + .get_output_format = gst_amc_codec_ml_get_output_format, + + .start = gst_amc_codec_ml_start, + .stop = gst_amc_codec_ml_stop, + .flush = gst_amc_codec_ml_flush, + .request_key_frame = gst_amc_codec_ml_request_key_frame, + + .have_dynamic_bitrate = gst_amc_codec_ml_have_dynamic_bitrate, + .set_dynamic_bitrate = gst_amc_codec_ml_set_dynamic_bitrate, + + .release = gst_amc_codec_ml_release, + + .get_output_buffer = gst_amc_codec_ml_get_output_buffer, + .get_input_buffer = gst_amc_codec_ml_get_input_buffer, + + .dequeue_input_buffer = gst_amc_codec_ml_dequeue_input_buffer, + .dequeue_output_buffer = gst_amc_codec_ml_dequeue_output_buffer, + + .queue_input_buffer = gst_amc_codec_ml_queue_input_buffer, + .release_output_buffer = gst_amc_codec_ml_release_output_buffer, + + .new_surface_texture = gst_amc_codec_ml_new_surface_texture, +}; diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-format-ml.c b/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-format-ml.c index 6dada3cdc9..68d64b46dc 100644 --- a/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-format-ml.c +++ b/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-format-ml.c @@ -32,9 +32,9 @@ struct _GstAmcFormat MLHandle handle; }; -GstAmcFormat * -gst_amc_format_new_audio (const gchar * mime, gint sample_rate, gint channels, - GError ** err) +static GstAmcFormat * +gst_amc_format_ml_new_audio (const gchar * mime, gint sample_rate, + gint channels, GError ** err) { GstAmcFormat *format = g_slice_new0 (GstAmcFormat); MLResult result; @@ -51,8 +51,8 @@ gst_amc_format_new_audio (const gchar * mime, gint sample_rate, gint channels, return format; } -GstAmcFormat * -gst_amc_format_new_video (const gchar * mime, gint width, gint height, +static GstAmcFormat * +gst_amc_format_ml_new_video (const gchar * mime, gint width, gint height, GError ** err) { GstAmcFormat *format = g_slice_new0 (GstAmcFormat); @@ -70,7 +70,7 @@ gst_amc_format_new_video (const gchar * mime, gint width, gint height, } GstAmcFormat * -gst_amc_format_new_handle (MLHandle handle) +gst_amc_format_ml_new_handle (MLHandle handle) { GstAmcFormat *format = g_slice_new0 (GstAmcFormat); format->handle = handle; @@ -78,20 +78,20 @@ gst_amc_format_new_handle (MLHandle handle) } MLHandle -gst_amc_format_get_handle (GstAmcFormat * format) +gst_amc_format_ml_get_handle (GstAmcFormat * format) { return format->handle; } -void -gst_amc_format_free (GstAmcFormat * format) +static void +gst_amc_format_ml_free (GstAmcFormat * format) { g_return_if_fail (format != NULL); g_slice_free (GstAmcFormat, format); } -gchar * -gst_amc_format_to_string (GstAmcFormat * format, GError ** err) +static gchar * +gst_amc_format_ml_to_string (GstAmcFormat * format, GError ** err) { MLResult result; gchar *str; @@ -108,8 +108,8 @@ gst_amc_format_to_string (GstAmcFormat * format, GError ** err) return str; } -gboolean -gst_amc_format_get_float (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_ml_get_float (GstAmcFormat * format, const gchar * key, gfloat * value, GError ** err) { MLResult result; @@ -128,8 +128,8 @@ gst_amc_format_get_float (GstAmcFormat * format, const gchar * key, return TRUE; } -gboolean -gst_amc_format_set_float (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_ml_set_float (GstAmcFormat * format, const gchar * key, gfloat value, GError ** err) { MLResult result; @@ -147,9 +147,9 @@ gst_amc_format_set_float (GstAmcFormat * format, const gchar * key, return TRUE; } -gboolean -gst_amc_format_get_int (GstAmcFormat * format, const gchar * key, gint * value, - GError ** err) +static gboolean +gst_amc_format_ml_get_int (GstAmcFormat * format, const gchar * key, + gint * value, GError ** err) { MLResult result; @@ -167,8 +167,8 @@ gst_amc_format_get_int (GstAmcFormat * format, const gchar * key, gint * value, return TRUE; } -gboolean -gst_amc_format_set_int (GstAmcFormat * format, const gchar * key, gint value, +static gboolean +gst_amc_format_ml_set_int (GstAmcFormat * format, const gchar * key, gint value, GError ** err) { MLResult result; @@ -185,8 +185,8 @@ gst_amc_format_set_int (GstAmcFormat * format, const gchar * key, gint value, return TRUE; } -gboolean -gst_amc_format_get_string (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_ml_get_string (GstAmcFormat * format, const gchar * key, gchar ** value, GError ** err) { MLResult result; @@ -207,8 +207,8 @@ gst_amc_format_get_string (GstAmcFormat * format, const gchar * key, return TRUE; } -gboolean -gst_amc_format_set_string (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_ml_set_string (GstAmcFormat * format, const gchar * key, const gchar * value, GError ** err) { MLResult result; @@ -225,8 +225,8 @@ gst_amc_format_set_string (GstAmcFormat * format, const gchar * key, return TRUE; } -gboolean -gst_amc_format_get_buffer (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_ml_get_buffer (GstAmcFormat * format, const gchar * key, guint8 ** data, gsize * size, GError ** err) { MLResult result; @@ -251,8 +251,8 @@ gst_amc_format_get_buffer (GstAmcFormat * format, const gchar * key, return TRUE; } -gboolean -gst_amc_format_set_buffer (GstAmcFormat * format, const gchar * key, +static gboolean +gst_amc_format_ml_set_buffer (GstAmcFormat * format, const gchar * key, guint8 * data, gsize size, GError ** err) { MLResult result; @@ -272,3 +272,20 @@ gst_amc_format_set_buffer (GstAmcFormat * format, const gchar * key, } return TRUE; } + +GstAmcFormatVTable gst_amc_format_ml_vtable = { + .new_audio = gst_amc_format_ml_new_audio, + .new_video = gst_amc_format_ml_new_video, + .free = gst_amc_format_ml_free, + + .to_string = gst_amc_format_ml_to_string, + + .get_float = gst_amc_format_ml_get_float, + .set_float = gst_amc_format_ml_set_float, + .get_int = gst_amc_format_ml_get_int, + .set_int = gst_amc_format_ml_set_int, + .get_string = gst_amc_format_ml_get_string, + .set_string = gst_amc_format_ml_set_string, + .get_buffer = gst_amc_format_ml_get_buffer, + .set_buffer = gst_amc_format_ml_set_buffer, +}; diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-internal-ml.h b/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-internal-ml.h index 7eb50b2242..ad9ddf24f9 100644 --- a/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-internal-ml.h +++ b/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-internal-ml.h @@ -21,13 +21,17 @@ #ifndef __GST_AMC_INTERNAL_ML_H__ #define __GST_AMC_INTERNAL_ML_H__ +#include "../gstamc-codec.h" #include "../gstamc-format.h" #include G_BEGIN_DECLS -GstAmcFormat *gst_amc_format_new_handle (MLHandle handle); -MLHandle gst_amc_format_get_handle (GstAmcFormat * format); +extern GstAmcFormatVTable gst_amc_format_ml_vtable; +extern GstAmcCodecVTable gst_amc_codec_ml_vtable; + +GstAmcFormat *gst_amc_format_ml_new_handle (MLHandle handle); +MLHandle gst_amc_format_ml_get_handle (GstAmcFormat * format); G_END_DECLS diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-ml.c b/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-ml.c index ca4a8f7d21..b47c134d4f 100644 --- a/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-ml.c +++ b/subprojects/gst-plugins-bad/sys/androidmedia/magicleap/gstamc-ml.c @@ -18,6 +18,7 @@ */ #include "../gstamc.h" +#include "gstamc-internal-ml.h" gboolean gst_amc_static_init (void) @@ -26,5 +27,9 @@ gst_amc_static_init (void) * MagicLeap doesn't require any static initialization. All required * functions are in C and are linked into the plugin directly. */ + + gst_amc_codec_vtable = &gst_amc_codec_ml_vtable; + gst_amc_format_vtable = &gst_amc_format_ml_vtable; + return TRUE; } diff --git a/subprojects/gst-plugins-bad/sys/androidmedia/meson.build b/subprojects/gst-plugins-bad/sys/androidmedia/meson.build index 9fffe4ae0b..f5a94b189f 100644 --- a/subprojects/gst-plugins-bad/sys/androidmedia/meson.build +++ b/subprojects/gst-plugins-bad/sys/androidmedia/meson.build @@ -1,6 +1,8 @@ androidmedia_sources = [ 'gstamcaudiodec.c', 'gstamc.c', + 'gstamc-codec.c', + 'gstamc-format.c', 'gstamcsurfacetexture.c', 'gstamcvideodec.c', 'gstamcvideoenc.c',