[FFmpeg-devel] [PATCH v2 1/6] avcodec: add av_jni_{get, set}_android_app_ctx helper
Matthieu Bouron
matthieu.bouron at gmail.com
Mon Mar 4 21:36:19 EET 2024
On Mon, Mar 04, 2024 at 05:35:36PM +0100, Matthieu Bouron wrote:
> On Mon, Mar 4, 2024 at 4:11 PM Matthieu Bouron
> <matthieu.bouron at gmail.com> wrote:
> >
> > On Mon, Mar 4, 2024 at 12:29 PM Andreas Rheinhardt
> > <andreas.rheinhardt at outlook.com> wrote:
[...]
> > >
> > > I am against adding stub functions on platforms where they are known to
> > > be useless, i.e. everything except android.
> >
> > Ok. Will update the patch introducing a new header "jni_android.h".
> > Unless we want to also scope avcodec/jni.h to Android only ?
>
> Or maybe you mean adding a ifdef guard to it ?
>
New patch attached. The functions are now only built for Android.
[...]
-------------- next part --------------
>From 1b674e78c6a86090f5c9ed6fef5f47ae83ba98be Mon Sep 17 00:00:00 2001
From: Matthieu Bouron <matthieu.bouron at gmail.com>
Date: Mon, 12 Feb 2024 23:13:09 +0100
Subject: [PATCH v3 1/6] avcodec: add av_jni_{get,set}_android_app_ctx helper
This will allow users to pass the Android ApplicationContext which is mandatory
to retrieve the ContentResolver responsible to resolve/open Android content-uri.
---
libavcodec/jni.c | 42 ++++++++++++++++++++++++++++++++++++++++++
libavcodec/jni.h | 17 +++++++++++++++++
2 files changed, 59 insertions(+)
diff --git a/libavcodec/jni.c b/libavcodec/jni.c
index ae6490de9d..cfe95bd1ec 100644
--- a/libavcodec/jni.c
+++ b/libavcodec/jni.c
@@ -77,3 +77,45 @@ void *av_jni_get_java_vm(void *log_ctx)
}
#endif
+
+#if defined(__ANDROID__)
+
+int av_jni_set_android_app_ctx(void *app_ctx, void *log_ctx)
+{
+#if CONFIG_JNI
+ JNIEnv *env = ff_jni_get_env(log_ctx);
+ if (!env)
+ return AVERROR(EINVAL);
+
+ jobjectRefType type = (*env)->GetObjectRefType(env, app_ctx);
+ if (type != JNIGlobalRefType) {
+ av_log(log_ctx, AV_LOG_ERROR, "Application context must be passed as a global reference");
+ return AVERROR(EINVAL);
+ }
+
+ pthread_mutex_lock(&lock);
+ android_app_ctx = app_ctx;
+ pthread_mutex_unlock(&lock);
+
+ return 0;
+#else
+ return AVERROR(ENOSYS);
+#endif
+}
+
+void *av_jni_get_android_app_ctx(void)
+{
+#if CONFIG_JNI
+ void *ctx;
+
+ pthread_mutex_lock(&lock);
+ ctx = android_app_ctx;
+ pthread_mutex_unlock(&lock);
+
+ return ctx;
+#else
+ return NULL;
+#endif
+}
+
+#endif
diff --git a/libavcodec/jni.h b/libavcodec/jni.h
index dd99e92611..da8025f830 100644
--- a/libavcodec/jni.h
+++ b/libavcodec/jni.h
@@ -43,4 +43,21 @@ int av_jni_set_java_vm(void *vm, void *log_ctx);
*/
void *av_jni_get_java_vm(void *log_ctx);
+/*
+ * Set the Android application context which will be used to retrieve the Android
+ * content resolver to resolve content uris.
+ *
+ * @param app_ctx global JNI reference to the Android application context
+ * @return 0 on success, < 0 otherwise
+ */
+int av_jni_set_android_app_ctx(void *app_ctx, void *log_ctx);
+
+/*
+ * Get the Android application context that has been set with
+ * av_jni_set_android_app_ctx.
+ *
+ * @return a pointer the the Android application context
+ */
+void *av_jni_get_android_app_ctx(void);
+
#endif /* AVCODEC_JNI_H */
--
2.44.0
More information about the ffmpeg-devel
mailing list