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.
This commit is contained in:
		
							parent
							
								
									073251316e
								
							
						
					
					
						commit
						f17e18d292
					
				@ -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,
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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 */
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user