static void SDL_AMediaFormatJava_setBuffer(SDL_AMediaFormat* aformat, const char* name, void* data, size_t size) { int ret = -1; JNIEnv *env = NULL; if (JNI_OK != SDL_JNI_SetupThreadEnv(&env)) { ALOGE("%s: SDL_JNI_SetupThreadEnv: failed", __func__); return; } SDL_AMediaFormat_Opaque *opaque = (SDL_AMediaFormat_Opaque *)aformat->opaque; jobject android_media_format = opaque->android_media_format; if (!opaque->android_byte_buffer) { opaque->android_byte_buffer = J4AC_ByteBuffer__allocateDirect__asGlobalRef__catchAll(env, size); if (!opaque->android_byte_buffer) { J4A_FUNC_FAIL_TRACE(); return; } } ret = J4AC_ByteBuffer__assignData__catchAll(env, opaque->android_byte_buffer, data, size); if (ret < 0) { J4A_FUNC_FAIL_TRACE(); return; } J4AC_MediaFormat__setByteBuffer__withCString(env, android_media_format, name, opaque->android_byte_buffer); if (J4A_ExceptionCheck__catchAll(env)) { ALOGE("%s: call jmid_setByteBuffer: failed", __func__); return; } }
static int64_t jni_set_media_data_source(JNIEnv* env, jobject thiz, jobject media_data_source) { int64_t nativeMediaDataSource = 0; pthread_mutex_lock(&g_clazz.mutex); jobject old = (jobject) (intptr_t) J4AC_IjkMediaPlayer__mNativeMediaDataSource__get__catchAll(env, thiz); if (old) { J4AC_IMediaDataSource__close__catchAll(env, old); J4A_DeleteGlobalRef__p(env, &old); J4AC_IjkMediaPlayer__mNativeMediaDataSource__set__catchAll(env, thiz, 0); } if (media_data_source) { jobject global_media_data_source = (*env)->NewGlobalRef(env, media_data_source); if (J4A_ExceptionCheck__catchAll(env) || !global_media_data_source) goto fail; nativeMediaDataSource = (int64_t) (intptr_t) global_media_data_source; J4AC_IjkMediaPlayer__mNativeMediaDataSource__set__catchAll(env, thiz, (jlong) nativeMediaDataSource); } fail: pthread_mutex_unlock(&g_clazz.mutex); return nativeMediaDataSource; }
int J4A_ThrowException(JNIEnv* env, const char* class_sign, const char* msg) { int ret = -1; if (J4A_ExceptionCheck__catchAll(env)) { J4A_ALOGE("pending exception throwed.\n"); } jclass exceptionClass = J4A_FindClass__catchAll(env, class_sign); if (exceptionClass == NULL) { J4A_FUNC_FAIL_TRACE(); ret = -1; goto fail; } ret = J4A_ThrowExceptionOfClass(env, exceptionClass, msg); if (ret) { J4A_FUNC_FAIL_TRACE(); goto fail; } ret = 0; fail: J4A_DeleteLocalRef__p(env, exceptionClass); return ret; }
static int64_t jni_set_ijkio_http(JNIEnv* env, jobject thiz, jobject ijk_io) { int64_t nativeIjkIOHttp = 0; pthread_mutex_lock(&g_clazz.mutex); jobject old = (jobject) (intptr_t) J4AC_IjkMediaPlayer__mNativeIjkIOHttp__get__catchAll(env, thiz); if (old) { J4AC_IIjkIOHttp__close__catchAll(env, old); J4A_DeleteGlobalRef__p(env, &old); J4AC_IjkMediaPlayer__mNativeIjkIOHttp__set__catchAll(env, thiz, 0); } if (ijk_io) { jobject global_ijkio_http = (*env)->NewGlobalRef(env, ijk_io); if (J4A_ExceptionCheck__catchAll(env) || !global_ijkio_http) goto fail; nativeIjkIOHttp = (int64_t) (intptr_t) global_ijkio_http; J4AC_IjkMediaPlayer__mNativeIjkIOHttp__set__catchAll(env, thiz, (jlong) nativeIjkIOHttp); } fail: pthread_mutex_unlock(&g_clazz.mutex); return nativeIjkIOHttp; }
jbyteArray J4A_NewByteArray__catchAll(JNIEnv *env, jsize capacity) { jbyteArray local = (*env)->NewByteArray(env, capacity); if (J4A_ExceptionCheck__catchAll(env) || !local) return NULL; return local; }
void J4AC_android_os_Bundle__putString__withCString__catchAll(JNIEnv *env, jobject thiz, const char *key_cstr__, const char *value_cstr__) { jstring key = NULL; jstring value = NULL; key = (*env)->NewStringUTF(env, key_cstr__); if (J4A_ExceptionCheck__catchAll(env) || !key) goto fail; value = (*env)->NewStringUTF(env, value_cstr__); if (J4A_ExceptionCheck__catchAll(env) || !value) goto fail; J4AC_android_os_Bundle__putString__catchAll(env, thiz, key, value); fail: J4A_DeleteLocalRef__p(env, &key); J4A_DeleteLocalRef__p(env, &value); }
jstring J4AC_android_os_Bundle__getString__catchAll(JNIEnv *env, jobject thiz, jstring key) { jstring ret_object = J4AC_android_os_Bundle__getString(env, thiz, key); if (J4A_ExceptionCheck__catchAll(env) || !ret_object) { return NULL; } return ret_object; }
jobject J4AC_android_os_Bundle__Bundle__catchAll(JNIEnv *env) { jobject ret_object = J4AC_android_os_Bundle__Bundle(env); if (J4A_ExceptionCheck__catchAll(env) || !ret_object) { return NULL; } return ret_object; }
jint J4AC_android_os_Bundle__getInt__catchAll(JNIEnv *env, jobject thiz, jstring key, jint defaultValue) { jint ret_value = J4AC_android_os_Bundle__getInt(env, thiz, key, defaultValue); if (J4A_ExceptionCheck__catchAll(env)) { return 0; } return ret_value; }
jint J4AC_tv_danmaku_ijk_media_player_misc_IAndroidIO__close__catchAll(JNIEnv *env, jobject thiz) { jint ret_value = J4AC_tv_danmaku_ijk_media_player_misc_IAndroidIO__close(env, thiz); if (J4A_ExceptionCheck__catchAll(env)) { return 0; } return ret_value; }
jlong J4AC_tv_danmaku_ijk_media_player_misc_IAndroidIO__seek__catchAll(JNIEnv *env, jobject thiz, jlong offset, jint whence) { jlong ret_value = J4AC_tv_danmaku_ijk_media_player_misc_IAndroidIO__seek(env, thiz, offset, whence); if (J4A_ExceptionCheck__catchAll(env)) { return 0; } return ret_value; }
jint J4AC_tv_danmaku_ijk_media_player_misc_IAndroidIO__read__catchAll(JNIEnv *env, jobject thiz, jbyteArray buffer, jint size) { jint ret_value = J4AC_tv_danmaku_ijk_media_player_misc_IAndroidIO__read(env, thiz, buffer, size); if (J4A_ExceptionCheck__catchAll(env)) { return 0; } return ret_value; }
jstring J4AC_android_os_Bundle__getString__withCString__catchAll(JNIEnv *env, jobject thiz, const char *key_cstr__) { jstring ret_object = NULL; jstring key = NULL; key = (*env)->NewStringUTF(env, key_cstr__); if (J4A_ExceptionCheck__catchAll(env) || !key) goto fail; ret_object = J4AC_android_os_Bundle__getString__catchAll(env, thiz, key); if (J4A_ExceptionCheck__catchAll(env) || !ret_object) { ret_object = NULL; goto fail; } fail: J4A_DeleteLocalRef__p(env, &key); return ret_object; }
jint J4AC_android_os_Bundle__getInt__withCString__catchAll(JNIEnv *env, jobject thiz, const char *key_cstr__, jint defaultValue) { jint ret_value = 0; jstring key = NULL; key = (*env)->NewStringUTF(env, key_cstr__); if (J4A_ExceptionCheck__catchAll(env) || !key) goto fail; ret_value = J4AC_android_os_Bundle__getInt__catchAll(env, thiz, key, defaultValue); if (J4A_ExceptionCheck__catchAll(env)) { ret_value = 0; goto fail; } fail: J4A_DeleteLocalRef__p(env, &key); return ret_value; }
jbyteArray J4A_NewByteArray__asGlobalRef__catchAll(JNIEnv *env, jsize capacity) { jbyteArray local = (*env)->NewByteArray(env, capacity); if (J4A_ExceptionCheck__catchAll(env) || !local) return NULL; jbyteArray global = (*env)->NewGlobalRef(env, local); J4A_DeleteLocalRef__p(env, &local); return global; }
jclass J4A_NewGlobalRef__catchAll(JNIEnv *env, jobject obj) { jclass obj_global = (*env)->NewGlobalRef(env, obj); if (J4A_ExceptionCheck__catchAll(env) || !(obj_global)) { J4A_FUNC_FAIL_TRACE(); goto fail; } fail: return obj_global; }
jfieldID J4A_GetStaticFieldID__catchAll(JNIEnv *env, jclass clazz, const char *field_name, const char *field_sign) { jfieldID field_id = (*env)->GetStaticFieldID(env, clazz, field_name, field_sign); if (J4A_ExceptionCheck__catchAll(env) || !field_id) { J4A_FUNC_FAIL_TRACE2(field_name, field_sign); field_id = NULL; goto fail; } fail: return field_id; }
jclass J4A_FindClass__catchAll(JNIEnv *env, const char *class_sign) { jclass clazz = (*env)->FindClass(env, class_sign); if (J4A_ExceptionCheck__catchAll(env) || !(clazz)) { J4A_FUNC_FAIL_TRACE(); clazz = NULL; goto fail; } fail: return clazz; }
jmethodID J4A_GetStaticMethodID__catchAll(JNIEnv *env, jclass clazz, const char *method_name, const char *method_sign) { jmethodID method_id = (*env)->GetStaticMethodID(env, clazz, method_name, method_sign); if (J4A_ExceptionCheck__catchAll(env) || !method_id) { J4A_FUNC_FAIL_TRACE2(method_name, method_sign); method_id = NULL; goto fail; } fail: return method_id; }
const char *J4AC_android_os_Bundle__getString__withCString__asCBuffer__catchAll(JNIEnv *env, jobject thiz, const char *key_cstr__, char *out_buf, int out_len) { const char *ret_value = NULL; const char *c_str = NULL; jstring local_string = J4AC_android_os_Bundle__getString__withCString__catchAll(env, thiz, key_cstr__); if (J4A_ExceptionCheck__catchAll(env) || !local_string) { goto fail; } c_str = (*env)->GetStringUTFChars(env, local_string, NULL ); if (J4A_ExceptionCheck__catchAll(env) || !c_str) { goto fail; } strlcpy(out_buf, c_str, out_len); ret_value = out_buf; fail: J4A_ReleaseStringUTFChars__p(env, local_string, &c_str); J4A_DeleteLocalRef__p(env, &local_string); return ret_value; }
SDL_AMediaFormat *SDL_AMediaFormatJava_init(JNIEnv *env, jobject android_format) { SDLTRACE("%s", __func__); jobject global_android_media_format = (*env)->NewGlobalRef(env, android_format); if (J4A_ExceptionCheck__catchAll(env) || !global_android_media_format) { return NULL; } SDL_AMediaFormat *aformat = SDL_AMediaFormat_CreateInternal(sizeof(SDL_AMediaFormat_Opaque)); if (!aformat) { SDL_JNI_DeleteGlobalRefP(env, &global_android_media_format); return NULL; } setup_aformat(aformat, global_android_media_format); return aformat; }
SDL_AMediaFormat *SDL_AMediaFormatJava_createVideoFormat(JNIEnv *env, const char *mime, int width, int height) { SDLTRACE("%s", __func__); jobject android_media_format = J4AC_MediaFormat__createVideoFormat__withCString__asGlobalRef__catchAll(env, mime, width, height); if (J4A_ExceptionCheck__catchAll(env) || !android_media_format) { return NULL; } SDL_AMediaFormat *aformat = SDL_AMediaFormat_CreateInternal(sizeof(SDL_AMediaFormat_Opaque)); if (!aformat) { SDL_JNI_DeleteGlobalRefP(env, &android_media_format); return NULL; } setup_aformat(aformat, android_media_format); SDL_AMediaFormat_setInt32(aformat, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, 0); return aformat; }
jobject J4AC_android_os_Bundle__Bundle__asGlobalRef__catchAll(JNIEnv *env) { jobject ret_object = NULL; jobject local_object = J4AC_android_os_Bundle__Bundle__catchAll(env); if (J4A_ExceptionCheck__catchAll(env) || !local_object) { ret_object = NULL; goto fail; } ret_object = J4A_NewGlobalRef__catchAll(env, local_object); if (!ret_object) { ret_object = NULL; goto fail; } fail: J4A_DeleteLocalRef__p(env, &local_object); return ret_object; }
jstring J4AC_android_os_Bundle__getString__withCString__asGlobalRef__catchAll(JNIEnv *env, jobject thiz, const char *key_cstr__) { jstring ret_object = NULL; jstring local_object = J4AC_android_os_Bundle__getString__withCString__catchAll(env, thiz, key_cstr__); if (J4A_ExceptionCheck__catchAll(env) || !local_object) { ret_object = NULL; goto fail; } ret_object = J4A_NewGlobalRef__catchAll(env, local_object); if (!ret_object) { ret_object = NULL; goto fail; } fail: J4A_DeleteLocalRef__p(env, &local_object); return ret_object; }
static bool mediacodec_select_callback(void *opaque, ijkmp_mediacodecinfo_context *mcc) { JNIEnv *env = NULL; jobject weak_this = (jobject) opaque; const char *found_codec_name = NULL; if (JNI_OK != SDL_JNI_SetupThreadEnv(&env)) { ALOGE("%s: SetupThreadEnv failed\n", __func__); return -1; } found_codec_name = J4AC_IjkMediaPlayer__onSelectCodec__withCString__asCBuffer(env, weak_this, mcc->mime_type, mcc->profile, mcc->level, mcc->codec_name, sizeof(mcc->codec_name)); if (J4A_ExceptionCheck__catchAll(env) || !found_codec_name) { ALOGE("%s: onSelectCodec failed\n", __func__); goto fail; } fail: return found_codec_name; }
static void SDL_AMediaFormatJava_setInt32(SDL_AMediaFormat* aformat, const char* name, int32_t value) { JNIEnv *env = NULL; if (JNI_OK != SDL_JNI_SetupThreadEnv(&env)) { ALOGE("%s: SDL_JNI_SetupThreadEnv: failed", __func__); return; } jobject android_media_format = getAndroidMediaFormat(env, aformat); if (!android_media_format) { ALOGE("%s: getAndroidMediaFormat: failed", __func__); return; } J4AC_MediaFormat__setInteger__withCString(env, android_media_format, name, value); if (J4A_ExceptionCheck__catchAll(env)) { ALOGE("%s: CallVoidMethod: failed", __func__); return; } }
static bool SDL_AMediaFormatJava_getInt32(SDL_AMediaFormat* aformat, const char* name, int32_t *out) { JNIEnv *env = NULL; if (JNI_OK != SDL_JNI_SetupThreadEnv(&env)) { ALOGE("%s: SDL_JNI_SetupThreadEnv: failed", __func__); return false; } jobject android_media_format = getAndroidMediaFormat(env, aformat); if (!android_media_format) { ALOGE("%s: getAndroidMediaFormat: failed", __func__); return false; } jint ret = J4AC_MediaFormat__getInteger__withCString(env, android_media_format, name); if (J4A_ExceptionCheck__catchAll(env)) { ALOGE("%s: CallIntMethod: failed", __func__); return false; } if (out) *out = ret; return true; }
static int reconfigure_codec_l(JNIEnv *env, IJKFF_Pipenode *node, jobject new_surface) { IJKFF_Pipenode_Opaque *opaque = node->opaque; int ret = 0; sdl_amedia_status_t amc_ret = 0; jobject prev_jsurface = NULL; prev_jsurface = opaque->jsurface; if (new_surface) { opaque->jsurface = (*env)->NewGlobalRef(env, new_surface); if (J4A_ExceptionCheck__catchAll(env) || !opaque->jsurface) goto fail; } else { opaque->jsurface = NULL; } SDL_JNI_DeleteGlobalRefP(env, &prev_jsurface); if (!opaque->acodec) { opaque->acodec = create_codec_l(env, node); if (!opaque->acodec) { ALOGE("%s:open_video_decoder: create_codec failed\n", __func__); ret = -1; goto fail; } } if (SDL_AMediaCodec_isConfigured(opaque->acodec)) { if (opaque->acodec) { if (SDL_AMediaCodec_isStarted(opaque->acodec)) { SDL_VoutAndroid_invalidateAllBuffers(opaque->weak_vout); SDL_AMediaCodec_stop(opaque->acodec); } if (opaque->quirk_reconfigure_with_new_codec) { ALOGI("quirk: reconfigure with new codec"); SDL_AMediaCodec_decreaseReferenceP(&opaque->acodec); opaque->acodec = create_codec_l(env, node); if (!opaque->acodec) { ALOGE("%s:open_video_decoder: create_codec failed\n", __func__); ret = -1; goto fail; } } } assert(opaque->weak_vout); } amc_ret = SDL_AMediaCodec_configure_surface(env, opaque->acodec, opaque->input_aformat, opaque->jsurface, NULL, 0); if (amc_ret != SDL_AMEDIA_OK) { ALOGE("%s:configure_surface: failed\n", __func__); ret = -1; goto fail; } amc_ret = SDL_AMediaCodec_start(opaque->acodec); if (amc_ret != SDL_AMEDIA_OK) { ALOGE("%s:SDL_AMediaCodec_start: failed\n", __func__); ret = -1; goto fail; } opaque->acodec_first_dequeue_output_request = true; ALOGI("%s:new acodec: %p\n", __func__, opaque->acodec); SDL_VoutAndroid_setAMediaCodec(opaque->weak_vout, opaque->acodec); fail: return ret; }
void J4AC_android_os_Bundle__putParcelableArrayList__catchAll(JNIEnv *env, jobject thiz, jstring key, jobject value) { J4AC_android_os_Bundle__putParcelableArrayList(env, thiz, key, value); J4A_ExceptionCheck__catchAll(env); }
void J4AC_android_os_Bundle__putString__catchAll(JNIEnv *env, jobject thiz, jstring key, jstring value) { J4AC_android_os_Bundle__putString(env, thiz, key, value); J4A_ExceptionCheck__catchAll(env); }