diff options
author | almatvee <none@none> | 2017-10-04 14:20:19 -0700 |
---|---|---|
committer | almatvee <none@none> | 2017-10-04 14:20:19 -0700 |
commit | fb2eeeeb314bfeebed94b82d8092ced2801610e2 (patch) | |
tree | 7925976ede55ab5b0974e9e390fcba06a82db399 | |
parent | 06d81d3b6daa57e7e4ae557c105e42b5d5fcf6f1 (diff) | |
download | jdk8u_jfx-fb2eeeeb314bfeebed94b82d8092ced2801610e2.tar.gz |
8181922: Provide media support for libav version 57
Reviewed-by: kcr, ddehaven
-rw-r--r-- | modules/media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gstregistry.c | 134 |
1 files changed, 81 insertions, 53 deletions
diff --git a/modules/media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gstregistry.c b/modules/media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gstregistry.c index ae954d8d1..738da9844 100644 --- a/modules/media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gstregistry.c +++ b/modules/media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gstregistry.c @@ -162,10 +162,12 @@ extern HMODULE _priv_gst_dll_handle; #include <link.h> #include <dlfcn.h> -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 @@ -1249,62 +1251,88 @@ gst_registry_scan_path_level (GstRegistryScanContext * context, } #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); - } - - if (avcHandle) - isAVCFFMPEG = TRUE; - } + // 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) - { - 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); - } - } + // 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) { + 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 |