summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.in25
-rw-r--r--AUTHORS0
-rw-r--r--ChangeLog0
-rw-r--r--Makefile.am3
-rw-r--r--NEWS0
-rw-r--r--README0
-rw-r--r--TODO22
-rw-r--r--acinclude.m41868
-rw-r--r--acinclude.m4.mine475
-rwxr-xr-xautogen.sh71
-rw-r--r--configure.in166
-rw-r--r--pixmaps/camera.pngbin0 -> 2716 bytes
-rw-r--r--pixmaps/dummy.pngbin0 -> 2640 bytes
-rw-r--r--pixmaps/miav-logo-256x256.pngbin0 -> 39580 bytes
-rw-r--r--pixmaps/miav-logo-512x512.pngbin0 -> 91627 bytes
-rw-r--r--pixmaps/miav-logo-64x64.pngbin0 -> 5827 bytes
-rw-r--r--pixmaps/record.pngbin0 -> 1190 bytes
-rw-r--r--pixmaps/stop.pngbin0 -> 339 bytes
-rw-r--r--src/Makefile.am1
-rw-r--r--src/aboutwindow.cc89
-rw-r--r--src/aboutwindow.h77
-rw-r--r--src/camera.cc131
-rw-r--r--src/camera.h81
-rw-r--r--src/cprquerydialog.cc376
-rw-r--r--src/cprquerydialog.h136
-rw-r--r--src/decoder.cc171
-rw-r--r--src/decoder.h65
-rw-r--r--src/dvframe.cc41
-rw-r--r--src/dvframe.h47
-rw-r--r--src/encoder.cc158
-rw-r--r--src/encoder.h89
-rw-r--r--src/ffframe.cc38
-rw-r--r--src/ffframe.h38
-rw-r--r--src/img_encoder.cc161
-rw-r--r--src/img_encoder.h63
-rw-r--r--src/mainwindow.cc305
-rw-r--r--src/mainwindow.h100
-rw-r--r--src/messagebox.cc197
-rw-r--r--src/messagebox.h66
-rw-r--r--src/miav.cc120
-rw-r--r--src/miav.h36
-rw-r--r--src/miav_config.cc99
-rw-r--r--src/miav_config.h57
-rw-r--r--src/mov_encoder.cc207
-rw-r--r--src/mov_encoder.h57
-rw-r--r--src/network.cc139
-rw-r--r--src/network.h52
-rw-r--r--src/package.h53
-rw-r--r--src/player.cc155
-rw-r--r--src/player.h77
-rw-r--r--src/queue.h130
-rw-r--r--src/server.cc129
-rw-r--r--src/server.h44
-rw-r--r--src/socket.cc134
-rw-r--r--src/socket.h56
-rw-r--r--src/thread.cc34
-rw-r--r--src/thread.h42
-rw-r--r--src/util.cc56
-rw-r--r--src/util.h36
-rw-r--r--src/videowidget.cc46
-rw-r--r--src/videowidget.h45
-rwxr-xr-xtools/CPUMaker27
-rwxr-xr-xtools/MIaVAdd64
-rwxr-xr-xtools/MocList11
-rwxr-xr-xtools/MocMaker3
65 files changed, 6968 insertions, 1 deletions
diff --git a/.in b/.in
new file mode 100644
index 0000000..eff77b6
--- /dev/null
+++ b/.in
@@ -0,0 +1,25 @@
+/* .in. Generated from configure.in by autoheader. */
+
+/* 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 version of this package. */
+#undef PACKAGE_VERSION
+
+/* Version number of package */
+#undef VERSION
+
+/* Defined if on Win32 platform */
+#undef WIN32
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/AUTHORS
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ChangeLog
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..bd780f0
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,3 @@
+AUTOMAKE_OPTIONS = gnu
+SUBDIRS = src
+DISTDIRS = pixmaps ffmpeg src \ No newline at end of file
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/NEWS
diff --git a/README b/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/README
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..858e4fe
--- /dev/null
+++ b/TODO
@@ -0,0 +1,22 @@
+
+Make generic gui
+ - Reorganize widgets to fit 19" display. [done]
+ - Create button icons, to replace text. [in progress]
+
+Make isolated cprquerydialog [in progress]
+ - To replace mgui
+
+Clean up cprquerydialog
+ - merge code into a single file, for simplicity. [done]
+
+Finish config parser.
+
+Make library detection in configure script
+ - LibSDL [done]
+ - LibJpeg [done]
+ - ffmpeg
+
+Include ffmpeg in project [ NO ]
+
+Incorporate server into project
+ - Make it standalone compilable (through flag to configure) [done]
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644
index 0000000..694ec25
--- /dev/null
+++ b/acinclude.m4
@@ -0,0 +1,1868 @@
+# as.m4
+# Figure out how to run the assembler.
+
+# AM_PROG_AS
+AC_DEFUN([AM_PROG_AS],
+[# By default we simply use the C compiler to build assembly code.
+AC_REQUIRE([AC_PROG_CC])
+: ${AS='$(CC)'}
+# Set ASFLAGS if not already set.
+: ${ASFLAGS='$(CFLAGS)'}
+AC_SUBST(AS)
+AC_SUBST(ASFLAGS)
+])
+
+dnl AC_GCC_VERSION
+dnl check for compiler version
+dnl sets COMPILER_VERSION and GCC_VERSION
+
+AC_DEFUN([AC_CC_VERSION],
+[
+ AC_MSG_CHECKING([C compiler version])
+ COMPILER_VERSION=`$CC -v 2>&1 | grep version`
+ if test -z "`echo $COMPILER_VERSION | grep gcc`" ; then
+ GCC_VERSION=unknown
+ AC_MSG_RESULT([unknown])
+ else
+ dnl Ok, how to turn $3 into the real $3
+ GCC_VERSION=`echo $COMPILER_VERSION | sed -e 's/.*\ .*\ \(.*\)\ .*/\1/'`
+ echo gcc $GCC_VERSION
+ fi
+])
+
+dnl AC_TRY_CFLAGS (CFLAGS, [ACTION-IF-WORKS], [ACTION-IF-FAILS])
+dnl check if $CC supports a given set of cflags
+
+AC_DEFUN([AC_TRY_CFLAGS],
+[
+ AC_MSG_CHECKING([if $CC supports $1 flag(s)])
+ ac_save_CFLAGS=$CFLAGS
+ CFLAGS=$1
+ AC_TRY_COMPILE([], [], [ ac_cv_try_cflags_ok=yes ],[ ac_cv_try_cflags_ok=no ])
+ CFLAGS=$ac_save_CFLAGS
+ AC_MSG_RESULT([$ac_cv_try_cflags_ok])
+ if test x$ac_cv_try_cflags_ok = xyes; then
+ ifelse([$2], [], [:], [$2])
+ else
+ ifelse([$3], [], [:], [$3])
+ fi
+])
+
+dnl AC_TRY_CXXFLAGS (CXXFLAGS, [ACTION-IF-WORKS], [ACTION-IF-FAILS])
+dnl check if $CXX supports a given set of cxxflags
+
+AC_DEFUN([AC_TRY_CXXFLAGS],
+[
+ AC_MSG_CHECKING([if $CXX supports $1 flag(s)])
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ ac_save_CXXFLAGS=$CXXFLAGS
+ CXXFLAGS=$1
+ AC_TRY_COMPILE([], [], [ ac_cv_try_cxxflags_ok=yes ],[ ac_cv_try_cxxflags_ok=no ])
+ CXXFLAGS=$ac_save_CXXFLAGS
+ AC_MSG_RESULT([$ac_cv_try_cxxflags_ok])
+ AC_LANG_RESTORE
+ if test x$ac_cv_try_cxxflags_ok = xyes; then
+ ifelse([$2], [], [:], [$2])
+ else
+ ifelse([$3], [], [:], [$3])
+ fi
+])
+
+dnl AC_CHECK_GNU_EXTENSIONS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([AC_CHECK_GNU_EXTENSIONS],
+[
+ AC_CACHE_CHECK([if you need GNU extensions], ac_cv_gnu_extensions,
+ [ AC_TRY_COMPILE([#include <features.h>], [
+#ifndef __GNU_LIBRARY__
+gnuneeded
+#endif
+ ], [ ac_cv_gnu_extensions=yes ], [ ac_cv_gnu_extensions=no ])
+ ])
+ if test x$ac_cv_gnu_extensions = xyes; then
+ ifelse([$1], [], [:], [$1])
+ dnl AC_DEFINE_UNQUOTED(_GNU_SOURCE)
+ else
+ ifelse([$2], [], [:], [$2])
+ fi
+])
+
+dnl
+dnl AC_CHECK_GNU_VECTOR([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl
+AC_DEFUN([AC_CHECK_GNU_VECTOR],
+[
+ AC_CACHE_CHECK([if gcc supports vector builtins], ac_cv_gnu_builtins,
+ [ AC_TRY_COMPILE([#include <features.h>], [
+int main(void) {
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
+return 0;
+#else
+#error no vector builtins
+#endif
+}
+ ], [ ac_cv_gnu_builtins=yes ], [ ac_cv_gnu_builtins=no ])
+ ])
+ if test x$ac_cv_gnu_builtins = xyes; then
+ ifelse([$1], [], [:], [$1])
+ else
+ ifelse([$2], [], [:], [$2])
+ fi
+])
+# Configure paths for DivX
+
+dnl Usage:
+dnl AM_PATH_DIVX([ACTION-IF-FOUND-DECORE [, ACTION-IF-NOT-FOUND-DECORE
+dnl [, ACTION-IF-FOUND-ENCORE, [ACTION-IF-NOT-FOUND-DECORE]]]] )
+dnl Test for libdivxdecore, libdivxencore, and define XVID_CFLAGS and XVID_LIBS
+dnl
+AC_DEFUN([AM_PATH_DIVX],
+[
+ AC_ARG_WITH(divx4_prefix, [ --with-divx4-prefix=PFX where divx4linux is installed. (optional)],
+ [], with_divx4_prefix=)
+
+ have_divx_decore=no
+ have_divx_encore=no
+ DIVX_CFLAGS=""
+ DIVX_LIBS=""
+ save_CPPFLAGS=$CPPFLAGS
+ if test -n "$with_divx4_prefix" ; then
+ dnl user has specified extra path for DivX4 instalation
+ CPPFLAGS="-I$with_divx4_prefix $CPPFLAGS"
+ AC_CHECK_HEADER(include/decore.h,
+ DIVX_CFLAGS="-I$with_divx4_prefix/include"
+ DIVX_LIBS="-L$with_divx4_prefix/lib"
+ have_divx_decore=yes)
+ if test x$have_divx_decore = xno ; then
+ CPPFLAGS="-I$with_divx4_prefix $CPPFLAGS"
+ AC_CHECK_HEADER(decore.h,
+ DIVX_CFLAGS="-I$with_divx4_prefix"
+ DIVX_LIBS="-L$with_divx4_prefix"
+ have_divx_decore=yes)
+ fi
+ else
+ AC_CHECK_HEADER(decore.h, have_divx_decore=yes)
+ fi
+
+ AC_CHECK_HEADER(encore2.h, have_divx_encore=yes)
+ CPPFLAGS=$save_CPPFLAGS
+
+ if test x$have_divx_decore = xyes ; then
+ AC_CHECK_LIB(divxdecore, decore,
+ DIVX_LIBS="$DIVX_LIBS -ldivxdecore",
+ have_divx_decore=no, $DIVX_LIBS)
+ fi
+
+ if test x$have_divx_encore = xyes ; then
+ AC_CHECK_LIB(divxencore, encore,
+ DIVX_LIBS="$DIVX_LIBS -ldivxencore",
+ have_divx_encore=no, $DIVX_LIBS)
+ fi
+
+ if test x$have_divx_decore = xyes ; then
+ ifelse([$1], , :, [$1])
+ else
+ ifelse([$2], , :, [$2])
+ fi
+
+ if test x$have_divx_encore = xyes ; then
+ ifelse([$3], , :, [$3])
+ else
+ ifelse([$4], , :, [$4])
+ fi
+
+ AC_SUBST(DIVX_CFLAGS)
+ AC_SUBST(DIVX_LIBS)
+])
+
+dnl
+dnl slightly modified dmalloc.m4
+dnl
+
+AC_DEFUN([AC_WITH_DMALLOCTH],
+[
+AC_ARG_WITH(dmallocth, [ --with-dmallocth use dmallocth. (see: http://www.dmalloc.com)],
+ [], with_dmallocth=no)
+if test x$with_dmallocth = xyes ; then
+ AC_MSG_RESULT([enabling dmalloc thread debugging])
+ AC_CHECK_HEADER(dmalloc.h, , AC_MSG_ERROR([header file 'dmalloc.h' is missing!]))
+ AC_DEFINE(WITH_DMALLOCTH,1, [Define if using the dmallocth debugging malloc package])
+ LIBS="$LIBS -ldmallocth"
+ LDFLAGS="$LDFLAGS -g"
+fi
+])
+# Configure paths for libfaad
+
+dnl AM_PATH_FAAD([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for libfaad, and define FAAD_CFLAGS and FAAD_LIBS
+dnl
+AC_DEFUN([AM_PATH_FAAD],
+[
+ AC_ARG_WITH(faad_prefix, [ --with-faad-prefix=PFX where FAAD is installed. (optional)],
+ [], with_faad_prefix="")
+
+ AC_ARG_ENABLE(faadtest, [ --disable-faadtest do not try to compile and run a test FAAD program],
+ [], enable_faadtest=yes)
+
+ FAAD_CFLAGS=""
+ FAAD_LIBS=""
+
+ have_faad=no
+ ac_save_CPPFLAGS=$CPPFLAGS
+ if test -n "$with_faad_prefix" ; then
+ dnl user has specified extra path for FAAD instalation
+ CPPFLAGS="-I$with_faad_prefix $CPPFLAGS"
+ AC_CHECK_HEADER(faad.h,
+ FAAD_CFLAGS="-I$with_faad_prefix"
+ FAAD_LIBS="-L$with_faad_prefix"
+ have_faad=yes)
+ else
+ AC_CHECK_HEADER(faad.h, have_faad=yes)
+ fi
+ CPPFLAGS=$ac_save_CPPFLAGS
+
+dnl
+dnl Now check if the installed FAAD is sufficiently new.
+dnl
+ if test x$have_faad = xyes ; then
+ FAAD_LIBS="$FAAD_LIBS -lfaad -lm"
+ if test x$enable_faadtest = xyes ; then
+ AC_CACHE_CHECK([for faacDecOpen in -lfaad],
+ ac_cv_val_HAVE_FAAD,
+ [ rm -f conf.faadtest
+ ac_save_CFLAGS=$CFLAGS
+ ac_save_LIBS=$LIBS
+ CFLAGS="$CFLAGS $FAAD_CFLAGS"
+ LIBS="$LIBS $FAAD_LIBS"
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <faad.h>
+
+int main ()
+{
+ faacDecHandle h = faacDecOpen();
+ system("touch conf.faadtest");
+ return 0;
+} ],
+ [ ac_cv_val_HAVE_FAAD=yes ],
+ [ ac_cv_val_HAVE_FAAD=no ],
+ [ echo $ac_n "cross compiling; assumed OK... $ac_c" ])
+ CFLAGS=$ac_save_CFLAGS
+ LIBS=$ac_save_LIBS])
+ test x$ac_cv_val_HAVE_FAAD = xno && have_faad = xno
+ fi
+ fi
+
+ if test x$have_faad = xyes ; then
+ ifelse([$1], , :, [$1])
+ else
+ if test -n "$FAAD_LIBS" -a x$enable_faadtest = xyes -a ! -f conf.faadtest ; then
+ AC_MSG_WARN([Could not run FAAD test program, checking why...])
+ CFLAGS="$CFLAGS $FAAD_CFLAGS"
+ LIBS="$LIBS $FAAD_LIBS"
+ AC_TRY_LINK([
+#include <stdio.h>
+#include <faad.h>
+], [ return 0 ], [
+AC_MSG_RESULT([*** The test program compiled, but did not run. This usually means
+*** that the run-time linker is not finding FAAD or finding the wrong
+*** version of FAAD. If it is not finding FAAD, you'll need to set your
+*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point
+*** to the installed location Also, make sure you have run ldconfig if that
+*** is required on your system
+***
+*** If you have an old version installed, it is best to remove it, although
+*** you may also be able to get things to work by modifying LD_LIBRARY_PATH])], [
+AC_MSG_RESULT([*** The test program failed to compile or link. See the file config.log for the
+*** exact error that occured. This usually means FAAD was incorrectly installed.])])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ FAAD_CFLAGS=""
+ FAAD_LIBS=""
+ ifelse([$2], , :, [$2])
+ fi
+ AC_SUBST(FAAD_CFLAGS)
+ AC_SUBST(FAAD_LIBS)
+ rm -f conf.faadtest
+])
+
+dnl Check for lrintf presence
+dnl currently needed only by ffmpeg
+AC_DEFUN([AC_FUNC_LRINTF],
+[
+ AC_CACHE_CHECK([whether system declares lrintf function in math.h],
+ ac_cv_val_HAVE_LRINTF,
+ [ac_save_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -O2"
+ AC_TRY_RUN([
+ #define _ISOC9X_SOURCE 1
+ #include <math.h>
+ int main( void ) { return (lrintf(3.999f) > 0)?0:1; } ],
+ [ ac_cv_val_HAVE_LRINTF=yes ], [ ac_cv_val_HAVE_LRINTF=no ],
+ [ echo $ac_n "cross compiling; assumed OK... $ac_c" ])
+ CFLAGS=$ac_save_CFLAGS
+ ])
+ if test x$ac_cv_val_HAVE_LRINTF = xyes; then
+ AC_DEFINE(HAVE_LRINTF, 1, [Define if you have lrintf on your system.])
+ fi
+])
+
+
+dnl Usage:
+dnl AM_PATH_FFMPEG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for ffmpeg, and define FFMPEG_CFLAGS and FFMPEG_LIBS
+
+AC_DEFUN([AM_PATH_FFMPEG],
+[
+ AC_REQUIRE([AC_FUNC_LRINTF])
+
+ dnl !!! - it really sucks - Makefile.am can't be optimized even by
+ dnl !!! preparing some extra variable forward
+ dnl !!! FFAVFORMAT_SRC=
+
+ AC_REQUIRE([AC_CHECK_OSS])
+ test x$enable_oss = xyes && AC_DEFINE(CONFIG_AUDIO_OSS, 1, [Define if you want to have ffmpeg OSS audio support compiled.])
+
+ AC_REQUIRE([AC_CHECK_V4L])
+ test x$enable_v4l = xyes && AC_DEFINE(CONFIG_VIDEO4LINUX, 1, [Define if you have video4linux device. (ffmpeg)])
+
+ AC_REQUIRE([AC_FIND_ZLIB])
+ test x$have_zlib = xyes && AC_DEFINE(CONFIG_ZLIB, 1, [Define if you have z library (-lz) (ffmpeg)])
+
+ AC_ARG_ENABLE(ffmpeg_faadbin, [ --enable-ffmpeg-faadbin build ffmpeg with FAAD binary support. (default=yes)],
+ [], enable_ffmpeg_faadbin=yes)
+ test x$enable_ffmpeg_faadbin = xyes && AC_DEFINE(CONFIG_FAADBIN, 1, [Define if you want to build support for runtime linked libfaad.])
+ AC_REQUIRE([AM_PATH_FAAD])
+ test x$have_faad = xyes && AC_DEFINE(CONFIG_FAAD, 1, [Define if you want to have AAC support compiled. (ffmpeg)])
+
+ AC_ARG_ENABLE(ffmpeg_risky, [ --enable-ffmpeg-risky build ffmpeg risky code. (default=yes)],
+ [], enable_ffmpeg_risky=yes)
+
+ AC_ARG_ENABLE(ffmpeg_a52, [ --enable-ffmpeg-a52 build ffmpeg with A52 (AC3) support. (default=yes)],
+ [], enable_ffmpeg_a52=yes)
+ if test x$enable_ffmpeg_a52 = xyes ; then
+ AC_DEFINE(HAVE_FFMPEG_A52, 1, [Define if you want to use ffmpeg A52 audio decoder.])
+ AC_ARG_ENABLE(ffmpeg_a52bin, [ --enable-ffmpeg-a52bin A52 plugin dlopens liba52.so.0 at runtime (default=no)],
+ [], enable_ffmpeg_a52bin=no)
+
+ if test x$enable_ffmpeg_a52bin = xyes ; then
+ AC_DEFINE(CONFIG_A52BIN, 1, [Define if you want to build ffmpeg with A52 dlopened decoder.])
+ fi
+ fi
+
+ test x$enable_ffmpeg_risky = xyes && AC_DEFINE(CONFIG_RISKY, 1, [Define if you want to compile patent encumbered codecs. (ffmpeg)])
+
+ AC_DEFINE(CONFIG_ENCODERS, 1, [Define if you want to build ffmpeg encoders.])
+ AC_DEFINE(CONFIG_DECODERS, 1, [Define if you want to build ffmpeg decoders.])
+ AC_DEFINE(CONFIG_AC3, 1, [Define if you want to build ffmpeg with AC3 decoder.])
+ AC_DEFINE(SIMPLE_IDCT, 1, [Define if you want to build ffmpeg with simples idct.])
+ AC_DEFINE(CONFIG_NETWORK, 1, [Define if you want to build ffmpeg with network support.])
+ AC_DEFINE(CONFIG_MPEGAUDIO_HP, 1, [Define if you want to have highquality ffmpeg mpeg audio support compiled.])
+ AC_DEFINE(HAVE_PTHREADS, 1, [Define if you want to have ffmpeg pthread support compiled.])
+
+ if test -n "$ffmpeg_profiling" ; then
+ AC_DEFINE(HAVE_GPROF, 1, [Define if you want to build ffmpeg with gprof support.])
+ fi
+
+ test -z "$FFMPEG_CFLAGS" && FFMPEG_CFLAGS="-O4 $DEFAULT_FLAGS"
+ FFMPEG_CFLAGS="$FFMPEG_CFLAGS $DEFAULT_DEFINES"
+
+ AC_CHECK_GNU_VECTOR(FFMPEG_SSE="-msse";
+ AC_DEFINE(HAVE_BUILTIN_VECTOR, 1, [Define if your compiler supports vector builtins (MMX).]), [])
+ AC_SUBST(FFMPEG_CFLAGS)
+ AC_SUBST(FFMPEG_SSE)
+
+ AM_CONDITIONAL(AMM_BUILD_STRPTIME, test x$ac_cv_func_strptime != xyes )
+
+dnl ffmpeg_x86opt=
+dnl test x$enable_x86opt = xno && ffmpeg_x86opt="--disable-mmx"
+dnl AC_MSG_RESULT([=== configuring ffmpeg ===])
+dnl ( cd $srcdir/ffmpeg ; \
+dnl ./configure --prefix=$prefix --cc=$CC \
+dnl $ffmpeg_profiling $ffmpeg_cpu \
+dnl $ffmpeg_x86opt --disable-mp3lib \
+dnl --enable-simple_idct )
+])
+# Configure paths for FreeType2
+# Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor
+
+dnl AC_CHECK_FT2([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for FreeType2, and define FT2_CFLAGS and FT2_LIBS
+dnl
+AC_DEFUN([AC_CHECK_FT2],
+[dnl
+dnl Get the cflags and libraries from the freetype-config script
+dnl
+AC_ARG_WITH(ft-prefix,
+[ --with-ft-prefix=PREFIX prefix where FreeType is installed (optional)],
+ ft_config_prefix="$withval", ft_config_prefix="")
+AC_ARG_WITH(ft-exec-prefix,
+[ --with-ft-exec-prefix=PFX exec prefix where FreeType is installed (optional)],
+ ft_config_exec_prefix="$withval", ft_config_exec_prefix="")
+AC_ARG_ENABLE(freetypetest,
+[ --disable-freetypetest Do not try to compile and run FT2 test program],
+ [], enable_fttest=yes)
+
+if test x$ft_config_exec_prefix != x ; then
+ ft_config_args="$ft_config_args --exec-prefix=$ft_config_exec_prefix"
+ if test x${FT2_CONFIG+set} != xset ; then
+ FT2_CONFIG=$ft_config_exec_prefix/bin/freetype-config
+ fi
+fi
+if test x$ft_config_prefix != x ; then
+ ft_config_args="$ft_config_args --prefix=$ft_config_prefix"
+ if test x${FT2_CONFIG+set} != xset ; then
+ FT2_CONFIG=$ft_config_prefix/bin/freetype-config
+ fi
+fi
+AC_PATH_PROG(FT2_CONFIG, freetype-config, no)
+
+min_ft_version=ifelse([$1], ,6.1.0,$1)
+AC_MSG_CHECKING(for FreeType - version >= $min_ft_version)
+no_ft=""
+if test "$FT2_CONFIG" = "no" ; then
+ no_ft=yes
+else
+ FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags`
+ FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs`
+ ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ ft_min_major_version=`echo $min_ft_version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ ft_min_minor_version=`echo $min_ft_version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ ft_min_micro_version=`echo $min_ft_version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ if test x$enable_fttest = xyes ; then
+ ft_config_is_lt=""
+ if test $ft_config_major_version -lt $ft_min_major_version ; then
+ ft_config_is_lt=yes
+ else
+ if test $ft_config_major_version -eq $ft_min_major_version ; then
+ if test $ft_config_minor_version -lt $ft_min_minor_version ; then
+ ft_config_is_lt=yes
+ else
+ if test $ft_config_minor_version -eq $ft_min_minor_version ; then
+ if test $ft_config_micro_version -lt $ft_min_micro_version ; then
+ ft_config_is_lt=yes
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test x$ft_config_is_lt = xyes ; then
+ no_ft=yes
+ else
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $FT2_CFLAGS"
+ LIBS="$FT2_LIBS $LIBS"
+dnl
+dnl Sanity checks for the results of freetype-config to some extent
+dnl
+ AC_TRY_RUN([
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main()
+{
+ FT_Library library;
+ FT_Error error;
+
+ error = FT_Init_FreeType(&library);
+
+ if (error)
+ return 1;
+ else
+ {
+ FT_Done_FreeType(library);
+ return 0;
+ }
+}
+],, no_ft=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi # test $ft_config_version -lt $ft_min_version
+ fi # test x$enable_fttest = xyes
+fi # test "$FT2_CONFIG" = "no"
+if test x$no_ft = x ; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+else
+ AC_MSG_RESULT(no)
+ if test "$FT2_CONFIG" = "no" ; then
+ echo "*** The freetype-config script installed by FreeType 2 could not be found."
+ echo "*** If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the FT2_CONFIG environment variable to the"
+ echo "*** full path to freetype-config."
+ else
+ if test x$ft_config_is_lt = xyes ; then
+ echo "*** Your installed version of the FreeType 2 library is too old."
+ echo "*** If you have different versions of FreeType 2, make sure that"
+ echo "*** correct values for --with-ft-prefix or --with-ft-exec-prefix"
+ echo "*** are used, or set the FT2_CONFIG environment variable to the"
+ echo "*** full path to freetype-config."
+ else
+ echo "*** The FreeType test program failed to run. If your system uses"
+ echo "*** shared libraries and they are installed outside the normal"
+ echo "*** system library path, make sure the variable LD_LIBRARY_PATH"
+ echo "*** (or whatever is appropiate for your system) is correctly set."
+ fi
+ fi
+ FT2_CFLAGS=""
+ FT2_LIBS=""
+ ifelse([$3], , :, [$3])
+fi
+AC_SUBST(FT2_CFLAGS)
+AC_SUBST(FT2_LIBS)
+])
+# Configure paths for iconv
+
+dnl Usage:
+dnl AC_ICONV(MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for ares, and defines
+dnl - ICONV_CFLAGS (compiler flags)
+dnl - ICONV_LIBS (linker flags, stripping and path)
+dnl prerequisites:
+
+AC_DEFUN([AC_ICONV],
+[
+ dnl check it it's part of the libc
+ AC_CHECK_LIB(c, iconv_open, ac_cv_have_iconv=yes, ac_cv_have_iconv=no)
+
+ ICONV_CFLAGS=
+ ICONV_LIBS=
+ AC_ARG_WITH(iconv, [ --with-iconv=path path for extra iconv library],
+ [
+ if test x$ac_cv_have_iconv = xno; then
+ ac_iconv_path=
+ case "$with_iconv" in
+ 'yes') ac_iconv_path="/usr" ;;
+ 'no') ;;
+ *) ac_iconv_path=$with_iconv ;;
+ esac
+ if test -n "$ac_iconv_path"; then
+ ac_save_ICONVLIBS=$LIBS
+ LIBS="-L$ac_iconv_path/lib $LIBS"
+ AC_CHECK_LIB(iconv, iconv_open, ac_cv_have_iconv=yes,)
+ if test x$ac_cv_have_iconv = xyes ; then
+ ICONV_LIBS="-liconv"
+ if test "$ac_iconv_path" != "/usr"; then
+ ICONV_CFLAGS="-I$ac_iconv_path/include"
+ ICONV_LIBS="$ac_iconv_path/lib $ICONV_LIBS"
+ fi
+ fi
+ LIBS=$ac_save_ICONVLIBS
+ fi
+ fi
+ ])
+
+ if test x$ac_cv_have_iconv = xyes ; then
+ AC_MSG_CHECKING([for iconv declaration])
+ AC_CACHE_VAL(ac_cv_proto_iconv, [
+ AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char**, size_t*, char**, size_t*);
+#else
+size_t iconv();
+#endif
+], [],
+ [ ac_cv_proto_iconv="" ], [ ac_cv_proto_iconv="const" ]) ])
+ AC_DEFINE_UNQUOTED(ICONV_CONST_CAST, $ac_cv_proto_iconv, [Use casting for iconv's inputbuffer - don't ask me.])
+ if test x$ac_cv_proto_iconv = xconst ; then
+ AC_MSG_RESULT([using const])
+ else
+ AC_MSG_RESULT([not using const])
+ fi
+ ifelse([$2], , :, [$2])
+ else
+ ICONV_CFLAGS=""
+ ICONV_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+
+ AC_SUBST(ICONV_CFLAGS)
+ AC_SUBST(ICONV_LIBS)
+])
+# Configure paths for libogg
+# Jack Moffitt <jack@icecast.org> 10-21-2000
+# Shamelessly stolen from Owen Taylor and Manish Singh
+
+dnl AM_PATH_OGG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for libogg, and define OGG_CFLAGS and OGG_LIBS
+dnl
+AC_DEFUN([AM_PATH_OGG],
+[dnl
+dnl Get the cflags and libraries
+dnl
+AC_ARG_WITH(ogg-prefix,[ --with-ogg-prefix=PFX prefix where libogg is installed. (optional)], ogg_prefix="$withval", ogg_prefix="")
+AC_ARG_ENABLE(oggtest, [ --disable-oggtest do not try to compile and run a test Ogg program.],, enable_oggtest=yes)
+
+ if test "x$ogg_prefix" != "xNONE" ; then
+ ogg_args="$ogg_args --prefix=$ogg_prefix"
+ OGG_CFLAGS="-I$ogg_prefix/include"
+ OGG_LIBS="-L$ogg_prefix/lib"
+ elif test "$prefix" != ""; then
+ ogg_args="$ogg_args --prefix=$prefix"
+ OGG_CFLAGS="-I$prefix/include"
+ OGG_LIBS="-L$prefix/lib"
+ fi
+
+ OGG_LIBS="$OGG_LIBS -logg"
+
+ AC_MSG_CHECKING(for Ogg)
+ no_ogg=""
+
+
+ if test "x$enable_oggtest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $OGG_CFLAGS"
+ LIBS="$LIBS $OGG_LIBS"
+dnl
+dnl Now check if the installed Ogg is sufficiently new.
+dnl
+ rm -f conf.oggtest
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ogg/ogg.h>
+
+int main ()
+{
+ system("touch conf.oggtest");
+ return 0;
+}
+
+],, no_ogg=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+
+ if test "x$no_ogg" = "x" ; then
+ AC_MSG_RESULT(yes)
+ ifelse([$1], , :, [$1])
+ else
+ AC_MSG_RESULT(no)
+ if test -f conf.oggtest ; then
+ :
+ else
+ echo "*** Could not run Ogg test program, checking why..."
+ CFLAGS="$CFLAGS $OGG_CFLAGS"
+ LIBS="$LIBS $OGG_LIBS"
+ AC_TRY_LINK([
+#include <stdio.h>
+#include <ogg/ogg.h>
+], [ return 0; ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding Ogg or finding the wrong"
+ echo "*** version of Ogg. If it is not finding Ogg, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means Ogg was incorrectly installed"
+ echo "*** or that you have moved Ogg since it was installed. In the latter case, you"
+ echo "*** may want to edit the ogg-config script: $OGG_CONFIG" ])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ OGG_CFLAGS=""
+ OGG_LIBS=""
+ ifelse([$2], , :, [$2])
+ fi
+ AC_SUBST(OGG_CFLAGS)
+ AC_SUBST(OGG_LIBS)
+ rm -f conf.oggtest
+])
+
+dnl Usage:
+dnl AC_CHECK_OSS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for OSS audio interface, and defines
+dnl prerequisites:
+
+AC_DEFUN([AC_CHECK_OSS],
+[
+ AC_ARG_ENABLE(oss, [ --enable-oss support the OSS audio API. (autodetect)],
+ [], enable_oss=yes)
+ if test x$enable_oss = xyes; then
+ AC_CACHE_CHECK([for OSS audio support], ac_cv_val_have_oss_audio,
+ [AC_TRY_COMPILE([
+ #ifdef __NetBSD__
+ #include <sys/ioccom.h>
+ #include <soundcard.h>
+ #else
+ #include <sys/soundcard.h>
+ #endif
+ ],[ int arg = SNDCTL_DSP_SETFRAGMENT; ],
+ [ ac_cv_val_have_oss_audio=yes ], [ ac_cv_val_have_oss_audio=no ])
+ ])
+ enable_oss=$ac_cv_val_have_oss_audio
+ fi
+
+ if test x$enable_oss = xyes; then
+ AC_CHECK_LIB([ossaudio], [_oss_ioctl])
+ ifelse([$1], , :, [$1])
+ else
+ ifelse([$2], , :, [$2])
+ fi
+])
+
+
+dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not)
+dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page
+dnl also defines GSTUFF_PKG_ERRORS on error
+AC_DEFUN([PKG_CHECK_MODULES], [
+ succeeded=no
+
+ if test -z "$PKG_CONFIG"; then
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+ fi
+
+ if test "$PKG_CONFIG" = "no" ; then
+ echo "*** The pkg-config script could not be found. Make sure it is"
+ echo "*** in your path, or set the PKG_CONFIG environment variable"
+ echo "*** to the full path to pkg-config."
+ echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
+ else
+ PKG_CONFIG_MIN_VERSION=0.9.0
+ if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then
+ AC_MSG_CHECKING(for $2)
+
+ if $PKG_CONFIG --exists "$2" ; then
+ AC_MSG_RESULT(yes)
+ succeeded=yes
+
+ AC_MSG_CHECKING($1_CFLAGS)
+ $1_CFLAGS=`$PKG_CONFIG --cflags "$2"`
+ AC_MSG_RESULT($$1_CFLAGS)
+
+ AC_MSG_CHECKING($1_LIBS)
+ $1_LIBS=`$PKG_CONFIG --libs "$2"`
+ AC_MSG_RESULT($$1_LIBS)
+ else
+ $1_CFLAGS=""
+ $1_LIBS=""
+ ## If we have a custom action on failure, don't print errors, but
+ ## do set a variable so people can do so.
+ $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+ ifelse([$4], ,echo $$1_PKG_ERRORS,)
+ fi
+
+ AC_SUBST($1_CFLAGS)
+ AC_SUBST($1_LIBS)
+ else
+ echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer."
+ echo "*** See http://www.freedesktop.org/software/pkgconfig"
+ fi
+ fi
+
+ if test $succeeded = yes; then
+ ifelse([$3], , :, [$3])
+ else
+ ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4])
+ fi
+])
+
+# Configure paths for SDL
+# Sam Lantinga 9/21/99
+# stolen from Manish Singh
+# stolen back from Frank Belew
+# stolen from Manish Singh
+# Shamelessly stolen from Owen Taylor
+# slightly modified for avifile
+
+dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS
+dnl
+AC_DEFUN([AM_PATH_SDL],
+[dnl
+dnl Get the cflags and libraries from the sdl-config script
+dnl
+AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX prefix where SDL is installed. (optional)],
+ sdl_prefix="$withval", sdl_prefix="")
+AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX exec prefix where SDL is installed. (optional)],
+ sdl_exec_prefix="$withval", sdl_exec_prefix="")
+AC_ARG_ENABLE(sdltest, [ --disable-sdltest do not try to compile and run a test SDL program.],
+ , enable_sdltest=yes)
+
+ if test x$sdl_exec_prefix != x ; then
+ sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix"
+ if test x${SDL_CONFIG+set} != xset ; then
+ SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config
+ fi
+ fi
+ if test x$sdl_prefix != x ; then
+ sdl_args="$sdl_args --prefix=$sdl_prefix"
+ if test x${SDL_CONFIG+set} != xset ; then
+ SDL_CONFIG=$sdl_prefix/bin/sdl-config
+ fi
+ fi
+ if test -z "$SDL_CONFIG"; then
+ AC_CHECK_PROGS(SDL_MY_CONFIG, sdl-config sdl11-config, "")
+ if test -n "$SDL_MY_CONFIG"; then
+ SDL_CONFIG=`which $SDL_MY_CONFIG`
+ echo "setting SDL_CONFIG to $SDL_CONFIG"
+ fi
+ fi
+
+ AC_REQUIRE([AC_CANONICAL_TARGET])
+ PATH="$prefix/bin:$prefix/usr/bin:$PATH"
+ AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH])
+ min_sdl_version=ifelse([$1], ,0.11.0,$1)
+ AC_MSG_CHECKING(for SDL - version >= $min_sdl_version)
+ no_sdl=""
+ if test "$SDL_CONFIG" = "no" ; then
+ no_sdl=yes
+ else
+ SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags`
+ SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs | sed -e 's!-L/usr/lib[[^/]]!!g'`
+
+ sdl_major_version=`$SDL_CONFIG $sdl_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ if test "x$enable_sdltest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $SDL_CFLAGS"
+ LIBS="$LIBS $SDL_LIBS"
+dnl
+dnl Now check if the installed SDL is sufficiently new. (Also sanity
+dnl checks the results of sdl-config to some extent
+dnl
+ rm -f conf.sdltest
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "SDL.h"
+
+char*
+my_strdup (char *str)
+{
+ char *new_str;
+
+ if (str)
+ {
+ new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char));
+ strcpy (new_str, str);
+ }
+ else
+ new_str = NULL;
+
+ return new_str;
+}
+
+int main (int argc, char *argv[])
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ /* This hangs on some systems (?)
+ system ("touch conf.sdltest");
+ */
+ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); }
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = my_strdup("$min_sdl_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+ printf("%s, bad version string\n", "$min_sdl_version");
+ exit(1);
+ }
+
+ if (($sdl_major_version > major) ||
+ (($sdl_major_version == major) && ($sdl_minor_version > minor)) ||
+ (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version);
+ printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro);
+ printf("*** best to upgrade to the required version.\n");
+ printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n");
+ printf("*** to point to the correct copy of sdl-config, and remove the file\n");
+ printf("*** config.cache before re-running configure\n");
+ return 1;
+ }
+}
+
+],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_sdl" = x ; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$SDL_CONFIG" = "no" ; then
+ echo "*** The sdl-config script installed by SDL could not be found"
+ echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the SDL_CONFIG environment variable to the"
+ echo "*** full path to sdl-config."
+ else
+ if test -f conf.sdltest ; then
+ :
+ else
+ echo "*** Could not run SDL test program, checking why..."
+ CFLAGS="$CFLAGS $SDL_CFLAGS"
+ LIBS="$LIBS $SDL_LIBS"
+ AC_TRY_LINK([
+#include <stdio.h>
+#include "SDL.h"
+
+int main(int argc, char *argv[])
+{ return 0; }
+#undef main
+#define main K_and_R_C_main
+], [ return 0; ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding SDL or finding the wrong"
+ echo "*** version of SDL. If it is not finding SDL, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means SDL was incorrectly installed"
+ echo "*** or that you have moved SDL since it was installed. In the latter case, you"
+ echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ SDL_CFLAGS=""
+ SDL_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(SDL_CFLAGS)
+ AC_SUBST(SDL_LIBS)
+ rm -f conf.sdltest
+])
+
+AC_DEFUN([MY_TEST_SDL],
+[
+AC_MSG_CHECKING([for SDL development libraries])
+cat > conftest.c <<EOF
+void main()
+{
+}
+EOF
+SDL_LIBTOOL=`$SDL_CONFIG --prefix`/lib/libSDL.la
+if test -r $SDL_LIBTOOL ; then
+ if libtool $CC conftest.c $SDL_LIBTOOL $LIBS $SDL_LIBS -o conftest >&5 2>&5; then
+ AC_MSG_RESULT([found])
+ GOOD_SDL_INSTALLATION=yes
+ else
+ AC_MSG_RESULT([linking against SDL library failed. Check config.log for details.])
+ GOOD_SDL_INSTALLATION=no
+ fi
+else
+ AC_MSG_RESULT([not found])
+ GOOD_SDL_INSTALLATION=no
+fi
+rm -f conftest.c conftest
+])
+
+dnl -*- shell-script -*-
+
+dnl This file is part of the Avifile packages
+dnl and has been heavily modified for its purposes
+dnl Copyright (C) 2002 Zdenek Kabelac (kabi@users.sourceforge.net)
+dnl
+dnl Originaly this file was part of the KDE libraries/packages
+dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu)
+dnl (C) 1997 Stephan Kulow (coolo@kde.org)
+
+dnl This file is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU Library General Public
+dnl License as published by the Free Software Foundation; either
+dnl version 2 of the License, or (at your option) any later version.
+
+dnl This library is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl Library General Public License for more details.
+
+dnl You should have received a copy of the GNU Library General Public License
+dnl along with this library; see the file COPYING.LIB. If not, write to
+dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+dnl Boston, MA 02111-1307, USA.
+
+
+dnl ------------------------------------------------------------------------
+dnl Find a file (or one of more files in a list of dirs)
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_FIND_FILE],
+[
+$3=NO
+for i in $2;
+do
+ for j in $1;
+ do
+ if test -r "$i/$j"; then
+ $3=$i
+ break 2
+ fi
+ done
+done
+])
+
+AC_DEFUN([AC_FIND_ZLIB],
+[
+ AC_CACHE_CHECK([for libz], ac_cv_lib_z,
+ [ac_save_LIBS=$LIBS
+ LIBS="$LIBS -lz"
+ AC_TRY_LINK([#include<zlib.h>],
+ [return (zlibVersion() == ZLIB_VERSION); ],
+ [ ac_cv_lib_z=yes ], [ ac_cv_lib_z=no ])
+ LIBS=$ac_save_LIBS])
+ AC_SUBST(Z_LIBS)
+ if test x$ac_cv_lib_z = xyes ; then
+ Z_LIBS="-lz"
+ have_zlib=yes
+ ifelse([$1], , :, [$1])
+ else
+ Z_LIBS=
+ have_zlib=no
+ ifelse([$2], , :, [$2])
+ fi
+])
+
+
+AC_DEFUN([AC_FIND_PNG],
+[
+AC_REQUIRE([AC_FIND_ZLIB])
+AC_MSG_CHECKING([for libpng])
+AC_CACHE_VAL(ac_cv_lib_png,
+[ac_save_LIBS="$LIBS"
+LIBS="$all_libraries -lpng $LIBZ -lm -lX11 $LIBSOCKET"
+AC_TRY_LINK([#include<png.h>],
+ [
+ png_structp png_ptr = png_create_read_struct( // image ptr
+ PNG_LIBPNG_VER_STRING, 0, 0, 0 );
+ return( png_ptr != 0 );
+ ],
+ eval "ac_cv_lib_png='-lpng $LIBZ -lm'",
+ eval "ac_cv_lib_png=no")
+ LIBS=$ac_save_LIBS
+])
+if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then
+ AC_DEFINE_UNQUOTED(HAVE_LIBPNG)
+ LIBPNG="$ac_cv_lib_png"
+ AC_SUBST(LIBPNG)
+ AC_MSG_RESULT($ac_cv_lib_png)
+else
+ AC_MSG_RESULT(no)
+ LIBPNG=""
+ AC_SUBST(LIBPNG)
+fi
+])
+
+
+dnl just a wrapper to clean up configure.in
+AC_DEFUN([KDE_PROG_LIBTOOL],
+[
+AC_REQUIRE([AM_ENABLE_SHARED])
+AC_REQUIRE([AM_ENABLE_STATIC])
+dnl libtool is only for C, so I must force him
+dnl to find the correct flags for C++
+ac_save_cc=$CC
+ac_save_cflags="$CFLAGS"
+CC=$CXX
+CFLAGS="$CXXFLAGS"
+dnl AM_PROG_LIBTOOL dnl for libraries
+CC=$ac_save_cc
+CFLAGS="$ac_save_cflags"
+])
+
+
+dnl Check for the type of the third argument of getsockname
+AC_DEFUN([AC_CHECK_KSIZE_T],
+[AC_MSG_CHECKING(for the third argument of getsockname)
+AC_LANG_CPLUSPLUS
+AC_CACHE_VAL(ac_cv_ksize_t,
+[AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/socket.h>
+],[
+socklen_t a=0;
+getsockname(0,(struct sockaddr*)0, &a);
+],
+ac_cv_ksize_t=socklen_t,
+ac_cv_ksize_t=)
+if test -z "$ac_cv_ksize_t"; then
+ac_save_cxxflags="$CXXFLAGS"
+if test "$GCC" = "yes"; then
+ CXXFLAGS="-Werror $CXXFLAGS"
+fi
+AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/socket.h>
+],[
+int a=0;
+getsockname(0,(struct sockaddr*)0, &a);
+],
+ac_cv_ksize_t=int,
+ac_cv_ksize_t=size_t)
+CXXFLAGS=$ac_save_cxxflags
+fi
+])
+
+if test -z "$ac_cv_ksize_t"; then
+ ac_cv_ksize_t=int
+fi
+
+AC_MSG_RESULT($ac_cv_ksize_t)
+AC_DEFINE_UNQUOTED(ksize_t, $ac_cv_ksize_t)
+
+])
+
+
+
+# Search path for a program which passes the given test.
+# Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+# serial 1
+# Stephan Kulow: I appended a _KDE against name conflicts
+
+dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST_KDE],
+[# Extract the first word of "$2", so it can be a program name with args.
+ set dummy $2; ac_word=[$]2
+ AC_MSG_CHECKING([for $ac_word])
+ AC_CACHE_VAL(ac_cv_path_$1,
+ [case "[$]$1" in
+ /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ dnl If no 4th arg is given, leave the cache variable unset,
+ dnl so AC_PATH_PROGS will keep looking.
+ ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+ ])
+ ;;
+ esac
+ ])
+ $1="$ac_cv_path_$1"
+ if test -n "[$]$1"; then
+ AC_MSG_RESULT([$]$1)
+ else
+ AC_MSG_RESULT(no)
+ fi
+ AC_SUBST($1)dnl
+])
+
+
+
+AC_DEFUN([AM_DISABLE_LIBRARIES],
+[
+ AC_PROVIDE([AM_ENABLE_STATIC])
+ AC_PROVIDE([AM_ENABLE_SHARED])
+ enable_static=no
+ enable_shared=no
+])
+
+
+
+
+
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+# Ulrich Drepper <drepper@cygnus.com>, 1995.
+#
+# This file can be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU General Public
+# License or the GNU Library General Public License but which still want
+# to provide support for the GNU gettext functionality.
+# Please note that the actual code of the GNU gettext library is covered
+# by the GNU Library General Public License, and the rest of the GNU
+# gettext package package is covered by the GNU General Public License.
+# They are *not* in the public domain.
+
+# serial 2
+
+AC_DEFUN([AM_LC_MESSAGES],
+[
+ if test $ac_cv_header_locale_h = yes; then
+ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES, 1,
+ [Define if your <locale.h> file defines LC_MESSAGES.])
+ fi
+ fi
+])
+
+
+dnl AM_PATH_LINUX([DEFAULT PATH, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl define LINUX_PATH and LINUX_CFLAGS
+AC_DEFUN([AM_PATH_LINUX],
+[
+ AC_ARG_WITH(linux_prefix, [ --with-linux-prefix=PFX where are linux sources (=/usr/src/linux)],
+ [], with_linux_prefix=ifelse([$1], [], /usr/src/linux, $1))
+ if test -f $with_linux_prefix/include/linux/modversions.h ; then
+ LINUX_CFLAGS="-D__KERNEL__ -DMODULE -I$with_linux_prefix/include -include $with_linux_prefix/include/linux/modversions.h"
+ LINUX_PREFIX=$with_linux_prefix
+ else
+ LINUX_CFLAGS=""
+ LINUX_PREFIX=""
+ fi
+ AC_SUBST(LINUX_CFLAGS)
+ AC_SUBST(LINUX_PREFIX)
+
+ if test -n "$LINUX_PREFIX"; then
+ ifelse([$2], [], [:], [$2])
+ else
+ ifelse([$3], [], [:], [$3])
+ fi
+])
+
+# Configure paths for VIDIX
+
+dnl Check if vidix support should be build
+
+AC_DEFUN([AM_PATH_VIDIX],
+[
+ AC_ARG_ENABLE(vidix, [ --enable-vidix build vidix drivers. [default=yes]],
+ [], enable_vidix=yes)
+ AC_MSG_CHECKING([for vidix])
+ if test x$enable_vidix = xyes -a x$ac_cv_prog_AWK != xno; then
+ case "$target" in
+ i?86-*-linux* | k?-*-linux* | athlon-*-linux*)
+ enable_vidix=yes
+ enable_linux=yes
+ ;;
+ i386-*-freebsd*)
+ enable_vidix=yes
+ enable_dha_kmod=no
+ ;;
+ *)
+ enable_dha_kmod=no
+ enable_vidix=no
+ ;;
+ esac
+ fi
+dnl for now without linux kernel support
+ enable_linux=no
+
+ AC_MSG_RESULT([$enable_vidix])
+
+ if test x$enable_vidix = xyes ; then
+ AC_DEFINE(HAVE_VIDIX, 1, [Define if you want to have vidix support.])
+ fi
+])
+
+# Configure paths for libvorbis
+# Jack Moffitt <jack@icecast.org> 10-21-2000
+# Shamelessly stolen from Owen Taylor and Manish Singh
+
+dnl AM_PATH_VORBIS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for libvorbis, and define VORBIS_CFLAGS and VORBIS_LIBS
+dnl
+AC_DEFUN([AM_PATH_VORBIS],
+[dnl
+dnl Get the cflags and libraries
+dnl
+AC_ARG_WITH(vorbis-prefix,[ --with-vorbis-prefix=PFX prefix where libvorbis is installed. (optional)], vorbis_prefix="$withval", vorbis_prefix="")
+AC_ARG_ENABLE(vorbistest, [ --disable-vorbistest do not try to compile and run a test Vorbis program.],, enable_vorbistest=yes)
+
+ if test "x$vorbis_prefix" != "xNONE" ; then
+ vorbis_args="$vorbis_args --prefix=$vorbis_prefix"
+ VORBIS_CFLAGS="-I$vorbis_prefix/include"
+ VORBIS_LIBDIR="-L$vorbis_prefix/lib"
+ elif test "$prefix" != ""; then
+ vorbis_args="$vorbis_args --prefix=$prefix"
+ VORBIS_CFLAGS="-I$prefix/include"
+ VORBIS_LIBDIR="-L$prefix/lib"
+ fi
+
+ VORBIS_LIBS="$VORBIS_LIBDIR -lvorbis -lm"
+ VORBISFILE_LIBS="-lvorbisfile"
+ VORBISENC_LIBS="-lvorbisenc"
+
+ AC_MSG_CHECKING(for Vorbis)
+ no_vorbis=""
+
+
+ if test "x$enable_vorbistest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $VORBIS_CFLAGS"
+ LIBS="$LIBS $VORBIS_LIBS $OGG_LIBS"
+dnl
+dnl Now check if the installed Vorbis is sufficiently new.
+dnl
+ rm -f conf.vorbistest
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <vorbis/codec.h>
+
+int main ()
+{
+ system("touch conf.vorbistest");
+ return 0;
+}
+
+],, no_vorbis=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+
+ if test "x$no_vorbis" = "x" ; then
+ AC_MSG_RESULT(yes)
+ ifelse([$1], , :, [$1])
+ else
+ AC_MSG_RESULT(no)
+ if test -f conf.vorbistest ; then
+ :
+ else
+ echo "*** Could not run Vorbis test program, checking why..."
+ CFLAGS="$CFLAGS $VORBIS_CFLAGS"
+ LIBS="$LIBS $VORBIS_LIBS $OGG_LIBS"
+ AC_TRY_LINK([
+#include <stdio.h>
+#include <vorbis/codec.h>
+], [ return 0; ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding Vorbis or finding the wrong"
+ echo "*** version of Vorbis. If it is not finding Vorbis, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means Vorbis was incorrectly installed"
+ echo "*** or that you have moved Vorbis since it was installed." ])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ VORBIS_CFLAGS=""
+ VORBIS_LIBS=""
+ VORBISFILE_LIBS=""
+ VORBISENC_LIBS=""
+ ifelse([$2], , :, [$2])
+ fi
+ AC_SUBST(VORBIS_CFLAGS)
+ AC_SUBST(VORBIS_LIBS)
+ AC_SUBST(VORBISFILE_LIBS)
+ AC_SUBST(VORBISENC_LIBS)
+ rm -f conf.vorbistest
+])
+
+# Configure paths for video4linux
+
+dnl Usage:
+dnl AC_CHECK_V4L([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for video4linux interface, and defines
+dnl prerequisites:
+
+AC_DEFUN([AC_CHECK_V4L],
+[
+ AC_ARG_ENABLE(v4l, [ --enable-v4l support v4l video interface. (autodetect)],
+ [], enable_v4l=yes)
+ if test x$enable_v4l = xyes; then
+ AC_CHECK_HEADER([linux/videodev.h], [], [ enable_v4l=no; ])
+ fi
+
+ if test x$enable_v4l = xyes; then
+ ifelse([$1], , :, [$1])
+ else
+ ifelse([$2], , :, [$2])
+ fi
+])
+
+# Configure paths for libxvidcore
+
+dnl AM_PATH_XVID([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for libxvidcore, and define XVID_CFLAGS and XVID_LIBS
+dnl
+AC_DEFUN([AM_PATH_XVID],
+[
+ AC_ARG_WITH(xvid_prefix, [ --with-xvid-prefix=PFX where XviD is installed. (optional)],
+ [], with_xvid_prefix="")
+
+ AC_ARG_ENABLE(xvidtest, [ --disable-xvidtest do not try to compile and run a test XviD program],
+ [], enable_xvidtest=yes)
+
+ XVID_CFLAGS=""
+ XVID_LIBS=""
+
+ have_xvid=no
+ ac_save_CPPFLAGS=$CPPFLAGS
+ if test -n "$with_xvid_prefix" ; then
+ dnl user has specified extra path for XviD instalation
+ CPPFLAGS="-I$with_xvid_prefix $CPPFLAGS"
+ AC_CHECK_HEADER(include/xvid.h,
+ XVID_CFLAGS="-I$with_xvid_prefix/include"
+ XVID_LIBS="-L$with_xvid_prefix/lib"
+ have_xvid=yes)
+ if test x$have_xvid = xno ; then
+ AC_CHECK_HEADER(xvid.h,
+ XVID_CFLAGS="-I$with_xvid_prefix"
+ XVID_LIBS="-L$with_xvid_prefix"
+ have_xvid=yes)
+ fi
+ else
+ AC_CHECK_HEADER(xvid.h, have_xvid=yes)
+ fi
+ CPPFLAGS=$ac_save_CPPFLAGS
+ XVID_LIBS="$XVID_LIBS -lxvidcore"
+
+dnl
+dnl Now check if the installed XviD is sufficiently new.
+dnl
+ if test x$have_xvid = xyes -a x$enable_xvidtest = xyes ; then
+ AC_CACHE_CHECK([for xvid_init in -lxvidcore],
+ ac_cv_val_HAVE_XVID,
+ [ rm -f conf.xvidtest
+ ac_save_CFLAGS=$CFLAGS
+ ac_save_LIBS=$LIBS
+ CFLAGS="$CFLAGS $XVID_CFLAGS"
+ LIBS="$LIBS $XVID_LIBS"
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <xvid.h>
+
+int main ()
+{
+ XVID_INIT_PARAM xinit;
+ system("touch conf.xvidtest");
+
+ xinit.cpu_flags = 0;
+ xvid_init(NULL, 0, &xinit, NULL);
+
+ if (xinit.api_version == API_VERSION) {
+ return 0;
+ } else {
+ printf("Header file and library are out of sync. Header file supports\n"
+ "version %d.%d API and shared library supports version %d.%d API.\n",
+ API_VERSION >> 16, API_VERSION & 0xFFFF,
+ xinit.api_version >> 16, xinit.api_version & 0xFFFF);
+ return 1;
+ }
+}
+ ],
+ [ ac_cv_val_HAVE_XVID=yes ],
+ [ ac_cv_val_HAVE_XVID=no ],
+ [ echo $ac_n "cross compiling; assumed OK... $ac_c" ])
+ CFLAGS=$ac_save_CFLAGS
+ LIBS=$ac_save_LIBS])
+ test x$ac_cv_val_HAVE_XVID = xno && have_xvid=no
+ fi
+
+ if test x$have_xvid = xyes ; then
+ ifelse([$1], , :, [$1])
+ else
+ if test ! -f conf.xvidtest ; then
+ AC_MSG_WARN([Could not run XviD test program, checking why...])
+ CFLAGS="$CFLAGS $XVID_CFLAGS"
+ LIBS="$LIBS $XVID_LIBS"
+ AC_TRY_LINK([
+#include <stdio.h>
+#include <xvid.h>
+], [ return 0 ], [
+AC_MSG_RESULT([*** The test program compiled, but did not run. This usually means
+*** that the run-time linker is not finding XviD or finding the wrong
+*** version of XviD. If it is not finding XviD, you'll need to set your
+*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point
+*** to the installed location Also, make sure you have run ldconfig if that
+*** is required on your system
+***
+*** If you have an old version installed, it is best to remove it, although
+*** you may also be able to get things to work by modifying LD_LIBRARY_PATH])], [
+AC_MSG_RESULT([*** The test program failed to compile or link. See the file config.log for the
+*** exact error that occured. This usually means XviD was incorrectly installed.])])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ XVID_CFLAGS=""
+ XVID_LIBS=""
+ ifelse([$2], , :, [$2])
+ fi
+ AC_SUBST(XVID_CFLAGS)
+ AC_SUBST(XVID_LIBS)
+ rm -f conf.xvidtest
+])
+
+# Configure paths for libxvidcore version 1.0
+
+dnl AM_PATH_XVID([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for libxvidcore, and define XVID4_CFLAGS and XVID4_LIBS
+dnl
+AC_DEFUN([AM_PATH_XVID4],
+[
+ AC_ARG_WITH(xvid4_prefix, [ --with-xvid4-prefix=PFX where XviD4 is installed. (optional)],
+ [], with_xvid4_prefix="")
+
+ AC_ARG_ENABLE(xvid4test, [ --disable-xvid4test do not try to compile and run a test XviD4 program],
+ [], enable_xvid4test=yes)
+
+ XVID4_CFLAGS=""
+ XVID4_LIBS=""
+
+ have_xvid4=no
+ ac_save_CPPFLAGS=$CPPFLAGS
+ if test -n "$with_xvid4_prefix" ; then
+ dnl user has specified extra path for XviD instalation
+ CPPFLAGS="-I$with_xvid4_prefix $CPPFLAGS"
+ AC_CHECK_HEADER(include/xvid.h,
+ XVID4_CFLAGS="-I$with_xvid4_prefix/include"
+ XVID4_LIBS="-L$with_xvid4_prefix/lib"
+ have_xvid4=yes)
+ if test x$have_xvid4 = xno ; then
+ AC_CHECK_HEADER(xvid.h,
+ XVID4_CFLAGS="-I$with_xvid4_prefix"
+ XVID4_LIBS="-L$with_xvid4_prefix"
+ have_xvid4=yes)
+ fi
+ else
+ AC_CHECK_HEADER(xvid.h, have_xvid4=yes)
+ fi
+ CPPFLAGS=$ac_save_CPPFLAGS
+ XVID4_LIBS="$XVID4_LIBS -lxvidcore"
+
+dnl
+dnl Now check if the installed XviD is sufficiently new.
+dnl
+ if test x$have_xvid4 = xyes -a x$enable_xvid4test = xyes ; then
+ AC_CACHE_CHECK([for xvid_global in -lxvidcore (4)],
+ ac_cv_val_HAVE_XVID4,
+ [ rm -f conf.xvidtest
+ ac_save_CFLAGS=$CFLAGS
+ ac_save_LIBS=$LIBS
+ CFLAGS="$CFLAGS $XVID4_CFLAGS"
+ LIBS="$LIBS $XVID4_LIBS"
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <xvid.h>
+
+int main ()
+{
+ xvid_gbl_info_t xinfo;
+ system("touch conf.xvidtest");
+
+ memset(&xinfo, 0, sizeof(xinfo));
+ xinfo.version = XVID_VERSION;
+
+ if (xvid_global(NULL, XVID_GBL_INIT, &xinfo, NULL) == XVID_ERR_FAIL) {
+ printf("Header file and library are out of sync. Header file supports\n"
+ "version %d.%d API and shared library supports version %d.%d API.\n",
+ XVID_VERSION >> 16, XVID_VERSION & 0xFFFF,
+ xinfo.version >> 16, xinfo.version & 0xFFFF);
+ return 1;
+ } else
+ return 0;
+}
+ ],
+ [ ac_cv_val_HAVE_XVID4=yes ],
+ [ ac_cv_val_HAVE_XVID4=no ],
+ [ echo $ac_n "cross compiling; assumed OK... $ac_c" ])
+ CFLAGS=$ac_save_CFLAGS
+ LIBS=$ac_save_LIBS])
+ test x$ac_cv_val_HAVE_XVID4 = xno && have_xvid4=no
+ fi
+
+ if test x$have_xvid4 = xyes ; then
+ ifelse([$1], , :, [$1])
+ else
+ if test ! -f conf.xvidtest ; then
+ AC_MSG_WARN([Could not run XviD4 test program, checking why...])
+ CFLAGS="$CFLAGS $XVID4_CFLAGS"
+ LIBS="$LIBS $XVID4_LIBS"
+ AC_TRY_LINK([
+#include <stdio.h>
+#include <xvid.h>
+], [ return 0 ], [
+AC_MSG_RESULT([*** The test program compiled, but did not run. This usually means
+*** that the run-time linker is not finding XviD or finding the wrong
+*** version of XviD. If it is not finding XviD, you'll need to set your
+*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point
+*** to the installed location Also, make sure you have run ldconfig if that
+*** is required on your system
+***
+*** If you have an old version installed, it is best to remove it, although
+*** you may also be able to get things to work by modifying LD_LIBRARY_PATH])], [
+AC_MSG_RESULT([*** The test program failed to compile or link. See the file config.log for the
+*** exact error that occured. This usually means XviD was incorrectly installed.])])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ XVID4_CFLAGS=""
+ XVID4_LIBS=""
+ ifelse([$2], , :, [$2])
+ fi
+ AC_SUBST(XVID4_CFLAGS)
+ AC_SUBST(XVID4_LIBS)
+ rm -f conf.xvidtest
+])
+
+###############################################################################################################333
+# Check for Qt compiler flags, linker flags, and binary packages
+AC_DEFUN([gw_CHECK_QT],
+[
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([AC_PATH_X])
+
+AC_MSG_CHECKING([QTDIR])
+AC_ARG_WITH([qtdir], [ --with-qtdir=DIR Qt installation directory [default=$QTDIR]], QTDIR=$withval)
+# Check that QTDIR is defined or that --with-qtdir given
+if test x"$QTDIR" = x ; then
+ QT_SEARCH="/usr/lib/qt31 /usr/local/qt31 /usr/lib/qt3 /usr/local/qt3 /usr/lib/qt2 /usr/local/qt2 /usr/lib/qt /usr/local/qt"
+ for i in $QT_SEARCH; do
+ if test -f $i/include/qglobal.h -a x$QTDIR = x; then QTDIR=$i; fi
+ done
+fi
+if test x"$QTDIR" = x ; then
+ AC_MSG_ERROR([*** QTDIR must be defined, or --with-qtdir option given])
+fi
+AC_MSG_RESULT([$QTDIR])
+
+# Change backslashes in QTDIR to forward slashes to prevent escaping
+# problems later on in the build process, mainly for Cygwin build
+# environment using MSVC as the compiler
+# TODO: Use sed instead of perl
+QTDIR=`echo $QTDIR | perl -p -e 's/\\\\/\\//g'`
+
+# Figure out which version of Qt we are using
+AC_MSG_CHECKING([Qt version])
+QT_VER=`grep 'define.*QT_VERSION_STR\W' $QTDIR/include/qglobal.h | perl -p -e 's/\D//g'`
+case "${QT_VER}" in
+ 2*)
+ QT_MAJOR="2"
+ ;;
+ 3*)
+ QT_MAJOR="3"
+ ;;
+ *)
+ AC_MSG_ERROR([*** Don't know how to handle this Qt major version])
+ ;;
+esac
+AC_MSG_RESULT([$QT_VER ($QT_MAJOR)])
+
+# Check that moc is in path
+AC_CHECK_PROG(MOC, moc, moc)
+if test x$MOC = x ; then
+ AC_MSG_ERROR([*** moc must be in path])
+fi
+
+# uic is the Qt user interface compiler
+AC_CHECK_PROG(UIC, uic, uic)
+if test x$UIC = x ; then
+ AC_MSG_ERROR([*** uic must be in path])
+fi
+
+# qembed is the Qt data embedding utility.
+# It is located in $QTDIR/tools/qembed, and must be compiled and installed
+# manually, we'll let it slide if it isn't present
+AC_CHECK_PROG(QEMBED, qembed, qembed)
+
+
+# Calculate Qt include path
+QT_CXXFLAGS="-I$QTDIR/include"
+
+QT_IS_EMBEDDED="no"
+# On unix, figure out if we're doing a static or dynamic link
+case "${host}" in
+ *-cygwin)
+ AC_DEFINE_UNQUOTED(WIN32, "", Defined if on Win32 platform)
+ if test -f "$QTDIR/lib/qt.lib" ; then
+ QT_LIB="qt.lib"
+ QT_IS_STATIC="yes"
+ QT_IS_MT="no"
+ elif test -f "$QTDIR/lib/qt-mt.lib" ; then
+ QT_LIB="qt-mt.lib"
+ QT_IS_STATIC="yes"
+ QT_IS_MT="yes"
+ elif test -f "$QTDIR/lib/qt$QT_VER.lib" ; then
+ QT_LIB="qt$QT_VER.lib"
+ QT_IS_STATIC="no"
+ QT_IS_MT="no"
+ elif test -f "$QTDIR/lib/qt-mt$QT_VER.lib" ; then
+ QT_LIB="qt-mt$QT_VER.lib"
+ QT_IS_STATIC="no"
+ QT_IS_MT="yes"
+ fi
+ ;;
+
+ *)
+ QT_IS_STATIC=`ls $QTDIR/lib/*.a 2> /dev/null`
+ if test "x$QT_IS_STATIC" = x; then
+ QT_IS_STATIC="no"
+ else
+ QT_IS_STATIC="yes"
+ fi
+ if test x$QT_IS_STATIC = xno ; then
+ QT_IS_DYNAMIC=`ls $QTDIR/lib/*.so 2> /dev/null`
+ if test "x$QT_IS_DYNAMIC" = x; then
+ AC_MSG_ERROR([*** Couldn't find any Qt libraries])
+ fi
+ fi
+
+ if test "x`ls $QTDIR/lib/libqt.* 2> /dev/null`" != x ; then
+ QT_LIB="-lqt"
+ QT_IS_MT="no"
+ elif test "x`ls $QTDIR/lib/libqt-mt.* 2> /dev/null`" != x ; then
+ QT_LIB="-lqt-mt"
+ QT_IS_MT="yes"
+ elif test "x`ls $QTDIR/lib/libqte.* 2> /dev/null`" != x ; then
+ QT_LIB="-lqte"
+ QT_IS_MT="no"
+ QT_IS_EMBEDDED="yes"
+ elif test "x`ls $QTDIR/lib/libqte-mt.* 2> /dev/null`" != x ; then
+ QT_LIB="-lqte-mt"
+ QT_IS_MT="yes"
+ QT_IS_EMBEDDED="yes"
+ fi
+ ;;
+esac
+AC_MSG_CHECKING([if Qt is static])
+AC_MSG_RESULT([$QT_IS_STATIC])
+AC_MSG_CHECKING([if Qt is multithreaded])
+AC_MSG_RESULT([$QT_IS_MT])
+AC_MSG_CHECKING([if Qt is embedded])
+AC_MSG_RESULT([$QT_IS_EMBEDDED])
+
+QT_GUILINK=""
+QASSISTANTCLIENT_LDADD="-lqassistantclient"
+case "${host}" in
+ *irix*)
+ QT_LIBS="$QT_LIB"
+ if test $QT_IS_STATIC = yes ; then
+ QT_LIBS="$QT_LIBS -L$x_libraries -lXext -lX11 -lm -lSM -lICE"
+ fi
+ ;;
+
+ *linux*)
+ QT_LIBS="$QT_LIB"
+ if test $QT_IS_STATIC = yes && test $QT_IS_EMBEDDED = no; then
+ QT_LIBS="$QT_LIBS -L$x_libraries -lXext -lX11 -lm -lSM -lICE -ldl -ljpeg"
+ fi
+ ;;
+
+
+ *osf*)
+ # Digital Unix (aka DGUX aka Tru64)
+ QT_LIBS="$QT_LIB"
+ if test $QT_IS_STATIC = yes ; then
+ QT_LIBS="$QT_LIBS -L$x_libraries -lXext -lX11 -lm -lSM -lICE"
+ fi
+ ;;
+
+ *solaris*)
+ QT_LIBS="$QT_LIB"
+ if test $QT_IS_STATIC = yes ; then
+ QT_LIBS="$QT_LIBS -L$x_libraries -lXext -lX11 -lm -lSM -lICE -lresolv -lsocket -lnsl"
+ fi
+ ;;
+
+
+ *win*)
+ # linker flag to suppress console when linking a GUI app on Win32
+ QT_GUILINK="/subsystem:windows"
+
+ if test $QT_MAJOR = "3" ; then
+ if test $QT_IS_MT = yes ; then
+ QT_LIBS="/nodefaultlib:libcmt"
+ else
+ QT_LIBS="/nodefaultlib:libc"
+ fi
+ fi
+
+ if test $QT_IS_STATIC = yes ; then
+ QT_LIBS="$QT_LIBS $QT_LIB kernel32.lib user32.lib gdi32.lib comdlg32.lib ole32.lib shell32.lib imm32.lib advapi32.lib wsock32.lib winspool.lib winmm.lib netapi32.lib"
+ if test $QT_MAJOR = "3" ; then
+ QT_LIBS="$QT_LIBS qtmain.lib"
+ fi
+ else
+ QT_LIBS="$QT_LIBS $QT_LIB"
+ if test $QT_MAJOR = "3" ; then
+ QT_CXXFLAGS="$QT_CXXFLAGS -DQT_DLL"
+ QT_LIBS="$QT_LIBS qtmain.lib qui.lib user32.lib netapi32.lib"
+ fi
+ fi
+ QASSISTANTCLIENT_LDADD="qassistantclient.lib"
+ ;;
+
+esac
+
+
+if test x"$QT_IS_EMBEDDED" = "xyes" ; then
+ QT_CXXFLAGS="-DQWS $QT_CXXFLAGS"
+fi
+
+if test x"$QT_IS_MT" = "xyes" ; then
+ QT_CXXFLAGS="$QT_CXXFLAGS -D_REENTRANT -DQT_THREAD_SUPPORT"
+fi
+
+QT_LDADD="-L$QTDIR/lib $QT_LIBS"
+
+if test x$QT_IS_STATIC = xyes ; then
+ OLDLIBS="$LIBS"
+ LIBS="$QT_LDADD"
+ AC_CHECK_LIB(Xft, XftFontOpen, QT_LDADD="$QT_LDADD -lXft")
+ LIBS="$LIBS"
+fi
+
+AC_MSG_CHECKING([QT_CXXFLAGS])
+AC_MSG_RESULT([$QT_CXXFLAGS])
+AC_MSG_CHECKING([QT_LDADD])
+AC_MSG_RESULT([$QT_LDADD])
+
+AC_SUBST(QT_CXXFLAGS)
+AC_SUBST(QT_LDADD)
+AC_SUBST(QT_GUILINK)
+AC_SUBST(QASSISTANTCLIENT_LDADD)
+
+])
+
diff --git a/acinclude.m4.mine b/acinclude.m4.mine
new file mode 100644
index 0000000..0fc8b65
--- /dev/null
+++ b/acinclude.m4.mine
@@ -0,0 +1,475 @@
+##########################################################################################################
+dnl Usage:
+dnl AM_PATH_FFMPEG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for ffmpeg, and define FFMPEG_CFLAGS and FFMPEG_LIBS
+
+AC_DEFUN([AM_PATH_FFMPEG],
+[
+ AC_REQUIRE([AC_FUNC_LRINTF])
+
+ dnl !!! - it really sucks - Makefile.am can't be optimized even by
+ dnl !!! preparing some extra variable forward
+ dnl !!! FFAVFORMAT_SRC=
+
+ AC_REQUIRE([AC_CHECK_OSS])
+ test x$enable_oss = xyes && AC_DEFINE(CONFIG_AUDIO_OSS, 1, [Define if you want to have ffmpeg OSS audio support compiled.])
+
+ AC_REQUIRE([AC_CHECK_V4L])
+ test x$enable_v4l = xyes && AC_DEFINE(CONFIG_VIDEO4LINUX, 1, [Define if you have video4linux device. (ffmpeg)])
+
+ AC_REQUIRE([AC_FIND_ZLIB])
+ test x$have_zlib = xyes && AC_DEFINE(CONFIG_ZLIB, 1, [Define if you have z library (-lz) (ffmpeg)])
+
+ AC_ARG_ENABLE(ffmpeg_faadbin, [ --enable-ffmpeg-faadbin build ffmpeg with FAAD binary support. (default=yes)],
+ [], enable_ffmpeg_faadbin=yes)
+ test x$enable_ffmpeg_faadbin = xyes && AC_DEFINE(CONFIG_FAADBIN, 1, [Define if you want to build support for runtime linked libfaad.])
+ AC_REQUIRE([AM_PATH_FAAD])
+ test x$have_faad = xyes && AC_DEFINE(CONFIG_FAAD, 1, [Define if you want to have AAC support compiled. (ffmpeg)])
+
+ AC_ARG_ENABLE(ffmpeg_risky, [ --enable-ffmpeg-risky build ffmpeg risky code. (default=yes)],
+ [], enable_ffmpeg_risky=yes)
+
+ AC_ARG_ENABLE(ffmpeg_a52, [ --enable-ffmpeg-a52 build ffmpeg with A52 (AC3) support. (default=yes)],
+ [], enable_ffmpeg_a52=yes)
+ if test x$enable_ffmpeg_a52 = xyes ; then
+ AC_DEFINE(HAVE_FFMPEG_A52, 1, [Define if you want to use ffmpeg A52 audio decoder.])
+ AC_ARG_ENABLE(ffmpeg_a52bin, [ --enable-ffmpeg-a52bin A52 plugin dlopens liba52.so.0 at runtime (default=no)],
+ [], enable_ffmpeg_a52bin=no)
+
+ if test x$enable_ffmpeg_a52bin = xyes ; then
+ AC_DEFINE(CONFIG_A52BIN, 1, [Define if you want to build ffmpeg with A52 dlopened decoder.])
+ fi
+ fi
+
+ test x$enable_ffmpeg_risky = xyes && AC_DEFINE(CONFIG_RISKY, 1, [Define if you want to compile patent encumbered codecs. (ffmpeg)])
+
+ AC_DEFINE(CONFIG_ENCODERS, 1, [Define if you want to build ffmpeg encoders.])
+ AC_DEFINE(CONFIG_DECODERS, 1, [Define if you want to build ffmpeg decoders.])
+ AC_DEFINE(CONFIG_AC3, 1, [Define if you want to build ffmpeg with AC3 decoder.])
+ AC_DEFINE(SIMPLE_IDCT, 1, [Define if you want to build ffmpeg with simples idct.])
+ AC_DEFINE(CONFIG_NETWORK, 1, [Define if you want to build ffmpeg with network support.])
+ AC_DEFINE(CONFIG_MPEGAUDIO_HP, 1, [Define if you want to have highquality ffmpeg mpeg audio support compiled.])
+ AC_DEFINE(HAVE_PTHREADS, 1, [Define if you want to have ffmpeg pthread support compiled.])
+
+ if test -n "$ffmpeg_profiling" ; then
+ AC_DEFINE(HAVE_GPROF, 1, [Define if you want to build ffmpeg with gprof support.])
+ fi
+
+ test -z "$FFMPEG_CFLAGS" && FFMPEG_CFLAGS="-O4 $DEFAULT_FLAGS"
+ FFMPEG_CFLAGS="$FFMPEG_CFLAGS $DEFAULT_DEFINES"
+
+ AC_CHECK_GNU_VECTOR(FFMPEG_SSE="-msse";
+ AC_DEFINE(HAVE_BUILTIN_VECTOR, 1, [Define if your compiler supports vector builtins (MMX).]), [])
+ AC_SUBST(FFMPEG_CFLAGS)
+ AC_SUBST(FFMPEG_SSE)
+
+ AM_CONDITIONAL(AMM_BUILD_STRPTIME, test x$ac_cv_func_strptime != xyes )
+
+dnl ffmpeg_x86opt=
+dnl test x$enable_x86opt = xno && ffmpeg_x86opt="--disable-mmx"
+dnl AC_MSG_RESULT([=== configuring ffmpeg ===])
+dnl ( cd $srcdir/ffmpeg ; \
+dnl ./configure --prefix=$prefix --cc=$CC \
+dnl $ffmpeg_profiling $ffmpeg_cpu \
+dnl $ffmpeg_x86opt --disable-mp3lib \
+dnl --enable-simple_idct )
+])
+
+
+##########################################################################################################
+# Configure paths for SDL
+# Sam Lantinga 9/21/99
+# stolen from Manish Singh
+# stolen back from Frank Belew
+# stolen from Manish Singh
+# Shamelessly stolen from Owen Taylor
+
+dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS
+dnl
+AC_DEFUN([AM_PATH_SDL],
+[dnl
+dnl Get the cflags and libraries from the sdl-config script
+dnl
+AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)],
+ sdl_prefix="$withval", sdl_prefix="")
+AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)],
+ sdl_exec_prefix="$withval", sdl_exec_prefix="")
+AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program],
+ , enable_sdltest=yes)
+
+ if test x$sdl_exec_prefix != x ; then
+ sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix"
+ if test x${SDL_CONFIG+set} != xset ; then
+ SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config
+ fi
+ fi
+ if test x$sdl_prefix != x ; then
+ sdl_args="$sdl_args --prefix=$sdl_prefix"
+ if test x${SDL_CONFIG+set} != xset ; then
+ SDL_CONFIG=$sdl_prefix/bin/sdl-config
+ fi
+ fi
+
+ AC_REQUIRE([AC_CANONICAL_TARGET])
+ PATH="$prefix/bin:$prefix/usr/bin:$PATH"
+ AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH])
+ min_sdl_version=ifelse([$1], ,0.11.0,$1)
+ AC_MSG_CHECKING(for SDL - version >= $min_sdl_version)
+ no_sdl=""
+ if test "$SDL_CONFIG" = "no" ; then
+ no_sdl=yes
+ else
+ SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags`
+ SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs`
+
+ sdl_major_version=`$SDL_CONFIG $sdl_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ if test "x$enable_sdltest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $SDL_CFLAGS"
+ LIBS="$LIBS $SDL_LIBS"
+dnl
+dnl Now check if the installed SDL is sufficiently new. (Also sanity
+dnl checks the results of sdl-config to some extent
+dnl
+ rm -f conf.sdltest
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "SDL.h"
+
+char*
+my_strdup (char *str)
+{
+ char *new_str;
+
+ if (str)
+ {
+ new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char));
+ strcpy (new_str, str);
+ }
+ else
+ new_str = NULL;
+
+ return new_str;
+}
+
+int main (int argc, char *argv[])
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ /* This hangs on some systems (?)
+ system ("touch conf.sdltest");
+ */
+ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); }
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = my_strdup("$min_sdl_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+ printf("%s, bad version string\n", "$min_sdl_version");
+ exit(1);
+ }
+
+ if (($sdl_major_version > major) ||
+ (($sdl_major_version == major) && ($sdl_minor_version > minor)) ||
+ (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version);
+ printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro);
+ printf("*** best to upgrade to the required version.\n");
+ printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n");
+ printf("*** to point to the correct copy of sdl-config, and remove the file\n");
+ printf("*** config.cache before re-running configure\n");
+ return 1;
+ }
+}
+
+],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_sdl" = x ; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$SDL_CONFIG" = "no" ; then
+ echo "*** The sdl-config script installed by SDL could not be found"
+ echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the SDL_CONFIG environment variable to the"
+ echo "*** full path to sdl-config."
+ else
+ if test -f conf.sdltest ; then
+ :
+ else
+ echo "*** Could not run SDL test program, checking why..."
+ CFLAGS="$CFLAGS $SDL_CFLAGS"
+ LIBS="$LIBS $SDL_LIBS"
+ AC_TRY_LINK([
+#include <stdio.h>
+#include "SDL.h"
+
+int main(int argc, char *argv[])
+{ return 0; }
+#undef main
+#define main K_and_R_C_main
+], [ return 0; ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding SDL or finding the wrong"
+ echo "*** version of SDL. If it is not finding SDL, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means SDL was incorrectly installed"
+ echo "*** or that you have moved SDL since it was installed. In the latter case, you"
+ echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ SDL_CFLAGS=""
+ SDL_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(SDL_CFLAGS)
+ AC_SUBST(SDL_LIBS)
+ rm -f conf.sdltest
+])
+
+
+###############################################################################################################333
+# Check for Qt compiler flags, linker flags, and binary packages
+AC_DEFUN([gw_CHECK_QT],
+[
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([AC_PATH_X])
+
+AC_MSG_CHECKING([QTDIR])
+AC_ARG_WITH([qtdir], [ --with-qtdir=DIR Qt installation directory [default=$QTDIR]], QTDIR=$withval)
+# Check that QTDIR is defined or that --with-qtdir given
+if test x"$QTDIR" = x ; then
+ QT_SEARCH="/usr/lib/qt31 /usr/local/qt31 /usr/lib/qt3 /usr/local/qt3 /usr/lib/qt2 /usr/local/qt2 /usr/lib/qt /usr/local/qt"
+ for i in $QT_SEARCH; do
+ if test -f $i/include/qglobal.h -a x$QTDIR = x; then QTDIR=$i; fi
+ done
+fi
+if test x"$QTDIR" = x ; then
+ AC_MSG_ERROR([*** QTDIR must be defined, or --with-qtdir option given])
+fi
+AC_MSG_RESULT([$QTDIR])
+
+# Change backslashes in QTDIR to forward slashes to prevent escaping
+# problems later on in the build process, mainly for Cygwin build
+# environment using MSVC as the compiler
+# TODO: Use sed instead of perl
+QTDIR=`echo $QTDIR | perl -p -e 's/\\\\/\\//g'`
+
+# Figure out which version of Qt we are using
+AC_MSG_CHECKING([Qt version])
+QT_VER=`grep 'define.*QT_VERSION_STR\W' $QTDIR/include/qglobal.h | perl -p -e 's/\D//g'`
+case "${QT_VER}" in
+ 2*)
+ QT_MAJOR="2"
+ ;;
+ 3*)
+ QT_MAJOR="3"
+ ;;
+ *)
+ AC_MSG_ERROR([*** Don't know how to handle this Qt major version])
+ ;;
+esac
+AC_MSG_RESULT([$QT_VER ($QT_MAJOR)])
+
+# Check that moc is in path
+AC_CHECK_PROG(MOC, moc, moc)
+if test x$MOC = x ; then
+ AC_MSG_ERROR([*** moc must be in path])
+fi
+
+# uic is the Qt user interface compiler
+AC_CHECK_PROG(UIC, uic, uic)
+if test x$UIC = x ; then
+ AC_MSG_ERROR([*** uic must be in path])
+fi
+
+# qembed is the Qt data embedding utility.
+# It is located in $QTDIR/tools/qembed, and must be compiled and installed
+# manually, we'll let it slide if it isn't present
+AC_CHECK_PROG(QEMBED, qembed, qembed)
+
+
+# Calculate Qt include path
+QT_CXXFLAGS="-I$QTDIR/include"
+
+QT_IS_EMBEDDED="no"
+# On unix, figure out if we're doing a static or dynamic link
+case "${host}" in
+ *-cygwin)
+ AC_DEFINE_UNQUOTED(WIN32, "", Defined if on Win32 platform)
+ if test -f "$QTDIR/lib/qt.lib" ; then
+ QT_LIB="qt.lib"
+ QT_IS_STATIC="yes"
+ QT_IS_MT="no"
+ elif test -f "$QTDIR/lib/qt-mt.lib" ; then
+ QT_LIB="qt-mt.lib"
+ QT_IS_STATIC="yes"
+ QT_IS_MT="yes"
+ elif test -f "$QTDIR/lib/qt$QT_VER.lib" ; then
+ QT_LIB="qt$QT_VER.lib"
+ QT_IS_STATIC="no"
+ QT_IS_MT="no"
+ elif test -f "$QTDIR/lib/qt-mt$QT_VER.lib" ; then
+ QT_LIB="qt-mt$QT_VER.lib"
+ QT_IS_STATIC="no"
+ QT_IS_MT="yes"
+ fi
+ ;;
+
+ *)
+ QT_IS_STATIC=`ls $QTDIR/lib/*.a 2> /dev/null`
+ if test "x$QT_IS_STATIC" = x; then
+ QT_IS_STATIC="no"
+ else
+ QT_IS_STATIC="yes"
+ fi
+ if test x$QT_IS_STATIC = xno ; then
+ QT_IS_DYNAMIC=`ls $QTDIR/lib/*.so 2> /dev/null`
+ if test "x$QT_IS_DYNAMIC" = x; then
+ AC_MSG_ERROR([*** Couldn't find any Qt libraries])
+ fi
+ fi
+
+ if test "x`ls $QTDIR/lib/libqt.* 2> /dev/null`" != x ; then
+ QT_LIB="-lqt"
+ QT_IS_MT="no"
+ elif test "x`ls $QTDIR/lib/libqt-mt.* 2> /dev/null`" != x ; then
+ QT_LIB="-lqt-mt"
+ QT_IS_MT="yes"
+ elif test "x`ls $QTDIR/lib/libqte.* 2> /dev/null`" != x ; then
+ QT_LIB="-lqte"
+ QT_IS_MT="no"
+ QT_IS_EMBEDDED="yes"
+ elif test "x`ls $QTDIR/lib/libqte-mt.* 2> /dev/null`" != x ; then
+ QT_LIB="-lqte-mt"
+ QT_IS_MT="yes"
+ QT_IS_EMBEDDED="yes"
+ fi
+ ;;
+esac
+AC_MSG_CHECKING([if Qt is static])
+AC_MSG_RESULT([$QT_IS_STATIC])
+AC_MSG_CHECKING([if Qt is multithreaded])
+AC_MSG_RESULT([$QT_IS_MT])
+AC_MSG_CHECKING([if Qt is embedded])
+AC_MSG_RESULT([$QT_IS_EMBEDDED])
+
+QT_GUILINK=""
+QASSISTANTCLIENT_LDADD="-lqassistantclient"
+case "${host}" in
+ *irix*)
+ QT_LIBS="$QT_LIB"
+ if test $QT_IS_STATIC = yes ; then
+ QT_LIBS="$QT_LIBS -L$x_libraries -lXext -lX11 -lm -lSM -lICE"
+ fi
+ ;;
+
+ *linux*)
+ QT_LIBS="$QT_LIB"
+ if test $QT_IS_STATIC = yes && test $QT_IS_EMBEDDED = no; then
+ QT_LIBS="$QT_LIBS -L$x_libraries -lXext -lX11 -lm -lSM -lICE -ldl -ljpeg"
+ fi
+ ;;
+
+
+ *osf*)
+ # Digital Unix (aka DGUX aka Tru64)
+ QT_LIBS="$QT_LIB"
+ if test $QT_IS_STATIC = yes ; then
+ QT_LIBS="$QT_LIBS -L$x_libraries -lXext -lX11 -lm -lSM -lICE"
+ fi
+ ;;
+
+ *solaris*)
+ QT_LIBS="$QT_LIB"
+ if test $QT_IS_STATIC = yes ; then
+ QT_LIBS="$QT_LIBS -L$x_libraries -lXext -lX11 -lm -lSM -lICE -lresolv -lsocket -lnsl"
+ fi
+ ;;
+
+
+ *win*)
+ # linker flag to suppress console when linking a GUI app on Win32
+ QT_GUILINK="/subsystem:windows"
+
+ if test $QT_MAJOR = "3" ; then
+ if test $QT_IS_MT = yes ; then
+ QT_LIBS="/nodefaultlib:libcmt"
+ else
+ QT_LIBS="/nodefaultlib:libc"
+ fi
+ fi
+
+ if test $QT_IS_STATIC = yes ; then
+ QT_LIBS="$QT_LIBS $QT_LIB kernel32.lib user32.lib gdi32.lib comdlg32.lib ole32.lib shell32.lib imm32.lib advapi32.lib wsock32.lib winspool.lib winmm.lib netapi32.lib"
+ if test $QT_MAJOR = "3" ; then
+ QT_LIBS="$QT_LIBS qtmain.lib"
+ fi
+ else
+ QT_LIBS="$QT_LIBS $QT_LIB"
+ if test $QT_MAJOR = "3" ; then
+ QT_CXXFLAGS="$QT_CXXFLAGS -DQT_DLL"
+ QT_LIBS="$QT_LIBS qtmain.lib qui.lib user32.lib netapi32.lib"
+ fi
+ fi
+ QASSISTANTCLIENT_LDADD="qassistantclient.lib"
+ ;;
+
+esac
+
+
+if test x"$QT_IS_EMBEDDED" = "xyes" ; then
+ QT_CXXFLAGS="-DQWS $QT_CXXFLAGS"
+fi
+
+if test x"$QT_IS_MT" = "xyes" ; then
+ QT_CXXFLAGS="$QT_CXXFLAGS -D_REENTRANT -DQT_THREAD_SUPPORT"
+fi
+
+QT_LDADD="-L$QTDIR/lib $QT_LIBS"
+
+if test x$QT_IS_STATIC = xyes ; then
+ OLDLIBS="$LIBS"
+ LIBS="$QT_LDADD"
+ AC_CHECK_LIB(Xft, XftFontOpen, QT_LDADD="$QT_LDADD -lXft")
+ LIBS="$LIBS"
+fi
+
+AC_MSG_CHECKING([QT_CXXFLAGS])
+AC_MSG_RESULT([$QT_CXXFLAGS])
+AC_MSG_CHECKING([QT_LDADD])
+AC_MSG_RESULT([$QT_LDADD])
+
+AC_SUBST(QT_CXXFLAGS)
+AC_SUBST(QT_LDADD)
+AC_SUBST(QT_GUILINK)
+AC_SUBST(QASSISTANTCLIENT_LDADD)
+
+])
+
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..45ef969
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,71 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+# This was lifted from the Gimp, and adapted slightly by
+# Raph Levien, slightly hacked for xine by Daniel Caujolle-Bert.
+
+DIE=0
+
+PROG=anoid
+
+# Check how echo works in this /bin/sh
+case `echo -n` in
+-n) _echo_n= _echo_c='\c';;
+*) _echo_n=-n _echo_c=;;
+esac
+
+
+(autoconf --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have autoconf installed to compile $PROG."
+ echo "Download the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+ DIE=1
+}
+
+(libtool --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have libtool installed to compile $PROG."
+ echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.4.tar.gz"
+ echo "(or a newer version if it is available)"
+ DIE=1
+}
+
+(automake --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have automake installed to compile $PROG."
+ echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
+ echo "(or a newer version if it is available)"
+ DIE=1
+}
+
+(aclocal --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "**Error**: Missing aclocal. The version of automake"
+ echo "installed doesn't appear recent enough."
+ echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
+ echo "(or a newer version if it is available)"
+ DIE=1
+}
+
+if [ "$DIE" -eq 1 ]; then
+ exit 1
+fi
+
+aclocalinclude="$ACLOCAL_FLAGS"; \
+(echo $_echo_n " + Running aclocal: $_echo_c"; \
+ aclocal $aclocalinclude; \
+ echo "done.") && \
+(echo $_echo_n " + Running libtoolize: $_echo_c"; \
+ libtoolize --force --copy >/dev/null 2>&1; \
+ echo "done.") && \
+(echo $_echo_n " + Running autoheader: $_echo_c"; \
+ autoheader; \
+ echo "done.") && \
+(echo $_echo_n " + Running automake: $_echo_c"; \
+ automake --gnu --add-missing --copy; \
+ echo "done.") && \
+(echo $_echo_n " + Running autoconf: $_echo_c"; \
+ autoconf; \
+ echo "done.")
+
+rm -f config.cache
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..1df3ba6
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,166 @@
+# Filnavn: configure.in
+AC_INIT(src/miav.cc)
+AM_INIT_AUTOMAKE( miav, 0.1.1 )
+
+AC_PROG_CXX
+
+AC_PROG_LIBTOOL
+AM_PROG_LIBTOOL
+
+AM_CONFIG_HEADER(config.h)
+AM_CXXFLAGS="-O2"
+AC_STDC_HEADERS
+
+AC_ARG_WITH(gui, [ --without-gui build without GUI support])
+ if test x$with_gui != xno && test -z "$GUI"; then
+#dnl ====================
+#dnl Check for Qt library
+#dnl ====================
+#AC_ARG_WITH(qt, [ --with-qt build with Qt utils. (autodetected)],
+# [], with_qt=yes)
+#dnl no X means no Qt
+#test x$have_x != xyes && with_qt=no
+#
+#if test x$with_qt = xyes ; then
+# AC_PATH_QT(200, test -z "$qt_version" && qt_version=0
+# AC_DEFINE_UNQUOTED(HAVE_LIBQT, $qt_version, [Define if using 'Qt' libraries.]),
+# with_qt=no)
+#else
+# AC_MSG_RESULT([compilation of Qt utils disabled])
+#fi
+#
+#if test x$with_qt = xyes ; then
+# AC_LANG_SAVE
+# AC_LANG_CPLUSPLUS
+# save_CXXFLAGS=$CXXFLAGS
+# save_LIBS=$LIBS
+# CXXFLAGS="$CXXFLAGS $QT_CFLAGS $X_CFLAGS"
+# LIBS="$LIBS $QT_LIBS $X_LIBS $PTHREAD_LIBS"
+# AC_CACHE_CHECK([for multithreading support in Qt],
+# ac_cv_val_with_qt_multi,
+# [ AC_TRY_LINK([
+# #define QT_THREAD_SUPPORT
+# #include <qapplication.h> ],
+# [ qApp->wakeUpGuiThread(); ],
+# [ ac_cv_val_with_qt_multi=yes ],
+# [ ac_cv_val_with_qt_multi=no ])
+# ])
+# CXXFLAGS=$save_CXXFLAGS
+# LIBS=$save_LIBS
+#
+# if test x$ac_cv_val_with_qt_multi != xyes ; then
+# AC_MSG_WARN([
+#*** Your Qt installation does not support multi-threading!
+#*** Avifile will be compiled - however it might crash mysteriously
+#*** Instalation of threaded Qt library version (qt-mt) is recommended
+#*** When rebuilding Qt use configure option '-thread'.])
+# fi
+#
+# AC_MSG_CHECKING(Qt version for Avicap)
+# if test $qt_version -ge 220 ; then
+# AC_MSG_RESULT([yes])
+# else
+# AC_MSG_RESULT([no (needs Qt 2.2.0 or better)])
+# build_avicap=no
+# fi
+# AC_LANG_RESTORE
+#fi
+
+
+dnl ======================
+dnl Check for Jpeg library
+dnl ======================
+AC_CHECK_HEADER(jpeglib.h, have_jpeglib=yes, have_jpeglib="no ")
+if test x$have_jpeglib = xyes; then
+dnl default action left - saving $LIBS is necessary
+ save_LIBS=$LIBS
+ AC_CHECK_LIB(jpeg, jpeg_start_compress, , have_jpeglib="no ")
+ LIBS=$save_LIBS
+fi
+
+#dnl =====================
+#dnl Check for SDL library
+#dnl =====================
+#AC_ARG_WITH(sdl, [ --with-sdl build with SDL. (autodetected)],
+# [], with_sdl=yes)
+#
+#if test x$with_sdl != xyes; then
+# with_sdl="no (video rendering unavailable as requested!)"
+# AC_MSG_WARN([
+#*** there will be NO video rendering without SDL support!])
+#else
+# SDL_MIN_VERSION=1.0.0
+# save_CFLAGS=$CFLAGS
+# save_CPPFLAGS=$CPPFLAGS
+# save_LIBS=$LD_FLAGS
+# LIBS=
+# AM_PATH_SDL($SDL_MIN_VERSION,
+# AC_DEFINE(HAVE_LIBSDL, 1, [Define if using 'SDL' library (-lsdl).]),
+# with_sdl="no (*** no SDL => no video rendering! ***)"
+# AC_MSG_WARN([Could not find SDL >= $SDL_MIN_VERSION!]) )
+# CFLAGS=$save_CFLAGS
+# CXXFLAGS=$save_CPPFLAGS
+# LDFLAGS="$save_LIBS
+#fi
+
+ dnl QT lib check macro (located in acinclude.m4)
+ gw_CHECK_QT
+
+ dnl Check for SDL
+ SDL_VERSION=1.2.0
+ AM_PATH_SDL($SDL_VERSION,
+ :,
+ AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!])
+ )
+ CXXFLAGS="$CXXFLAGS $SDL_CFLAGS"
+ LDFLAGS="$LDFLAGS $SDL_LIBS"
+
+ dnl Make code aware of the gui
+ AC_DEFINE([USE_GUI], [], [Is defined if te project is configured to compile with gui])
+ fi
+
+dnl =======================
+dnl Configure ffmpeg plugin
+dnl =======================
+#AM_PATH_FFMPEG
+
+#LD_FLAGS=$LD_FLAGS $LIBS
+
+# And now for the conditionals (for ffmpeg)
+#AM_CONDITIONAL(AMM_LINK_SHARED, test $lt_major_version -ge 1 -a $lt_minor_version -ge 4 -a $lt_micro_version -ge 3 )
+#AM_CONDITIONAL(AMM_FF_A52BIN, test x$enable_ffmpeg_a52bin = xyes)
+#AM_CONDITIONAL(AMM_FF_FAAD, test x$have_faad = xyes )
+#AM_CONDITIONAL(AMM_FF_ALPHAOPT, test x$enable_alphaopt = xyes)
+#AM_CONDITIONAL(AMM_FF_ARMOPT, test x$enable_armopt = xyes)
+#AM_CONDITIONAL(AMM_FF_MIPSOPT, test x$enable_mipsopt = xyes)
+#AM_CONDITIONAL(AMM_FF_MLIBOPT, test x$enable_mlibopt = xyes)
+#AM_CONDITIONAL(AMM_FF_PPCOPT, test x$enable_ppcopt = xyes)
+#AM_CONDITIONAL(AMM_FF_PS2OPT, test x$enable_ps2opt = xyes)
+#AM_CONDITIONAL(AMM_FF_SH4OPT, test x$enable_sh4opt = xyes)
+#AM_CONDITIONAL(AMM_FF_X86OPT, test x$enable_x86opt = xyes)
+#AM_CONDITIONAL(AMM_USE_OSS, test x$enable_oss = xyes)
+#AM_CONDITIONAL(AMM_USE_V4L, test x$enable_v4l = xyes )
+
+
+AC_SUBST(CFLAGS)
+AC_SUBST(CPPFLAGS)
+AC_SUBST(CXXFLAGS)
+
+AC_SUBST(LDFLAGS)
+
+AC_OUTPUT(
+ Makefile
+ src/Makefile)
+# ffmpeg/Makefile
+# ffmpeg/libavformat/Makefile
+# ffmpeg/libavcodec/Makefile
+# ffmpeg/libavcodec/alpha/Makefile
+# ffmpeg/libavcodec/armv4l/Makefile
+# ffmpeg/libavcodec/i386/Makefile
+# ffmpeg/libavcodec/liba52/Makefile
+# ffmpeg/libavcodec/libpostproc/Makefile
+# ffmpeg/libavcodec/mlib/Makefile
+# ffmpeg/libavcodec/ppc/Makefile
+# ffmpeg/libavcodec/ps2/Makefile
+# ffmpeg/libavcodec/sh4/Makefile
+# )
diff --git a/pixmaps/camera.png b/pixmaps/camera.png
new file mode 100644
index 0000000..2517ba0
--- /dev/null
+++ b/pixmaps/camera.png
Binary files differ
diff --git a/pixmaps/dummy.png b/pixmaps/dummy.png
new file mode 100644
index 0000000..da01677
--- /dev/null
+++ b/pixmaps/dummy.png
Binary files differ
diff --git a/pixmaps/miav-logo-256x256.png b/pixmaps/miav-logo-256x256.png
new file mode 100644
index 0000000..33ed3b8
--- /dev/null
+++ b/pixmaps/miav-logo-256x256.png
Binary files differ
diff --git a/pixmaps/miav-logo-512x512.png b/pixmaps/miav-logo-512x512.png
new file mode 100644
index 0000000..ead949c
--- /dev/null
+++ b/pixmaps/miav-logo-512x512.png
Binary files differ
diff --git a/pixmaps/miav-logo-64x64.png b/pixmaps/miav-logo-64x64.png
new file mode 100644
index 0000000..625ec40
--- /dev/null
+++ b/pixmaps/miav-logo-64x64.png
Binary files differ
diff --git a/pixmaps/record.png b/pixmaps/record.png
new file mode 100644
index 0000000..e453246
--- /dev/null
+++ b/pixmaps/record.png
Binary files differ
diff --git a/pixmaps/stop.png b/pixmaps/stop.png
new file mode 100644
index 0000000..5eb5036
--- /dev/null
+++ b/pixmaps/stop.png
Binary files differ
diff --git a/src/Makefile.am b/src/Makefile.am
index 40e37ee..75e6f85 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,4 +1,3 @@
-#frekin' wierd
## TODO: Move ffmpeg, libxml and libsdl into configure.in
AM_CXXFLAGS := $(CXXFLAGS) $(EXTRA_CXXFLAGS) -I../include $(QT_CXXFLAGS) \
diff --git a/src/aboutwindow.cc b/src/aboutwindow.cc
new file mode 100644
index 0000000..6630d4c
--- /dev/null
+++ b/src/aboutwindow.cc
@@ -0,0 +1,89 @@
+/***************************************************************************
+ * aboutwindow.cc
+ *
+ * Sun Aug 22 21:57:49 2004
+ * Copyright 2004 deva
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#ifdef USE_GUI
+
+#include "aboutwindow.h"
+
+#include <qpainter.h>
+#include <qfont.h>
+
+#include <config.h>
+//"miav-grab.h"
+
+AboutWindow::AboutWindow( QWidget* parent, const char* name )
+ : QDialog( parent, name )
+{
+ resize(320,460);
+// setModal(true);
+ pix_logo = new QPixmap();
+ pix_logo->load("miav-logo-512x512.png");
+
+ setBackgroundColor(QColor(150,150,150));
+
+ btn_ok = new QPushButton(this);
+ btn_ok->setText("OK");
+ btn_ok->move(200, 410);
+ btn_ok->resize( 95, 40 );
+ btn_ok->setFont( QFont( "Arial", 12, QFont::Bold ) );
+
+ QObject::connect( btn_ok, SIGNAL(clicked()), this, SLOT(close()) );
+
+ show();
+}
+
+AboutWindow::~AboutWindow()
+{
+}
+
+void AboutWindow::paintEvent( QPaintEvent *event )
+{
+ if(!event) return; // Just to get rid og the compile warning!
+ QPainter painter;
+ painter.begin(this);
+
+ painter.drawPixmap(-200,-50, *pix_logo);
+
+ painter.setBrush( Dense4Pattern );
+ painter.drawRect(25,25,270,377);
+
+ painter.setBrush( SolidPattern );
+ painter.setFont( QFont( "Arial", 18, QFont::Bold ) );
+ painter.setPen( Qt::black );
+ painter.drawText(58,58, "MIAV-Grab v" VERSION);
+ painter.setPen( Qt::red );
+ painter.drawText(60,60, "MIAV-Grab v" VERSION);
+
+ painter.setPen( Qt::white );
+ painter.setFont( QFont( "Arial", 11, QFont::Bold ) );
+ painter.drawText(30,70, 270, 357, 0, ABOUT_INFO);
+
+ painter.setPen( Qt::white );
+ painter.setFont( QFont( "Arial", 8, QFont::Bold ) );
+ painter.drawText(30,165, 270, 357, 0, GPL_LICENSE);
+
+ painter.end();
+}
+
+#endif /*USE_GUI*/
diff --git a/src/aboutwindow.h b/src/aboutwindow.h
new file mode 100644
index 0000000..a8437b5
--- /dev/null
+++ b/src/aboutwindow.h
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * aboutwindow.h
+ *
+ * Sun Aug 22 21:58:22 2004
+ * Copyright 2004 deva
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#ifdef USE_GUI
+
+#ifndef __ABOUTWINDOW_H__
+#define __ABOUTWINDOW_H__
+
+#include <qdialog.h>
+//#include <qlabel.h>
+#include <qpixmap.h>
+//#include <qtextedit.h>
+#include <qpushbutton.h>
+
+#define ABOUT_INFO "\
+Official homepage:\n\
+ http://www.aasimon.org/miav\n\
+Author:\n\
+ Bent Bisballe (deva@aasimon.org)\n\
+Copyright (c) 2004"
+
+#define GPL_LICENSE "\
+This program is free software; you can\n\
+redistribute it and/or modify it under the terms\n\
+of the GNU General Public License as published\n\
+by the Free Software Foundation; either version\n\
+2 of the License, or (at your option) any later\n\
+version.\n\
+ This program is distributed in the hope that\n\
+it will be useful, but WITHOUT ANY WARRANTY;\n\
+without even the implied warranty of\n\
+MERCHANTABILITY or FITNESS FOR A PARTI-\n\
+CULAR PURPOSE. See the GNU Library General\n\
+Public License for more details.\n\
+ You should have received a copy of the GNU\n\
+General Public License along with this program;\n\
+if not, write to the Free Software Foundation,\n\
+Inc., 59 Temple Place - Suite 330, Boston,\n\
+MA 02111-1307, USA."
+
+class AboutWindow : public QDialog
+{
+ Q_OBJECT
+public:
+ AboutWindow(QWidget* parent = 0, const char* name = 0);
+ ~AboutWindow();
+ virtual void paintEvent( QPaintEvent *event );
+
+private:
+ QPushButton *btn_ok;
+ QPixmap *pix_logo;
+};
+
+#endif /* __ABOUTWINDOW_H__ */
+
+#endif /*USE_GUI*/
diff --git a/src/camera.cc b/src/camera.cc
new file mode 100644
index 0000000..574caf3
--- /dev/null
+++ b/src/camera.cc
@@ -0,0 +1,131 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * camera.cc
+ *
+ * Fri Oct 29 12:46:38 CEST 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#ifdef USE_GUI
+
+#include "camera.h"
+
+Camera::Camera(const char *ip, const int port)
+{
+ pthread_mutex_init (&mutex, NULL);
+ //mutex = PTHREAD_MUTEX_INITIALIZER;
+
+ AVFormatContext *ifmtctx;
+ AVFormatContext *ofmtctx;
+
+ running = 1;
+
+ int channel = 0;
+ char *device = "/dev/dv1394";
+
+ av_register_all();
+
+ encode_queue = new Queue<DVFrame>(); // infinite size
+ player_queue = new Queue<FFFrame>(1); // fixed size of 1
+
+ sem_init(&encode_sem, 0, 0);
+ sem_init(&player_sem, 0, 0);
+
+ decoder = new Decoder(device,
+ channel,
+ &encode_sem,
+ &player_sem,
+ encode_queue,
+ player_queue,
+ &mutex,
+ &running);
+ // ifmtctx = decoder->fc;
+ if(!decoder->fc) return;
+
+ encoder = new Encoder(ip, port,
+ &encode_sem,
+ encode_queue,
+ &mutex,
+ &running);
+ ofmtctx = encoder->fc;
+
+ player = new Player(&running,
+ &player_sem,
+ player_queue,
+ &mutex);
+
+ pthread_create (&decodetid, NULL, thread_run, decoder);
+ pthread_create (&encodetid, NULL, thread_run, encoder);
+ pthread_create (&playertid, NULL, thread_run, player);
+}
+
+Camera::~Camera()
+{
+ // Signal to the threads to stop
+ running = 0;
+
+ pthread_join(decodetid, NULL);
+ pthread_join(playertid, NULL);
+ pthread_join(encodetid, NULL);
+
+ delete decoder;
+ delete encoder;
+ delete player;
+
+ sem_destroy(&encode_sem);
+ sem_destroy(&player_sem);
+
+ delete player_queue;
+ delete encode_queue;
+}
+
+void Camera::setCpr(char *newcpr)
+{
+ encoder->setCpr(newcpr);
+}
+
+
+void Camera::start()
+{
+ encoder->stop();
+}
+
+void Camera::stop()
+{
+ encoder->start();
+}
+
+void Camera::freeze()
+{
+ player->stop();
+ encoder->freeze();
+}
+
+void Camera::unfreeze()
+{
+ player->start();
+}
+
+void Camera::snapshot()
+{
+ encoder->shoot();
+}
+
+#endif/* USE_GUI */
diff --git a/src/camera.h b/src/camera.h
new file mode 100644
index 0000000..5190954
--- /dev/null
+++ b/src/camera.h
@@ -0,0 +1,81 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * camera.h
+ *
+ * Fri Oct 29 12:46:38 CEST 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#ifdef USE_GUI
+
+#ifndef __CAMERA_H__
+#define __CAMERA_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <avformat.h>
+
+#include "util.h"
+#include <queue.h>
+#include "decoder.h"
+#include "encoder.h"
+#include "player.h"
+
+#include "thread.h"
+#include "ffframe.h"
+#include <dvframe.h>
+
+#include <qwidget.h>
+
+class Camera {
+public:
+ Camera(const char *ip,
+ const int port);
+ ~Camera();
+ void setCpr(char *newcpr);
+ void start();
+ void stop();
+ void freeze();
+ void unfreeze();
+ void snapshot();
+
+private:
+ pthread_t playertid;
+ pthread_t decodetid;
+ pthread_t encodetid;
+ volatile int running;
+
+ Encoder *encoder;
+ Decoder *decoder;
+ Player *player;
+
+ Queue<DVFrame> *encode_queue;
+ Queue<FFFrame> *player_queue;
+ sem_t encode_sem;
+ sem_t player_sem;
+ pthread_mutex_t mutex;// = PTHREAD_MUTEX_INITIALIZER;
+};
+
+
+#endif/*__CAMERA_H__*/
+
+#endif/* USE_GUI */
diff --git a/src/cprquerydialog.cc b/src/cprquerydialog.cc
new file mode 100644
index 0000000..d5d3c44
--- /dev/null
+++ b/src/cprquerydialog.cc
@@ -0,0 +1,376 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * cprquerydialog.cc
+ *
+ * Sat Feb 19 17:05:43 CET 2005
+ * Copyright 2005 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#ifdef USE_GUI
+
+#include <qframe.h>
+
+#include "messagebox.h"
+#include "cprquerydialog.h"
+#include "miav_config.h"
+
+CPRQueryDialog::CPRQueryDialog(QLabel *lcpr,
+ QLabel *lname,
+ QWidget *parent,
+ const char *name,
+ bool modal)
+ : QDialog( parent, name, modal)
+{
+ MiavConfig cfg("cprquery.conf");
+
+ lbl_name = lname;
+ lbl_cpr = lcpr;
+
+ //Read configuration
+ CPR_HOST = cfg.readString("cpr_host");
+ CPR_PORT = cfg.readInt("cpr_port");
+
+ cpr[0] = '\0';
+ internalCpr[0] = '\0';
+
+ cprSocket = new QSocket(this);
+ connect(cprSocket, SIGNAL(readyRead()), SLOT(cprSocket_readyRead()));
+ connect(cprSocket, SIGNAL(connected()), SLOT(cprSocket_connected()));
+ ccw = new MessageBox(this, "Confirm", "Ugyldigt CPR nummer, brug det alligevel?", TYPE_YES_NO_CANCEL);
+ /*
+
+ // connect(btn_cpr, SIGNAL(clicked()), SLOT(bcancel_clicked()));
+
+ //show();
+ //run(0);
+ */
+
+ lbl_cpr->setText("Indtast CPR");
+
+ // Generate input buttons
+ //digits = pos;
+
+ QFrame *topf = new QFrame(this);
+ topf->setFrameStyle(QFrame::Box | QFrame::Raised);
+ topf->setLineWidth(3);
+ QHBoxLayout *bl = new QHBoxLayout(this);
+ bl->addWidget(topf);
+
+ QGridLayout *gl = new QGridLayout(topf, 4, 3, 10, 2);
+ QButton *b1 = createButton(topf, "1", 1);
+ QButton *b2 = createButton(topf, "2", 2);
+ QButton *b3 = createButton(topf, "3", 3);
+ QButton *b4 = createButton(topf, "4", 4);
+ QButton *b5 = createButton(topf, "5", 5);
+ QButton *b6 = createButton(topf, "6", 6);
+ QButton *b7 = createButton(topf, "7", 7);
+ QButton *b8 = createButton(topf, "8", 8);
+ QButton *b9 = createButton(topf, "9", 9);
+ QButton *b0 = createButton(topf, "0", 0);
+ QButton *bbs = createButton(topf, "<-", 10);
+ QButton *bca = createButton(topf, "CA", 11);
+
+ gl->addWidget(b1, 0,0);
+ gl->addWidget(b2, 0,1);
+ gl->addWidget(b3, 0,2);
+ gl->addWidget(b4, 1,0);
+ gl->addWidget(b5, 1,1);
+ gl->addWidget(b6, 1,2);
+ gl->addWidget(b7, 2,0);
+ gl->addWidget(b8, 2,1);
+ gl->addWidget(b9, 2,2);
+ gl->addWidget(b0, 3,1);
+ gl->addWidget(bbs, 3,2);
+ gl->addWidget(bca, 3,0);
+
+ /* Setup signals */
+ connect(b1, SIGNAL(clicked()), SLOT(b_1_clicked()));
+ connect(b2, SIGNAL(clicked()), SLOT(b_2_clicked()));
+ connect(b3, SIGNAL(clicked()), SLOT(b_3_clicked()));
+ connect(b4, SIGNAL(clicked()), SLOT(b_4_clicked()));
+ connect(b5, SIGNAL(clicked()), SLOT(b_5_clicked()));
+ connect(b6, SIGNAL(clicked()), SLOT(b_6_clicked()));
+ connect(b7, SIGNAL(clicked()), SLOT(b_7_clicked()));
+ connect(b8, SIGNAL(clicked()), SLOT(b_8_clicked()));
+ connect(b9, SIGNAL(clicked()), SLOT(b_9_clicked()));
+ connect(b0, SIGNAL(clicked()), SLOT(b_0_clicked()));
+ connect(bbs,SIGNAL(clicked()), SLOT(b_b_clicked()));
+ connect(bca,SIGNAL(clicked()), SLOT(b_c_clicked()));
+
+ this->move(175,150);
+ show();
+}
+
+CPRQueryDialog::~CPRQueryDialog()
+{
+ delete ccw;
+}
+
+QPushButton *CPRQueryDialog::createButton(QWidget *parent, const char *text, int value)
+/* A genric button-creater */
+{
+ char buf[32];
+ sprintf(buf, "%d", value);
+ QPushButton *q = new QPushButton(this, buf);
+
+ QFont f("Lucida", 48);
+ q->setFixedSize(150, 100);
+ q->setText(text);
+ q->setFont(f);
+ return q;
+}
+
+/* Event function for handling buttonclicks.
+ * For button 0-9 the values is sent back.
+ * Backspace and clear are handled via special
+ * signals.
+ * When 10 digits has been input we close the form
+ */
+void CPRQueryDialog::b_1_clicked() { insert_digit(1); }
+void CPRQueryDialog::b_2_clicked() { insert_digit(2); }
+void CPRQueryDialog::b_3_clicked() { insert_digit(3); }
+void CPRQueryDialog::b_4_clicked() { insert_digit(4); }
+void CPRQueryDialog::b_5_clicked() { insert_digit(5); }
+void CPRQueryDialog::b_6_clicked() { insert_digit(6); }
+void CPRQueryDialog::b_7_clicked() { insert_digit(7); }
+void CPRQueryDialog::b_8_clicked() { insert_digit(8); }
+void CPRQueryDialog::b_9_clicked() { insert_digit(9); }
+void CPRQueryDialog::b_0_clicked() { insert_digit(0);}
+void CPRQueryDialog::b_b_clicked() { remove_digit();}
+void CPRQueryDialog::b_c_clicked() { remove_all();}
+
+void CPRQueryDialog::b_clicked(int value)
+{
+ printf("%d\n", value);
+ switch(value) {
+ case 10:
+ if (digits>0) digits--;
+ emit bbs_clicked();
+ break;
+ case 11:
+ digits = 0;
+ emit bca_clicked();
+ break;
+ default:
+ digits++;
+ emit number_clicked(value);
+ }
+ if (digits == 10){
+ digits = 0;
+ accept();
+ }
+}
+
+void CPRQueryDialog::run(int pos)
+/* This is where the mgui thread starts.
+ * Open a inputwindow and prepare to receive a cpr
+ */
+{
+
+ // iw = new CPRQueryDialog(this, "Input", true, pos);
+
+
+ // TODO : Reconnect
+ /*
+ if (this->exec() == QDialog::Accepted) {
+#ifdef WITH_DV
+ camera->setCpr(cpr);
+#endif
+ verifycpr(cpr);
+ }
+ */
+}
+
+void CPRQueryDialog::remove_digit()
+/* Remove one digit from the selected cpr
+ * Used when the user pushes backspace in
+ * the inputwindow
+ */
+{
+ int temp;
+ temp = strlen(cpr);
+ if (temp == 7) /* Remove two characters due to the hyphen */
+ strcpy(cpr+temp-2, "\0");
+ else if ((temp >0) && (temp <=11))
+ strcpy(cpr+temp-1, "\0");
+ lbl_cpr->setText(cpr);
+}
+
+void CPRQueryDialog::remove_all()
+/* Clear the selected cpr */
+{
+ strcpy(cpr, "");
+ lbl_cpr->setText(cpr);
+}
+
+void CPRQueryDialog::insert_digit(int value)
+/* Respond to what the user types in the inputWindow */
+{
+ char temp[2];
+ switch(strlen(cpr)) {
+ case 5: // Automaticaly add a hyphen after the sixth digit
+ sprintf(temp, "%d-", value);
+ strcat(cpr, temp);
+ lbl_cpr->setText(cpr);
+ break;
+ case 10:
+ sprintf(temp, "%d", value);
+ strcat(cpr, temp);
+ lbl_cpr->setText(cpr);
+ verifycpr(cpr);
+ break;
+ default:
+ sprintf(temp, "%d", value);
+ strcat(cpr, temp);
+ lbl_cpr->setText(cpr);
+ break;
+ }
+}
+
+void CPRQueryDialog::verifycpr(char *cpr)
+/* Test a cpr via test_cpr().
+ * If cpr is invalid, then ask user what
+ * to do via confirmCprWindow
+ */
+{
+ strncpy(internalCpr, cpr, 6);
+ strncpy(internalCpr+6, cpr+7, 4);
+ internalCpr[10] = 0;
+
+ if (!(test_cpr(internalCpr))) {
+ switch(ccw->exec()) {
+ case MSG_CANCEL:
+ bedit_clicked();
+ break;
+ case MSG_NO:
+ bcancel_clicked();
+ break;
+ case MSG_YES:
+ accept();
+ break;
+ }
+ } else {
+ cprSocket->connectToHost(CPR_HOST->c_str(), CPR_PORT);
+ accept();
+ }
+}
+
+
+void CPRQueryDialog::bcancel_clicked()
+/* Clears all data - alerts user if measurements are not stored */
+{
+ cpr[0]= '\0';
+ lbl_cpr->setText("Indtast CPR");
+ lbl_name->setText("");
+ run(0);
+}
+
+void CPRQueryDialog::bedit_clicked()
+/* This is used when the user enters a cpr that is not valid and wishes to edit
+ * the cpr.
+ */
+{
+ cpr[10]= '\0';
+ lbl_cpr->setText(cpr);
+ lbl_name->setText("");
+ run(9);
+}
+
+
+int CPRQueryDialog::test_cpr(const char *s)
+/* Checks that a cpr i valid via a modulo11 test */
+{
+ int sum = 0;
+ int ctl;
+ const char *cptr;
+
+ if(strlen(s) != 10)
+ return 0;
+
+ for(cptr = s; *cptr; cptr++)
+ {
+ if(!isdigit(*cptr))
+ return 0;
+ }
+ sum += (s[0] - '0') * 4;
+ sum += (s[1] - '0') * 3;
+ sum += (s[2] - '0') * 2;
+ sum += (s[3] - '0') * 7;
+ sum += (s[4] - '0') * 6;
+ sum += (s[5] - '0') * 5;
+ sum += (s[6] - '0') * 4;
+ sum += (s[7] - '0') * 3;
+ sum += (s[8] - '0') * 2;
+ ctl = 11 - (sum % 11);
+ if(ctl == 11)
+ ctl = 0;
+ return s[9] - '0' == ctl;
+}
+
+void CPRQueryDialog::cprSocket_readyRead()
+/* Uses a patients cpr to look up his or hers name
+ * via the departments cpr-server.
+ * This is called by the cprSocket when the socket is ready
+ */
+{
+ QString name;
+ QString firstname;
+ QString lastname;
+ int timeout = 0;
+ if (!cprSocket->canReadLine())
+ return;
+ while(cprSocket->canReadLine()) {
+ QString s = cprSocket->readLine();
+ if (s.startsWith("0001")) {
+ name.append(s.right(s.length()-4));
+ lastname.append(s.right(s.length()-4));
+ name.setLength(name.length()-1);
+ if (name.length())
+ name += QString(", ");
+
+ }
+ if (s.startsWith("0002")) {
+ name.append(s.right(s.length()-4));
+ firstname.append(s.right(s.length()-4));
+ name.setLength(name.length()-1);
+ cprSocket->close();
+ lbl_name->setText(name);
+ return;
+ }
+ if (timeout>1000)
+ {
+ lbl_name->setText(NAME_NOT_AVAILABLE);
+ return;
+ }
+ timeout++;
+ }
+}
+
+
+void CPRQueryDialog::cprSocket_connected()
+/* Writes the selected cpr to the cpr-server
+ * when the cprSocket is connected.
+ */
+{
+ cprSocket->writeBlock(internalCpr, 10);
+ cprSocket->writeBlock("\n", 1);
+}
+
+#endif /* USE_GUI */
diff --git a/src/cprquerydialog.h b/src/cprquerydialog.h
new file mode 100644
index 0000000..56f800c
--- /dev/null
+++ b/src/cprquerydialog.h
@@ -0,0 +1,136 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * cprquerydialog.h
+ *
+ * Sat Feb 19 17:05:42 CET 2005
+ * Copyright 2005 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __MIAV_CPRQUERYDIALOG_H__
+#define __MIAV_CPRQUERYDIALOG_H__
+
+#define CPR_EDIT 8
+#define CPR_CLEAR 9
+#define NAME_NOT_AVAILABLE "Kunne ikke slå navn op i cpr-database"
+
+#include <config.h>
+#ifdef USE_GUI
+
+#include <qdialog.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qfont.h>
+
+#include <qwidget.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qdialog.h>
+#include <qlabel.h>
+
+#include <qsocket.h>
+#include <qtextedit.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+#include <qevent.h>
+
+#include <qpushbutton.h>
+
+#include <qwidget.h>
+#include <qlayout.h>
+#include <qdialog.h>
+
+#include <string>
+using namespace std;
+
+#include <qdialog.h>
+#include <qlabel.h>
+#include <qsocket.h>
+
+#include "messagebox.h"
+
+
+
+class CPRQueryDialog : public QDialog {
+ Q_OBJECT
+public:
+ CPRQueryDialog(QLabel *lcpr,
+ QLabel *lname,
+ QWidget * parent = 0,
+ const char * name = 0,
+ bool modal = FALSE);
+ ~CPRQueryDialog();
+
+public slots:
+ void bcancel_clicked();
+ void bedit_clicked();
+ void remove_digit();
+ void remove_all();
+ void insert_digit(int value);
+ void cprSocket_readyRead();
+ void cprSocket_connected();
+
+private:
+ QLabel *lbl_cpr;
+ QLabel *lbl_name;
+
+ MessageBox *ccw;
+
+ QSocket *cprSocket;
+ char cpr[12];
+ char internalCpr[11];
+
+ void verifycpr(char *cpr);
+ void run(int pos);
+ int test_cpr(const char *s);
+
+ /*Configuration*/
+ string *CPR_HOST;
+ int CPR_PORT;
+
+signals:
+ void bbs_clicked();
+ void bca_clicked();
+ void number_clicked(int);
+
+public slots:
+ void b_1_clicked();
+ void b_2_clicked();
+ void b_3_clicked();
+ void b_4_clicked();
+ void b_5_clicked();
+ void b_6_clicked();
+ void b_7_clicked();
+ void b_8_clicked();
+ void b_9_clicked();
+ void b_0_clicked();
+ void b_b_clicked();
+ void b_c_clicked();
+
+private:
+ void b_clicked(int value);
+ QPushButton *createButton(QWidget *parent, const char *text, int value);
+ int digits;
+};
+
+#endif/*__MIAV_CPRQUERYDIALOG_H__*/
+
+#endif /* USE_GUI */
diff --git a/src/decoder.cc b/src/decoder.cc
new file mode 100644
index 0000000..2171b1a
--- /dev/null
+++ b/src/decoder.cc
@@ -0,0 +1,171 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 Bent Bisballe
+ * Copyright (C) 2004 B. Stultiens
+ * Copyright (C) 2004 Koen Otter and Glenn van der Meyden
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <config.h>
+
+#include "decoder.h"
+
+Decoder::Decoder(char *device,
+ int channel,
+ sem_t *gencode_sem,
+ sem_t *gplayer_sem,
+ Queue<DVFrame> *gencode_queue,
+ Queue<FFFrame> *gplayer_queue,
+ pthread_mutex_t *gmutex,
+ volatile int *grunning)
+{
+ encode_sem = gencode_sem;
+ player_sem = gplayer_sem;
+ encode_queue = gencode_queue;
+ player_queue = gplayer_queue;
+ mutex = gmutex;
+ running = grunning;
+
+ AVFormatContext *ifc;
+ AVFormatParameters dvpars;
+ AVInputFormat *iformat;
+ AVCodec *dec_codec;
+
+ memset(&dvpars, 0, sizeof(dvpars));
+
+ if(!(iformat = av_find_input_format("dv1394"))) {
+ fprintf(stderr, "Failed to get input format dv1394\n");
+ exit(1);
+ }
+
+ dvpars.device = device; /* "/dev/dv1394"; */
+ dvpars.channel = channel;
+ dvpars.standard = "pal";
+
+ if(av_open_input_file(&ifc, "", iformat, 0, &dvpars) < 0) {
+ fprintf(stderr, "Device is in use\n");
+ fc = NULL; return;
+ }
+ if(av_find_stream_info(ifc) < 0) {
+ fprintf (stderr, "Could not find enough parameters\n");
+ fc = NULL; return;
+ }
+
+ dump_format(ifc, 1, "", 0);
+
+ if(!(dec_codec = avcodec_find_decoder(ifc->streams[0]->codec.codec_id))) {
+ printf("Unsupported codec for input stream \n");
+ fc = NULL; return;
+ }
+
+ if(avcodec_open(&ifc->streams[0]->codec, dec_codec) < 0) {
+ printf("Error while opening codec for input stream\n");
+ fc = NULL; return;
+ }
+
+ fc = ifc;
+}
+
+Decoder::~Decoder()
+{
+ avcodec_close(&fc->streams[0]->codec);
+ av_close_input_file(fc);
+}
+
+void Decoder::decode()
+{
+ if(fc == NULL) {
+ printf("Decoder not initialized.\n");
+ return;
+ }
+
+ while(*running) {
+ AVPacket pkt;
+ uint8_t *ptr;
+ int len;
+ SDL_Event user_event;
+
+ av_read_packet(fc, &pkt);
+ len = pkt.size;
+ ptr = pkt.data;
+ /* NOTE: we only decode video, we only need the data from stream_index 0 */
+ /* (stream 0: video, stream 1: audio) */
+
+ while(pkt.stream_index == 0 && len > 0) {
+ int ret;
+ int got_picture;
+ // buf_t *buf = buf_alloc();
+ FFFrame *fff = new FFFrame();
+ DVFrame *dvf = new DVFrame();
+ dvf->type = DVF_VIDEO;
+
+ memcpy(dvf->frame, ptr, len);
+
+ // fprintf(stderr, "DVBufferSize: [%d]bytes\n", len);
+ ret = avcodec_decode_video(&fc->streams[0]->codec,
+ fff->frame, &got_picture, ptr, len);
+
+ if(ret < 0) {
+ fprintf(stderr, "Error while decoding stream\n");
+ exit(1);
+ }
+
+ len -= ret;
+ ptr += ret;
+
+ pthread_mutex_lock(mutex);
+ encode_queue->push(dvf);
+ player_queue->push(fff);
+ pthread_mutex_unlock(mutex);
+
+ sem_post(encode_sem);
+
+ user_event.type = SDL_USEREVENT;
+ user_event.user.code = 0;
+ user_event.user.data1 = NULL;
+ user_event.user.data2 = NULL;
+ SDL_PushEvent(&user_event);
+ }
+
+ /* // For later use, when audio must be implemented
+ while(pkt.stream_index == 1 && len > 0) {
+ DVFrame *dvf = new DVFrame();
+ dvf->type = DVF_AUDIO;
+
+ memcpy(dvf->frame, ptr, sizeof(dvf->frame));
+
+ ptr += sizeof(dvf->frame);
+ len -= sizeof(dvf->frame);
+
+ pthread_mutex_lock(mutex);
+ encode_queue->push(dvf);
+ pthread_mutex_unlock(mutex);
+
+ sem_post(encode_sem);
+ }
+ */
+ av_free_packet(&pkt);
+ }
+
+ /* Kick the others so they wake up with empty queues */
+ sem_post(encode_sem);
+ pthread_exit(NULL);
+}
+
+void Decoder::run() {
+ decode();
+}
diff --git a/src/decoder.h b/src/decoder.h
new file mode 100644
index 0000000..ad323b1
--- /dev/null
+++ b/src/decoder.h
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 Bent Bisballe
+ * Copyright (C) 2004 B. Stultiens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <config.h>
+#ifndef __RTVIDEOREC_DECODER_H
+#define __RTVIDEOREC_DECODER_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <avformat.h>
+#include <SDL/SDL.h>
+
+#include <queue.h>
+#include "encoder.h"
+#include "player.h"
+
+#include "thread.h"
+#include "ffframe.h"
+#include <dvframe.h>
+
+class Decoder : public Thread {
+ public:
+ Decoder(char *device,
+ int channel,
+ sem_t *gencode_sem,
+ sem_t *gplayer_sem,
+ Queue<DVFrame> *gencode_queue,
+ Queue<FFFrame> *gplayer_queue,
+ pthread_mutex_t *gmutex,
+ volatile int *grunning);
+ ~Decoder();
+ void run();
+
+ AVFormatContext *fc;
+ sem_t *encode_sem;
+ sem_t *player_sem;
+ Queue<DVFrame> *encode_queue;
+ Queue<FFFrame> *player_queue;
+ pthread_mutex_t *mutex;
+ volatile int *running;
+
+ private:
+ void decode();
+};
+
+#endif
diff --git a/src/dvframe.cc b/src/dvframe.cc
new file mode 100644
index 0000000..229332c
--- /dev/null
+++ b/src/dvframe.cc
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * frame.cc
+ *
+ * Mon Nov 15 19:45:07 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+
+#include "dvframe.h"
+
+#include <memory.h>
+
+DVFrame::DVFrame()
+{
+ // frame = avcodec_alloc_frame();
+ memset(frame, 0, sizeof(frame));
+}
+
+DVFrame::~DVFrame()
+{
+ // av_free(frame);
+}
+
diff --git a/src/dvframe.h b/src/dvframe.h
new file mode 100644
index 0000000..a9e948c
--- /dev/null
+++ b/src/dvframe.h
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * frame.h
+ *
+ * Mon Nov 15 19:45:07 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#ifndef __DVFRAME_H__
+#define __DVFRAME_H__
+
+//#include <avformat.h>
+
+#define DVPACKAGE_SIZE 144000
+
+typedef enum {
+ DVF_AUDIO = 0x01,
+ DVF_VIDEO = 0x02
+} DVFrameType;
+
+
+class DVFrame {
+public:
+ DVFrame();
+ ~DVFrame();
+ DVFrameType type;
+ char frame[DVPACKAGE_SIZE];
+};
+
+#endif/*__DVFRAME_H__*/
diff --git a/src/encoder.cc b/src/encoder.cc
new file mode 100644
index 0000000..3da7443
--- /dev/null
+++ b/src/encoder.cc
@@ -0,0 +1,158 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 Bent Bisballe
+ * Copyright (C) 2004 B. Stultiens
+ * Copyright (C) 2004 Koen Otter and Glenn van der Meyden
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <config.h>
+#include "encoder.h"
+
+Encoder::Encoder(const char *gip,
+ const int gport,
+ sem_t *gsem,
+ Queue<DVFrame> *gqueue,
+ pthread_mutex_t *gmutex,
+ volatile int *grunning)
+{
+ sprintf(ip, gip);
+ port = gport;
+ memset(cpr, 0, sizeof(cpr));
+
+ printf("[ip: %s]\n", ip);
+ printf("[port: %d]\n", port);
+
+ sem = gsem;
+ queue = gqueue;
+ mutex = gmutex;
+ running = grunning;
+
+ record = 0;
+
+ sem_init(&record_sem, 0, 0);
+
+ s = NULL;
+ n = NULL;
+
+ shoot_request = 0;
+ shoot_value = 0;
+ freeze_request = 0;
+ freeze_value = 0;
+
+}
+
+Encoder::~Encoder()
+{
+ if(n) delete n;
+ if(s) delete s;
+}
+
+
+void Encoder::setCpr(char *newcpr)
+{
+ sprintf(cpr, newcpr);
+}
+
+
+void Encoder::encode()
+{
+ DVFrame *f;
+
+ while(*running) {
+ sem_wait(sem);
+
+ /*
+ pthread_mutex_lock(mutex);
+ while((f = queue->pop())) delete f;
+ pthread_mutex_unlock(mutex);
+
+ while(record) {
+ sem_wait(sem);
+ */
+
+ pthread_mutex_lock(mutex);
+ f = queue->pop();
+ pthread_mutex_unlock(mutex);
+
+ if((f && record) || (freeze_request != freeze_value) || (shoot_request != shoot_value)) {
+ fprintf(stderr, "Rec!\n");
+ n_header h;
+
+ h.header_type = DATA_HEADER;
+ sprintf(h.header.h_data.cpr, cpr);
+ h.header.h_data.freeze = (freeze_request != freeze_value);
+ h.header.h_data.snapshot = (shoot_request != shoot_value);
+ h.header.h_data.record = record;
+
+ if(freeze_request != freeze_value) freeze_value = freeze_request;
+ if(shoot_request != shoot_value) shoot_value = shoot_request;
+
+ n->sendPackage(&h, f->frame, sizeof(f->frame));
+ }
+
+ if(f) delete f;
+ //}
+ }
+ pthread_exit(NULL);
+}
+
+void Encoder::freeze()
+{
+ if(!s) {
+ s = new Socket(port);
+ s->sconnect(ip);
+ n = new Network(s);
+ }
+ freeze_request = 1 - freeze_request;
+}
+
+void Encoder::shoot()
+{
+ if(!s) {
+ s = new Socket(port);
+ s->sconnect(ip);
+ n = new Network(s);
+ }
+ shoot_request = 1 - shoot_request;
+}
+
+void Encoder::run() {
+ encode();
+}
+
+void Encoder::start() {
+ printf("GO!\n");
+ if(!s) {
+ s = new Socket(port);
+ s->sconnect(ip);
+ n = new Network(s);
+ }
+ record = 1;
+}
+
+void Encoder::stop() {
+ printf("STOP!\n");
+ if(s) {
+ if(n) delete n;
+ delete s;
+ s = NULL;
+ n = NULL;
+ }
+ record = 0;
+}
diff --git a/src/encoder.h b/src/encoder.h
new file mode 100644
index 0000000..d517ff5
--- /dev/null
+++ b/src/encoder.h
@@ -0,0 +1,89 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 Bent Bisballe
+ * Copyright (C) 2004 B. Stultiens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <config.h>
+#ifndef __RTVIDEOREC_ENCODER_H
+#define __RTVIDEOREC_ENCODER_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <avformat.h>
+
+#include <miav.h>
+
+#include "util.h"
+#include <queue.h>
+
+#include "thread.h"
+#include <dvframe.h>
+
+#define VIDEO_BUFFER_SIZE (1024*1024) /* FIXME: One size fits all... */
+
+
+
+class Encoder : public Thread {
+ public:
+ Encoder(const char *gip,
+ const int gport,
+ sem_t *gsem,
+ Queue<DVFrame> *gqueue,
+ pthread_mutex_t *gmutex,
+ volatile int *grunning);
+ ~Encoder();
+
+ void setCpr(char *newcpr);
+
+ void start();
+ void stop();
+
+ void freeze();
+ void shoot();
+
+ void run();
+
+ AVFormatContext *fc;
+ sem_t *sem;
+ Queue<DVFrame> *queue;
+ pthread_mutex_t *mutex;
+ volatile int *running;
+
+ private:
+ int port;
+ char ip[32];
+ char cpr[32];
+
+ volatile int record;
+
+ volatile int shoot_request;
+ int shoot_value;
+ volatile int freeze_request;
+ int freeze_value;
+
+ sem_t record_sem;
+ void encode();
+
+ Socket *s;
+ Network *n;
+};
+
+#endif
+
diff --git a/src/ffframe.cc b/src/ffframe.cc
new file mode 100644
index 0000000..cdce5ae
--- /dev/null
+++ b/src/ffframe.cc
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * frame.cc
+ *
+ * Mon Nov 15 19:45:07 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include "ffframe.h"
+
+FFFrame::FFFrame()
+{
+ frame = avcodec_alloc_frame();
+}
+
+FFFrame::~FFFrame()
+{
+ av_free(frame);
+}
+
diff --git a/src/ffframe.h b/src/ffframe.h
new file mode 100644
index 0000000..5b02780
--- /dev/null
+++ b/src/ffframe.h
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * frame.h
+ *
+ * Mon Nov 15 19:45:07 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#ifndef __FFFRAME_H__
+#define __FFFRAME_H__
+
+#include <avformat.h>
+
+class FFFrame {
+public:
+ FFFrame();
+ ~FFFrame();
+ AVFrame *frame;
+};
+
+#endif/*__FFFRAME_H__*/
diff --git a/src/img_encoder.cc b/src/img_encoder.cc
new file mode 100644
index 0000000..2f6d8b7
--- /dev/null
+++ b/src/img_encoder.cc
@@ -0,0 +1,161 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 Bent Bisballe
+ * Copyright (C) 2004 B. Stultiens
+ * Copyright (C) 2004 Koen Otter and Glenn van der Meyden
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "img_encoder.h"
+#include <stdio.h>
+//#include <setjmp.h>
+
+//av_alloc_format_context
+//av_destruct_packet_nofree
+
+ImgEncoder::ImgEncoder()
+{
+ //////////////////// GLOBAL INIT
+ av_register_all();
+
+ //////////////////// DECODE INIT
+ AVCodec *deccodec;
+
+ // find the dvvideo decoder
+ deccodec = avcodec_find_decoder(CODEC_ID_DVVIDEO);
+ if (!deccodec) {
+ fprintf(stderr, "codec not found\n");
+ exit(1);
+ }
+
+ dcc= avcodec_alloc_context();
+
+ // open it
+ if (avcodec_open(dcc, deccodec) < 0) {
+ fprintf(stderr, "could not open codec\n");
+ exit(1);
+ }
+}
+
+ImgEncoder::~ImgEncoder()
+{
+ // FIXME: free: deccodec and dcc
+}
+
+void ImgEncoder::encode(DVFrame *dvframe,
+ char *filename,
+ int quality)
+{
+ int ret;
+ AVFrame *rawframe = avcodec_alloc_frame();
+
+ ///////////////////////// DECODE
+ uint8_t *ptr;
+ int got_picture = 1;
+ int len;
+
+ ptr = (uint8_t *)dvframe->frame;
+ len = sizeof(dvframe->frame);
+
+ ret = avcodec_decode_video(dcc, rawframe, &got_picture, ptr, len);
+
+ if(!ret) {
+ printf("Decoder fuckup!\n");
+ return;
+ }
+
+ // TODO: Do image convertion here!
+ AVPicture pict;
+ avpicture_alloc(&pict,PIX_FMT_RGB24, 720, 576);
+
+ img_convert(&pict, PIX_FMT_RGB24, (AVPicture *)rawframe,
+ PIX_FMT_YUV420P, 720, 576);
+ printf("converted\n");
+ writeJPEGFile(filename, quality, (JSAMPLE*)(pict.data[0]), 720, 576);
+ printf("written\n");
+
+ avpicture_free(&pict);
+ av_free(rawframe);
+}
+///////////////////////////////////////////////////////////////////////////////////////////
+
+void ImgEncoder::writeJPEGFile(char *filename,
+ int quality,
+ JSAMPLE * image_buffer, // Points to large array of R,G,B-order data
+ int image_width, // Number of columns in image
+ int image_height // Number of rows in image
+)
+{
+ /*
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+
+ FILE * outfile; // target file
+ JSAMPROW row_pointer[1]; // pointer to JSAMPLE row[s]
+ int row_stride; // physical row width in image buffer
+
+ // Step 1: allocate and initialize JPEG compression object
+ cinfo.err = jpeg_std_error(&jerr);
+ jpeg_create_compress(&cinfo);
+
+ // Step 2: specify data destination (eg, a file)
+ if ((outfile = fopen(filename, "wb")) == NULL) {
+ fprintf(stderr, "can't open %s\n", filename);
+ exit(1);
+ }
+ jpeg_stdio_dest(&cinfo, outfile);
+
+ // Step 3: set parameters for compression
+ cinfo.image_width = image_width; // image width and height, in pixels
+ cinfo.image_height = image_height;
+ cinfo.input_components = 3; // # of color components per pixel
+/*
+typedef enum {
+ JCS_UNKNOWN, // error/unspecified
+ JCS_GRAYSCALE, // monochrome
+ JCS_RGB, // red/green/blue
+ JCS_YCbCr, // Y/Cb/Cr (also known as YUV)
+ JCS_CMYK, // C/M/Y/K
+ JCS_YCCK // Y/Cb/Cr/K
+} J_COLOR_SPACE;
+* /
+ cinfo.in_color_space = JCS_RGB; // colorspace of input image
+
+ jpeg_set_defaults(&cinfo);
+
+ jpeg_set_quality(&cinfo, quality, TRUE); // limit to baseline-JPEG values
+
+ // Step 4: Start compressor
+ jpeg_start_compress(&cinfo, TRUE);
+
+ // Step 5: while (scan lines remain to be written)
+ row_stride = image_width * 3; // JSAMPLEs per row in image_buffer
+
+ while (cinfo.next_scanline < cinfo.image_height) {
+ row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride];
+ (void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
+ }
+
+ // Step 6: Finish compression
+ jpeg_finish_compress(&cinfo);
+ fclose(outfile);
+
+ // Step 7: release JPEG compression object
+ jpeg_destroy_compress(&cinfo);
+ */
+}
diff --git a/src/img_encoder.h b/src/img_encoder.h
new file mode 100644
index 0000000..7f1da7e
--- /dev/null
+++ b/src/img_encoder.h
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 Bent Bisballe
+ * Copyright (C) 2004 B. Stultiens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef __RTVIDEOREC_IMGENCODER_H
+#define __RTVIDEOREC_IMGENCODER_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <avformat.h>
+#include <jpeglib.h>
+
+#include <dvframe.h>
+
+#include "util.h"
+
+#define VIDEO_BUFFER_SIZE (1024*1024) // FIXME: One size fits all...
+
+class ImgEncoder {
+ public:
+ ImgEncoder();
+ ~ImgEncoder();
+ void encode(DVFrame *frame, char* filename, int quality);
+ void writeJPEGFile(char *filename,
+ int quality,
+ JSAMPLE * image_buffer, // Points to large array of R,G,B-order data
+ int image_width, // Number of columns in image
+ int image_height); // Number of rows in image
+
+ private:
+ // Decoder
+ AVFormatContext *dfc;
+ AVCodecContext *dcc;
+
+ // Encoder
+ AVFormatContext *efc;
+ AVCodecContext *ecc;
+ AVPacket epkt;
+ unsigned char *video_buffer;
+ // AVPacket pkt;
+};
+
+#endif
+
diff --git a/src/mainwindow.cc b/src/mainwindow.cc
new file mode 100644
index 0000000..77b8d94
--- /dev/null
+++ b/src/mainwindow.cc
@@ -0,0 +1,305 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * mainwindow.cc
+ *
+ * Sat Aug 21 19:49:34 2004
+ * Copyright 2004 deva
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#ifdef USE_GUI
+
+#include "mainwindow.h"
+
+#include <qpainter.h>
+#include <qpicture.h>
+
+#include <qpushbutton.h>
+#include <qfont.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qlayout.h>
+#include <qstatusbar.h>
+
+//#include "mgui_alert.h"
+//#include "mgui_datasocket.h"
+
+#include "miav_config.h"
+
+#include <config.h>
+//"miav-grab.h"
+
+
+//#define WITH_DV
+MainWindow::MainWindow( QWidget* parent, const char* name )
+ : QWidget( parent, name, WStyle_Customize | WStyle_NoBorder )
+{
+ // statusBar();
+ // statusBar()->message("fisk");
+ // statusBar()->setSizeGripEnabled(false);
+
+ MiavConfig cfg("miav.conf");
+ /** /
+ int resolution_w = 1280; // TODO: Read actual resolution
+ int resolution_h = 1024; // TODO: Read actual resolution
+ /**/
+ /**/
+ int resolution_w = 1024; // TODO: Read actual resolution
+ int resolution_h = 768; // TODO: Read actual resolution
+ /**/
+ unit = ((float)resolution_w / (float)(cfg.readFloat("screensize") * 3.1f));
+
+ move(0,0);
+ resize(resolution_w, resolution_h);
+
+ // Load images
+ pix_record = new QPixmap();
+ pix_record->load( "record.png" );
+/*
+ QPainter *paint = new QPainter();
+ QPicture *pic = new QPicture();
+ pic->load(fname, "svg");
+ paint->begin(this);
+ paint->setWindow(pic->boundingRect());
+ paint->drawPicture(0, 0, *pic);
+ paint->end();
+ */
+
+ pix_stop = new QPixmap();
+ pix_stop->load( "stop.png" );
+
+ pix_camera = new QPixmap();
+ pix_camera->load( "camera.png" );
+
+ pix_dummy = new QPixmap();
+ pix_dummy->load( "dummy.png" );
+
+ pix_logo = new QPixmap();
+ pix_logo->load( "miav-logo-64x64.png" );
+
+ createGui();
+ show();
+
+ // camera = new Camera("192.168.0.10", 30000);
+
+ recording = false;
+ frozen = false;
+
+ aboutwindow = NULL;
+
+ // CPRQueryDialog dlg(lbl_cpr, lbl_name, this, "CPRQueryDialog");
+ // dlg.exec();
+ // Open the CPR Dialog
+ cpr_clicked();
+}
+
+MainWindow::~MainWindow()
+{
+ if(camera) delete camera;
+ delete btn_cpr;
+ if(aboutwindow) delete aboutwindow;
+}
+
+void MainWindow::createGui()
+{
+ // Layout widgets
+
+ /* _________________________________________________
+ *(0) __________________________ | ______________ |
+ * | | | | | | | | |
+ * |(1) | | | |(2) | |
+ * | | | | | | | | |
+ * | | | | | | | | |
+ * | | | | | | |______________| |
+ * | | | | | | | | |
+ * | | | | | | | | |
+ * | | | | | | | | |
+ * | |________|________|________| | | | |
+ * | | | | | | |______________| |
+ * | |________|________|________| | | | |
+ * | | | | | | | | |
+ * | |________|________|________| | | | |
+ * | | | | | | | | |
+ * | |________|________|________| | |______________| |
+ * |______________________________|__________________|
+ * |______________________________|__________________|
+ */
+
+ QGridLayout *g0 = new QGridLayout(this, 2, 2, 0, -1, "g0");
+ QGridLayout *g1 = new QGridLayout(3, 4, -1, "g1");
+ g0->addLayout(g1, 0, 0);
+ QGridLayout *g2 = new QGridLayout(1, NUM_HISTORY, -1, "g2");
+ g0->addLayout(g2, 0, 1);
+
+ img_recedge = new QLabel(this);
+ img_recedge->setBackgroundColor(QColor(160,160,160));
+ img_recedge->setFixedSize(740,596);
+
+ img_live = new VideoWidget(img_recedge);
+ // img_live->setErasePixmap( *pix_dummy );
+ img_live->setFixedSize(720,576);
+ img_live->move(10,10);
+ g1->addMultiCellWidget ( img_recedge, 0, 0, 0, 2, Qt::AlignHCenter);
+
+ // CPR/NAME LABEL + CPR button
+ lbl_cpr = createLabel("200379-1613", 18, 3);
+ g1->addMultiCellWidget ( lbl_cpr, 1, 1, 0, 1);
+
+ btn_cpr = createButton("NYT CPR", 8, 3);
+ btn_cpr->setFocus();
+ QObject::connect( btn_cpr, SIGNAL(clicked()), this, SLOT(cpr_clicked()) );
+ // Will also be connected in the MGUI code
+ g1->addWidget(btn_cpr, 1, 2);
+
+ lbl_name = createLabel("Bent Bisballe Kjær Nyeng Jensen", 18, 2);
+ g1->addMultiCellWidget ( lbl_name, 2, 2, 0, 2);
+
+ // Rec + Shot + Freeze buttons
+ btn_rec = createButton("", 8, 3);
+ btn_rec->setPixmap(*pix_record);
+ QObject::connect( btn_rec, SIGNAL(clicked()), this, SLOT(rec_clicked()) );
+ g1->addWidget(btn_rec, 3, 0);
+
+ btn_shoot = createButton("", 8, 3);
+ btn_shoot->setPixmap(*pix_camera);
+ QObject::connect( btn_shoot, SIGNAL(clicked()), this, SLOT(shoot_clicked()) );
+ g1->addWidget(btn_shoot, 3, 1);
+
+ btn_freeze = createButton("FREEZE", 8, 3);
+ // btn_freeze->setPixmap(*pix_logo);
+ QObject::connect( btn_freeze, SIGNAL(clicked()), this, SLOT(freeze_clicked()) );
+ g1->addWidget(btn_freeze, 3, 2);
+
+ // History widgets
+ for(int i = 0; i < NUM_HISTORY; i++) {
+ img_history[i] = new QLabel(this);
+ img_history[i]->setPixmap(*pix_dummy);
+ img_history[i]->setFixedSize(240,192);
+ g2->addWidget(img_history[i], i, 0, Qt::AlignHCenter);
+ }
+
+ // Statusbar
+ lbl_status = createLabel("STATUS", 18, 1);
+ lbl_status->setFrameStyle(QFrame::TabWidgetPanel | QFrame::Sunken);
+ lbl_status->setLineWidth(1);
+ g0->addWidget(lbl_status, 4, 0);
+
+ lbl_version = createLabel("MIaV-Grab v" VERSION, 18, 1);
+ lbl_version->setFrameStyle(QFrame::TabWidgetPanel | QFrame::Sunken);
+ lbl_version->setLineWidth(1);
+ lbl_version->setFixedHeight((int)unit);
+ g0->addWidget(lbl_version, 4, 1);
+
+ /* // About icon
+ btn_logo = new QPushButton("", this);
+ btn_logo->setPixmap(*pix_logo);
+ btn_logo->setFixedSize(74,74);
+ btn_logo->move(940,10);
+ btn_logo->setFlat(true);
+ QObject::connect( btn_logo, SIGNAL(clicked()), this, SLOT(logo_clicked()) );
+ */
+ //lbl_version->setFont( QFont( "Arial", 8, QFont::Light ) );
+ //lbl_version->setFixedSize(90,10);
+ //lbl_version->move(928,81);
+
+}
+
+QPushButton *MainWindow::createButton(char *caption, int width, int height)
+{
+ QPushButton *btn = new QPushButton(caption, this);
+ btn->setFont( QFont( "Arial", (int)(unit * height / 2), QFont::Bold ) );
+ btn->setFixedHeight((int)(unit * height));
+ return btn;
+}
+
+QLabel *MainWindow::createLabel(char *caption, int width, int height)
+{
+ QLabel *lbl = new QLabel(caption, this);
+ lbl->setFont( QFont( "Arial", (int)(unit * height / 2), (height>1)?QFont::Bold:QFont::Normal ) );
+ lbl->setFixedHeight((int)(unit * height));
+ return lbl;
+}
+
+void MainWindow::message(char *msg)
+{
+ lbl_status->setText(msg);
+}
+
+void MainWindow::logo_clicked()
+{
+ if(aboutwindow)
+ delete aboutwindow;
+ aboutwindow = new AboutWindow(0, "About MIAV-Grab");
+}
+
+void MainWindow::cpr_clicked()
+{
+ CPRQueryDialog dlg(lbl_cpr, lbl_name, this, "CPRQueryDialog");
+ printf("Cpr Dialog returned: %d\n", dlg.exec());
+}
+
+void MainWindow::rec_clicked()
+{
+ recording = 1 - recording;
+ if(recording) {
+ img_recedge->setBackgroundColor(red);
+ btn_rec->setPixmap(*pix_stop);
+ camera->stop();
+ } else {
+ img_recedge->setBackgroundColor(QColor(160,160,160));
+ btn_rec->setPixmap(*pix_record);
+ camera->start();
+ }
+}
+
+void MainWindow::shoot_clicked()
+{
+ QImage image;
+
+ camera->snapshot();
+
+ image = img_live->getScreenshot();
+ image = image.smoothScale(img_history[0]->width(), img_history[0]->height());
+
+ QPixmap pixmap;
+ for(int cnt = (NUM_HISTORY-1); cnt > 0; cnt--) {
+ pixmap = *img_history[cnt-1]->pixmap();
+ img_history[cnt]->setPixmap(pixmap);
+ }
+ img_history[0]->setPixmap(image);
+
+ if(frozen) {
+ camera->unfreeze();
+ btn_freeze->setOn(false);
+ frozen = false;
+ }
+}
+
+void MainWindow::freeze_clicked()
+{
+ if(frozen) {
+ camera->unfreeze();
+ frozen = false;
+ } else {
+ camera->freeze();
+ frozen = true;
+ }
+}
+
+#endif /*USE_GUI*/
diff --git a/src/mainwindow.h b/src/mainwindow.h
new file mode 100644
index 0000000..51cdcca
--- /dev/null
+++ b/src/mainwindow.h
@@ -0,0 +1,100 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * mainwindow.h
+ *
+ * Sat Aug 21 19:50:13 2004
+ * Copyright 2004 deva
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#ifdef USE_GUI
+
+#ifndef __MAINWINDOW_H__
+#define __MAINWINDOW_H__
+
+#include <string>
+using namespace std;
+
+#include <qwidget.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+
+#include "aboutwindow.h"
+#include "videowidget.h"
+#include "camera.h"
+#include "cprquerydialog.h"
+
+#define NUM_HISTORY 3
+
+class MainWindow : public QWidget
+{
+ Q_OBJECT
+public:
+ MainWindow(QWidget* parent = 0, const char* name = 0);
+ ~MainWindow();
+
+ void message(char* msg);
+
+public slots:
+ void cpr_clicked();
+ void logo_clicked();
+ void rec_clicked();
+ void shoot_clicked();
+ void freeze_clicked();
+
+private:
+ void createGui();
+
+ Camera *camera;
+ AboutWindow *aboutwindow;
+
+ QPixmap *pix_camera;
+ QPixmap *pix_record;
+ QPixmap *pix_stop;
+ QPixmap *pix_dummy;
+ QPixmap *pix_logo;
+
+ QLabel *lbl_version;
+ QLabel *lbl_status;
+ QLabel *lbl_cpr;
+ QLabel *lbl_name;
+
+ QLabel *img_recedge;
+ QLabel *img_history[NUM_HISTORY];
+
+ QPushButton *btn_logo;
+ QPushButton *btn_cpr;
+ QPushButton *btn_rec;
+ QPushButton *btn_shoot;
+ QPushButton *btn_freeze;
+
+ VideoWidget *img_live;
+
+ bool recording;
+ bool frozen;
+
+ float unit;
+
+ QPushButton *createButton(char *caption, int width, int height);
+ QLabel *createLabel(char *caption, int width, int height);
+};
+
+#endif
+
+#endif /*USE_GUI*/
diff --git a/src/messagebox.cc b/src/messagebox.cc
new file mode 100644
index 0000000..47799b7
--- /dev/null
+++ b/src/messagebox.cc
@@ -0,0 +1,197 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * messagebox.cc
+ *
+ * Fri Feb 25 20:23:19 CET 2005
+ * Copyright 2005 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "messagebox.h"
+
+////////////////////////////////////////////////////////////////////////////////////////
+/* If the cpr input by the user is not valid, this dialog
+ * ask the user what to do. Edit the number, use it as it is,
+ * or clear the number.
+ */
+
+MessageBox::MessageBox(QWidget* parent, const char* name, const char* text, msg_type type)
+ : QDialog(parent, name, TRUE)
+{
+ QFrame *topf = new QFrame(this);
+ topf->setFrameStyle(QFrame::Box | QFrame::Raised);
+ topf->setLineWidth(3);
+ QVBoxLayout *bl = new QVBoxLayout(this);
+ bl->addWidget(topf);
+
+ QLabel *lbl_text = new QLabel(topf);
+ // text->setText("CPR ikke gyldigt, ønsker du at forsætte?");
+ lbl_text->setText(text);
+ lbl_text->setFont(QFont("Lucida", 18));
+ QFrame *f = new QFrame(topf);
+
+ QVBoxLayout *blayout = new QVBoxLayout(topf, 20, 20);
+ blayout->addWidget(lbl_text);
+ blayout->addWidget(f);
+
+ switch(type) {
+ case TYPE_OK: {
+ QPushButton *bok = createButton(f, "Ok");
+ QGridLayout *glayout = new QGridLayout(f, 1, 1, 20, 20);
+ glayout->addWidget(bok, 0, 0);
+ connect(bok, SIGNAL( clicked() ), SLOT(bok_clicked()));
+ break;
+ }
+ case TYPE_OK_CANCEL: {
+ QPushButton *bok = createButton(f, "Ok");
+ QPushButton *bcancel = createButton(f, "Cancel");
+ QGridLayout *glayout = new QGridLayout(f, 1, 2, 20, 20);
+ glayout->addWidget(bcancel, 0, 1);
+ glayout->addWidget(bok, 0, 2);
+ connect(bcancel, SIGNAL( clicked() ), SLOT(bcancel_clicked()));
+ connect(bok, SIGNAL( clicked() ), SLOT(bok_clicked()));
+ break;
+ }
+ case TYPE_YES_NO: {
+ QPushButton *byes = createButton(f, "Ja");
+ QPushButton *bno = createButton(f, "Nej");
+ QGridLayout *glayout = new QGridLayout(f, 1, 2, 20, 20);
+ glayout->addWidget(bno, 0, 0);
+ glayout->addWidget(byes, 0, 1);
+ connect(byes, SIGNAL( clicked() ), SLOT(byes_clicked()));
+ connect(bno, SIGNAL( clicked() ), SLOT(bno_clicked()));
+ break;
+ }
+ case TYPE_YES_NO_CANCEL: {
+ QPushButton *byes = createButton(f, "Ja");
+ QPushButton *bcancel = createButton(f, "Cancel");
+ QPushButton *bno = createButton(f, "Nej");
+ QGridLayout *glayout = new QGridLayout(f, 1, 3, 20, 20);
+ glayout->addWidget(bno, 0, 0);
+ glayout->addWidget(bcancel, 0, 1);
+ glayout->addWidget(byes, 0, 2);
+ connect(byes, SIGNAL( clicked() ), SLOT(byes_clicked()));
+ connect(bcancel, SIGNAL( clicked() ), SLOT(bcancel_clicked()));
+ connect(bno, SIGNAL( clicked() ), SLOT(bno_clicked()));
+ break;
+ }
+ }
+}
+
+QPushButton *MessageBox::createButton(QWidget *parent, const char *text)
+{
+ QPushButton *q = new QPushButton(parent);
+ q->setText(text);
+ q->setFont(QFont("Lucida", 18));
+ q->setFixedSize(200, 75);
+ return q;
+}
+
+void MessageBox::bok_clicked()
+{
+ done(MSG_OK);
+}
+
+void MessageBox::bcancel_clicked()
+{
+ done(MSG_CANCEL);
+}
+
+void MessageBox::byes_clicked()
+{
+ done(MSG_YES);
+}
+
+void MessageBox::bno_clicked()
+{
+ done(MSG_NO);
+}
+
+
+/*
+////////////////////////////////////////////////////////////////////////////////////////
+// A generic alert dialog that can either give the user a choice
+// (yes or no - returns true or false) or simply give a statement and await the users
+// acknowledgement (OK - returns true)
+//
+
+Alert::Alert(QWidget *parent, const char *text, bool single, const char* name, bool mode)
+: QDialog(parent, name, mode)
+// Sets up the dialog. Two buttons if mode=true otherwise one button
+{
+
+ QPushButton *b_true; ;
+ QPushButton *b_false;
+
+ QFrame *topf = new QFrame(this);
+ topf->setFrameStyle(QFrame::Box | QFrame::Raised);
+ topf->setLineWidth(3);
+ QVBoxLayout *bl1 = new QVBoxLayout(topf, 20, 20);
+
+ QLabel *l_text = new QLabel(topf);
+ QFont font("Lucida", 18);
+ l_text->setText(text);
+ l_text->setFont(font);
+
+ QFrame *f = new QFrame(topf);
+ QHBoxLayout *bl2 = new QHBoxLayout(f, 20, 20);
+
+
+ QVBoxLayout *toplayout = new QVBoxLayout(this);
+ toplayout->addWidget(topf);
+ bl1->addWidget(l_text);
+ bl1->addWidget(f);
+ if(!single)
+ {
+ b_true = createButton(f, M_YES);
+ b_false = createButton(f, M_NO);
+ bl2->addWidget(b_false);
+ bl2->addWidget(b_true);
+ connect(b_false, SIGNAL(clicked()), SLOT(false_clicked()));
+ connect(b_true, SIGNAL(clicked()), SLOT(true_clicked()));
+ }
+ else
+ {
+ b_true = createButton(f, M_OK);
+ bl2->addWidget(b_true);
+ connect(b_true, SIGNAL(clicked()), SLOT(true_clicked()));
+ }
+
+}
+
+QPushButton *Alert::createButton(QWidget *parent, const char *text)
+{
+ QPushButton *q = new QPushButton(parent);
+ QFont font("Lucida", 18);
+ q->setFont(font);
+ q->setText(text);
+ q->setFixedSize(200,75);
+ return q;
+}
+
+void Alert::true_clicked()
+{
+ accept();
+}
+
+void Alert::false_clicked()
+{
+ reject();
+}
+*/
diff --git a/src/messagebox.h b/src/messagebox.h
new file mode 100644
index 0000000..11a1c05
--- /dev/null
+++ b/src/messagebox.h
@@ -0,0 +1,66 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * messagebox.h
+ *
+ * Fri Feb 25 20:23:19 CET 2005
+ * Copyright 2005 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __MIAV_MESSAGEBOX_H__
+#define __MIAV_MESSAGEBOX_H__
+
+#include <qdialog.h>
+#include <qwidget.h>
+#include <qframe.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+
+typedef enum {
+ MSG_YES,
+ MSG_NO,
+ MSG_CANCEL,
+ MSG_OK
+} msg_val;
+
+typedef enum {
+ TYPE_OK,
+ TYPE_OK_CANCEL,
+ TYPE_YES_NO,
+ TYPE_YES_NO_CANCEL,
+} msg_type;
+
+class MessageBox : public QDialog
+{
+ Q_OBJECT
+public:
+ MessageBox(QWidget* parent = 0, const char* name = "", const char* text = "", msg_type type = TYPE_OK);
+
+public slots:
+ void bok_clicked();
+ void bcancel_clicked();
+ void byes_clicked();
+ void bno_clicked();
+
+private:
+ QPushButton *createButton(QWidget *parent, const char *text);
+};
+
+#endif/*__MIAV_MESSAGEBOX_H__*/
diff --git a/src/miav.cc b/src/miav.cc
new file mode 100644
index 0000000..4d53bc5
--- /dev/null
+++ b/src/miav.cc
@@ -0,0 +1,120 @@
+/***************************************************************************
+ * miav.cc
+ *
+ * Sat Aug 21 17:32:24 2004
+ * Copyright 2004 deva
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+
+#include "server.h"
+#include "socket.h"
+
+#ifdef USE_GUI
+#include <qapplication.h>
+#include "mainwindow.h"
+#include <miav.h>
+#endif /* USE_GUI */
+
+#include <stdio.h>
+
+enum {
+ MODE_GRAB,
+ MODE_SERVER
+};
+
+/**
+ * This function starts the MIaV gui.
+ */
+int grab(int argc, char *argv[]) {
+#ifdef USE_GUI
+ QApplication miav_grab( argc, argv );
+ MainWindow mainwindow;
+ miav_grab.setMainWidget( &mainwindow );
+ return miav_grab.exec();
+#else /* USE_GUI */
+ printf("Error: MIaV was not compiled with GUI support...\n");
+ return 0;
+#endif /* USE_GUI */
+}
+
+/**
+ * This function starts the MIaV server.
+ */
+int server(int argc, char *argv[]) {
+ pid_t childpid; // variable to store the child's pid
+
+ signal(SIGCLD, SIG_IGN); // Ved SIGCHILD til IGNORE maa wait/waitpid ikke kaldes
+ // (ellers kommer der kernel-brok)
+
+ if(argc < 1) {
+ printf("Usage: miav server [port]\n");
+ printf("[port] Is the port number the server will be listening to.\n");
+ return 1;
+ }
+
+ printf("Listening on port %d\n",atoi(argv[0]));
+ Socket *s = new Socket(atoi(argv[0]));
+
+ while(1) {
+ Socket *sc = new Socket(s->slisten());
+ if(sc->isConnected()) {
+ childpid = fork();
+
+ if(childpid == -1) {
+ // fork() returns -1 on failure
+ perror("fork");
+ exit(1);
+ } else if(childpid == 0) {
+ // fork() returns 0 to the child process
+ delete s; // Close listen socket.
+ newConnection(sc);
+ delete sc; // Close communication socket.
+ exit(0);
+ } else {
+ // fork() returns new pid to the parent process
+ }
+ }
+ }
+ delete s;
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ int mode = MODE_GRAB;
+
+ if(argc < 2) {
+ printf("Usage: miav [mode] [mode options]\n");
+ printf("[mode] can be one of the following: grab or server.\n");
+ return 1;
+ }
+
+ if(!strcmp(argv[1], "grab")) mode = MODE_GRAB;
+ if(!strcmp(argv[1], "server")) mode = MODE_SERVER;
+
+ switch(mode) {
+ case MODE_GRAB:
+ return grab(argc - 2, &argv[2]);
+ case MODE_SERVER:
+ return server(argc - 2, &argv[2]);
+ }
+ return 0;
+}
diff --git a/src/miav.h b/src/miav.h
new file mode 100644
index 0000000..d6d860e
--- /dev/null
+++ b/src/miav.h
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * miav.h
+ *
+ * Mon Nov 8 09:59:24 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#ifndef __LIBMIAV_H__
+#define __LIBMIAV_H__
+
+#include "util.h"
+
+#include "network.h"
+#include "socket.h"
+#include "queue.h"
+
+#endif/*__LIBMIAV_H__*/
diff --git a/src/miav_config.cc b/src/miav_config.cc
new file mode 100644
index 0000000..2af0ef1
--- /dev/null
+++ b/src/miav_config.cc
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * miav_config.cc
+ *
+ * Sat Feb 19 14:13:19 CET 2005
+ * Copyright 2005 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include "miav_config.h"
+
+MiavConfig::MiavConfig(char *file)
+{
+ configs = NULL;
+
+ _cfg *cfg;
+
+ // TODO: Read config from file.
+
+ // Add a config
+ configs = cfg = (_cfg*) malloc(sizeof(_cfg));
+ cfg->name = new string("cpr_host");
+ cfg->stringval = new string("cpr.j.auh.dk");
+ cfg->next = (_cfg*) malloc(sizeof(_cfg));
+
+ // Add another config
+ cfg = cfg->next;
+ cfg->name = new string("cpr_port");
+ cfg->intval = 10301;
+ cfg->next = (_cfg*) malloc(sizeof(_cfg));
+
+ // Add another config
+ cfg = cfg->next;
+ cfg->name = new string("screensize");
+ cfg->floatval = 19.0f;
+ cfg->next = NULL;
+}
+
+MiavConfig::~MiavConfig()
+{
+ _cfg *die = NULL;
+ _cfg *cfg = configs;
+
+ while(cfg) {
+ if(die) free(die);
+ die = cfg;
+ cfg = cfg->next;
+ }
+ if(die) free(die);
+}
+
+int MiavConfig::readInt(char *node)
+{
+ return findNode(node)->intval;
+}
+
+bool MiavConfig::readBool(char *node)
+{
+ return findNode(node)->boolval;
+}
+
+string *MiavConfig::readString(char *node)
+{
+ return findNode(node)->stringval;
+}
+
+float MiavConfig::readFloat(char *node)
+{
+ return findNode(node)->floatval;
+}
+
+_cfg *MiavConfig::findNode(char* node)
+{
+ _cfg *cfg = configs;
+
+ while(cfg) {
+ if(!strcmp(node, cfg->name->c_str())) return cfg;
+ cfg = cfg->next;
+ }
+ fprintf(stderr, "ERROR: Request for nonexisting node \"%s\"!\n", node);
+ exit(1);
+}
diff --git a/src/miav_config.h b/src/miav_config.h
new file mode 100644
index 0000000..4b062e0
--- /dev/null
+++ b/src/miav_config.h
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * miav_config.h
+ *
+ * Sat Feb 19 14:13:19 CET 2005
+ * Copyright 2005 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#ifndef __MIAV_MIAV_CONFIG_H__
+#define __MIAV_MIAV_CONFIG_H__
+
+#include <string>
+using namespace std;
+
+typedef struct __cfg {
+ string *name;
+ bool boolval;
+ int intval;
+ string *stringval;
+ float floatval;
+ struct __cfg* next;
+} _cfg;
+
+class MiavConfig {
+public:
+ MiavConfig(char *file);
+ ~MiavConfig();
+
+ int readInt(char *node);
+ bool readBool(char *node);
+ string *readString(char *node);
+ float readFloat(char *node);
+
+private:
+ _cfg *findNode(char* node);
+ _cfg *configs;
+};
+
+#endif/*__MIAV_MIAV_CONFIG_H__*/
diff --git a/src/mov_encoder.cc b/src/mov_encoder.cc
new file mode 100644
index 0000000..92b2657
--- /dev/null
+++ b/src/mov_encoder.cc
@@ -0,0 +1,207 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 Bent Bisballe
+ * Copyright (C) 2004 B. Stultiens
+ * Copyright (C) 2004 Koen Otter and Glenn van der Meyden
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "mov_encoder.h"
+
+//av_alloc_format_context
+//av_destruct_packet_nofree
+
+MovEncoder::MovEncoder(const char *filename)
+{
+ //////////////////// GLOBAL INIT
+ av_register_all();
+
+ //////////////////// ENCODE INIT
+ AVStream *st;
+ AVCodec *enc_codec;
+
+ if(!(efc = av_alloc_format_context())) {
+ fprintf(stderr, "Could not alloc output format context\n");
+ exit(1);
+ }
+
+ efc->oformat = guess_format("mpeg", NULL, NULL);
+ //efc->oformat = guess_format(NULL, filename, NULL);
+
+ if(!(st = av_new_stream(efc, 0))) {
+ fprintf(stderr, "Could not alloc stream\n");
+ switch((int)st) {
+ case AVERROR_UNKNOWN : printf("unknown error\n");
+ break;
+ case AVERROR_IO : printf("i/o error\n");
+ break;
+ case AVERROR_NUMEXPECTED : printf("number syntax expected in filename\n");
+ break;
+ case AVERROR_INVALIDDATA : printf("invalid data found\n");
+ break;
+ case AVERROR_NOMEM : printf("not enough memory\n");
+ break;
+ case AVERROR_NOFMT : printf("unknown format\n");
+ break;
+ case AVERROR_NOTSUPP : printf("operation not supported\n");
+ break;
+ }
+ exit(1);
+ }
+
+ enc_codec = avcodec_find_encoder(CODEC_ID_MPEG2VIDEO);
+ if(!enc_codec) {
+ printf("Unsupported codec for output stream\n");
+ exit(1);
+ }
+ avcodec_get_context_defaults(&st->codec);
+ ecc = &st->codec;
+ ecc->codec_id = CODEC_ID_MPEG2VIDEO;
+ ecc->bit_rate = 8192*1000;
+ ecc->bit_rate_tolerance = 8000*1000;
+ ecc->frame_rate = 25;
+ ecc->frame_rate_base = 1;
+
+ ecc->width = 720;
+ ecc->height = 576;
+ ecc->pix_fmt = PIX_FMT_YUV420P;
+ ecc->gop_size = 0;
+ ecc->mb_decision = FF_MB_DECISION_SIMPLE;
+ ecc->qmin = 2;
+ ecc->qmax = 31;
+ ecc->mb_qmin = 2;
+ ecc->mb_qmax = 31;
+ ecc->max_qdiff = 3;
+ ecc->qblur = 0.5;
+ ecc->qcompress = 0.5;
+ ecc->rc_eq = "tex^qComp";
+ ecc->debug= 0;
+
+ ecc->rc_override_count=0;
+ ecc->rc_max_rate = 0;
+ ecc->rc_min_rate = 0;
+ ecc->rc_buffer_size = 0;
+ ecc->rc_buffer_aggressivity = 1.0;
+ ecc->rc_initial_cplx= 0;
+ ecc->i_quant_factor = -0.8;
+ ecc->b_quant_factor = 1.25;
+ ecc->i_quant_offset = 0.8;
+ ecc->b_quant_offset = 1.25;
+ ecc->dct_algo = 0;
+ ecc->idct_algo = 0;
+ ecc->strict_std_compliance = 0;
+ ecc->me_method = ME_EPZS;
+
+ if(avcodec_open(&st->codec, enc_codec) < 0) {
+ printf("Error while opening codec for stream\n");
+ exit(1);
+ }
+
+ if(url_fopen(&efc->pb, filename, URL_RDWR) < 0) {
+ fprintf(stderr, "Could not open '%s'\n", filename);
+ exit(1);
+ }
+
+ if(av_set_parameters(efc, NULL) < 0) {
+ fprintf(stderr, "%s: Invalid encoding parameters\n", filename);
+ exit(1);
+ }
+
+ dump_format(efc, 0, filename, 1);
+
+ if(av_write_header(efc) < 0) {
+ fprintf(stderr, "Could not write header for output file \n");
+ exit(1);
+ }
+
+ video_buffer = (unsigned char *)av_malloc(VIDEO_BUFFER_SIZE);
+
+ av_init_packet(&epkt);
+
+ epkt.stream_index = efc->streams[0]->index;
+
+ // ecc = &efc->streams[0]->codec;
+
+ //////////////////// DECODE INIT
+ AVCodec *deccodec;
+ // AVCodecContext *dcc= NULL;
+ printf("Video decoding\n");
+
+ /* find the dvvideo decoder */
+ deccodec = avcodec_find_decoder(CODEC_ID_DVVIDEO);
+ if (!deccodec) {
+ fprintf(stderr, "codec not found\n");
+ exit(1);
+ }
+
+ dcc= avcodec_alloc_context();
+
+ /* open it */
+ if (avcodec_open(dcc, deccodec) < 0) {
+ fprintf(stderr, "could not open codec\n");
+ exit(1);
+ }
+}
+
+MovEncoder::~MovEncoder()
+{
+ av_free(video_buffer);
+ url_fclose(&efc->pb);
+}
+
+void MovEncoder::encode(DVFrame *dvframe)
+{
+ int ret;
+ AVFrame *rawframe = avcodec_alloc_frame();
+
+ ///////////////////////// DECODE
+ uint8_t *ptr;
+ int got_picture = 1;
+ int len;
+
+ ptr = (uint8_t *)dvframe->frame;
+ len = sizeof(dvframe->frame);
+
+ ret = avcodec_decode_video(dcc,//&dfc->streams[0]->codec,
+ rawframe, &got_picture, ptr, len);
+
+ if(!ret) {
+ printf("Decoder fuckup!\n");
+ return;
+ }
+
+ ///////////////////////// ENCODE
+
+ ret = avcodec_encode_video(ecc, video_buffer, VIDEO_BUFFER_SIZE, rawframe);
+
+ if(!ret) {
+ printf("MovEncoder fuckup!\n");
+ return;
+ }
+
+ epkt.data = video_buffer;
+ epkt.size = ret;
+
+ if(ecc->coded_frame) epkt.pts = ecc->coded_frame->pts;
+
+ if(ecc->coded_frame && ecc->coded_frame->key_frame) epkt.flags |= PKT_FLAG_KEY;
+
+ av_write_frame(efc, &epkt);
+
+ av_free(rawframe);
+}
diff --git a/src/mov_encoder.h b/src/mov_encoder.h
new file mode 100644
index 0000000..eb67350
--- /dev/null
+++ b/src/mov_encoder.h
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 Bent Bisballe
+ * Copyright (C) 2004 B. Stultiens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef __RTVIDEOREC_ENCODER_H
+#define __RTVIDEOREC_ENCODER_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <avformat.h>
+
+#include <dvframe.h>
+
+#include "util.h"
+
+#define VIDEO_BUFFER_SIZE (1024*1024) // FIXME: One size fits all...
+
+class MovEncoder {
+ public:
+ MovEncoder(const char *filename);
+ ~MovEncoder();
+ void encode(DVFrame *frame);
+
+ private:
+ // Decoder
+ AVFormatContext *dfc;
+ AVCodecContext *dcc;
+
+ // Encoder
+ AVFormatContext *efc;
+ AVCodecContext *ecc;
+ AVPacket epkt;
+ unsigned char *video_buffer;
+ // AVPacket pkt;
+};
+
+#endif
+
diff --git a/src/network.cc b/src/network.cc
new file mode 100644
index 0000000..8e99855
--- /dev/null
+++ b/src/network.cc
@@ -0,0 +1,139 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * network.cc
+ *
+ * Wed Nov 3 21:23:14 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include "network.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/socket.h>
+
+Network::Network(Socket *gs)
+{
+ s = gs;
+}
+
+Network::~Network()
+{
+}
+
+int Network::write(void *buf, int size)
+{
+ if(!s->isConnected()) {
+ fprintf(stderr, "Write attempted to a socket not connected!\n");
+ return 0;
+ }
+ int n = send(s->ssocket, buf, size, MSG_WAITALL);
+
+ if(n == -1) printf("An error occurred!\n");
+
+ // printf("Sent: %s\n", buf);
+
+ return n;
+}
+
+int Network::read(void *buf, int size)
+{
+ if(!s->isConnected()) {
+ fprintf(stderr, "Read attempted from a socket not connected!\n");
+ return 0;
+ }
+ int n = recv(s->ssocket, buf, size, MSG_WAITALL);
+
+ if(n == -1) printf("An error occurred!\n");
+
+ // printf("Recieved: %s\n", buf);
+
+ return n;
+}
+
+/*
+struct msghdr {
+ void *msg_name // Optional address.
+ socklen_t msg_namelen // Size of address.
+ struct iovec *msg_iov // Scatter/gather array.
+ int msg_iovlen // Members in msg_iov.
+ void *msg_control // Ancillary data; see below.
+ socklen_t msg_controllen // Ancillary data buffer len.
+ int msg_flags // Flags on received message.
+};
+*/
+
+int Network::sendPackage(n_header *h, void* buf, int bufsz)
+{
+ struct msghdr msg;
+ struct iovec iovecs[2];
+
+ memset(&msg, 0, sizeof(msg));
+
+ msg.msg_iov = iovecs;
+ msg.msg_iovlen = 2;
+
+ msg.msg_iov[0].iov_base = h;
+ msg.msg_iov[0].iov_len = sizeof(*h);
+
+ msg.msg_iov[1].iov_base = buf;
+ msg.msg_iov[1].iov_len = bufsz;
+
+ int n = sendmsg(s->ssocket, &msg, 0);
+ if(n < 0) {
+ perror("sendmsg");
+ return -1;
+ }
+
+ return n;
+}
+
+int Network::recvPackage(n_header *h, void* buf, int bufsz)
+{
+ struct msghdr msg;
+ struct iovec iovecs[2];
+
+ memset(&msg, 0, sizeof(msg));
+
+ iovecs[0].iov_base = h;
+ iovecs[0].iov_len = sizeof(*h);
+
+ iovecs[1].iov_base = buf;
+ iovecs[1].iov_len = bufsz;
+
+ msg.msg_iov = iovecs;
+ msg.msg_iovlen = 2;
+
+ int n = recvmsg(s->ssocket, &msg, MSG_WAITALL);
+
+ if(n < 0) {
+ perror("recvmsg");
+ return -1;
+ }
+
+ if(msg.msg_iovlen != 2) {
+ fprintf(stderr, "Wrong package format!\n");
+ return -1;
+ }
+ return n;
+}
+
diff --git a/src/network.h b/src/network.h
new file mode 100644
index 0000000..72d5826
--- /dev/null
+++ b/src/network.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * network.h
+ *
+ * Wed Nov 3 21:23:14 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#ifndef __MIAVLIB_NETWORK_H__
+#define __MIAVLIB_NETWORK_H__
+
+#include "socket.h"
+#include "package.h"
+
+class Network {
+public:
+ Network(Socket *gs);
+ ~Network();
+
+ // Raw communication
+ int write(void *buf, int size);
+ int read(void *buf, int size);
+
+ // Package communication
+ int sendPackage(n_header *h, void* buf, int bufsz);
+ int recvPackage(n_header *h, void* buf, int bufsz);
+
+private:
+ Socket *s;
+};
+
+#endif/*__NETWORK_H__*/
+
+
diff --git a/src/package.h b/src/package.h
new file mode 100644
index 0000000..db0e5a0
--- /dev/null
+++ b/src/package.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * package.h
+ *
+ * Tue Nov 9 10:57:20 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#ifndef __MIAVLIB_PACKAGE_H__
+#define __MIAVLIB_PACKAGE_H__
+
+typedef enum {
+ DATA_HEADER = 0x0001,
+ INFO_HEADER = 0x0002
+} n_header_type;
+
+typedef struct {
+ n_header_type header_type;
+ union {
+ struct {
+ char cpr[32]; // Can hold wierd cpr numbers as well (not only danish)
+ bool record;
+ bool freeze;
+ bool snapshot;
+ } h_data;
+ struct {
+ int fisk;
+ } h_info;
+ } header;
+} n_header;
+
+
+#endif/*__PACKAGE_H__*/
+
+
diff --git a/src/player.cc b/src/player.cc
new file mode 100644
index 0000000..a860afa
--- /dev/null
+++ b/src/player.cc
@@ -0,0 +1,155 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 Bent Bisballe
+ * Copyright (C) 2004 B. Stultiens
+ * Copyright (C) 2004 Koen Otter and Glenn van der Meyden
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <config.h>
+#ifdef USE_GUI
+
+#include "player.h"
+
+Player::Player(volatile int *grunning,
+ sem_t *gsem,
+ Queue<FFFrame> *gqueue,
+ pthread_mutex_t *gmutex)
+{
+ running = grunning;
+ sem = gsem;
+ queue = gqueue;
+ mutex = gmutex;
+
+ sem_init(&play_sem, 0, 1);
+
+ if(SDL_Init(SDL_INIT_VIDEO) < 0) {
+ fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
+ exit(1);
+ }
+ screen = SDL_SetVideoMode(DISPLAYWIDTH,
+ DISPLAYHEIGHT,
+ 16,
+ SDL_HWSURFACE|SDL_ANYFORMAT|SDL_HWACCEL);
+ if(!screen) {
+ fprintf(stderr, "Unable to set %dx%d video: %s\n",
+ DISPLAYWIDTH, DISPLAYHEIGHT, SDL_GetError());
+ exit(1);
+ }
+
+ overlay = SDL_CreateYUVOverlay(DISPLAYWIDTH, DISPLAYHEIGHT, SDL_IYUV_OVERLAY, screen);
+}
+
+Player::~Player()
+{
+ if(overlay)
+ SDL_FreeYUVOverlay(overlay);
+ SDL_Quit();
+}
+
+void Player::player()
+{
+ SDL_Event event;
+ SDL_Rect rect;
+ FFFrame *f;
+ AVPicture pict;
+ int i;
+ struct timespec ts;
+
+ // rect.x = 20;
+ // rect.y = 182;
+ rect.x = 0;
+ rect.y = 0;
+ rect.w = DISPLAYWIDTH;
+ rect.h = DISPLAYHEIGHT;
+
+ //+++++Reference to the overlay pixels/pitches, only after creating a new overlay+++++
+ for(i = 0; i < 3; i++) {
+ pict.data[i] = overlay->pixels[i];
+ pict.linesize[i] = overlay->pitches[i];
+ }
+
+ while(*running) {
+ // Wait for the semaphore to be free... then run
+ sem_wait(&play_sem);
+ sem_post(&play_sem);
+
+ if(!SDL_WaitEvent(&event)) break; // FIXME: Gracefull exit...
+
+ switch(event.type) {
+ case SDL_KEYDOWN:
+ switch(event.key.keysym.sym) {
+ case SDLK_q:
+ case SDLK_ESCAPE:
+ goto quitit;
+ default:
+ break;
+ }
+ break;
+
+ case SDL_USEREVENT:
+ pthread_mutex_lock(mutex);
+ f = queue->pop();
+ pthread_mutex_unlock(mutex);
+ if(!f) break;
+
+ img_convert(&pict, PIX_FMT_YUV420P, (AVPicture *)f->frame,
+ PIX_FMT_YUV420P, DISPLAYWIDTH, DISPLAYHEIGHT);
+
+ SDL_LockYUVOverlay(overlay);
+ overlay->pixels = pict.data;
+ SDL_UnlockYUVOverlay(overlay);
+ SDL_DisplayYUVOverlay(overlay, &rect);
+ break;
+
+ case SDL_QUIT:
+ quitit:
+ *running = 0;
+ break;
+
+ default:
+ break;
+ }
+ }
+ /* Remove any late buffer */
+ /* We don't care, the encoder finishes them all */
+ ts.tv_sec = 0;
+ ts.tv_nsec = 100000000L; // 100ms
+ nanosleep(&ts, NULL);
+
+ pthread_mutex_lock(mutex);
+ f = queue->pop();
+ pthread_mutex_unlock(mutex);
+ if(f) delete f;
+}
+
+void Player::run()
+{
+ player();
+}
+
+void Player::start()
+{
+ sem_post(&play_sem);
+}
+
+void Player::stop()
+{
+ sem_wait(&play_sem);
+}
+
+#endif /* USE_GUI */
diff --git a/src/player.h b/src/player.h
new file mode 100644
index 0000000..e33c4e7
--- /dev/null
+++ b/src/player.h
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 Bent Bisballe
+ * Copyright (C) 2004 B. Stultiens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <config.h>
+#ifdef USE_GUI
+
+#ifndef __RTVIDEOREC_PLAYER_H
+#define __RTVIDEOREC_PLAYER_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <semaphore.h>
+#include <pthread.h>
+#include <time.h>
+#include <SDL/SDL.h>
+#include <avformat.h>
+
+#include "util.h"
+#include <queue.h>
+
+#include "thread.h"
+#include "ffframe.h"
+
+#include <qwidget.h>
+
+#define DISPLAYWIDTH 720 /* FIXME: These numbers suck! */
+#define DISPLAYHEIGHT 576
+
+class Player : public Thread {
+ public:
+ Player(volatile int *grunning,
+ sem_t *gsem,
+ Queue<FFFrame> *gqueue,
+ pthread_mutex_t *gmutex);
+ ~Player();
+
+ void start();
+ void stop();
+
+ void run();
+
+ private:
+ void player();
+
+ volatile int *running;
+ sem_t *sem;
+ Queue<FFFrame> *queue;
+ pthread_mutex_t *mutex;
+
+ sem_t play_sem;
+
+ SDL_Surface *screen;
+ SDL_Overlay *overlay;
+};
+
+#endif
+
+#endif /* USE_GUI */
diff --git a/src/queue.h b/src/queue.h
new file mode 100644
index 0000000..7352071
--- /dev/null
+++ b/src/queue.h
@@ -0,0 +1,130 @@
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 Bent Bisballe
+ * Copyright (C) 2004 B. Stultiens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <config.h>
+#ifndef __RTVIDEOREC_QUEUE_H
+#define __RTVIDEOREC_QUEUE_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <avformat.h>
+#include <avcodec.h>
+
+#include "util.h"
+
+typedef struct __buf_t {
+ struct __buf_t *next;
+ struct __buf_t *prev;
+ void *data;
+} buf_t;
+
+
+template<typename T>
+class Queue {
+ public:
+ Queue(int glimit = 0);
+ ~Queue();
+
+ void push(T *t);
+ T *pop();
+
+ private:
+ int limit;
+ buf_t *head;
+ buf_t *tail;
+ int count;
+ pthread_mutex_t mutex;
+};
+
+template<typename T>
+Queue<T>::Queue(int glimit)
+{
+ limit = glimit;
+ count = 0;
+ head = NULL;
+ tail = NULL;
+}
+
+template<typename T>
+Queue<T>::~Queue()
+{
+ if(count != 0) {
+ fprintf(stderr, "Queue not empty (%d)\n", count);
+ while(T *t = pop()) delete t;
+ }
+}
+
+template<typename T>
+void Queue<T>::push(T *t)
+{
+ buf_t *b = (buf_t*)xmalloc(sizeof(*b));
+ b->data = (void*)t;
+
+ assert(b != NULL);
+
+ if(limit && count > 0) {
+ T* tmp = (T*)pop();
+ delete tmp;
+ }
+
+ if(!head) {
+ head = tail = b;
+ b->next = b->prev = NULL;
+ count = 1;
+ return;
+ }
+
+ b->next = tail;
+ b->prev = NULL;
+ if(tail)
+ tail->prev = b;
+ tail = b;
+ count++;
+}
+
+template<typename T>
+T *Queue<T>::pop()
+{
+ T *d;
+ buf_t *b;
+
+ assert(count >= 0);
+
+ if(count == 0)
+ return NULL;
+
+ b = head;
+ if(b->prev)
+ b->prev->next = NULL;
+ head = b->prev;
+ if(b == tail)
+ tail = NULL;
+ count--;
+
+ d = (T*)b->data;
+ free(b);
+ return d;
+}
+
+#endif
+
diff --git a/src/server.cc b/src/server.cc
new file mode 100644
index 0000000..22b691f
--- /dev/null
+++ b/src/server.cc
@@ -0,0 +1,129 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * miav-rec.cc
+ *
+ * Mon Nov 8 11:35:01 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "server.h"
+#include "miav.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "mov_encoder.h"
+#include "img_encoder.h"
+
+void saveFrameAsImage(char* cpr, DVFrame *f)
+{
+ char fname[256];
+ ImgEncoder imgenc;
+
+ sprintf(fname, "image-%s-%d.jpeg", cpr, rand());
+
+ imgenc.encode(f, fname, 100); // Quality is between 0...100, where 100 is best.
+}
+/*
+struct tm
+{
+ int tm_sec; // Seconds. [0-60] (1 leap second)
+ int tm_min; // Minutes. [0-59]
+ int tm_hour; // Hours. [0-23]
+ int tm_mday; // Day. [1-31]
+ int tm_mon; // Month. [0-11]
+ int tm_year; // Year - 1900.
+ int tm_wday; // Day of week. [0-6]
+ int tm_yday; // Days in year.[0-365]
+ int tm_isdst; // DST. [-1/0/1]
+};
+*/
+
+MovEncoder *newMovEncoder(char* cpr)
+{
+ MovEncoder *enc;
+ struct tm *ltime;
+ char fname[256];
+ time_t t = time(NULL);
+ ltime = localtime(&t);
+ sprintf(fname, "%.2d%.2d%.2d%.2d%.2d%.2d-%s.mpg", ltime->tm_year + 1900, ltime->tm_mon,
+ ltime->tm_mday, ltime->tm_hour, ltime->tm_min, ltime->tm_sec, cpr);
+ enc = new MovEncoder(fname);
+ return enc;
+}
+
+void newConnection(Socket *s)
+{
+ n_header h;
+ DVFrame *f;
+ DVFrame *freeze_frame = NULL;
+ MovEncoder *enc = NULL;
+
+ f = new DVFrame();
+
+ printf("New connection[pid: %d]...\n", getpid());
+
+ Network n = Network(s);
+ while(int ret = n.recvPackage(&h, (void*)f->frame, DVPACKAGE_SIZE)) {
+ if(ret == -1) {
+ fprintf(stderr, "An error occurred...!\n");
+ break;
+ }
+ printf("Read: %d bytes\t", ret);
+ printf("\ttyp: %d\t", h.header_type);
+ printf("\tcpr: %s\t", h.header.h_data.cpr);
+ printf("\tfrz: %d\t", h.header.h_data.freeze);
+ printf("\tsht: %d\n", h.header.h_data.snapshot);
+
+ if(h.header.h_data.snapshot) {
+ if(freeze_frame) {
+ saveFrameAsImage(h.header.h_data.cpr, freeze_frame);
+ delete freeze_frame;
+ freeze_frame = NULL;
+ } else {
+ saveFrameAsImage(h.header.h_data.cpr, f);
+ }
+ }
+
+ if(h.header.h_data.record) {
+ if(!enc) enc = newMovEncoder(h.header.h_data.cpr);
+ enc->encode(f);
+ }
+
+ if(h.header.h_data.freeze) {
+ if(freeze_frame) delete freeze_frame;
+ freeze_frame = f;
+ } else {
+ delete f;
+ }
+
+ f = new DVFrame();
+ }
+ delete f;
+ if(enc) delete enc;
+
+ printf("Connection end[pid: %d]...\n", getpid());
+
+}
+/*
+int main(int argc, char *argv[])
+{
+}
+*/
diff --git a/src/server.h b/src/server.h
new file mode 100644
index 0000000..fd28f33
--- /dev/null
+++ b/src/server.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * server.h
+ *
+ * Mon Nov 8 11:35:01 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __SERVER_H__
+#define __SERVER_H__
+
+#include <unistd.h> // Symbolic Constants
+#include <sys/types.h> // Primitive System Data Types
+#include <errno.h> // Errors
+#include <stdio.h> // Input/Output
+#include <sys/wait.h> // Wait for Process Termination
+#include <stdlib.h> // General Utilities
+
+#include <time.h>
+
+#include "dvframe.h"
+#include "socket.h"
+
+void newConnection(Socket *s);
+
+
+#endif/*__SERVER_H__*/
diff --git a/src/socket.cc b/src/socket.cc
new file mode 100644
index 0000000..7cee58a
--- /dev/null
+++ b/src/socket.cc
@@ -0,0 +1,134 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * socket.cc
+ *
+ * Mon Nov 8 10:49:33 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+
+#include "socket.h"
+
+Socket::Socket()
+{
+ connected = false;
+ err = 0;
+}
+
+Socket::Socket(u_short port)
+{
+ connected = false;
+ err = 0;
+
+ // printf("Socket on port: %d\n", port);
+
+ // create socket
+ ssocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // PF_INET: ipv4, PF_INET6: ipv6
+ // tcp: IPPROTO_TCP
+ // upd: IPPROTO_UDP
+ if (ssocket < 0) {
+ err = 1;
+ perror("Socket: socket() failed");
+ }
+
+ socketaddr.sin_family = AF_INET; // Use "internet protocol" IP
+ socketaddr.sin_port = htons(port); // connect to that port
+ socketaddr.sin_addr.s_addr = INADDR_ANY;// INADDR_ANY puts your IP address automatically
+
+ // fprintf(stderr, "Socket created\n");
+}
+
+
+Socket::~Socket()
+{
+ // if(err) perror("Socket: No socket to kill");
+ // printf("Socket: I'm melting...[%d]\n", ssocket);
+ if(ssocket >= 0) close(ssocket); // close server socket
+}
+
+
+Socket Socket::slisten()
+{
+ Socket s = Socket();
+
+ if(err) {
+ perror("Socket: No socket present");
+ return s;
+ }
+ if(!connected) {
+ // bind socket to address specified by "sa" parameter
+ err = bind(ssocket, (struct sockaddr*)&socketaddr, sizeof(socketaddr));
+
+ if (err) {
+ perror("Socket: bind() failed");
+ return s;
+ }
+
+ // start listen for connection - kernel will accept connection requests (max 5 in queue)
+ err = listen(ssocket, 5);
+ if(err) {
+ perror("Socket: listen() failed");
+ return s;
+ }
+ }
+
+ // accept new connection and get its connection descriptor
+ int csalen = sizeof(s.socketaddr);
+
+ s.ssocket = accept(ssocket, (struct sockaddr*)&s.socketaddr, (socklen_t*)&csalen);
+ if (s.ssocket < 0) {
+ err = 1;
+ perror("Socket: accept() failed");
+ return s;
+ }
+
+ fprintf(stderr, "Socket connected\n");
+ connected = true;
+ s.connected = true;
+ return s;
+}
+
+
+int Socket::sconnect(char *ip)
+{
+ if(err) {
+ perror("Socket: No socket present");
+ return err;
+ }
+
+ // FIXME: gethostbyname()
+ socketaddr.sin_addr.s_addr = inet_addr(ip);
+ //inet_aton (ip, &socketaddr.sin_addr);
+
+ err = connect(ssocket, (struct sockaddr*)&socketaddr, sizeof(socketaddr));
+ if (err) {
+ perror("Socket: connect() failed");
+ return err;
+ }
+ // fprintf(stderr, "Socket connected\n");
+ connected = true;
+ return 0;
+}
+
+
+bool Socket::isConnected()
+{
+ return connected;
+}
diff --git a/src/socket.h b/src/socket.h
new file mode 100644
index 0000000..d0d85af
--- /dev/null
+++ b/src/socket.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * socket.h
+ *
+ * Mon Nov 8 10:49:33 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#ifndef __MIAVLIB_SOCKET_H__
+#define __MIAVLIB_SOCKET_H__
+
+#include <stdio.h>
+#include <string.h>
+
+#include <unistd.h>
+#include <netinet/in.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+
+class Socket {
+public:
+ Socket();
+ Socket(u_short port);
+ ~Socket();
+ Socket slisten();
+ int sconnect(char *ip);
+ bool isConnected();
+
+ struct sockaddr_in socketaddr;
+ int ssocket;
+ bool connected;
+
+private:
+ int err;
+};
+
+#endif/*__SOCKET_H__*/
diff --git a/src/thread.cc b/src/thread.cc
new file mode 100644
index 0000000..c6b4d95
--- /dev/null
+++ b/src/thread.cc
@@ -0,0 +1,34 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * thread.cc
+ *
+ * Sun Oct 31 12:12:20 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+
+#include "thread.h"
+#include <stdio.h>
+
+void* thread_run(void *data) {
+ Thread *t = (Thread*)data;
+ t->run();
+ return NULL;
+}
diff --git a/src/thread.h b/src/thread.h
new file mode 100644
index 0000000..ecf0487
--- /dev/null
+++ b/src/thread.h
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * thread.h
+ *
+ * Sun Oct 31 12:12:20 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#ifndef __THREAD_H__
+#define __THREAD_H__
+
+#include <pthread.h>
+#include <semaphore.h>
+
+class Thread {
+public:
+ Thread() {}
+ virtual ~Thread() {}
+ virtual void run() = 0;
+};
+
+void* thread_run(void *data);
+
+#endif/*__THREAD_H__*/
diff --git a/src/util.cc b/src/util.cc
new file mode 100644
index 0000000..5edf990
--- /dev/null
+++ b/src/util.cc
@@ -0,0 +1,56 @@
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 B. Stultiens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "util.h"
+
+void *xmalloc(size_t s)
+{
+ void *p;
+ assert(s > 0);
+
+ p = malloc(s);
+ if(!p) {
+ fprintf(stderr, "Out of memory in xmalloc\n");
+ exit(1);
+ }
+ memset(p, 0, s);
+ return p;
+}
+
+void *xrealloc(void *b, size_t s)
+{
+ void *p;
+ assert(s > 0);
+
+ if(!b) return xmalloc(s);
+
+ p = realloc(b, s);
+ if(!p) {
+ fprintf(stderr, "Out of memory in xrealloc\n");
+ exit(1);
+ }
+ return p;
+}
diff --git a/src/util.h b/src/util.h
new file mode 100644
index 0000000..b82b782
--- /dev/null
+++ b/src/util.h
@@ -0,0 +1,36 @@
+/*
+ * RTVideoRec Realtime video recoder and encoder for Linux
+ *
+ * Copyright (C) 2004 B. Stultiens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <config.h>
+#ifndef __RTVIDEOREC_UTIL_H
+#define __RTVIDEOREC_UTIL_H
+
+//#ifdef __cplusplus
+//extern "C" {
+//#endif
+
+void *xmalloc(size_t s);
+void *xrealloc(void *b, size_t s);
+
+//#ifdef __cplusplus
+//}
+//#endif
+
+#endif
diff --git a/src/videowidget.cc b/src/videowidget.cc
new file mode 100644
index 0000000..64758bd
--- /dev/null
+++ b/src/videowidget.cc
@@ -0,0 +1,46 @@
+/***************************************************************************
+ * videowidget.cc
+ *
+ * Fri Sep 3 14:36:37 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+
+#ifdef USE_GUI
+
+#include "videowidget.h"
+
+VideoWidget::VideoWidget(QWidget *parent) : QWidget(parent, "")
+{
+ // A welltested hack to force SDL to draw in the QWidget
+ QString ids;
+ setenv("SDL_WINDOWID", ids.setNum(winId()), 1);
+}
+
+VideoWidget::~VideoWidget()
+{
+}
+
+QPixmap VideoWidget::getScreenshot()
+{
+ return QPixmap::grabWindow (winId());
+}
+
+#endif /* USE_GUI */
diff --git a/src/videowidget.h b/src/videowidget.h
new file mode 100644
index 0000000..52669ed
--- /dev/null
+++ b/src/videowidget.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * videowidget.h
+ *
+ * Fri Sep 3 14:36:46 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#ifdef USE_GUI
+
+#ifndef __VIDEOWIDGET_H__
+#define __VIDEOWIDGET_H__
+
+#include <qwidget.h>
+#include <qpixmap.h>
+
+class VideoWidget : public QWidget {
+Q_OBJECT
+ public:
+ VideoWidget(QWidget *parent);
+ ~VideoWidget();
+ QPixmap getScreenshot();
+
+ private:
+};
+
+#endif /* __VIDEOWIDGET_H__ */
+
+#endif /* USE_GUI */
diff --git a/tools/CPUMaker b/tools/CPUMaker
new file mode 100755
index 0000000..d62ff23
--- /dev/null
+++ b/tools/CPUMaker
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+FLAG="${FLAG} -ansi -Wall -O2 -finline-functions"
+
+case "$(cat /proc/cpuinfo | egrep '^model name'|cut -d ':' -f 2|cut -c 2-)" in
+ 'Intel(R) Pentium(R) M processor 1300MHz')
+ FLAG="${FLAG} -march=pentium3 -fomit-frame-pointer -ffast-math"
+ ;;
+ *)
+ ;;
+esac
+
+for flag in $(cat /proc/cpuinfo | egrep '^flags'|cut -d ':' -f 2|cut -c 2-); do
+ case $flag in
+ mmx)
+ FLAG="${FLAG} -mmmx"
+ ;;
+ sse)
+ FLAG="${FLAG} -msse"
+ ;;
+ sse2)
+ FLAG="${FLAG} -msse2"
+ ;;
+ esac
+done
+
+echo 'GCC_FLAGS = $(QTGCC_FLAGS)' $FLAG
diff --git a/tools/MIaVAdd b/tools/MIaVAdd
new file mode 100755
index 0000000..8a5ca1a
--- /dev/null
+++ b/tools/MIaVAdd
@@ -0,0 +1,64 @@
+# -*- mode: shell-script; sh-shell: bash; sh-indentation: 2 -*-
+
+function allfile() {
+ echo "/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */" > $1;
+ echo "/***************************************************************************" >> $1;
+ echo " * $1" >> $1;
+ echo " *" >> $1 ;
+ echo " * `date`" >> $1;
+ echo " * Copyright 2005 Bent Bisballe" >> $1;
+ echo " * deva@aasimon.org" >> $1;
+ echo " ****************************************************************************/" >> $1;
+ echo "" >> $1;
+ echo "/*" >> $1;
+ echo " * This program is free software; you can redistribute it and/or modify" >> $1;
+ echo " * it under the terms of the GNU General Public License as published by" >> $1;
+ echo " * the Free Software Foundation; either version 2 of the License, or" >> $1;
+ echo " * (at your option) any later version." >> $1;
+ echo " *" >> $1;
+ echo " * This program is distributed in the hope that it will be useful," >> $1;
+ echo " * but WITHOUT ANY WARRANTY; without even the implied warranty of" >> $1;
+ echo " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" >> $1;
+ echo " * GNU Library General Public License for more details." >> $1;
+ echo " *" >> $1;
+ echo " * You should have received a copy of the GNU General Public License" >> $1;
+ echo " * along with this program; if not, write to the Free Software" >> $1;
+ echo " * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." >> $1;
+ echo " */" >> $1;
+ echo "" >> $1;
+}
+
+function ccfile() {
+ local hf=`echo -n $1 | cut -d'.' -f1`.h;
+ hfile $hf;
+
+ allfile $1;
+ echo -n '#include "' >> $1;
+ echo -n $hf >> $1;
+ echo '"' >> $1;
+ echo '' >> $1;
+}
+
+function hfile() {
+ allfile $1;
+ local hn=`echo $1 | tr 'a-z.' 'A-Z_'`
+ echo -n "#ifndef __MIAV_" >> $1;
+ echo -n "$hn" >> $1;
+ echo "__" >> $1;
+ echo -n "#define __MIAV_" >> $1;
+ echo -n "$hn" >> $1;
+ echo "__" >> $1;
+ echo -n "#endif/*__MIAV_" >> $1;
+ echo -n "$hn" >> $1;
+ echo "__*/" >> $1;
+}
+
+if [ "$#" = "1" ]; then
+if [ "CC" = `echo $1 | cut -d'.' -f2 | tr 'a-z' 'A-Z'` ]; then
+ ccfile $1;
+fi;
+if [ "H" = `echo $1 | cut -d'.' -f2 | tr 'a-z' 'A-Z'` ]; then
+ hfile $1;
+fi;
+else echo "Usage: $0 filename";
+fi;
diff --git a/tools/MocList b/tools/MocList
new file mode 100755
index 0000000..b69f49f
--- /dev/null
+++ b/tools/MocList
@@ -0,0 +1,11 @@
+# -*- mode: shell-script; sh-shell: bash; sh-indentation: 2 -*-
+if grep "#define USE_GUI" ../config.h > /dev/null ; then
+ if [ "$1" = "cc" ]; then
+ grep "Q_OBJECT" *.h | cut -d: -f1 | sed -e 's/^//g;s/\.h/\.moc.cc/g'| xargs echo;
+ elif [ "$1" = "o" ]; then
+ grep "Q_OBJECT" *.h | cut -d: -f1 | sed -e 's/^//g;s/\.h/\.moc.o/g'| xargs echo;
+ elif [ "$1" = "h" ]; then
+ grep "Q_OBJECT" *.h | cut -d: -f1 | cut -d'/' -f3 | xargs echo;
+ fi
+fi
+
diff --git a/tools/MocMaker b/tools/MocMaker
new file mode 100755
index 0000000..da34900
--- /dev/null
+++ b/tools/MocMaker
@@ -0,0 +1,3 @@
+# -*- mode: shell-script; sh-shell: bash; sh-indentation: 2 -*-
+echo -ne "\n"
+for file in `grep "Q_OBJECT" *.h | cut -d: -f1 | cut -d'/' -f3 | xargs echo`; do echo -e "moc_${file%.h}.cpp: $file\n\t@\${MOC} $file -o moc_${file%.h}.cpp\n"; done