initial recommit
git-svn-id: https://svn.salfter.gotdns.org/svn/h264dvr/trunk@390 1b90f75b-8b96-4784-87c0-14078182fce6
This commit is contained in:
1
Makefile.am
Normal file
1
Makefile.am
Normal file
@@ -0,0 +1 @@
|
||||
SUBDIRS=lib src
|
||||
14
WIN32-BUILD-NOTES
Normal file
14
WIN32-BUILD-NOTES
Normal file
@@ -0,0 +1,14 @@
|
||||
== setting up the environment ==
|
||||
|
||||
emerge crossdev && crossdev i686-pc-mingw32 && emerge nsis
|
||||
tar xjf /usr/portage/distfiles/wxPython-src-2.8.11.0.tar.bz2
|
||||
cd wxPython-src-2.8.11.0
|
||||
./configure --prefix=/usr/i686-pc-mingw32 --host=i686-pc-mingw32 --target=i686-pc-mingw32 --with-msw --enable-unicode && make && make install
|
||||
|
||||
== finding DLLs that may need to be included with EXEs ==
|
||||
|
||||
find /usr/i686-pc-mingw32/ /usr/*-pc-linux-gnu/i686-pc-mingw32/gcc-bin/ -name \*.dll -exec du \{} \;
|
||||
|
||||
== building this package ==
|
||||
|
||||
./configure --host=i686-pc-mingw32 --with-wx-config=/usr/i686-pc-mingw32/bin/wx-config
|
||||
951
aclocal.m4
vendored
Normal file
951
aclocal.m4
vendored
Normal file
@@ -0,0 +1,951 @@
|
||||
# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||
# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
m4_ifndef([AC_AUTOCONF_VERSION],
|
||||
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
||||
m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
|
||||
[m4_warning([this file was generated for autoconf 2.68.
|
||||
You have another version of autoconf. It may work, but is not guaranteed to.
|
||||
If you have problems, you may need to regenerate the build system entirely.
|
||||
To do so, use the procedure documented by the package, typically `autoreconf'.])])
|
||||
|
||||
# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# AM_AUTOMAKE_VERSION(VERSION)
|
||||
# ----------------------------
|
||||
# Automake X.Y traces this macro to ensure aclocal.m4 has been
|
||||
# generated from the m4 files accompanying Automake X.Y.
|
||||
# (This private macro should not be called outside this file.)
|
||||
AC_DEFUN([AM_AUTOMAKE_VERSION],
|
||||
[am__api_version='1.11'
|
||||
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
||||
dnl require some minimum version. Point them to the right macro.
|
||||
m4_if([$1], [1.11.1], [],
|
||||
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
||||
])
|
||||
|
||||
# _AM_AUTOCONF_VERSION(VERSION)
|
||||
# -----------------------------
|
||||
# aclocal traces this macro to find the Autoconf version.
|
||||
# This is a private macro too. Using m4_define simplifies
|
||||
# the logic in aclocal, which can simply ignore this definition.
|
||||
m4_define([_AM_AUTOCONF_VERSION], [])
|
||||
|
||||
# AM_SET_CURRENT_AUTOMAKE_VERSION
|
||||
# -------------------------------
|
||||
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
||||
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
||||
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
||||
[AM_AUTOMAKE_VERSION([1.11.1])dnl
|
||||
m4_ifndef([AC_AUTOCONF_VERSION],
|
||||
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
||||
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
||||
|
||||
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
|
||||
# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
|
||||
# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
|
||||
#
|
||||
# Of course, Automake must honor this variable whenever it calls a
|
||||
# tool from the auxiliary directory. The problem is that $srcdir (and
|
||||
# therefore $ac_aux_dir as well) can be either absolute or relative,
|
||||
# depending on how configure is run. This is pretty annoying, since
|
||||
# it makes $ac_aux_dir quite unusable in subdirectories: in the top
|
||||
# source directory, any form will work fine, but in subdirectories a
|
||||
# relative path needs to be adjusted first.
|
||||
#
|
||||
# $ac_aux_dir/missing
|
||||
# fails when called from a subdirectory if $ac_aux_dir is relative
|
||||
# $top_srcdir/$ac_aux_dir/missing
|
||||
# fails if $ac_aux_dir is absolute,
|
||||
# fails when called from a subdirectory in a VPATH build with
|
||||
# a relative $ac_aux_dir
|
||||
#
|
||||
# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
|
||||
# are both prefixed by $srcdir. In an in-source build this is usually
|
||||
# harmless because $srcdir is `.', but things will broke when you
|
||||
# start a VPATH build or use an absolute $srcdir.
|
||||
#
|
||||
# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
|
||||
# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
|
||||
# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
|
||||
# and then we would define $MISSING as
|
||||
# MISSING="\${SHELL} $am_aux_dir/missing"
|
||||
# This will work as long as MISSING is not called from configure, because
|
||||
# unfortunately $(top_srcdir) has no meaning in configure.
|
||||
# However there are other variables, like CC, which are often used in
|
||||
# configure, and could therefore not use this "fixed" $ac_aux_dir.
|
||||
#
|
||||
# Another solution, used here, is to always expand $ac_aux_dir to an
|
||||
# absolute PATH. The drawback is that using absolute paths prevent a
|
||||
# configured tree to be moved without reconfiguration.
|
||||
|
||||
AC_DEFUN([AM_AUX_DIR_EXPAND],
|
||||
[dnl Rely on autoconf to set up CDPATH properly.
|
||||
AC_PREREQ([2.50])dnl
|
||||
# expand $ac_aux_dir to an absolute path
|
||||
am_aux_dir=`cd $ac_aux_dir && pwd`
|
||||
])
|
||||
|
||||
# AM_CONDITIONAL -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 9
|
||||
|
||||
# AM_CONDITIONAL(NAME, SHELL-CONDITION)
|
||||
# -------------------------------------
|
||||
# Define a conditional.
|
||||
AC_DEFUN([AM_CONDITIONAL],
|
||||
[AC_PREREQ(2.52)dnl
|
||||
ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
|
||||
[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
|
||||
AC_SUBST([$1_TRUE])dnl
|
||||
AC_SUBST([$1_FALSE])dnl
|
||||
_AM_SUBST_NOTMAKE([$1_TRUE])dnl
|
||||
_AM_SUBST_NOTMAKE([$1_FALSE])dnl
|
||||
m4_define([_AM_COND_VALUE_$1], [$2])dnl
|
||||
if $2; then
|
||||
$1_TRUE=
|
||||
$1_FALSE='#'
|
||||
else
|
||||
$1_TRUE='#'
|
||||
$1_FALSE=
|
||||
fi
|
||||
AC_CONFIG_COMMANDS_PRE(
|
||||
[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
|
||||
AC_MSG_ERROR([[conditional "$1" was never defined.
|
||||
Usually this means the macro was only invoked conditionally.]])
|
||||
fi])])
|
||||
|
||||
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 10
|
||||
|
||||
# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
|
||||
# written in clear, in which case automake, when reading aclocal.m4,
|
||||
# will think it sees a *use*, and therefore will trigger all it's
|
||||
# C support machinery. Also note that it means that autoscan, seeing
|
||||
# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
|
||||
|
||||
|
||||
# _AM_DEPENDENCIES(NAME)
|
||||
# ----------------------
|
||||
# See how the compiler implements dependency checking.
|
||||
# NAME is "CC", "CXX", "GCJ", or "OBJC".
|
||||
# We try a few techniques and use that to set a single cache variable.
|
||||
#
|
||||
# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
|
||||
# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
|
||||
# dependency, and given that the user is not expected to run this macro,
|
||||
# just rely on AC_PROG_CC.
|
||||
AC_DEFUN([_AM_DEPENDENCIES],
|
||||
[AC_REQUIRE([AM_SET_DEPDIR])dnl
|
||||
AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
|
||||
AC_REQUIRE([AM_MAKE_INCLUDE])dnl
|
||||
AC_REQUIRE([AM_DEP_TRACK])dnl
|
||||
|
||||
ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
|
||||
[$1], CXX, [depcc="$CXX" am_compiler_list=],
|
||||
[$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
|
||||
[$1], UPC, [depcc="$UPC" am_compiler_list=],
|
||||
[$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
|
||||
[depcc="$$1" am_compiler_list=])
|
||||
|
||||
AC_CACHE_CHECK([dependency style of $depcc],
|
||||
[am_cv_$1_dependencies_compiler_type],
|
||||
[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
|
||||
# We make a subdir and do the tests there. Otherwise we can end up
|
||||
# making bogus files that we don't know about and never remove. For
|
||||
# instance it was reported that on HP-UX the gcc test will end up
|
||||
# making a dummy file named `D' -- because `-MD' means `put the output
|
||||
# in D'.
|
||||
mkdir conftest.dir
|
||||
# Copy depcomp to subdir because otherwise we won't find it if we're
|
||||
# using a relative directory.
|
||||
cp "$am_depcomp" conftest.dir
|
||||
cd conftest.dir
|
||||
# We will build objects and dependencies in a subdirectory because
|
||||
# it helps to detect inapplicable dependency modes. For instance
|
||||
# both Tru64's cc and ICC support -MD to output dependencies as a
|
||||
# side effect of compilation, but ICC will put the dependencies in
|
||||
# the current directory while Tru64 will put them in the object
|
||||
# directory.
|
||||
mkdir sub
|
||||
|
||||
am_cv_$1_dependencies_compiler_type=none
|
||||
if test "$am_compiler_list" = ""; then
|
||||
am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
|
||||
fi
|
||||
am__universal=false
|
||||
m4_case([$1], [CC],
|
||||
[case " $depcc " in #(
|
||||
*\ -arch\ *\ -arch\ *) am__universal=true ;;
|
||||
esac],
|
||||
[CXX],
|
||||
[case " $depcc " in #(
|
||||
*\ -arch\ *\ -arch\ *) am__universal=true ;;
|
||||
esac])
|
||||
|
||||
for depmode in $am_compiler_list; do
|
||||
# Setup a source with many dependencies, because some compilers
|
||||
# like to wrap large dependency lists on column 80 (with \), and
|
||||
# we should not choose a depcomp mode which is confused by this.
|
||||
#
|
||||
# We need to recreate these files for each test, as the compiler may
|
||||
# overwrite some of them when testing with obscure command lines.
|
||||
# This happens at least with the AIX C compiler.
|
||||
: > sub/conftest.c
|
||||
for i in 1 2 3 4 5 6; do
|
||||
echo '#include "conftst'$i'.h"' >> sub/conftest.c
|
||||
# Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
|
||||
# Solaris 8's {/usr,}/bin/sh.
|
||||
touch sub/conftst$i.h
|
||||
done
|
||||
echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
|
||||
|
||||
# We check with `-c' and `-o' for the sake of the "dashmstdout"
|
||||
# mode. It turns out that the SunPro C++ compiler does not properly
|
||||
# handle `-M -o', and we need to detect this. Also, some Intel
|
||||
# versions had trouble with output in subdirs
|
||||
am__obj=sub/conftest.${OBJEXT-o}
|
||||
am__minus_obj="-o $am__obj"
|
||||
case $depmode in
|
||||
gcc)
|
||||
# This depmode causes a compiler race in universal mode.
|
||||
test "$am__universal" = false || continue
|
||||
;;
|
||||
nosideeffect)
|
||||
# after this tag, mechanisms are not by side-effect, so they'll
|
||||
# only be used when explicitly requested
|
||||
if test "x$enable_dependency_tracking" = xyes; then
|
||||
continue
|
||||
else
|
||||
break
|
||||
fi
|
||||
;;
|
||||
msvisualcpp | msvcmsys)
|
||||
# This compiler won't grok `-c -o', but also, the minuso test has
|
||||
# not run yet. These depmodes are late enough in the game, and
|
||||
# so weak that their functioning should not be impacted.
|
||||
am__obj=conftest.${OBJEXT-o}
|
||||
am__minus_obj=
|
||||
;;
|
||||
none) break ;;
|
||||
esac
|
||||
if depmode=$depmode \
|
||||
source=sub/conftest.c object=$am__obj \
|
||||
depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
|
||||
$SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
|
||||
>/dev/null 2>conftest.err &&
|
||||
grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
|
||||
grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
|
||||
grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
|
||||
${MAKE-make} -s -f confmf > /dev/null 2>&1; then
|
||||
# icc doesn't choke on unknown options, it will just issue warnings
|
||||
# or remarks (even with -Werror). So we grep stderr for any message
|
||||
# that says an option was ignored or not supported.
|
||||
# When given -MP, icc 7.0 and 7.1 complain thusly:
|
||||
# icc: Command line warning: ignoring option '-M'; no argument required
|
||||
# The diagnosis changed in icc 8.0:
|
||||
# icc: Command line remark: option '-MP' not supported
|
||||
if (grep 'ignoring option' conftest.err ||
|
||||
grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
|
||||
am_cv_$1_dependencies_compiler_type=$depmode
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
cd ..
|
||||
rm -rf conftest.dir
|
||||
else
|
||||
am_cv_$1_dependencies_compiler_type=none
|
||||
fi
|
||||
])
|
||||
AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
|
||||
AM_CONDITIONAL([am__fastdep$1], [
|
||||
test "x$enable_dependency_tracking" != xno \
|
||||
&& test "$am_cv_$1_dependencies_compiler_type" = gcc3])
|
||||
])
|
||||
|
||||
|
||||
# AM_SET_DEPDIR
|
||||
# -------------
|
||||
# Choose a directory name for dependency files.
|
||||
# This macro is AC_REQUIREd in _AM_DEPENDENCIES
|
||||
AC_DEFUN([AM_SET_DEPDIR],
|
||||
[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
|
||||
AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
|
||||
])
|
||||
|
||||
|
||||
# AM_DEP_TRACK
|
||||
# ------------
|
||||
AC_DEFUN([AM_DEP_TRACK],
|
||||
[AC_ARG_ENABLE(dependency-tracking,
|
||||
[ --disable-dependency-tracking speeds up one-time build
|
||||
--enable-dependency-tracking do not reject slow dependency extractors])
|
||||
if test "x$enable_dependency_tracking" != xno; then
|
||||
am_depcomp="$ac_aux_dir/depcomp"
|
||||
AMDEPBACKSLASH='\'
|
||||
fi
|
||||
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
|
||||
AC_SUBST([AMDEPBACKSLASH])dnl
|
||||
_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
|
||||
])
|
||||
|
||||
# Generate code to set up dependency tracking. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
#serial 5
|
||||
|
||||
# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
||||
# ------------------------------
|
||||
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||
[{
|
||||
# Autoconf 2.62 quotes --file arguments for eval, but not when files
|
||||
# are listed without --file. Let's play safe and only enable the eval
|
||||
# if we detect the quoting.
|
||||
case $CONFIG_FILES in
|
||||
*\'*) eval set x "$CONFIG_FILES" ;;
|
||||
*) set x $CONFIG_FILES ;;
|
||||
esac
|
||||
shift
|
||||
for mf
|
||||
do
|
||||
# Strip MF so we end up with the name of the file.
|
||||
mf=`echo "$mf" | sed -e 's/:.*$//'`
|
||||
# Check whether this is an Automake generated Makefile or not.
|
||||
# We used to match only the files named `Makefile.in', but
|
||||
# some people rename them; so instead we look at the file content.
|
||||
# Grep'ing the first line is not enough: some people post-process
|
||||
# each Makefile.in and add a new line on top of each file to say so.
|
||||
# Grep'ing the whole file is not good either: AIX grep has a line
|
||||
# limit of 2048, but all sed's we know have understand at least 4000.
|
||||
if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
|
||||
dirpart=`AS_DIRNAME("$mf")`
|
||||
else
|
||||
continue
|
||||
fi
|
||||
# Extract the definition of DEPDIR, am__include, and am__quote
|
||||
# from the Makefile without running `make'.
|
||||
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
|
||||
test -z "$DEPDIR" && continue
|
||||
am__include=`sed -n 's/^am__include = //p' < "$mf"`
|
||||
test -z "am__include" && continue
|
||||
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
|
||||
# When using ansi2knr, U may be empty or an underscore; expand it
|
||||
U=`sed -n 's/^U = //p' < "$mf"`
|
||||
# Find all dependency output files, they are included files with
|
||||
# $(DEPDIR) in their names. We invoke sed twice because it is the
|
||||
# simplest approach to changing $(DEPDIR) to its actual value in the
|
||||
# expansion.
|
||||
for file in `sed -n "
|
||||
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
|
||||
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
|
||||
# Make sure the directory exists.
|
||||
test -f "$dirpart/$file" && continue
|
||||
fdir=`AS_DIRNAME(["$file"])`
|
||||
AS_MKDIR_P([$dirpart/$fdir])
|
||||
# echo "creating $dirpart/$file"
|
||||
echo '# dummy' > "$dirpart/$file"
|
||||
done
|
||||
done
|
||||
}
|
||||
])# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
||||
|
||||
|
||||
# AM_OUTPUT_DEPENDENCY_COMMANDS
|
||||
# -----------------------------
|
||||
# This macro should only be invoked once -- use via AC_REQUIRE.
|
||||
#
|
||||
# This code is only required when automatic dependency tracking
|
||||
# is enabled. FIXME. This creates each `.P' file that we will
|
||||
# need in order to bootstrap the dependency handling code.
|
||||
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||
[AC_CONFIG_COMMANDS([depfiles],
|
||||
[test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||
[AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
|
||||
])
|
||||
|
||||
# Do all the work for Automake. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||
# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 16
|
||||
|
||||
# This macro actually does too much. Some checks are only needed if
|
||||
# your package does certain things. But this isn't really a big deal.
|
||||
|
||||
# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
|
||||
# AM_INIT_AUTOMAKE([OPTIONS])
|
||||
# -----------------------------------------------
|
||||
# The call with PACKAGE and VERSION arguments is the old style
|
||||
# call (pre autoconf-2.50), which is being phased out. PACKAGE
|
||||
# and VERSION should now be passed to AC_INIT and removed from
|
||||
# the call to AM_INIT_AUTOMAKE.
|
||||
# We support both call styles for the transition. After
|
||||
# the next Automake release, Autoconf can make the AC_INIT
|
||||
# arguments mandatory, and then we can depend on a new Autoconf
|
||||
# release and drop the old call support.
|
||||
AC_DEFUN([AM_INIT_AUTOMAKE],
|
||||
[AC_PREREQ([2.62])dnl
|
||||
dnl Autoconf wants to disallow AM_ names. We explicitly allow
|
||||
dnl the ones we care about.
|
||||
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
|
||||
AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
|
||||
AC_REQUIRE([AC_PROG_INSTALL])dnl
|
||||
if test "`cd $srcdir && pwd`" != "`pwd`"; then
|
||||
# Use -I$(srcdir) only when $(srcdir) != ., so that make's output
|
||||
# is not polluted with repeated "-I."
|
||||
AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
|
||||
# test to see if srcdir already configured
|
||||
if test -f $srcdir/config.status; then
|
||||
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
|
||||
fi
|
||||
fi
|
||||
|
||||
# test whether we have cygpath
|
||||
if test -z "$CYGPATH_W"; then
|
||||
if (cygpath --version) >/dev/null 2>/dev/null; then
|
||||
CYGPATH_W='cygpath -w'
|
||||
else
|
||||
CYGPATH_W=echo
|
||||
fi
|
||||
fi
|
||||
AC_SUBST([CYGPATH_W])
|
||||
|
||||
# Define the identity of the package.
|
||||
dnl Distinguish between old-style and new-style calls.
|
||||
m4_ifval([$2],
|
||||
[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
|
||||
AC_SUBST([PACKAGE], [$1])dnl
|
||||
AC_SUBST([VERSION], [$2])],
|
||||
[_AM_SET_OPTIONS([$1])dnl
|
||||
dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
|
||||
m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
|
||||
[m4_fatal([AC_INIT should be called with package and version arguments])])dnl
|
||||
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
|
||||
AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
|
||||
|
||||
_AM_IF_OPTION([no-define],,
|
||||
[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
|
||||
AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
|
||||
|
||||
# Some tools Automake needs.
|
||||
AC_REQUIRE([AM_SANITY_CHECK])dnl
|
||||
AC_REQUIRE([AC_ARG_PROGRAM])dnl
|
||||
AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
|
||||
AM_MISSING_PROG(AUTOCONF, autoconf)
|
||||
AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
|
||||
AM_MISSING_PROG(AUTOHEADER, autoheader)
|
||||
AM_MISSING_PROG(MAKEINFO, makeinfo)
|
||||
AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
|
||||
AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
|
||||
AC_REQUIRE([AM_PROG_MKDIR_P])dnl
|
||||
# We need awk for the "check" target. The system "awk" is bad on
|
||||
# some platforms.
|
||||
AC_REQUIRE([AC_PROG_AWK])dnl
|
||||
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
||||
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
|
||||
_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
|
||||
[_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
|
||||
[_AM_PROG_TAR([v7])])])
|
||||
_AM_IF_OPTION([no-dependencies],,
|
||||
[AC_PROVIDE_IFELSE([AC_PROG_CC],
|
||||
[_AM_DEPENDENCIES(CC)],
|
||||
[define([AC_PROG_CC],
|
||||
defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
|
||||
AC_PROVIDE_IFELSE([AC_PROG_CXX],
|
||||
[_AM_DEPENDENCIES(CXX)],
|
||||
[define([AC_PROG_CXX],
|
||||
defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
|
||||
AC_PROVIDE_IFELSE([AC_PROG_OBJC],
|
||||
[_AM_DEPENDENCIES(OBJC)],
|
||||
[define([AC_PROG_OBJC],
|
||||
defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
|
||||
])
|
||||
_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
|
||||
dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
|
||||
dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro
|
||||
dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
|
||||
AC_CONFIG_COMMANDS_PRE(dnl
|
||||
[m4_provide_if([_AM_COMPILER_EXEEXT],
|
||||
[AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
|
||||
])
|
||||
|
||||
dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
|
||||
dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
|
||||
dnl mangled by Autoconf and run in a shell conditional statement.
|
||||
m4_define([_AC_COMPILER_EXEEXT],
|
||||
m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
|
||||
|
||||
|
||||
# When config.status generates a header, we must update the stamp-h file.
|
||||
# This file resides in the same directory as the config header
|
||||
# that is generated. The stamp files are numbered to have different names.
|
||||
|
||||
# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
|
||||
# loop where config.status creates the headers, so we can generate
|
||||
# our stamp files there.
|
||||
AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
|
||||
[# Compute $1's index in $config_headers.
|
||||
_am_arg=$1
|
||||
_am_stamp_count=1
|
||||
for _am_header in $config_headers :; do
|
||||
case $_am_header in
|
||||
$_am_arg | $_am_arg:* )
|
||||
break ;;
|
||||
* )
|
||||
_am_stamp_count=`expr $_am_stamp_count + 1` ;;
|
||||
esac
|
||||
done
|
||||
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
||||
|
||||
# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# AM_PROG_INSTALL_SH
|
||||
# ------------------
|
||||
# Define $install_sh.
|
||||
AC_DEFUN([AM_PROG_INSTALL_SH],
|
||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||
if test x"${install_sh}" != xset; then
|
||||
case $am_aux_dir in
|
||||
*\ * | *\ *)
|
||||
install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
|
||||
*)
|
||||
install_sh="\${SHELL} $am_aux_dir/install-sh"
|
||||
esac
|
||||
fi
|
||||
AC_SUBST(install_sh)])
|
||||
|
||||
# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 2
|
||||
|
||||
# Check whether the underlying file-system supports filenames
|
||||
# with a leading dot. For instance MS-DOS doesn't.
|
||||
AC_DEFUN([AM_SET_LEADING_DOT],
|
||||
[rm -rf .tst 2>/dev/null
|
||||
mkdir .tst 2>/dev/null
|
||||
if test -d .tst; then
|
||||
am__leading_dot=.
|
||||
else
|
||||
am__leading_dot=_
|
||||
fi
|
||||
rmdir .tst 2>/dev/null
|
||||
AC_SUBST([am__leading_dot])])
|
||||
|
||||
# Check to see how 'make' treats includes. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 4
|
||||
|
||||
# AM_MAKE_INCLUDE()
|
||||
# -----------------
|
||||
# Check to see how make treats includes.
|
||||
AC_DEFUN([AM_MAKE_INCLUDE],
|
||||
[am_make=${MAKE-make}
|
||||
cat > confinc << 'END'
|
||||
am__doit:
|
||||
@echo this is the am__doit target
|
||||
.PHONY: am__doit
|
||||
END
|
||||
# If we don't find an include directive, just comment out the code.
|
||||
AC_MSG_CHECKING([for style of include used by $am_make])
|
||||
am__include="#"
|
||||
am__quote=
|
||||
_am_result=none
|
||||
# First try GNU make style include.
|
||||
echo "include confinc" > confmf
|
||||
# Ignore all kinds of additional output from `make'.
|
||||
case `$am_make -s -f confmf 2> /dev/null` in #(
|
||||
*the\ am__doit\ target*)
|
||||
am__include=include
|
||||
am__quote=
|
||||
_am_result=GNU
|
||||
;;
|
||||
esac
|
||||
# Now try BSD make style include.
|
||||
if test "$am__include" = "#"; then
|
||||
echo '.include "confinc"' > confmf
|
||||
case `$am_make -s -f confmf 2> /dev/null` in #(
|
||||
*the\ am__doit\ target*)
|
||||
am__include=.include
|
||||
am__quote="\""
|
||||
_am_result=BSD
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
AC_SUBST([am__include])
|
||||
AC_SUBST([am__quote])
|
||||
AC_MSG_RESULT([$_am_result])
|
||||
rm -f confinc confmf
|
||||
])
|
||||
|
||||
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 6
|
||||
|
||||
# AM_MISSING_PROG(NAME, PROGRAM)
|
||||
# ------------------------------
|
||||
AC_DEFUN([AM_MISSING_PROG],
|
||||
[AC_REQUIRE([AM_MISSING_HAS_RUN])
|
||||
$1=${$1-"${am_missing_run}$2"}
|
||||
AC_SUBST($1)])
|
||||
|
||||
|
||||
# AM_MISSING_HAS_RUN
|
||||
# ------------------
|
||||
# Define MISSING if not defined so far and test if it supports --run.
|
||||
# If it does, set am_missing_run to use it, otherwise, to nothing.
|
||||
AC_DEFUN([AM_MISSING_HAS_RUN],
|
||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||
AC_REQUIRE_AUX_FILE([missing])dnl
|
||||
if test x"${MISSING+set}" != xset; then
|
||||
case $am_aux_dir in
|
||||
*\ * | *\ *)
|
||||
MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
|
||||
*)
|
||||
MISSING="\${SHELL} $am_aux_dir/missing" ;;
|
||||
esac
|
||||
fi
|
||||
# Use eval to expand $SHELL
|
||||
if eval "$MISSING --run true"; then
|
||||
am_missing_run="$MISSING --run "
|
||||
else
|
||||
am_missing_run=
|
||||
AC_MSG_WARN([`missing' script is too old or missing])
|
||||
fi
|
||||
])
|
||||
|
||||
# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# AM_PROG_MKDIR_P
|
||||
# ---------------
|
||||
# Check for `mkdir -p'.
|
||||
AC_DEFUN([AM_PROG_MKDIR_P],
|
||||
[AC_PREREQ([2.60])dnl
|
||||
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
|
||||
dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
|
||||
dnl while keeping a definition of mkdir_p for backward compatibility.
|
||||
dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
|
||||
dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
|
||||
dnl Makefile.ins that do not define MKDIR_P, so we do our own
|
||||
dnl adjustment using top_builddir (which is defined more often than
|
||||
dnl MKDIR_P).
|
||||
AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
|
||||
case $mkdir_p in
|
||||
[[\\/$]]* | ?:[[\\/]]*) ;;
|
||||
*/*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
|
||||
esac
|
||||
])
|
||||
|
||||
# Helper functions for option handling. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 4
|
||||
|
||||
# _AM_MANGLE_OPTION(NAME)
|
||||
# -----------------------
|
||||
AC_DEFUN([_AM_MANGLE_OPTION],
|
||||
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
|
||||
|
||||
# _AM_SET_OPTION(NAME)
|
||||
# ------------------------------
|
||||
# Set option NAME. Presently that only means defining a flag for this option.
|
||||
AC_DEFUN([_AM_SET_OPTION],
|
||||
[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
|
||||
|
||||
# _AM_SET_OPTIONS(OPTIONS)
|
||||
# ----------------------------------
|
||||
# OPTIONS is a space-separated list of Automake options.
|
||||
AC_DEFUN([_AM_SET_OPTIONS],
|
||||
[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
|
||||
|
||||
# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
|
||||
# -------------------------------------------
|
||||
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
|
||||
AC_DEFUN([_AM_IF_OPTION],
|
||||
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
||||
|
||||
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 5
|
||||
|
||||
# AM_SANITY_CHECK
|
||||
# ---------------
|
||||
AC_DEFUN([AM_SANITY_CHECK],
|
||||
[AC_MSG_CHECKING([whether build environment is sane])
|
||||
# Just in case
|
||||
sleep 1
|
||||
echo timestamp > conftest.file
|
||||
# Reject unsafe characters in $srcdir or the absolute working directory
|
||||
# name. Accept space and tab only in the latter.
|
||||
am_lf='
|
||||
'
|
||||
case `pwd` in
|
||||
*[[\\\"\#\$\&\'\`$am_lf]]*)
|
||||
AC_MSG_ERROR([unsafe absolute working directory name]);;
|
||||
esac
|
||||
case $srcdir in
|
||||
*[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
|
||||
AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
|
||||
esac
|
||||
|
||||
# Do `set' in a subshell so we don't clobber the current shell's
|
||||
# arguments. Must try -L first in case configure is actually a
|
||||
# symlink; some systems play weird games with the mod time of symlinks
|
||||
# (eg FreeBSD returns the mod time of the symlink's containing
|
||||
# directory).
|
||||
if (
|
||||
set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
|
||||
if test "$[*]" = "X"; then
|
||||
# -L didn't work.
|
||||
set X `ls -t "$srcdir/configure" conftest.file`
|
||||
fi
|
||||
rm -f conftest.file
|
||||
if test "$[*]" != "X $srcdir/configure conftest.file" \
|
||||
&& test "$[*]" != "X conftest.file $srcdir/configure"; then
|
||||
|
||||
# If neither matched, then we have a broken ls. This can happen
|
||||
# if, for instance, CONFIG_SHELL is bash and it inherits a
|
||||
# broken ls alias from the environment. This has actually
|
||||
# happened. Such a system could not be considered "sane".
|
||||
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
|
||||
alias in your environment])
|
||||
fi
|
||||
|
||||
test "$[2]" = conftest.file
|
||||
)
|
||||
then
|
||||
# Ok.
|
||||
:
|
||||
else
|
||||
AC_MSG_ERROR([newly created file is older than distributed files!
|
||||
Check your system clock])
|
||||
fi
|
||||
AC_MSG_RESULT(yes)])
|
||||
|
||||
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# AM_PROG_INSTALL_STRIP
|
||||
# ---------------------
|
||||
# One issue with vendor `install' (even GNU) is that you can't
|
||||
# specify the program used to strip binaries. This is especially
|
||||
# annoying in cross-compiling environments, where the build's strip
|
||||
# is unlikely to handle the host's binaries.
|
||||
# Fortunately install-sh will honor a STRIPPROG variable, so we
|
||||
# always use install-sh in `make install-strip', and initialize
|
||||
# STRIPPROG with the value of the STRIP variable (set by the user).
|
||||
AC_DEFUN([AM_PROG_INSTALL_STRIP],
|
||||
[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
|
||||
# Installed binaries are usually stripped using `strip' when the user
|
||||
# run `make install-strip'. However `strip' might not be the right
|
||||
# tool to use in cross-compilation environments, therefore Automake
|
||||
# will honor the `STRIP' environment variable to overrule this program.
|
||||
dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
|
||||
if test "$cross_compiling" != no; then
|
||||
AC_CHECK_TOOL([STRIP], [strip], :)
|
||||
fi
|
||||
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
||||
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
||||
|
||||
# Copyright (C) 2006, 2008 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 2
|
||||
|
||||
# _AM_SUBST_NOTMAKE(VARIABLE)
|
||||
# ---------------------------
|
||||
# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
|
||||
# This macro is traced by Automake.
|
||||
AC_DEFUN([_AM_SUBST_NOTMAKE])
|
||||
|
||||
# AM_SUBST_NOTMAKE(VARIABLE)
|
||||
# ---------------------------
|
||||
# Public sister of _AM_SUBST_NOTMAKE.
|
||||
AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
|
||||
|
||||
# Check how to create a tarball. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 2
|
||||
|
||||
# _AM_PROG_TAR(FORMAT)
|
||||
# --------------------
|
||||
# Check how to create a tarball in format FORMAT.
|
||||
# FORMAT should be one of `v7', `ustar', or `pax'.
|
||||
#
|
||||
# Substitute a variable $(am__tar) that is a command
|
||||
# writing to stdout a FORMAT-tarball containing the directory
|
||||
# $tardir.
|
||||
# tardir=directory && $(am__tar) > result.tar
|
||||
#
|
||||
# Substitute a variable $(am__untar) that extract such
|
||||
# a tarball read from stdin.
|
||||
# $(am__untar) < result.tar
|
||||
AC_DEFUN([_AM_PROG_TAR],
|
||||
[# Always define AMTAR for backward compatibility.
|
||||
AM_MISSING_PROG([AMTAR], [tar])
|
||||
m4_if([$1], [v7],
|
||||
[am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
|
||||
[m4_case([$1], [ustar],, [pax],,
|
||||
[m4_fatal([Unknown tar format])])
|
||||
AC_MSG_CHECKING([how to create a $1 tar archive])
|
||||
# Loop over all known methods to create a tar archive until one works.
|
||||
_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
|
||||
_am_tools=${am_cv_prog_tar_$1-$_am_tools}
|
||||
# Do not fold the above two line into one, because Tru64 sh and
|
||||
# Solaris sh will not grok spaces in the rhs of `-'.
|
||||
for _am_tool in $_am_tools
|
||||
do
|
||||
case $_am_tool in
|
||||
gnutar)
|
||||
for _am_tar in tar gnutar gtar;
|
||||
do
|
||||
AM_RUN_LOG([$_am_tar --version]) && break
|
||||
done
|
||||
am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
|
||||
am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
|
||||
am__untar="$_am_tar -xf -"
|
||||
;;
|
||||
plaintar)
|
||||
# Must skip GNU tar: if it does not support --format= it doesn't create
|
||||
# ustar tarball either.
|
||||
(tar --version) >/dev/null 2>&1 && continue
|
||||
am__tar='tar chf - "$$tardir"'
|
||||
am__tar_='tar chf - "$tardir"'
|
||||
am__untar='tar xf -'
|
||||
;;
|
||||
pax)
|
||||
am__tar='pax -L -x $1 -w "$$tardir"'
|
||||
am__tar_='pax -L -x $1 -w "$tardir"'
|
||||
am__untar='pax -r'
|
||||
;;
|
||||
cpio)
|
||||
am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
|
||||
am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
|
||||
am__untar='cpio -i -H $1 -d'
|
||||
;;
|
||||
none)
|
||||
am__tar=false
|
||||
am__tar_=false
|
||||
am__untar=false
|
||||
;;
|
||||
esac
|
||||
|
||||
# If the value was cached, stop now. We just wanted to have am__tar
|
||||
# and am__untar set.
|
||||
test -n "${am_cv_prog_tar_$1}" && break
|
||||
|
||||
# tar/untar a dummy directory, and stop if the command works
|
||||
rm -rf conftest.dir
|
||||
mkdir conftest.dir
|
||||
echo GrepMe > conftest.dir/file
|
||||
AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
|
||||
rm -rf conftest.dir
|
||||
if test -s conftest.tar; then
|
||||
AM_RUN_LOG([$am__untar <conftest.tar])
|
||||
grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
|
||||
fi
|
||||
done
|
||||
rm -rf conftest.dir
|
||||
|
||||
AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
|
||||
AC_MSG_RESULT([$am_cv_prog_tar_$1])])
|
||||
AC_SUBST([am__tar])
|
||||
AC_SUBST([am__untar])
|
||||
]) # _AM_PROG_TAR
|
||||
|
||||
0
autoscan-2.68.log
Normal file
0
autoscan-2.68.log
Normal file
1
config.guess
vendored
Symbolic link
1
config.guess
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
/usr/share/automake-1.11/config.guess
|
||||
112
config.h.in
Normal file
112
config.h.in
Normal file
@@ -0,0 +1,112 @@
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define to 1 if you have the `clock_gettime' function. */
|
||||
#undef HAVE_CLOCK_GETTIME
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#undef HAVE_FCNTL_H
|
||||
|
||||
/* Define to 1 if you have the `fork' function. */
|
||||
#undef HAVE_FORK
|
||||
|
||||
/* Define to 1 if you have the `getpagesize' function. */
|
||||
#undef HAVE_GETPAGESIZE
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#undef HAVE_MEMSET
|
||||
|
||||
/* Define to 1 if you have a working `mmap' system call. */
|
||||
#undef HAVE_MMAP
|
||||
|
||||
/* Define to 1 if stdbool.h conforms to C99. */
|
||||
#undef HAVE_STDBOOL_H
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the <syslog.h> header file. */
|
||||
#undef HAVE_SYSLOG_H
|
||||
|
||||
/* Define to 1 if you have the <sys/ioctl.h> header file. */
|
||||
#undef HAVE_SYS_IOCTL_H
|
||||
|
||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||
#undef HAVE_SYS_PARAM_H
|
||||
|
||||
/* Define to 1 if you have the <sys/statvfs.h> header file. */
|
||||
#undef HAVE_SYS_STATVFS_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Define to 1 if you have the `vfork' function. */
|
||||
#undef HAVE_VFORK
|
||||
|
||||
/* Define to 1 if you have the <vfork.h> header file. */
|
||||
#undef HAVE_VFORK_H
|
||||
|
||||
/* Define to 1 if `fork' works. */
|
||||
#undef HAVE_WORKING_FORK
|
||||
|
||||
/* Define to 1 if `vfork' works. */
|
||||
#undef HAVE_WORKING_VFORK
|
||||
|
||||
/* Define to 1 if the system has the type `_Bool'. */
|
||||
#undef HAVE__BOOL
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Version number of package */
|
||||
#undef VERSION
|
||||
|
||||
/* Define to `int' if <sys/types.h> does not define. */
|
||||
#undef pid_t
|
||||
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
#undef size_t
|
||||
|
||||
/* Define as `fork' if `vfork' does not work. */
|
||||
#undef vfork
|
||||
1
config.sub
vendored
Symbolic link
1
config.sub
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
/usr/share/automake-1.11/config.sub
|
||||
63
configure.ac
Normal file
63
configure.ac
Normal file
@@ -0,0 +1,63 @@
|
||||
# -*- Autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ([2.68])
|
||||
AC_INIT([h264dvr], [0.1], [scott@alfter.us])
|
||||
AM_INIT_AUTOMAKE
|
||||
AC_CONFIG_SRCDIR([lib/daemonize.cpp])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CANONICAL_HOST
|
||||
AM_CONDITIONAL(WIN32_BUILD, test "$host_os" = "mingw32")
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CC
|
||||
AC_PROG_RANLIB
|
||||
|
||||
# check for wxWidgets
|
||||
|
||||
WXCONFIG=wx-config
|
||||
AC_ARG_WITH(wx-config,
|
||||
[[ --with-wx-config=FILE Use the given path to wx-config when determining
|
||||
wxWidgets configuration; defaults to "wx-config"]],
|
||||
[
|
||||
if test "$withval" != "yes" -a "$withval" != ""; then
|
||||
WXCONFIG=$withval
|
||||
fi
|
||||
])
|
||||
AC_MSG_CHECKING([wxWidgets version])
|
||||
if wxversion=`$WXCONFIG --version`; then
|
||||
AC_MSG_RESULT([$wxversion])
|
||||
else
|
||||
AC_MSG_RESULT([not found])
|
||||
AC_MSG_ERROR([wxWidgets is required. Try --with-wx-config.])
|
||||
fi
|
||||
|
||||
WX_CPPFLAGS="`$WXCONFIG --cppflags`"
|
||||
WX_CXXFLAGS="`$WXCONFIG --cxxflags | sed -e 's/-fno-exceptions//'`"
|
||||
WX_LIBS="`$WXCONFIG --libs`"
|
||||
|
||||
CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS"
|
||||
CXXFLAGS="$CXXFLAGS $WX_CPPFLAGS"
|
||||
|
||||
AC_SUBST(WX_LIBS)
|
||||
|
||||
|
||||
# Checks for libraries.
|
||||
|
||||
# Checks for header files.
|
||||
AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/ioctl.h sys/statvfs.h syslog.h unistd.h])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_HEADER_STDBOOL
|
||||
AC_TYPE_SIZE_T
|
||||
|
||||
# Checks for library functions.
|
||||
AC_FUNC_FORK
|
||||
AC_FUNC_MMAP
|
||||
AC_CHECK_FUNCS([clock_gettime memset])
|
||||
|
||||
# create top-level and subdirectory makefiles
|
||||
AC_CONFIG_FILES([Makefile src/Makefile lib/Makefile])
|
||||
|
||||
AC_OUTPUT
|
||||
39
include/DiskWriter.h
Normal file
39
include/DiskWriter.h
Normal file
@@ -0,0 +1,39 @@
|
||||
#ifndef DISKWRITER_H
|
||||
#define DISKWRITER_H
|
||||
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <syslog.h>
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
#include <dirent.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "index_type.h"
|
||||
|
||||
#define MIN_FREE_SPACE 3221225472 // 3 GB
|
||||
|
||||
using namespace std;
|
||||
|
||||
class DiskWriter
|
||||
{
|
||||
private:
|
||||
bool opened;
|
||||
bool rotate;
|
||||
string szDestDir;
|
||||
string szPrefix;
|
||||
ofstream outfile_data, outfile_index;
|
||||
struct tm last_ts;
|
||||
int lastframe_hour;
|
||||
int lastframe_minute;
|
||||
void Cleanup();
|
||||
public:
|
||||
DiskWriter(string destdir, string prefix);
|
||||
bool Write(void* bfr, int len, bool keyframe);
|
||||
};
|
||||
|
||||
|
||||
#endif // DISKWRITER_H
|
||||
12
include/daemonize.h
Normal file
12
include/daemonize.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#ifndef __DAEMONIZE_H
|
||||
#define __DAEMONIZE_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
void daemonize();
|
||||
|
||||
#endif // __DAEMONIZE_H
|
||||
14
include/index_type.h
Normal file
14
include/index_type.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#ifndef __INDEX_TYPE_H
|
||||
#define __INDEX_TYPE_H
|
||||
|
||||
#include <time.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
struct timespec time;
|
||||
long pos;
|
||||
int len;
|
||||
bool keyframe;
|
||||
} index_t;
|
||||
|
||||
#endif // __INDEX_TYPE_H
|
||||
16
include/recd.h
Normal file
16
include/recd.h
Normal file
@@ -0,0 +1,16 @@
|
||||
#ifndef __RECD_H
|
||||
#define __RECD_H
|
||||
|
||||
#include <iostream>
|
||||
#include <getopt.h>
|
||||
#include <string>
|
||||
#include <syslog.h>
|
||||
#include <libgen.h>
|
||||
#include "config.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
void help(char* progname);
|
||||
int main (int argc, char** argv);
|
||||
|
||||
#endif // __RECD_H
|
||||
51
include/recd_capture.h
Normal file
51
include/recd_capture.h
Normal file
@@ -0,0 +1,51 @@
|
||||
#ifndef __RECD_CAPTURE_H
|
||||
#define __RECD_CAPTURE_H
|
||||
|
||||
#include <string>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <syslog.h>
|
||||
#include <iostream>
|
||||
#include <time.h>
|
||||
#include "config.h"
|
||||
|
||||
#define V_BUFFERS 8
|
||||
|
||||
#define reset_vbuf(__vb) do { \
|
||||
memset((__vb), 0, sizeof(*(__vb))); \
|
||||
(__vb)->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; \
|
||||
(__vb)->memory = V4L2_MEMORY_MMAP; \
|
||||
} while(0)
|
||||
|
||||
using namespace std;
|
||||
|
||||
typedef struct {
|
||||
void *data;
|
||||
size_t size;
|
||||
} video_buffer;
|
||||
|
||||
class Capture
|
||||
{
|
||||
private:
|
||||
int vfd;
|
||||
struct v4l2_format vfmt;
|
||||
struct v4l2_capability vcap;
|
||||
struct v4l2_streamparm vparm;
|
||||
video_buffer p_buf[V_BUFFERS];
|
||||
void err_out(char* fmt, ...);
|
||||
void open_video_dev(const char* dev);
|
||||
void set_osd(char* fmt, ...);
|
||||
void v4l_prepare();
|
||||
string szPrevOSDMessage;
|
||||
public:
|
||||
void StartCapture(string source, string prefix, string outdir, string caption);
|
||||
Capture();
|
||||
};
|
||||
|
||||
#endif // __RECD_CAPTURE_H
|
||||
1
install-sh
Symbolic link
1
install-sh
Symbolic link
@@ -0,0 +1 @@
|
||||
/usr/share/automake-1.11/install-sh
|
||||
106
lib/DiskWriter.cpp
Normal file
106
lib/DiskWriter.cpp
Normal file
@@ -0,0 +1,106 @@
|
||||
#include "DiskWriter.h"
|
||||
|
||||
DiskWriter::DiskWriter(string destdir, string prefix)
|
||||
{
|
||||
szDestDir=destdir;
|
||||
szPrefix=prefix;
|
||||
opened=false;
|
||||
rotate=false;
|
||||
lastframe_hour=-1;
|
||||
lastframe_minute=-1;
|
||||
}
|
||||
|
||||
void DiskWriter::Cleanup()
|
||||
{
|
||||
struct statvfs diskinfo;
|
||||
DIR* d;
|
||||
struct dirent* de;
|
||||
struct stat s;
|
||||
char pn[PATH_MAX];
|
||||
char oldest[NAME_MAX];
|
||||
time_t mtime;
|
||||
|
||||
statvfs(szDestDir.c_str(), &diskinfo);
|
||||
if (diskinfo.f_bavail*diskinfo.f_bsize<MIN_FREE_SPACE)
|
||||
{
|
||||
time(&mtime);
|
||||
if ((d=opendir(szDestDir.c_str()))!=NULL)
|
||||
{
|
||||
while ((de=readdir(d))!=NULL)
|
||||
{
|
||||
// if (strncmp(de->d_name, szPrefix.c_str(), szPrefix.length())==0)
|
||||
// {
|
||||
sprintf(pn, "%s/%s", szDestDir.c_str(), de->d_name);
|
||||
if (stat(pn, &s)==0)
|
||||
if (S_ISREG(s.st_mode) && s.st_mtime<mtime)
|
||||
{
|
||||
strcpy(oldest, de->d_name);
|
||||
mtime=s.st_mtime;
|
||||
}
|
||||
// }
|
||||
}
|
||||
closedir(d);
|
||||
sprintf(pn, "%s/%s", szDestDir.c_str(), oldest);
|
||||
unlink(pn);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
bool DiskWriter::Write(void* bfr, int len, bool keyframe)
|
||||
{
|
||||
struct timespec ts;
|
||||
struct tm *lt;
|
||||
char szDestFile[1024];
|
||||
index_t idx;
|
||||
|
||||
clock_gettime(CLOCK_REALTIME, &ts);
|
||||
lt=localtime(&(ts.tv_sec));
|
||||
// if (lastframe_hour>-1 && lastframe_hour!=lt->tm_hour)
|
||||
// rotate=true;
|
||||
// if (rotate && keyframe) // need to rotate?
|
||||
// {
|
||||
// outfile_data.close();
|
||||
// outfile_index.close();
|
||||
// opened=false;
|
||||
// }
|
||||
if (!opened)
|
||||
{
|
||||
sprintf(szDestFile, "%s/%s.%04i%02i%02i.%02i%02i%02i%03li.264", szDestDir.c_str(), szPrefix.c_str(),
|
||||
lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday,
|
||||
lt->tm_hour, lt->tm_min, lt->tm_sec, ts.tv_nsec/1000000);
|
||||
outfile_data.open(szDestFile, ios::binary);
|
||||
outfile_index.open(((string)szDestFile+".idx").c_str(), ios::binary);
|
||||
if (outfile_data.fail())
|
||||
return false;
|
||||
opened=true;
|
||||
}
|
||||
if (lastframe_hour>-1 && lastframe_hour!=lt->tm_hour)
|
||||
rotate=true;
|
||||
if (rotate && keyframe) // need to rotate?
|
||||
{
|
||||
outfile_data.close();
|
||||
outfile_index.close();
|
||||
sprintf(szDestFile, "%s/%s.%04i%02i%02i.%02i%02i%02i%03li.264", szDestDir.c_str(), szPrefix.c_str(),
|
||||
lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday,
|
||||
lt->tm_hour, lt->tm_min, lt->tm_sec, ts.tv_nsec/1000000);
|
||||
outfile_data.open(szDestFile, ios::binary);
|
||||
outfile_index.open(((string)szDestFile+".idx").c_str(), ios::binary);
|
||||
if (outfile_data.fail())
|
||||
return false;
|
||||
rotate=false;
|
||||
}
|
||||
if (lastframe_minute!=lt->tm_min) // check every minute for free space
|
||||
Cleanup();
|
||||
lastframe_hour=lt->tm_hour;
|
||||
lastframe_minute=lt->tm_min;
|
||||
memcpy(&(idx.time), &ts, sizeof(ts));
|
||||
idx.pos=outfile_data.tellp();
|
||||
idx.len=len;
|
||||
idx.keyframe=keyframe;
|
||||
outfile_data.write((const char*)bfr, len);
|
||||
outfile_index.write((const char*)&idx, sizeof(idx));
|
||||
memcpy(&last_ts, &ts, sizeof(ts));
|
||||
return !outfile_data.fail();
|
||||
}
|
||||
13
lib/Makefile.am
Normal file
13
lib/Makefile.am
Normal file
@@ -0,0 +1,13 @@
|
||||
noinst_LIBRARIES=
|
||||
|
||||
if !WIN32_BUILD
|
||||
|
||||
noinst_LIBRARIES+=librecd.a libdaemonize.a
|
||||
|
||||
librecd_a_SOURCES=DiskWriter.cpp recd_capture.cpp
|
||||
librecd_a_CXXFLAGS=-I../include
|
||||
|
||||
libdaemonize_a_SOURCES=daemonize.cpp
|
||||
libdaemonize_a_CXXFLAGS=-I../include
|
||||
|
||||
endif
|
||||
18
lib/daemonize.cpp
Normal file
18
lib/daemonize.cpp
Normal file
@@ -0,0 +1,18 @@
|
||||
#include "daemonize.h"
|
||||
|
||||
void daemonize()
|
||||
{
|
||||
int pid=fork();
|
||||
if (pid<0) exit(-1); // fork() error
|
||||
if (pid>0) exit(0); // parent exits normally
|
||||
umask(0);
|
||||
int sid=setsid();
|
||||
if (sid<0)
|
||||
exit(-1);
|
||||
if ((chdir("/"))<0)
|
||||
exit(-1);
|
||||
FILE* nullin=freopen("/dev/null", "r", stdin);
|
||||
FILE* nullout=freopen("/dev/null", "w", stdout);
|
||||
FILE* nullerr=freopen("/dev/null", "w", stderr);
|
||||
}
|
||||
|
||||
190
lib/recd_capture.cpp
Normal file
190
lib/recd_capture.cpp
Normal file
@@ -0,0 +1,190 @@
|
||||
#include "recd_capture.h"
|
||||
#include "DiskWriter.h"
|
||||
|
||||
// capture functionality mostly cribbed from the bc-record example
|
||||
// provided with the Bluecherry capture card driver
|
||||
|
||||
Capture::Capture()
|
||||
{
|
||||
szPrevOSDMessage="";
|
||||
}
|
||||
|
||||
|
||||
void Capture::err_out(char* fmt, ... )
|
||||
{
|
||||
char buf[256];
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||
va_end(ap);
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
|
||||
syslog(LOG_ERR, "%s", buf);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
void Capture::open_video_dev(const char* dev)
|
||||
{
|
||||
if ((vfd = open(dev, O_RDWR)) < 0)
|
||||
err_out((char*)"Opening video device");
|
||||
|
||||
/* Verify this is the correct type */
|
||||
if (ioctl(vfd, VIDIOC_QUERYCAP, &vcap) < 0)
|
||||
err_out((char*)"Querying video capabilities");
|
||||
|
||||
if (!(vcap.capabilities & V4L2_CAP_VIDEO_CAPTURE) ||
|
||||
!(vcap.capabilities & V4L2_CAP_STREAMING))
|
||||
err_out((char*)"Invalid video device type");
|
||||
|
||||
/* Get the parameters */
|
||||
vparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
if (ioctl(vfd, VIDIOC_G_PARM, &vparm) < 0)
|
||||
err_out((char*)"Getting parameters for video device");
|
||||
|
||||
/* Get the format */
|
||||
vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
if (ioctl(vfd, VIDIOC_G_FMT, &vfmt) < 0)
|
||||
err_out((char*)"Getting video device format");
|
||||
|
||||
/* Set FPS/GOP */
|
||||
vparm.parm.capture.timeperframe.denominator = 30;
|
||||
vparm.parm.capture.timeperframe.numerator = 1;
|
||||
ioctl(vfd, VIDIOC_S_PARM, &vparm);
|
||||
|
||||
/* Set format */
|
||||
vfmt.fmt.pix.width = 704;
|
||||
vfmt.fmt.pix.height = 480;
|
||||
if (ioctl(vfd, VIDIOC_S_FMT, &vfmt) < 0)
|
||||
err_out((char*)"Setting video format");
|
||||
}
|
||||
|
||||
void Capture::set_osd(char* fmt, ...)
|
||||
{
|
||||
char buf[256];
|
||||
va_list ap;
|
||||
struct v4l2_ext_control ctrl;
|
||||
struct v4l2_ext_controls ctrls;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||
va_end(ap);
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
|
||||
memset(&ctrl, 0, sizeof(ctrl));
|
||||
memset(&ctrls, 0, sizeof(ctrls));
|
||||
|
||||
ctrls.count = 1;
|
||||
ctrls.ctrl_class = V4L2_CTRL_CLASS_FM_TX;
|
||||
ctrls.controls = &ctrl;
|
||||
ctrl.id = V4L2_CID_RDS_TX_RADIO_TEXT;
|
||||
ctrl.size = strlen(buf);
|
||||
ctrl.string = buf;
|
||||
|
||||
ioctl(vfd, VIDIOC_S_EXT_CTRLS, &ctrls);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void Capture::v4l_prepare()
|
||||
{
|
||||
enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
struct v4l2_requestbuffers req;
|
||||
int i;
|
||||
|
||||
reset_vbuf(&req);
|
||||
req.count = V_BUFFERS;
|
||||
|
||||
if (ioctl(vfd, VIDIOC_REQBUFS, &req) < 0)
|
||||
err_out((char*)"Requesting buffers");
|
||||
|
||||
if (req.count != V_BUFFERS)
|
||||
err_out((char*)"Requested buffer count mismatch");
|
||||
|
||||
for (i = 0; i < V_BUFFERS; i++) {
|
||||
struct v4l2_buffer vb;
|
||||
|
||||
reset_vbuf(&vb);
|
||||
vb.index = i;
|
||||
|
||||
if (ioctl(vfd, VIDIOC_QUERYBUF, &vb) < 0)
|
||||
err_out((char*)"Querying buffer");
|
||||
|
||||
p_buf[i].size = vb.length;
|
||||
p_buf[i].data = mmap(NULL, vb.length, PROT_WRITE | PROT_READ, MAP_SHARED, vfd, vb.m.offset);
|
||||
if (p_buf[i].data == MAP_FAILED)
|
||||
err_out((char*)"Mmap of buffer");
|
||||
}
|
||||
|
||||
if (ioctl(vfd, VIDIOC_STREAMON, &type) < 0)
|
||||
err_out((char*)"Starting video stream");
|
||||
|
||||
/* Queue all buffers */
|
||||
for (i = 0; i < V_BUFFERS; i++) {
|
||||
struct v4l2_buffer vb;
|
||||
|
||||
reset_vbuf(&vb);
|
||||
vb.index = i;
|
||||
|
||||
if (ioctl(vfd, VIDIOC_QBUF, &vb) < 0)
|
||||
err_out((char*)"Queuing buffer");
|
||||
}
|
||||
}
|
||||
|
||||
void Capture::StartCapture(string source, string prefix, string outdir, string caption)
|
||||
{
|
||||
bool got_vop=false;
|
||||
char szOSDMessage[160];
|
||||
|
||||
DiskWriter dw(outdir, prefix);
|
||||
|
||||
open_video_dev(source.c_str());
|
||||
v4l_prepare();
|
||||
|
||||
for (;;) {
|
||||
struct v4l2_buffer vb;
|
||||
int ret;
|
||||
time_t tm = time(NULL);
|
||||
struct tm* tmv=localtime(&tm);
|
||||
|
||||
if (caption!="")
|
||||
sprintf(szOSDMessage, "%04i-%02i-%02i %02i:%02i:%02i | %s", tmv->tm_year+1900, tmv->tm_mon+1, tmv->tm_mday, tmv->tm_hour, tmv->tm_min, tmv->tm_sec, caption.c_str());
|
||||
else
|
||||
sprintf(szOSDMessage, "%04i-%02i-%02i %02i:%02i:%02i", tmv->tm_year+1900, tmv->tm_mon+1, tmv->tm_mday, tmv->tm_hour, tmv->tm_min, tmv->tm_sec);
|
||||
if (szPrevOSDMessage!=szOSDMessage)
|
||||
{
|
||||
set_osd(szOSDMessage);
|
||||
szPrevOSDMessage=szOSDMessage;
|
||||
}
|
||||
|
||||
reset_vbuf(&vb);
|
||||
ret = ioctl(vfd, VIDIOC_DQBUF, &vb);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Failure in dqbuf\n");
|
||||
ioctl(vfd, VIDIOC_QBUF, &vb);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Wait for key frame */
|
||||
if (!got_vop) {
|
||||
if (!(vb.flags & V4L2_BUF_FLAG_KEYFRAME)) {
|
||||
ioctl(vfd, VIDIOC_QBUF, &vb);
|
||||
continue;
|
||||
}
|
||||
syslog(LOG_INFO, "starting capture on %s", source.c_str());
|
||||
got_vop = true;
|
||||
}
|
||||
|
||||
// if (vb.flags & V4L2_BUF_FLAG_KEYFRAME)
|
||||
// cout << vb.bytesused << " keyframe" << endl;
|
||||
// else
|
||||
// cout << vb.bytesused << endl;
|
||||
|
||||
if (!dw.Write(p_buf[vb.index].data, vb.bytesused, vb.flags & V4L2_BUF_FLAG_KEYFRAME))
|
||||
err_out((char*)"Unable to write to disk");
|
||||
|
||||
ioctl(vfd, VIDIOC_QBUF, &vb);
|
||||
}
|
||||
|
||||
return; // we should never get here
|
||||
}
|
||||
14
src/Makefile.am
Normal file
14
src/Makefile.am
Normal file
@@ -0,0 +1,14 @@
|
||||
bin_PROGRAMS=hello
|
||||
|
||||
hello_SOURCES=hello.cpp
|
||||
hello_LDADD=$(WX_LIBS)
|
||||
|
||||
if !WIN32_BUILD
|
||||
|
||||
bin_PROGRAMS+= recd
|
||||
|
||||
recd_SOURCES=recd.cpp
|
||||
recd_CXXFLAGS=-I../include
|
||||
recd_LDADD=../lib/librecd.a ../lib/libdaemonize.a -lrt
|
||||
|
||||
endif
|
||||
83
src/hello.cpp
Normal file
83
src/hello.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
//
|
||||
// file name: hworld.cpp
|
||||
//
|
||||
// purpose: wxWidgets "Hello world"
|
||||
//
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
class MyApp: public wxApp
|
||||
{
|
||||
virtual bool OnInit();
|
||||
};
|
||||
|
||||
class MyFrame: public wxFrame
|
||||
{
|
||||
public:
|
||||
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
|
||||
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
void OnAbout(wxCommandEvent& event);
|
||||
|
||||
private:
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
ID_Quit = 1,
|
||||
ID_About,
|
||||
};
|
||||
|
||||
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_MENU(ID_Quit, MyFrame::OnQuit)
|
||||
EVT_MENU(ID_About, MyFrame::OnAbout)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
IMPLEMENT_APP(MyApp)
|
||||
|
||||
bool MyApp::OnInit()
|
||||
{
|
||||
MyFrame *frame = new MyFrame( wxT("Hello World"), wxPoint(50,50), wxSize(450,340) );
|
||||
frame->Show( true );
|
||||
SetTopWindow( frame );
|
||||
return true;
|
||||
}
|
||||
|
||||
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
||||
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
|
||||
{
|
||||
wxMenu *menuFile = new wxMenu;
|
||||
|
||||
menuFile->Append( ID_About, wxT("&About...") );
|
||||
menuFile->AppendSeparator();
|
||||
menuFile->Append( ID_Quit, wxT("E&xit") );
|
||||
|
||||
wxMenuBar *menuBar = new wxMenuBar;
|
||||
menuBar->Append( menuFile, wxT("&File") );
|
||||
|
||||
SetMenuBar( menuBar );
|
||||
|
||||
CreateStatusBar();
|
||||
SetStatusText( wxT("Welcome to wxWidgets!") );
|
||||
}
|
||||
|
||||
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
Close( true );
|
||||
}
|
||||
|
||||
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
wxMessageBox( wxT("This is a wxWidgets' Hello world sample"),
|
||||
wxT("About Hello World"), wxOK | wxICON_INFORMATION );
|
||||
}
|
||||
90
src/recd.cpp
Normal file
90
src/recd.cpp
Normal file
@@ -0,0 +1,90 @@
|
||||
#include "recd.h"
|
||||
#include "daemonize.h"
|
||||
#include "recd_capture.h"
|
||||
#include <syslog.h>
|
||||
|
||||
void help(char* progname)
|
||||
{
|
||||
cerr << "Usage: " << progname << " options" << endl;
|
||||
cerr << " -s|--source /dev/videoX use /dev/videoX as recording source" << endl;
|
||||
cerr << " -p|--prefix foo use foo as filename prefix for recordings" << endl;
|
||||
cerr << " -o|--output dirname use dirname as recording directory" << endl;
|
||||
cerr << " (default: /mnt/store)" << endl;
|
||||
cerr << " -c|--caption msg insert msg after timestamp as video caption" << endl;
|
||||
cerr << " -d|--no-daemon don't fork into background" << endl;
|
||||
cerr << " -h|--help this message" << endl;
|
||||
}
|
||||
|
||||
int main (int argc, char** argv)
|
||||
{
|
||||
int c;
|
||||
string source="";
|
||||
string caption="";
|
||||
string prefix="";
|
||||
bool no_daemonize=0;
|
||||
string outdir="/mnt/store";
|
||||
Capture objCapture;
|
||||
|
||||
openlog(basename(argv[0]), LOG_PID, LOG_DAEMON);
|
||||
|
||||
while (1)
|
||||
{
|
||||
struct option long_options[]=
|
||||
{
|
||||
{"source", required_argument, 0, 's'},
|
||||
{"prefix", required_argument, 0, 'p'},
|
||||
{"output", required_argument, 0, 'o'},
|
||||
{"no-daemon", no_argument, 0, 'd'},
|
||||
{"caption", required_argument, 0, 'c'},
|
||||
{"help", no_argument, 0, 'h'}
|
||||
};
|
||||
int option_index=0;
|
||||
if ((c=getopt_long(argc, argv, "s:p:o:dc:h?", long_options, &option_index))==-1)
|
||||
break;
|
||||
switch (c)
|
||||
{
|
||||
case 's':
|
||||
source=optarg;
|
||||
break;
|
||||
case 'p':
|
||||
prefix=optarg;
|
||||
break;
|
||||
case 'o':
|
||||
outdir=optarg;
|
||||
break;
|
||||
case 'd':
|
||||
no_daemonize=1;
|
||||
break;
|
||||
case 'c':
|
||||
caption=optarg;
|
||||
break;
|
||||
case 'h':
|
||||
case '?':
|
||||
help(argv[0]);
|
||||
exit(-1);
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
if (optind<argc)
|
||||
{
|
||||
help(argv[0]);
|
||||
exit(-1);
|
||||
}
|
||||
if (source=="")
|
||||
{
|
||||
cerr << "error: no source specified" << endl;
|
||||
help(argv[0]);
|
||||
exit(-1);
|
||||
}
|
||||
if (prefix=="")
|
||||
{
|
||||
cerr << "error: no prefix specified" << endl;
|
||||
help(argv[0]);
|
||||
exit(-1);
|
||||
}
|
||||
if (!no_daemonize)
|
||||
daemonize();
|
||||
objCapture.StartCapture(source, prefix, outdir, caption);
|
||||
return 0; // we should never get here
|
||||
}
|
||||
Reference in New Issue
Block a user