[FFmpeg-cvslog] avcodec: add av_jni_{get,set}_android_app_ctx() helpers

Matthieu Bouron git at videolan.org
Sat Mar 23 12:39:55 EET 2024


ffmpeg | branch: master | Matthieu Bouron <matthieu.bouron at gmail.com> | Mon Feb 12 23:13:09 2024 +0100| [f17e18d2922645f56a35d276b5e75cfdaf20ab7e] | committer: Matthieu Bouron

avcodec: add av_jni_{get,set}_android_app_ctx() helpers

This will allow users to pass the Android ApplicationContext which is mandatory
to retrieve the ContentResolver responsible to resolve/open Android content URIS.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f17e18d2922645f56a35d276b5e75cfdaf20ab7e
---

 doc/APIchanges   |  3 +++
 libavcodec/jni.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 libavcodec/jni.h | 21 +++++++++++++++++++++
 3 files changed, 67 insertions(+)

diff --git a/doc/APIchanges b/doc/APIchanges
index 9694947e63..2796b4d0c2 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,9 @@ The last version increases of all libraries were on 2024-03-07
 
 API changes, most recent first:
 
+2024-03-xx - xxxxxxxxxx - lavc 61.3.100 - jni.h
+  Add av_jni_set_android_app_ctx() and av_jni_get_android_app_ctx().
+
 2024-03-22 - xxxxxxxxxx - lavu 59.4.100 - frame.h
   Constified the first-level pointee of av_frame_side_data_get()
   and renamed it to av_frame_side_data_get_c(). From now on,
diff --git a/libavcodec/jni.c b/libavcodec/jni.c
index ae6490de9d..1193c608c3 100644
--- a/libavcodec/jni.c
+++ b/libavcodec/jni.c
@@ -35,6 +35,7 @@
 #include "ffjni.h"
 
 static void *java_vm;
+static void *android_app_ctx;
 static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 
 int av_jni_set_java_vm(void *vm, void *log_ctx)
@@ -77,3 +78,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..955cd28096 100644
--- a/libavcodec/jni.h
+++ b/libavcodec/jni.h
@@ -43,4 +43,25 @@ 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 handle content uris.
+ *
+ * This function is only available on Android.
+ *
+ * @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.
+ *
+ * This function is only available on Android.
+ *
+ * @return a pointer the the Android application context
+ */
+void *av_jni_get_android_app_ctx(void);
+
 #endif /* AVCODEC_JNI_H */



More information about the ffmpeg-cvslog mailing list