Yes we would like to have it merge upstream :-) 2015-03-27 14:37 GMT+01:00 Hans de Goede <hdegoede@xxxxxxxxxx>: > Hi, > > On 27-03-15 09:29, Benjamin Gaignard wrote: >> >> Hello, >> >> On behalf of Paramanand, I would have to have your opinion on this patch. >> The goal is to enable more v4l2 lib features on Android to be able to >> do video decoding using v4l2 devices. > > > This looks fine to me, you say that > "I would have to have your opinion on this patch." > > So I've not merged it yet, let me know if you want to have this patch merged > upstream. > > Regards, > > Hans > > > > >> >> Regards, >> Benjamin >> >> commit 85f40dcc5248b5fb03464fe25fd2d1acb30f9722 >> Author: Paramanand SINGH <paramanand.singh@xxxxxxxxxx> >> Date: Wed Mar 11 15:41:28 2015 +0530 >> >> libv4l2: Changes for compilation in Android 5.0 >> >> Added Android makefiles for libv4l2 and >> libv4lconvert. Minor changes to include >> android-config.h. Changed the plugin >> loading mechanism to avoid using >> unsupported glob.h header. Current mechanism >> supports a list of plugin search paths >> including /system/lib and /vendor/lib. >> >> Signed-off-by: Paramanand Singh <paramanand.singh@xxxxxxxxxx> >> >> diff --git a/android-config.h b/android-config.h >> index f474330..9f12b8f 100644 >> --- a/android-config.h >> +++ b/android-config.h >> @@ -1,3 +1,5 @@ >> +#ifndef __V4L_ANDROID_CONFIG_H__ >> +#define __V4L_ANDROID_CONFIG_H__ >> /* config.h. Generated from config.h.in by configure. */ >> /* config.h.in. Generated from configure.ac by autoheader. */ >> >> @@ -358,3 +360,4 @@ getsubopt (char **optionp, char *const *tokens, >> char **valuep) >> >> return -1; >> } >> +#endif >> diff --git a/lib/Android.mk b/lib/Android.mk >> new file mode 100644 >> index 0000000..2e43120 >> --- /dev/null >> +++ b/lib/Android.mk >> @@ -0,0 +1,4 @@ >> +LOCAL_PATH:= $(call my-dir) >> +include $(CLEAR_VARS) >> + >> +include $(call all-makefiles-under,$(LOCAL_PATH)) >> diff --git a/lib/libv4l2/Android.mk b/lib/libv4l2/Android.mk >> new file mode 100644 >> index 0000000..7d723fb >> --- /dev/null >> +++ b/lib/libv4l2/Android.mk >> @@ -0,0 +1,31 @@ >> +LOCAL_PATH:= $(call my-dir) >> + >> +include $(CLEAR_VARS) >> + >> +LOCAL_SRC_FILES := \ >> + log.c \ >> + libv4l2.c \ >> + v4l2convert.c \ >> + v4l2-plugin-android.c >> + >> +LOCAL_CFLAGS += -Wno-missing-field-initializers >> +LOCAL_CFLAGS += -Wno-sign-compare >> + >> +LOCAL_C_INCLUDES := \ >> + $(LOCAL_PATH)/../include \ >> + $(LOCAL_PATH)/../../include \ >> + $(LOCAL_PATH)/../.. \ >> + $(TOP)/bionic/libc/upstream-openbsd/lib/libc/gen >> + >> +LOCAL_SHARED_LIBRARIES := \ >> + libutils \ >> + libcutils \ >> + libdl \ >> + libssl \ >> + libz >> + >> +LOCAL_STATIC_LIBRARIES := libv4l_convert >> +LOCAL_MODULE := libv4l2 >> +LOCAL_MODULE_TAGS := optional >> + >> +include $(BUILD_SHARED_LIBRARY) >> diff --git a/lib/libv4l2/libv4l2.c b/lib/libv4l2/libv4l2.c >> index 966a000..70a6fd2 100644 >> --- a/lib/libv4l2/libv4l2.c >> +++ b/lib/libv4l2/libv4l2.c >> @@ -55,7 +55,11 @@ >> When modifications are made, one should be careful that this behavior >> is >> preserved. >> */ >> +#ifdef ANDROID >> +#include <android-config.h> >> +#else >> #include <config.h> >> +#endif >> #include <errno.h> >> #include <stdarg.h> >> #include <stdio.h> >> diff --git a/lib/libv4l2/log.c b/lib/libv4l2/log.c >> index d1042ed..9d3eab1 100644 >> --- a/lib/libv4l2/log.c >> +++ b/lib/libv4l2/log.c >> @@ -18,7 +18,11 @@ >> # Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA >> 02110-1335 USA >> */ >> >> +#ifdef ANDROID >> +#include <android-config.h> >> +#else >> #include <config.h> >> +#endif >> #include <stdio.h> >> #include <stdlib.h> >> #include <string.h> >> diff --git a/lib/libv4l2/v4l2-plugin-android.c >> b/lib/libv4l2/v4l2-plugin-android.c >> new file mode 100644 >> index 0000000..af7f4ae >> --- /dev/null >> +++ b/lib/libv4l2/v4l2-plugin-android.c >> @@ -0,0 +1,153 @@ >> +/* >> +* Copyright (C) 2010 Nokia Corporation <multimedia@xxxxxxxxx> >> + >> +* This program is free software; you can redistribute it and/or modify >> +* it under the terms of the GNU Lesser General Public License as >> published by >> +* the Free Software Foundation; either version 2.1 of the License, or >> +* (at your option) any later version. >> +* >> +* This program is distributed in the hope that it will be useful, >> +* but WITHOUT ANY WARRANTY; without even the implied warranty of >> +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> +* Lesser General Public License for more details. >> +* >> +* You should have received a copy of the GNU Lesser General Public >> License >> +* along with this program; if not, write to the Free Software >> +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 >> USA >> +*/ >> + >> +#ifdef ANDROID >> +#include <android-config.h> >> +#else >> +#include <config.h> >> +#endif >> +#include <stdarg.h> >> +#include <dlfcn.h> >> +#include <fcntl.h> >> +#include <glob.h> >> +#include <sys/stat.h> >> +#include <sys/mman.h> >> +#include <sys/types.h> >> +#include <dirent.h> >> +#include <stdlib.h> >> +#include <string.h> >> +#include "libv4l2.h" >> +#include "libv4l2-priv.h" >> +#include "libv4l-plugin.h" >> + >> +/* libv4l plugin support: >> + it is provided by functions v4l2_plugin_[open,close,etc]. >> + >> + When open() is called libv4l dlopens files in >> /usr/lib[64]/libv4l/plugins >> + 1 at a time and call open callback passing through the applications >> + parameters unmodified. >> + >> + If a plugin is relevant for the specified device node, it can indicate >> so >> + by returning a value other then -1 (the actual file descriptor). >> + As soon as a plugin returns another value then -1 plugin loading stops >> and >> + information about it (fd and corresponding library handle) is stored. >> For >> + each function v4l2_[ioctl,read,close,etc] is called corresponding >> + v4l2_plugin_* function which looks if there is loaded plugin for that >> file >> + and call it's callbacks. >> + >> + v4l2_plugin_* function indicates by it's first argument if plugin was >> used, >> + and if it was not then v4l2_* functions proceed with their usual >> behavior. >> +*/ >> + >> +/* list of plugin search paths */ >> +static const char *g_plugin_search_paths[] = { >> + "/system/lib/libv4l/plugins", >> + "/vendor/lib/libv4l/plugins", >> + NULL /* list terminator */ >> +}; >> + >> +void v4l2_plugin_init(int fd, void **plugin_lib_ret, void >> **plugin_priv_ret, >> + const struct libv4l_dev_ops **dev_ops_ret) >> +{ >> + char *error; >> + void *plugin_library = NULL; >> + const struct libv4l_dev_ops *libv4l2_plugin = NULL; >> + DIR *plugin_dir = NULL; >> + struct dirent *entry; >> + char *suffix = NULL; >> + int length, i; >> + char filename[256]; >> + >> + /* initialize output params */ >> + *dev_ops_ret = v4lconvert_get_default_dev_ops(); >> + *plugin_lib_ret = NULL; >> + *plugin_priv_ret = NULL; >> + >> + /* read the plugin directory for "*.so" files */ >> + for (i = 0; g_plugin_search_paths[i] != NULL; i++) { >> + plugin_dir = opendir(g_plugin_search_paths[i]); >> + if (plugin_dir == NULL) { >> + V4L2_LOG_ERR("PLUGIN: opening plugin directory (%s) failed\n", >> + g_plugin_search_paths[i]); >> + continue; >> + } >> + >> + while (entry = readdir(plugin_dir)) { >> + /* get last 3 letter suffix from the filename */ >> + length = strlen(entry->d_name); >> + if (length > 3) >> + suffix = entry->d_name + (length - 3); >> + >> + if (!suffix || strcmp(suffix, ".so")) { >> + suffix = NULL; /* reset for next iteration */ >> + continue; >> + } >> + >> + /* load library and get desired symbol */ >> + sprintf(filename, "%s/%s", g_plugin_search_paths[i], entry->d_name); >> + V4L2_LOG("PLUGIN: dlopen(%s);\n", filename); >> + plugin_library = dlopen(filename, RTLD_LAZY); >> + if (!plugin_library) >> + continue; >> + >> + dlerror(); /* Clear any existing error */ >> + libv4l2_plugin = (struct libv4l_dev_ops *) >> + dlsym(plugin_library, "libv4l2_plugin"); >> + error = dlerror(); >> + if (error != NULL) { >> + V4L2_LOG_ERR("PLUGIN: dlsym failed: %s\n", error); >> + dlclose(plugin_library); >> + continue; >> + } >> + >> + if (!libv4l2_plugin->init || >> + !libv4l2_plugin->close || >> + !libv4l2_plugin->ioctl) { >> + V4L2_LOG("PLUGIN: does not have all mandatory ops\n"); >> + dlclose(plugin_library); >> + continue; >> + } >> + >> + *plugin_priv_ret = libv4l2_plugin->init(fd); >> + if (!*plugin_priv_ret) { >> + V4L2_LOG("PLUGIN: plugin open() returned NULL\n"); >> + dlclose(plugin_library); >> + continue; >> + } >> + >> + /* exit loop when a suitable plugin is found */ >> + *plugin_lib_ret = plugin_library; >> + *dev_ops_ret = libv4l2_plugin; >> + break; >> + } >> + closedir(plugin_dir); >> + >> + /* exit loop when a suitable plugin is found */ >> + if (*plugin_lib_ret && *plugin_priv_ret && *dev_ops_ret) >> + break; >> + } >> +} >> + >> +void v4l2_plugin_cleanup(void *plugin_lib, void *plugin_priv, >> + const struct libv4l_dev_ops *dev_ops) >> +{ >> + if (plugin_lib) { >> + dev_ops->close(plugin_priv); >> + dlclose(plugin_lib); >> + } >> +} >> diff --git a/lib/libv4l2/v4l2convert.c b/lib/libv4l2/v4l2convert.c >> index 9b46ab8..d046834 100644 >> --- a/lib/libv4l2/v4l2convert.c >> +++ b/lib/libv4l2/v4l2convert.c >> @@ -25,7 +25,11 @@ >> >> #define _LARGEFILE64_SOURCE 1 >> >> +#ifdef ANDROID >> +#include <android-config.h> >> +#else >> #include <config.h> >> +#endif >> #include <stdarg.h> >> #include <stdlib.h> >> #include <fcntl.h> >> @@ -111,6 +115,7 @@ LIBV4L_PUBLIC int open64(const char *file, int oflag, >> ...) >> } >> #endif >> >> +#ifndef ANDROID >> LIBV4L_PUBLIC int close(int fd) >> { >> return v4l2_close(fd); >> @@ -156,4 +161,4 @@ LIBV4L_PUBLIC int munmap(void *start, size_t length) >> { >> return v4l2_munmap(start, length); >> } >> - >> +#endif >> diff --git a/lib/libv4lconvert/Android.mk b/lib/libv4lconvert/Android.mk >> new file mode 100644 >> index 0000000..99a136b >> --- /dev/null >> +++ b/lib/libv4lconvert/Android.mk >> @@ -0,0 +1,53 @@ >> +LOCAL_PATH:= $(call my-dir) >> + >> +include $(CLEAR_VARS) >> + >> +LOCAL_SRC_FILES := \ >> + bayer.c \ >> + cpia1.c \ >> + crop.c \ >> + flip.c \ >> + helper.c \ >> + hm12.c \ >> + jidctflt.c \ >> + jl2005bcd.c \ >> + jpeg.c \ >> + jpeg_memsrcdest.c \ >> + jpgl.c \ >> + libv4lconvert.c \ >> + mr97310a.c \ >> + pac207.c \ >> + rgbyuv.c \ >> + se401.c \ >> + sn9c10x.c \ >> + sn9c2028-decomp.c \ >> + sn9c20x.c \ >> + spca501.c \ >> + spca561-decompress.c \ >> + sq905c.c \ >> + stv0680.c \ >> + tinyjpeg.c \ >> + control/libv4lcontrol.c \ >> + processing/autogain.c \ >> + processing/gamma.c \ >> + processing/libv4lprocessing.c \ >> + processing/whitebalance.c \ >> + >> +LOCAL_CFLAGS += -Wno-missing-field-initializers >> +LOCAL_CFLAGS += -Wno-sign-compare >> + >> +LOCAL_C_INCLUDES := \ >> + $(LOCAL_PATH)/../include \ >> + $(LOCAL_PATH)/../../include \ >> + $(LOCAL_PATH)/../.. \ >> + >> +LOCAL_SHARED_LIBRARIES := \ >> + libutils \ >> + libcutils \ >> + libdl \ >> + libz >> + >> +LOCAL_MODULE := libv4l_convert >> +LOCAL_MODULE_TAGS := optional >> + >> +include $(BUILD_STATIC_LIBRARY) >> diff --git a/lib/libv4lconvert/control/libv4lcontrol.c >> b/lib/libv4lconvert/control/libv4lcontrol.c >> index 325616c..74102d9 100644 >> --- a/lib/libv4lconvert/control/libv4lcontrol.c >> +++ b/lib/libv4lconvert/control/libv4lcontrol.c >> @@ -362,7 +362,7 @@ static int v4lcontrol_get_usb_info(struct >> v4lcontrol_data *data, >> int *speed) >> { >> FILE *f; >> - int i, minor; >> + int i, minor_dev; >> struct stat st; >> char sysfs_name[512]; >> char c, *s, buf[32]; >> @@ -388,8 +388,8 @@ static int v4lcontrol_get_usb_info(struct >> v4lcontrol_data *data, >> s = fgets(buf, sizeof(buf), f); >> fclose(f); >> >> - if (s && sscanf(buf, "%*d:%d%c", &minor, &c) == 2 && >> - c == '\n' && minor == minor(st.st_rdev)) >> + if (s && sscanf(buf, "%*d:%d%c", &minor_dev, &c) == 2 && >> + c == '\n' && minor_dev == minor(st.st_rdev)) >> break; >> } >> if (i == 256) >> @@ -716,6 +716,7 @@ struct v4lcontrol_data *v4lcontrol_create(int fd, >> void *dev_ops_priv, >> if (shm_name[i] == '/') >> shm_name[i] = '-'; >> >> +#ifndef ANDROID >> /* Open the shared memory object identified by shm_name */ >> shm_fd = shm_open(shm_name, (O_CREAT | O_EXCL | O_RDWR), (S_IREAD | >> S_IWRITE)); >> if (shm_fd >= 0) >> @@ -738,6 +739,7 @@ struct v4lcontrol_data *v4lcontrol_create(int fd, >> void *dev_ops_priv, >> } >> } else >> perror("libv4lcontrol: error creating shm segment failed"); >> +#endif >> >> /* Fall back to malloc */ >> if (data->shm_values == NULL) { >> diff --git a/lib/libv4lconvert/jl2005bcd.c b/lib/libv4lconvert/jl2005bcd.c >> index 14171a1..5a29830 100644 >> --- a/lib/libv4lconvert/jl2005bcd.c >> +++ b/lib/libv4lconvert/jl2005bcd.c >> @@ -23,7 +23,11 @@ >> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 >> USA >> */ >> >> -#include <config.h> >> +#ifdef ANDROID >> +#include <android-config.h> >> +#else >> +#include <config.h> >> +#endif >> #include <stdlib.h> >> #include <string.h> >> >> diff --git a/lib/libv4lconvert/jpeg.c b/lib/libv4lconvert/jpeg.c >> index 0142d44..15f8dec 100644 >> --- a/lib/libv4lconvert/jpeg.c >> +++ b/lib/libv4lconvert/jpeg.c >> @@ -16,7 +16,11 @@ >> # Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA >> 02110-1335 USA >> */ >> >> +#ifdef ANDROID >> +#include <android-config.h> >> +#else >> #include <config.h> >> +#endif >> #include <errno.h> >> #include <stdlib.h> >> #include "libv4lconvert-priv.h" >> diff --git a/lib/libv4lconvert/jpeg_memsrcdest.c >> b/lib/libv4lconvert/jpeg_memsrcdest.c >> index b70af8e..323e7af 100644 >> --- a/lib/libv4lconvert/jpeg_memsrcdest.c >> +++ b/lib/libv4lconvert/jpeg_memsrcdest.c >> @@ -16,7 +16,11 @@ >> >> /* this is not a core library module, so it doesn't define >> JPEG_INTERNALS */ >> >> +#ifdef ANDROID >> +#include <android-config.h> >> +#else >> #include <config.h> >> +#endif >> #include <stdlib.h> >> #include <stdio.h> >> >> diff --git a/lib/libv4lconvert/libv4lconvert-priv.h >> b/lib/libv4lconvert/libv4lconvert-priv.h >> index ac1391e..c19bbd4 100644 >> --- a/lib/libv4lconvert/libv4lconvert-priv.h >> +++ b/lib/libv4lconvert/libv4lconvert-priv.h >> @@ -19,7 +19,11 @@ >> #ifndef __LIBV4LCONVERT_PRIV_H >> #define __LIBV4LCONVERT_PRIV_H >> >> +#ifdef ANDROID >> +#include <android-config.h> >> +#else >> #include <config.h> >> +#endif >> #include <stdio.h> >> #include <stdint.h> >> #include <sys/types.h> >> diff --git a/lib/libv4lconvert/libv4lconvert.c >> b/lib/libv4lconvert/libv4lconvert.c >> index e4aa54a..004dc72 100644 >> --- a/lib/libv4lconvert/libv4lconvert.c >> +++ b/lib/libv4lconvert/libv4lconvert.c >> @@ -16,7 +16,11 @@ >> # Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA >> 02110-1335 USA >> */ >> >> +#ifdef ANDROID >> +#include <android-config.h> >> +#else >> #include <config.h> >> +#endif >> #include <errno.h> >> #include <string.h> >> #include <stdlib.h> >> diff --git a/lib/libv4lconvert/libv4lsyscall-priv.h >> b/lib/libv4lconvert/libv4lsyscall-priv.h >> index cdd38bc..f548fb2 100644 >> --- a/lib/libv4lconvert/libv4lsyscall-priv.h >> +++ b/lib/libv4lconvert/libv4lsyscall-priv.h >> @@ -36,7 +36,7 @@ >> >> #ifdef linux >> #include <sys/time.h> >> -#include <syscall.h> >> +#include <sys/syscall.h> >> #include <linux/types.h> >> #include <linux/ioctl.h> >> /* On 32 bits archs we always use mmap2, on 64 bits archs there is no >> mmap2 */ >> @@ -62,6 +62,10 @@ >> typedef off_t __off_t; >> #endif >> >> +#if defined(ANDROID) >> +typedef off_t __off_t; >> +#endif >> + >> #undef SYS_OPEN >> #undef SYS_CLOSE >> #undef SYS_IOCTL >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-media" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> > -- Benjamin Gaignard Graphic Working Group Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html