--- old/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gstregistry.c 2017-10-03 19:36:24.982346100 -0700 +++ new/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gstregistry.c 2017-10-03 19:36:24.254273300 -0700 @@ -157,10 +157,12 @@ #include #include -static const int AVCODEC_EXPLICIT_VERSIONS[] = { 53, 54, 55, 56 }; +// For libav (libavcodec.so) +static const int AVCODEC_LIBAV_EXPLICIT_VERSIONS[] = { 53, 54, 55, 56 }; +// For ffmpeg (libavcodec-ffmpeg.so) static const int AVCODEC_FFMPEG_EXPLICIT_VERSIONS[] = { 56 }; - -typedef unsigned (*avcodec_version_proto)(); +// For libav or ffmpeg (libavcodec.so) +static const int AVCODEC_EXPLICIT_VERSIONS[] = { 57 }; /* * Callback passed to dl_iterate_phdr(): finds the path of @@ -1368,62 +1370,88 @@ } #else // GSTREAMER_LITE - for (gstlite_plugins_list_index = 0; gstlite_plugins_list[gstlite_plugins_list_index] != NULL; gstlite_plugins_list_index++) - { - filename_partial = g_build_filename (path, gstlite_plugins_list[gstlite_plugins_list_index], NULL); + for (gstlite_plugins_list_index = 0; gstlite_plugins_list[gstlite_plugins_list_index] != NULL; gstlite_plugins_list_index++) { + filename_partial = g_build_filename (path, gstlite_plugins_list[gstlite_plugins_list_index], NULL); #ifdef LINUX - if (g_str_has_suffix(filename_partial, "libavplugin")) // Check libav version and load correspondent module. - { - int vi = (sizeof(AVCODEC_EXPLICIT_VERSIONS)/sizeof(AVCODEC_EXPLICIT_VERSIONS[0])); - - while(!avcHandle && --vi >= 0) - { - int version = AVCODEC_EXPLICIT_VERSIONS[vi]; - gchar* libname = g_strdup_printf("libavcodec.so.%d", version); - avcHandle = dlopen(libname, RTLD_NOW); - g_free(libname); - } + if (g_str_has_suffix(filename_partial, "libavplugin")) { // Check libav version and load correspondent module. + int plugin_version = 0; + // Look for libavcodec and check its version to figure out if it is + // libav or ffmpeg. Starting from 57 and up + int vi = (sizeof(AVCODEC_EXPLICIT_VERSIONS)/sizeof(AVCODEC_EXPLICIT_VERSIONS[0])); + while(!avcHandle && --vi >= 0) { + int version = AVCODEC_EXPLICIT_VERSIONS[vi]; + gchar* libname = g_strdup_printf("libavcodec.so.%d", version); + avcHandle = dlopen(libname, RTLD_NOW); + g_free(libname); + } - // Look for libavcodec-ffmpeg if libavcodec is not available - if (avcHandle == NULL) - { - vi = (sizeof(AVCODEC_FFMPEG_EXPLICIT_VERSIONS)/sizeof(AVCODEC_FFMPEG_EXPLICIT_VERSIONS[0])); - while(!avcHandle && --vi >= 0) - { - int version = AVCODEC_FFMPEG_EXPLICIT_VERSIONS[vi]; - gchar* libname = g_strdup_printf("libavcodec-ffmpeg.so.%d", version); - avcHandle = dlopen(libname, RTLD_NOW); - g_free(libname); - } + // Check if it is libav or ffmpeg + if (avcHandle) { + unsigned int (*av_version)(void); + av_version = dlsym(avcHandle, "avcodec_version"); + if (av_version != NULL) { + unsigned int version = (*av_version)(); + unsigned int micro = version & 0xFF; + if (micro >= 100) + isAVCFFMPEG = TRUE; + plugin_version = AVCODEC_EXPLICIT_VERSIONS[vi]; + } else { // Something wrong + dlclose(avcHandle); + avcHandle = NULL; + } + } - if (avcHandle) - isAVCFFMPEG = TRUE; - } + // Look for libavcodec-ffmpeg. For 56 only + if (avcHandle == NULL) { + vi = (sizeof(AVCODEC_FFMPEG_EXPLICIT_VERSIONS)/sizeof(AVCODEC_FFMPEG_EXPLICIT_VERSIONS[0])); + while(!avcHandle && --vi >= 0) { + int version = AVCODEC_FFMPEG_EXPLICIT_VERSIONS[vi]; + gchar* libname = g_strdup_printf("libavcodec-ffmpeg.so.%d", version); + avcHandle = dlopen(libname, RTLD_NOW); + g_free(libname); + } - if (avcHandle) - { - dlclose(avcHandle); - avcHandle = NULL; - - // Try simple name first. OpenJDK build may contain the latest bits. - filename = g_strdup_printf("%s%s", filename_partial, GST_EXTRA_MODULE_SUFFIX); - if (g_stat (filename, &file_status) < 0) // Not available, create a versioned filename - { - g_free(filename); - if (isAVCFFMPEG) - filename = g_strdup_printf("%s-ffmpeg-%d%s", filename_partial, AVCODEC_FFMPEG_EXPLICIT_VERSIONS[vi], GST_EXTRA_MODULE_SUFFIX); - else - filename = g_strdup_printf("%s-%d%s", filename_partial, AVCODEC_EXPLICIT_VERSIONS[vi], GST_EXTRA_MODULE_SUFFIX); - } - } + if (avcHandle) { + plugin_version = AVCODEC_FFMPEG_EXPLICIT_VERSIONS[vi]; + isAVCFFMPEG = TRUE; + } + } + + // Looks for libav 56 and below + if (avcHandle == NULL) { + vi = (sizeof(AVCODEC_LIBAV_EXPLICIT_VERSIONS)/sizeof(AVCODEC_LIBAV_EXPLICIT_VERSIONS[0])); + while(!avcHandle && --vi >= 0) { + int version = AVCODEC_LIBAV_EXPLICIT_VERSIONS[vi]; + gchar* libname = g_strdup_printf("libavcodec.so.%d", version); + avcHandle = dlopen(libname, RTLD_NOW); + g_free(libname); + } + + if (avcHandle) { + plugin_version = AVCODEC_LIBAV_EXPLICIT_VERSIONS[vi]; + } + } + + if (avcHandle) { + dlclose(avcHandle); + avcHandle = NULL; + + // Try simple name first. OpenJDK build may contain the latest bits. + filename = g_strdup_printf("%s%s", filename_partial, GST_EXTRA_MODULE_SUFFIX); + if (g_stat (filename, &file_status) < 0) { // Not available, create a versioned filename + g_free(filename); + if (isAVCFFMPEG) + filename = g_strdup_printf("%s-ffmpeg-%d%s", filename_partial, plugin_version, GST_EXTRA_MODULE_SUFFIX); else - { - g_free(filename_partial); - continue; // No libavcodec.so installed. + filename = g_strdup_printf("%s-%d%s", filename_partial, plugin_version, GST_EXTRA_MODULE_SUFFIX); } + } else { + g_free(filename_partial); + continue; // No libavcodec.so installed. } - else - filename = g_strconcat(filename_partial, GST_EXTRA_MODULE_SUFFIX, NULL); + } else { + filename = g_strconcat(filename_partial, GST_EXTRA_MODULE_SUFFIX, NULL); + } #else filename = g_strconcat(filename_partial, GST_EXTRA_MODULE_SUFFIX, NULL); #endif