build: add meson build definition
authorMatthew Waters <matthew@centricular.com>
Tue, 17 Jan 2017 15:43:44 +0000 (02:43 +1100)
committerMatthew Waters <matthew@centricular.com>
Wed, 18 Jan 2017 04:23:42 +0000 (15:23 +1100)
Currently only been tested on the RPi within gst-build.

config/bellagio/meson.build [new file with mode: 0644]
config/meson.build [new file with mode: 0644]
config/rpi/meson.build [new file with mode: 0644]
examples/egl/meson.build [new file with mode: 0644]
examples/meson.build [new file with mode: 0644]
hooks/pre-commit.hook [new file with mode: 0755]
meson.build [new file with mode: 0644]
meson_options.txt [new file with mode: 0644]
omx/meson.build [new file with mode: 0644]

diff --git a/config/bellagio/meson.build b/config/bellagio/meson.build
new file mode 100644 (file)
index 0000000..dc99c08
--- /dev/null
@@ -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 (file)
index 0000000..fda9670
--- /dev/null
@@ -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 (file)
index 0000000..dc99c08
--- /dev/null
@@ -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 (file)
index 0000000..1d1a5cf
--- /dev/null
@@ -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 (file)
index 0000000..5173880
--- /dev/null
@@ -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 (executable)
index 0000000..3c1062b
--- /dev/null
@@ -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 (file)
index 0000000..1afcbe9
--- /dev/null
@@ -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 (file)
index 0000000..3274c0a
--- /dev/null
@@ -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 (file)
index 0000000..08447e6
--- /dev/null
@@ -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,
+)