void Java_org_videolan_libvlc_LibVLC_nativeInit(JNIEnv *env, jobject thiz) { //only use OpenSLES if java side says we can jclass cls = (*env)->GetObjectClass(env, thiz); jmethodID methodId = (*env)->GetMethodID(env, cls, "getAout", "()I"); bool use_opensles = (*env)->CallIntMethod(env, thiz, methodId) == AOUT_OPENSLES; methodId = (*env)->GetMethodID(env, cls, "getVout", "()I"); bool use_opengles2 = (*env)->CallIntMethod(env, thiz, methodId) == VOUT_OPENGLES2; methodId = (*env)->GetMethodID(env, cls, "timeStretchingEnabled", "()Z"); bool enable_time_stretch = (*env)->CallBooleanMethod(env, thiz, methodId); methodId = (*env)->GetMethodID(env, cls, "frameSkipEnabled", "()Z"); bool enable_frame_skip = (*env)->CallBooleanMethod(env, thiz, methodId); methodId = (*env)->GetMethodID(env, cls, "getDeblocking", "()I"); int deblocking = (*env)->CallIntMethod(env, thiz, methodId); char deblockstr[2]; snprintf(deblockstr, sizeof(deblockstr), "%d", deblocking); LOGD("Using deblocking level %d", deblocking); methodId = (*env)->GetMethodID(env, cls, "getNetworkCaching", "()I"); int networkCaching = (*env)->CallIntMethod(env, thiz, methodId); char networkCachingstr[25]; if(networkCaching > 0) { snprintf(networkCachingstr, sizeof(networkCachingstr), "--network-caching=%d", networkCaching); LOGD("Using network caching of %d ms", networkCaching); } methodId = (*env)->GetMethodID(env, cls, "getChroma", "()Ljava/lang/String;"); jstring chroma = (*env)->CallObjectMethod(env, thiz, methodId); const char *chromastr = (*env)->GetStringUTFChars(env, chroma, 0); LOGD("Chroma set to \"%s\"", chromastr); methodId = (*env)->GetMethodID(env, cls, "getSubtitlesEncoding", "()Ljava/lang/String;"); jstring subsencoding = (*env)->CallObjectMethod(env, thiz, methodId); const char *subsencodingstr = (*env)->GetStringUTFChars(env, subsencoding, 0); LOGD("Subtitle encoding set to \"%s\"", subsencodingstr); methodId = (*env)->GetMethodID(env, cls, "isVerboseMode", "()Z"); verbosity = (*env)->CallBooleanMethod(env, thiz, methodId); methodId = (*env)->GetMethodID(env, cls, "getHardwareAcceleration", "()I"); int hardwareAcceleration = (*env)->CallIntMethod(env, thiz, methodId); /* With the MediaCodec opaque mode we cannot use the OpenGL ES vout. */ if (hardwareAcceleration == HW_ACCELERATION_FULL) use_opengles2 = false; /* Don't add any invalid options, otherwise it causes LibVLC to crash */ const char *argv[] = { /* CPU intensive plugin, setting for slow devices */ enable_time_stretch ? "--audio-time-stretch" : "--no-audio-time-stretch", /* avcodec speed settings for slow devices */ //"--avcodec-fast", // non-spec-compliant speedup tricks "--avcodec-skiploopfilter", deblockstr, "--avcodec-skip-frame", enable_frame_skip ? "2" : "0", "--avcodec-skip-idct", enable_frame_skip ? "2" : "0", /* Remove me when UTF-8 is enforced by law */ "--subsdec-encoding", subsencodingstr, /* XXX: why can't the default be fine ? #7792 */ (networkCaching > 0) ? networkCachingstr : "", /* Android audio API is a mess */ use_opensles ? "--aout=opensles" : "--aout=android_audiotrack", /* Android video API is a mess */ use_opengles2 ? "--vout=gles2" : "--vout=androidsurface", "--androidsurface-chroma", chromastr != NULL && chromastr[0] != 0 ? chromastr : "RV32", /* XXX: we can't recover from direct rendering failure */ (hardwareAcceleration == HW_ACCELERATION_FULL) ? "" : "--no-mediacodec-dr", }; libvlc_instance_t *instance = libvlc_new(sizeof(argv) / sizeof(*argv), argv); setLong(env, thiz, "mLibVlcInstance", (jlong)(intptr_t) instance); (*env)->ReleaseStringUTFChars(env, chroma, chromastr); (*env)->ReleaseStringUTFChars(env, subsencoding, subsencodingstr); if (!instance) { jclass exc = (*env)->FindClass(env, "org/videolan/libvlc/LibVlcException"); (*env)->ThrowNew(env, exc, "Unable to instantiate LibVLC"); } LOGI("LibVLC initialized: %p", instance); libvlc_log_set(instance, debug_log, &verbosity); init_native_crash_handler(env, thiz); }
void Java_org_videolan_libvlc_LibVLC_nativeInit(JNIEnv *env, jobject thiz) { //only use OpenSLES if java side says we can jclass cls = (*env)->GetObjectClass(env, thiz); jmethodID methodId = (*env)->GetMethodID(env, cls, "getAout", "()I"); int aout = (*env)->CallIntMethod(env, thiz, methodId); methodId = (*env)->GetMethodID(env, cls, "getVout", "()I"); int vout = (*env)->CallIntMethod(env, thiz, methodId); methodId = (*env)->GetMethodID(env, cls, "timeStretchingEnabled", "()Z"); bool enable_time_stretch = (*env)->CallBooleanMethod(env, thiz, methodId); methodId = (*env)->GetMethodID(env, cls, "frameSkipEnabled", "()Z"); bool enable_frame_skip = (*env)->CallBooleanMethod(env, thiz, methodId); methodId = (*env)->GetMethodID(env, cls, "getDeblocking", "()I"); int deblocking = (*env)->CallIntMethod(env, thiz, methodId); char deblockstr[2]; snprintf(deblockstr, sizeof(deblockstr), "%d", deblocking); LOGD("Using deblocking level %d", deblocking); methodId = (*env)->GetMethodID(env, cls, "getNetworkCaching", "()I"); int networkCaching = (*env)->CallIntMethod(env, thiz, methodId); char networkCachingstr[25]; if(networkCaching > 0) { snprintf(networkCachingstr, sizeof(networkCachingstr), "--network-caching=%d", networkCaching); LOGD("Using network caching of %d ms", networkCaching); } methodId = (*env)->GetMethodID(env, cls, "getHttpReconnect", "()Z"); bool enable_http_reconnect = (*env)->CallBooleanMethod(env, thiz, methodId); methodId = (*env)->GetMethodID(env, cls, "getChroma", "()Ljava/lang/String;"); jstring chroma = (*env)->CallObjectMethod(env, thiz, methodId); const char *chromastr = (*env)->GetStringUTFChars(env, chroma, 0); LOGD("Chroma set to \"%s\"", chromastr); methodId = (*env)->GetMethodID(env, cls, "getSubtitlesEncoding", "()Ljava/lang/String;"); jstring subsencoding = (*env)->CallObjectMethod(env, thiz, methodId); const char *subsencodingstr = (*env)->GetStringUTFChars(env, subsencoding, 0); LOGD("Subtitle encoding set to \"%s\"", subsencodingstr); methodId = (*env)->GetMethodID(env, cls, "isVerboseMode", "()Z"); verbosity = (*env)->CallBooleanMethod(env, thiz, methodId); methodId = (*env)->GetMethodID(env, cls, "isDirectRendering", "()Z"); bool direct_rendering = (*env)->CallBooleanMethod(env, thiz, methodId); /* With the MediaCodec opaque mode we cannot use the OpenGL ES vout. */ if (direct_rendering) vout = VOUT_ANDROID_WINDOW; methodId = (*env)->GetMethodID(env, cls, "getCachePath", "()Ljava/lang/String;"); jstring cachePath = (*env)->CallObjectMethod(env, thiz, methodId); if (cachePath) { const char *cache_path = (*env)->GetStringUTFChars(env, cachePath, 0); setenv("DVDCSS_CACHE", cache_path, 1); (*env)->ReleaseStringUTFChars(env, cachePath, cache_path); } #define MAX_ARGV 18 const char *argv[MAX_ARGV]; int argc = 0; /* CPU intensive plugin, setting for slow devices */ argv[argc++] = enable_time_stretch ? "--audio-time-stretch" : "--no-audio-time-stretch"; /* avcodec-skiploopfilter */ argv[argc++] = "--avcodec-skiploopfilter"; argv[argc++] = deblockstr; /* avcodec-skip-frame */ argv[argc++] = "--avcodec-skip-frame"; argv[argc++] = enable_frame_skip ? "2" : "0"; /* avcodec-skip-idct */ argv[argc++] = "--avcodec-skip-idct"; argv[argc++] = enable_frame_skip ? "2" : "0"; /* Remove me when UTF-8 is enforced by law */ argv[argc++] = "--subsdec-encoding"; argv[argc++] = subsencodingstr; /* Enable statistics */ argv[argc++] = "--stats"; /* XXX: why can't the default be fine ? #7792 */ if (networkCaching > 0) argv[argc++] = networkCachingstr; /* Android audio API */ argv[argc++] = aout == AOUT_OPENSLES ? "--aout=opensles" : (aout == AOUT_AUDIOTRACK ? "--aout=android_audiotrack" : "--aout=dummy"); /* Android video API */ argv[argc++] = vout == VOUT_ANDROID_WINDOW ? "--vout=androidwindow" : (vout == VOUT_OPENGLES2 ? "--vout=gles2" : "--vout=androidsurface"); /* chroma */ argv[argc++] = "--androidsurface-chroma"; argv[argc++] = chromastr != NULL && chromastr[0] != 0 ? chromastr : "RV32"; /* direct rendering */ if (!direct_rendering) { argv[argc++] = "--no-mediacodec-dr"; #ifdef HAVE_IOMX_DR argv[argc++] = "--no-omxil-dr"; #endif } /* Reconnect on lost HTTP streams, e.g. network change */ if (enable_http_reconnect) argv[argc++] = "--http-reconnect"; assert(MAX_ARGV >= argc); libvlc_instance_t *instance = libvlc_new(argc, argv); setLong(env, thiz, "mLibVlcInstance", (jlong)(intptr_t) instance); (*env)->ReleaseStringUTFChars(env, chroma, chromastr); (*env)->ReleaseStringUTFChars(env, subsencoding, subsencodingstr); if (!instance) { jclass exc = (*env)->FindClass(env, "org/videolan/libvlc/LibVlcException"); (*env)->ThrowNew(env, exc, "Unable to instantiate LibVLC"); } LOGI("LibVLC initialized: %p", instance); libvlc_log_set(instance, debug_log, &verbosity); init_native_crash_handler(env, thiz); }
/** * Sets the logging callback for a LibVLC instance. This function is * thread-safe: it will wait for any pending callbacks invocation to * complete. * * \param data opaque data pointer for the callback function * * \note Some log messages (especially debug) are emitted by LibVLC while * is being initialized. These messages cannot be captured with this * interface. * * \warning A deadlock may occur if this function is called from the * callback. * * \param p_instance libvlc instance * * \version LibVLC 2.1.0 or later */ void logSet(libvlc_log_cb cb, void * data) { libvlc_log_set(*this, cb, data); }
// TODO don't leak shit. static PP_Bool vlc_did_create(PP_Instance instance, uint32_t _argc, const char *_argn[], const char *_argv[]) { vlc_setPPAPI_InitializingInstance(instance); VLC_UNUSED(_argc); VLC_UNUSED(_argn); VLC_UNUSED(_argv); if(vlc_PPAPI_InitializeInstance(instance) != VLC_SUCCESS) { return PP_FALSE; } PP_Bool ret = PP_FALSE; libvlc_instance_t* vlc_inst = NULL; libvlc_media_player_t* media_player = NULL; libvlc_media_list_player_t* media_list_player = NULL; libvlc_media_list_t* playlist = NULL; instance_t* new_inst = add_instance(instance); if(new_inst == NULL) { vlc_ppapi_log_error(instance, "failed to create the plugin instance object!\n"); goto error; } vlc_inst = libvlc_new(0, NULL); if(vlc_inst == NULL) { vlc_ppapi_log_error(instance, "failed to create the vlc instance!\n"); goto error; } else { new_inst->vlc = vlc_inst; } libvlc_log_set(vlc_inst, libvlc_logging_callback, (void*)new_inst); media_player = libvlc_media_player_new(vlc_inst); if(media_player == NULL) { vlc_ppapi_log_error(instance, "libvlc_media_player_t creation failed"); goto error; } else { new_inst->media_player = media_player; } var_Create(media_player, "ppapi-instance", VLC_VAR_INTEGER); var_SetInteger(media_player, "ppapi-instance", instance); var_SetString(media_player, "vout", "ppapi_vout_graphics3d"); if(-1 == libvlc_add_intf(vlc_inst, "ppapi_control")) { vlc_ppapi_log_error(instance, "failed to start `ppapi-control`"); goto error; } ret = PP_TRUE; goto done; error: ret = PP_FALSE; if(new_inst != NULL) { remove_instance(new_inst); } done: vlc_setPPAPI_InitializingInstance(0); return ret; }