summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Waters <matthew@centricular.com>2017-01-18 02:43:44 +1100
committerMatthew Waters <matthew@centricular.com>2017-01-18 15:23:42 +1100
commited5f63c9efcb9746d001819d413b8b20770c3f62 (patch)
tree564bdc9d6b36750dcf4a86a6e07f72be95e64768
parentb4f3e4094bc285f2f7a8d3cea121119e2c5e90cb (diff)
build: add meson build definition
Currently only been tested on the RPi within gst-build.
-rw-r--r--config/bellagio/meson.build1
-rw-r--r--config/meson.build5
-rw-r--r--config/rpi/meson.build1
-rw-r--r--examples/egl/meson.build19
-rw-r--r--examples/meson.build3
-rwxr-xr-xhooks/pre-commit.hook83
-rw-r--r--meson.build258
-rw-r--r--meson_options.txt3
-rw-r--r--omx/meson.build57
9 files changed, 430 insertions, 0 deletions
diff --git a/config/bellagio/meson.build b/config/bellagio/meson.build
new file mode 100644
index 0000000..dc99c08
--- /dev/null
+++ b/config/bellagio/meson.build
@@ -0,0 +1 @@
+install_data (['gstomx.conf'], install_dir : omx_conf_dir)
diff --git a/config/meson.build b/config/meson.build
new file mode 100644
index 0000000..fda9670
--- /dev/null
+++ b/config/meson.build
@@ -0,0 +1,5 @@
+if omx_target == 'rpi'
+ subdir ('rpi')
+elif omx_target == 'bellagio'
+ subdir ('bellagio')
+endif
diff --git a/config/rpi/meson.build b/config/rpi/meson.build
new file mode 100644
index 0000000..dc99c08
--- /dev/null
+++ b/config/rpi/meson.build
@@ -0,0 +1 @@
+install_data (['gstomx.conf'], install_dir : omx_conf_dir)
diff --git a/examples/egl/meson.build b/examples/egl/meson.build
new file mode 100644
index 0000000..1d1a5cf
--- /dev/null
+++ b/examples/egl/meson.build
@@ -0,0 +1,19 @@
+if omx_target == 'rpi'
+ egl_sources = ['testegl.c']
+
+ egl_dep = dependency('egl', required : false)
+ if not egl_dep.found()
+ egl_dep = cc.find_library ('EGL')
+ endif
+
+ gles2_dep = dependency('glesv2', required : false)
+ if not gles2_dep.found()
+ gles2_dep = cc.find_library ('GLESv2')
+ endif
+
+ executable ('testegl',
+ sources : egl_sources,
+ c_args : gst_omx_args,
+ include_directories : [configinc],
+ dependencies : [libm, gst_dep, gstvideo_dep, gstgl_dep, egl_dep, gles2_dep])
+endif
diff --git a/examples/meson.build b/examples/meson.build
new file mode 100644
index 0000000..5173880
--- /dev/null
+++ b/examples/meson.build
@@ -0,0 +1,3 @@
+if gstgl_dep.found()
+ subdir('egl')
+endif
diff --git a/hooks/pre-commit.hook b/hooks/pre-commit.hook
new file mode 100755
index 0000000..3c1062b
--- /dev/null
+++ b/hooks/pre-commit.hook
@@ -0,0 +1,83 @@
+#!/bin/sh
+#
+# Check that the code follows a consistant code style
+#
+
+# Check for existence of indent, and error out if not present.
+# On some *bsd systems the binary seems to be called gnunindent,
+# so check for that first.
+
+version=`gnuindent --version 2>/dev/null`
+if test "x$version" = "x"; then
+ version=`gindent --version 2>/dev/null`
+ if test "x$version" = "x"; then
+ version=`indent --version 2>/dev/null`
+ if test "x$version" = "x"; then
+ echo "GStreamer git pre-commit hook:"
+ echo "Did not find GNU indent, please install it before continuing."
+ exit 1
+ else
+ INDENT=indent
+ fi
+ else
+ INDENT=gindent
+ fi
+else
+ INDENT=gnuindent
+fi
+
+case `$INDENT --version` in
+ GNU*)
+ ;;
+ default)
+ echo "GStreamer git pre-commit hook:"
+ echo "Did not find GNU indent, please install it before continuing."
+ echo "(Found $INDENT, but it doesn't seem to be GNU indent)"
+ exit 1
+ ;;
+esac
+
+INDENT_PARAMETERS="--braces-on-if-line \
+ --case-brace-indentation0 \
+ --case-indentation2 \
+ --braces-after-struct-decl-line \
+ --line-length80 \
+ --no-tabs \
+ --cuddle-else \
+ --dont-line-up-parentheses \
+ --continuation-indentation4 \
+ --honour-newlines \
+ --tab-size8 \
+ --indent-level2 \
+ --leave-preprocessor-space"
+
+echo "--Checking style--"
+for file in `git diff-index --cached --name-only HEAD --diff-filter=ACMR| grep "\.c$"` ; do
+ # nf is the temporary checkout. This makes sure we check against the
+ # revision in the index (and not the checked out version).
+ nf=`git checkout-index --temp ${file} | cut -f 1`
+ newfile=`mktemp /tmp/${nf}.XXXXXX` || exit 1
+ $INDENT ${INDENT_PARAMETERS} \
+ $nf -o $newfile 2>> /dev/null
+ # FIXME: Call indent twice as it tends to do line-breaks
+ # different for every second call.
+ $INDENT ${INDENT_PARAMETERS} \
+ $newfile 2>> /dev/null
+ diff -u -p "${nf}" "${newfile}"
+ r=$?
+ rm "${newfile}"
+ rm "${nf}"
+ if [ $r != 0 ] ; then
+echo "================================================================================================="
+echo " Code style error in: $file "
+echo " "
+echo " Please fix before committing. Don't forget to run git add before trying to commit again. "
+echo " If the whole file is to be committed, this should work (run from the top-level directory): "
+echo " "
+echo " gst-indent $file; git add $file; git commit"
+echo " "
+echo "================================================================================================="
+ exit 1
+ fi
+done
+echo "--Checking style pass--"
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..1afcbe9
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,258 @@
+project('gst-omx', 'c',
+ version : '1.11.1.1',
+ meson_version : '>= 0.36.0',
+ default_options : [ 'warning_level=1',
+ 'buildtype=debugoptimized' ])
+
+gst_version = meson.project_version()
+version_arr = gst_version.split('.')
+gst_version_major = version_arr[0]
+gst_version_minor = version_arr[1]
+gst_version_micro = version_arr[2]
+if version_arr.length() == 4
+ gst_version_nano = version_arr[3]
+else
+ gst_version_nano = 0
+endif
+
+glib_req = '>= 2.40.0'
+gst_req = '>= @0@.@1@.0'.format(gst_version_major, gst_version_minor)
+
+api_version = '1.0'
+soversion = 0
+# maintaining compatibility with the previous libtool versioning
+# current = minor * 100 + micro
+libversion = '@0@.@1@.0'.format(soversion, gst_version_minor.to_int() * 100 + gst_version_micro.to_int())
+
+plugins_install_dir = '@0@/gstreamer-1.0'.format(get_option('libdir'))
+
+cc = meson.get_compiler('c')
+
+if cc.get_id() == 'msvc'
+ # Ignore several spurious warnings for things gstreamer does very commonly
+ # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it
+ # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once
+ # NOTE: Only add warnings here if you are sure they're spurious
+ add_project_arguments(
+ '/wd4018', # implicit signed/unsigned conversion
+ '/wd4146', # unary minus on unsigned (beware INT_MIN)
+ '/wd4244', # lossy type conversion (e.g. double -> int)
+ '/wd4305', # truncating type conversion (e.g. double -> float)
+ language : 'c')
+ # Disable SAFESEH with MSVC for plugins and libs that use external deps that
+ # are built with MinGW
+ noseh_link_args = ['/SAFESEH:NO']
+else
+ noseh_link_args = []
+endif
+
+cdata = configuration_data()
+check_headers = [
+# ['HAVE_DLFCN_H', 'dlfcn.h'],
+# ['HAVE_FCNTL_H', 'fcntl.h'],
+# ['HAVE_INTTYPES_H', 'inttypes.h'],
+# ['HAVE_MEMORY_H', 'memory.h'],
+# ['HAVE_MSACM_H', 'msacm.h'],
+# ['HAVE_PTHREAD_H', 'pthread.h'],
+# ['HAVE_STDINT_H', 'stdint.h'],
+# ['HAVE_STDLIB_H', 'stdlib.h'],
+# ['HAVE_STRINGS_H', 'strings.h'],
+# ['HAVE_STRING_H', 'string.h'],
+# ['HAVE_SYS_PARAM_H', 'sys/param.h'],
+# ['HAVE_SYS_SOCKET_H', 'sys/socket.h'],
+# ['HAVE_SYS_STAT_H', 'sys/stat.h'],
+# ['HAVE_SYS_TIME_H', 'sys/time.h'],
+# ['HAVE_SYS_TYPES_H', 'sys/types.h'],
+# ['HAVE_SYS_UTSNAME_H', 'sys/utsname.h'],
+# ['HAVE_UNISTD_H', 'unistd.h'],
+]
+
+foreach h : check_headers
+ if cc.has_header(h.get(1))
+ cdata.set(h.get(0), 1)
+ endif
+endforeach
+
+check_functions = [
+# check token HAVE_CPU_ALPHA
+# check token HAVE_CPU_ARM
+# check token HAVE_CPU_CRIS
+# check token HAVE_CPU_CRISV32
+# check token HAVE_CPU_HPPA
+# check token HAVE_CPU_I386
+# check token HAVE_CPU_IA64
+# check token HAVE_CPU_M68K
+# check token HAVE_CPU_MIPS
+# check token HAVE_CPU_PPC
+# check token HAVE_CPU_PPC64
+# check token HAVE_CPU_S390
+# check token HAVE_CPU_SPARC
+# check token HAVE_CPU_X86_64
+# ['HAVE_DCGETTEXT', 'dcgettext'],
+# check token HAVE_EXPERIMENTAL
+# check token HAVE_EXTERNAL
+# ['HAVE_GETPAGESIZE', 'getpagesize'],
+# check token HAVE_GETTEXT
+]
+
+foreach f : check_functions
+ if cc.has_function(f.get(1))
+ cdata.set(f.get(0), 1)
+ endif
+endforeach
+
+#cdata.set('SIZEOF_CHAR', cc.sizeof('char'))
+#cdata.set('SIZEOF_INT', cc.sizeof('int'))
+#cdata.set('SIZEOF_LONG', cc.sizeof('long'))
+#cdata.set('SIZEOF_SHORT', cc.sizeof('short'))
+#cdata.set('SIZEOF_VOIDP', cc.sizeof('void*'))
+
+cdata.set('VERSION', '"@0@"'.format(gst_version))
+cdata.set('PACKAGE', '"gst-omx"')
+cdata.set('PACKAGE_VERSION', '"@0@"'.format(gst_version))
+cdata.set('PACKAGE_BUGREPORT', '"http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer"')
+cdata.set('PACKAGE_NAME', '"GStreamer OMX Plugins"')
+cdata.set('GETTEXT_PACKAGE', '"gst-omx-1.0"')
+cdata.set('GST_API_VERSION', '"@0@"'.format(api_version))
+cdata.set('GST_PACKAGE_NAME', '"GStreamer OpenMX Plug-ins"')
+cdata.set('GST_PACKAGE_ORIGIN', '"Unknown package origin"')
+cdata.set('GST_LICENSE', '"LGPL"')
+cdata.set('LIBDIR', '"@0@"'.format(get_option('libdir')))
+
+# FIXME: This should be exposed as a configuration option
+host_system = host_machine.system()
+if host_system == 'linux'
+ cdata.set('DEFAULT_VIDEOSRC', '"v4l2src"')
+elif host_system == 'osx'
+ cdata.set('DEFAULT_VIDEOSRC', '"avfvideosrc"')
+else
+ cdata.set('DEFAULT_VIDEOSRC', '"videotestsrc"')
+endif
+
+# Mandatory GST deps
+gst_dep = dependency('gstreamer-1.0', version : gst_req,
+ fallback : ['gstreamer', 'gst_dep'])
+gstbase_dep = dependency('gstreamer-base-1.0', version : gst_req,
+ fallback : ['gstreamer', 'gst_base_dep'])
+gstcontroller_dep = dependency('gstreamer-controller-1.0', version : gst_req,
+ fallback : ['gstreamer', 'gst_controller_dep'])
+
+gstpbutils_dep = dependency('gstreamer-pbutils-1.0', version : gst_req,
+ fallback : ['gst-plugins-base', 'pbutils_dep'])
+gstaudio_dep = dependency('gstreamer-audio-1.0', version : gst_req,
+ fallback : ['gst-plugins-base', 'audio_dep'])
+gstfft_dep = dependency('gstreamer-fft-1.0', version : gst_req,
+ fallback : ['gst-plugins-base', 'fft_dep'])
+gsttag_dep = dependency('gstreamer-tag-1.0', version : gst_req,
+ fallback : ['gst-plugins-base', 'tag_dep'])
+gstvideo_dep = dependency('gstreamer-video-1.0', version : gst_req,
+ fallback : ['gst-plugins-base', 'video_dep'])
+
+gstgl_dep = dependency('gstreamer-gl-1.0', version : gst_req,
+ fallback : ['gst-plugins-bad', 'gstgl_dep'], required : false)
+
+libm = cc.find_library('m', required : false)
+glib_dep = dependency('glib-2.0', version : glib_req)
+gio_dep = dependency('gio-2.0', version : glib_req)
+gmodule_dep = dependency('gmodule-2.0', version : glib_req)
+
+gst_omx_args = ['-DHAVE_CONFIG_H']
+configinc = include_directories('.')
+omx_header_path = get_option('with_omx_header_path')
+if omx_header_path != ''
+ gst_omx_args += ['-I' + omx_header_path]
+endif
+
+have_external_omx = cc.has_header(
+ 'OMX_Core.h',
+ args : gst_omx_args,
+ required : false)
+extra_video_headers = ''
+if have_external_omx
+ have_video_ext = cc.has_header (
+ 'OMX_VideoExt.h',
+ args : gst_omx_args,
+ required : false)
+ if have_video_ext
+ extra_video_headers += '''
+#include <OMX_VideoExt.h>'''
+ endif
+endif
+
+have_omx_vp8 = cc.has_header_symbol(
+ 'OMX_Video.h',
+ 'OMX_VIDEO_CodingVP8',
+ prefix : extra_video_headers,
+ args : gst_omx_args,
+ required : false)
+if have_omx_vp8
+ cdata.set('HAVE_VP8', 1)
+endif
+
+have_omx_theora = cc.has_header_symbol(
+ 'OMX_Video.h',
+ 'OMX_VIDEO_CodingTheora',
+ prefix : extra_video_headers,
+ args : gst_omx_args,
+ required : false)
+if have_omx_vp8
+ cdata.set('HAVE_THEORA', 1)
+endif
+
+default_omx_struct_packing = 0
+omx_target = get_option ('with_omx_target')
+if omx_target == 'generic'
+ cdata.set('USE_OMX_TARGET_GENERIC', 1)
+elif omx_target == 'rpi'
+ cdata.set('USE_OMX_TARGET_RPI', 1)
+ cdata.set('OMX_SKIP64BIT', 1)
+ default_omx_struct_packing = 4
+
+ if gstgl_dep.found()
+ if gstgl_dep.type_name() == 'pkgconfig'
+ gl_winsys = gstgl_dep.get_pkgconfig_variable('gl_winsys').split(',')
+ gl_platforms = gstgl_dep.get_pkgconfig_variable('gl_platforms').split(',')
+ elif gstgl_dep.type_name() == 'internal'
+ # XXX assume gst-plugins-bad was built with dispmanx and egl support
+ gl_winsys = ['dispmanx']
+ gl_platforms = ['egl']
+ else
+ error ('unreachable dependency type')
+ endif
+
+ if not gl_winsys.contains('dispmanx') or not gl_platforms.contains ('egl')
+ gstgl_dep = dependency('', required : false)
+ endif
+ endif
+elif omx_target == 'bellagio'
+ cdata.set('USE_OMX_TARGET_BELLAGIO', 1)
+else
+ error ('Unsupported omx target specified. Use the -Dwith_omx_target option')
+endif
+
+if gstgl_dep.found()
+ cdata.set ('HAVE_GST_GL', 1)
+endif
+
+omx_struct_packing = get_option ('with_omx_struct_packing').to_int()
+if omx_struct_packing == 0
+ omx_struct_packing = default_omx_struct_packing
+endif
+if omx_struct_packing != 0
+ cdata.set('GST_OMX_STRUCT_PACKING', omx_struct_packing)
+endif
+
+omx_conf_dir = join_paths (get_option ('prefix'), get_option ('sysconfdir'), 'xdg')
+cdata.set_quoted('GST_OMX_CONFIG_DIR', omx_conf_dir)
+
+configure_file(input : 'config.h.meson',
+ output : 'config.h',
+ configuration : cdata)
+
+subdir('config')
+subdir('examples')
+subdir('omx')
+#subdir('tools')
+
+python3 = find_program('python3')
+run_command(python3, '-c', 'import shutil; shutil.copy("hooks/pre-commit.hook", ".git/hooks/pre-commit")')
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 0000000..3274c0a
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,3 @@
+option('with_omx_header_path', type : 'string', value : '', description : 'An extra include directory to find the OpenMax headers')
+option('with_omx_target', type : 'combo', choices : ['none', 'generic', 'rpi', 'bellagio'], value : 'none', description : 'The OMX platform to target')
+option('with_omx_struct_packing', type : 'combo', choices : ['0', '1', '2', '4', '8'], value : '0', description : 'Force OpenMAX struct packing')
diff --git a/omx/meson.build b/omx/meson.build
new file mode 100644
index 0000000..08447e6
--- /dev/null
+++ b/omx/meson.build
@@ -0,0 +1,57 @@
+omx_sources = [
+ 'gstomx.c',
+ 'gstomxbufferpool.c',
+ 'gstomxvideo.c',
+ 'gstomxvideodec.c',
+ 'gstomxvideoenc.c',
+ 'gstomxaudiodec.c',
+ 'gstomxaudioenc.c',
+ 'gstomxmjpegdec.c',
+ 'gstomxmpeg4videodec.c',
+ 'gstomxmpeg2videodec.c',
+ 'gstomxh264dec.c',
+ 'gstomxh263dec.c',
+ 'gstomxwmvdec.c',
+ 'gstomxmpeg4videoenc.c',
+ 'gstomxh264enc.c',
+ 'gstomxh263enc.c',
+ 'gstomxaacdec.c',
+ 'gstomxmp3dec.c',
+ 'gstomxaacenc.c',
+ 'gstomxamrdec.c',
+ 'gstomxaudiosink.c',
+ 'gstomxanalogaudiosink.c',
+ 'gstomxhdmiaudiosink.c',
+]
+
+extra_inc = []
+extra_c_args = []
+
+if have_omx_vp8
+ omx_sources += 'gstomxvp8dec.c'
+endif
+
+if have_omx_theora
+ omx_sources += 'gstomxtheoradec.c'
+endif
+
+if not have_external_omx
+ extra_inc += include_directories ('openmax')
+endif
+
+optional_deps = []
+if gstgl_dep.found()
+ optional_deps += gstgl_dep
+ extra_c_args += ['-DGST_USE_UNSTABLE_API']
+endif
+
+gstomx = library('gstomx',
+ omx_sources,
+ c_args : gst_omx_args + extra_c_args,
+# link_args : noseh_link_args,
+ include_directories : [configinc] + extra_inc,
+ dependencies : [gstvideo_dep, gstaudio_dep, gstbase_dep, gstcontroller_dep,
+ libm] + optional_deps,
+ install : true,
+ install_dir : plugins_install_dir,
+)