diff --git a/Makefile.in b/Makefile.in index f2c1750..509ad57 100644 --- a/Makefile.in +++ b/Makefile.in @@ -37,7 +37,7 @@ VIDEO_OBJ = @VIDEO@ OBJ = motion.o logger.o conf.o draw.o jpegutils.o vloopback_motion.o $(VIDEO_OBJ) \ netcam.o netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o \ alg.o event.o picture.o rotate.o webhttpd.o \ - stream.o md5.o @FFMPEG_OBJ@ + stream.o md5.o @FFMPEG_OBJ@ @SDL_OBJ@ SRC = $(OBJ:.o=.c) DOC = CHANGELOG COPYING CREDITS INSTALL README motion_guide.html EXAMPLES = *.conf motion.init-Debian motion.init-Fedora motion.init-FreeBSD.sh diff --git a/conf.c b/conf.c index 9f647c2..87d5ced 100644 --- a/conf.c +++ b/conf.c @@ -83,6 +83,9 @@ struct config conf_template = { ffmpeg_bps: DEF_FFMPEG_BPS, ffmpeg_vbr: DEF_FFMPEG_VBR, ffmpeg_video_codec: DEF_FFMPEG_CODEC, +#ifdef HAVE_SDL + sdl_threadnr: 0, +#endif ipv6_enabled: 0, stream_port: 0, stream_quality: 50, @@ -757,6 +760,19 @@ config_param config_params[] = { print_bool }, #endif /* HAVE_FFMPEG */ +#ifdef HAVE_SDL + { + "sdl_threadnr", + "\n############################################################\n" + "# SDL Window\n" + "############################################################\n\n" + "# Number of motion thread to show in SDL Window (default: 0 = disabled)", + 1, + CONF_OFFSET(sdl_threadnr), + copy_int, + print_int + }, +#endif /* HAVE_SDL */ { "use_extpipe", "\n############################################################\n" @@ -2320,11 +2336,10 @@ static void usage() printf("-d level\t\tLog level (1-9) (EMR, ALR, CRT, ERR, WRN, NTC, ERR, DBG, ALL). default: 6 / NTC.\n"); printf("-k type\t\t\tType of log (STR, ENC, NET, DBL, EVT, TRK, VID, ALL). default: ALL.\n"); printf("-p process_id_file\tFull path and filename of process id file (pid file).\n"); - printf("-l log file \t\tFull path and filename of log file. ( use -l syslog to log to stderr and syslog )\n"); + printf("-l log file \t\tFull path and filename of log file.\n"); printf("-h\t\t\tShow this screen.\n"); printf("\n"); printf("Motion is configured using a config file only. If none is supplied,\n"); printf("it will read motion.conf from current directory, ~/.motion or %s.\n", sysconfdir); - printf("e.g run motion debugging video only , no daemon and logging to stderr and syslog :\n\n\t ./motion -n -l syslog -d 9 -k VID\n"); printf("\n"); } diff --git a/conf.h b/conf.h index 33b776d..afadce6 100644 --- a/conf.h +++ b/conf.h @@ -64,6 +64,9 @@ struct config { int ffmpeg_vbr; int ffmpeg_deinterlace; const char *ffmpeg_video_codec; +#ifdef HAVE_SDL + int sdl_threadnr; +#endif int ipv6_enabled; int stream_port; int stream_quality; diff --git a/config.h.in b/config.h.in index 60b98e3..9e10ae3 100644 --- a/config.h.in +++ b/config.h.in @@ -24,6 +24,9 @@ /* Define to 1 if you have PostgreSQL support */ #undef HAVE_PGSQL +/* Define to 1 if you have SDL support */ +#undef HAVE_SDL + /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H diff --git a/configure.in b/configure.in index b7c96df..9cab599 100644 --- a/configure.in +++ b/configure.in @@ -206,6 +206,45 @@ else fi +# +# Check for sdl library +# +SDL_SUPPORT="yes" +AC_ARG_WITH(sdl, +[ --without-sdl Compile without sdl support to get stream in SDL window.], +[], +[]) +AC_MSG_CHECKING(for sdl) +if test "x$withval" = "xno"; then + AC_MSG_RESULT(skipped) + SDL_SUPPORT="no" +else + if test "${FreeBSD}" != ""; then + CONFIG_SDL='sdl11-config' + else + CONFIG_SDL='sdl-config' + fi + if test -z "`($CONFIG_SDL --version) 2>/dev/null`" ;then + AC_MSG_RESULT(no) + if test "$withval" = "yes"; then + echo "" + echo "****************************************************" + echo "* sdl-config could not be found. Please install it *" + echo "* and remove the --with-sdl configure argument. *" + echo "* libSDL can be found at http://www.libsdl.org *" + echo "****************************************************" + echo "" + fi + else + AC_MSG_RESULT(yes) + SDL_SUPPORT="yes" + TEMP_LIBS="$TEMP_LIBS `${CONFIG_SDL} --libs`" + TEMP_CFLAGS="${TEMP_CFLAGS} `${CONFIG_SDL} --cflags`" + AC_DEFINE([HAVE_SDL],1,[Define to 1 if you have SDL support]) + SDL_OBJ="sdl.o" + AC_SUBST(SDL_OBJ) + fi +fi # # Check for the special mmx accelerated jpeg library @@ -1196,6 +1235,12 @@ else fi fi +if test "${SDL_SUPPORT}" = "yes"; then + echo "SDL support: Yes" +else + echo "SDL support: No" +fi + if test "${FFMPEG_OK}" = "found"; then echo "FFmpeg support: Yes" else diff --git a/event.c b/event.c index 2eaa8a8..11256eb 100644 --- a/event.c +++ b/event.c @@ -233,6 +233,16 @@ static void event_stream_put(struct context *cnt, int type ATTRIBUTE_UNUSED, stream_put(cnt, img); } +#ifdef HAVE_SDL +static void event_sdl_put(struct context *cnt, int type ATTRIBUTE_UNUSED, + unsigned char *img, char *dummy1 ATTRIBUTE_UNUSED, + void *dummy2 ATTRIBUTE_UNUSED, struct tm *tm ATTRIBUTE_UNUSED) +{ + sdl_put(img, cnt->imgs.width, cnt->imgs.height); +} +#endif + + #if !defined(WITHOUT_V4L) && !defined(BSD) static void event_vid_putpipe(struct context *cnt, int type ATTRIBUTE_UNUSED, unsigned char *img, char *dummy ATTRIBUTE_UNUSED, void *devpipe, @@ -791,6 +801,12 @@ struct event_handlers event_handlers[] = { EVENT_IMAGE_SNAPSHOT, event_image_snapshot }, +#ifdef HAVE_SDL + { + EVENT_SDL_PUT, + event_sdl_put + }, +#endif #if !defined(WITHOUT_V4L) && !defined(BSD) { EVENT_IMAGE, diff --git a/event.h b/event.h index 2f7ccb3..d226566 100644 --- a/event.h +++ b/event.h @@ -30,6 +30,7 @@ #define EVENT_AREA_DETECTED 17 #define EVENT_CAMERA_LOST 18 #define EVENT_FFMPEG_PUT 19 +#define EVENT_SDL_PUT 20 typedef void(* event_handler)(struct context *, int, unsigned char *, char *, void *, struct tm *); diff --git a/motion-dist.conf.in b/motion-dist.conf.in index 3b3e4b0..4803577 100644 --- a/motion-dist.conf.in +++ b/motion-dist.conf.in @@ -308,6 +308,12 @@ ffmpeg_video_codec mpeg4 # (default: off) ffmpeg_deinterlace off +############################################################ +# SDL Window +############################################################ + +# Number of motion thread to show in SDL Window (default: 0 = disabled) +0 ############################################################ # External pipe to video encoder diff --git a/motion.c b/motion.c index 1064d56..2e8391d 100644 --- a/motion.c +++ b/motion.c @@ -2064,6 +2064,10 @@ static void *motion_loop(void *arg) if (cnt->conf.setup_mode) { event(cnt, EVENT_IMAGE, cnt->imgs.out, NULL, &cnt->pipe, cnt->currenttime_tm); event(cnt, EVENT_STREAM, cnt->imgs.out, NULL, NULL, cnt->currenttime_tm); +#ifdef HAVE_SDL + if (cnt_list[0]->conf.sdl_threadnr == cnt->threadnr) + event(cnt, EVENT_SDL_PUT, cnt->imgs.out, NULL, NULL, cnt->currenttime_tm); +#endif } else { event(cnt, EVENT_IMAGE, cnt->current_image->image, NULL, &cnt->pipe, &cnt->current_image->timestamp_tm); @@ -2071,6 +2075,11 @@ static void *motion_loop(void *arg) if (!cnt->conf.stream_motion || cnt->shots == 1) event(cnt, EVENT_STREAM, cnt->current_image->image, NULL, NULL, &cnt->current_image->timestamp_tm); +#ifdef HAVE_SDL + if (cnt_list[0]->conf.sdl_threadnr == cnt->threadnr) + event(cnt, EVENT_SDL_PUT, cnt->current_image->image, NULL, NULL, + &cnt->current_image->timestamp_tm); +#endif } event(cnt, EVENT_IMAGEM, cnt->imgs.out, NULL, &cnt->mpipe, cnt->currenttime_tm); @@ -2435,8 +2444,12 @@ static void motion_startup(int daemonize, int argc, char *argv[]) } set_log_level(cnt_list[0]->log_level); - - MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, "%s: Motion "VERSION" Started"); + +#ifdef HAVE_SDL + MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, "%s: Motion "VERSION" Started with SDL support"); +#else + MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, "%s: Motion "VERSION" Started"); +#endif if ((cnt_list[0]->conf.log_file) && (strncmp(cnt_list[0]->conf.log_file, "syslog", 6))) { set_log_mode(LOGMODE_FILE); @@ -2696,6 +2709,12 @@ int main (int argc, char **argv) start_motion_thread(cnt_list[i], &thread_attr); } +#ifdef HAVE_SDL + if (cnt_list[0]->conf.sdl_threadnr > 0) + sdl_start(cnt_list[cnt_list[1] != NULL ? cnt_list[0]->conf.sdl_threadnr : 0]->conf.width, + cnt_list[cnt_list[1] != NULL ? cnt_list[0]->conf.sdl_threadnr : 0]->conf.height); +#endif + /* * Create a thread for the control interface if requested. Create it * detached and with 'motion_web_control' as the thread function. @@ -2776,6 +2795,11 @@ int main (int argc, char **argv) } while (restart); /* loop if we're supposed to restart */ +#ifdef HAVE_SDL + sdl_stop(); +#endif + + // Be sure that http control exits fine cnt_list[0]->finish = 1; SLEEP(1, 0); diff --git a/motion.h b/motion.h index 5d9c414..09d4bbc 100644 --- a/motion.h +++ b/motion.h @@ -62,6 +62,11 @@ #include "stream.h" #include "webhttpd.h" +#ifdef HAVE_SDL +#include "sdl.h" +#endif + + /** * ATTRIBUTE_UNUSED: *