mirror of
https://github.com/Motion-Project/motion.git
synced 2026-06-12 07:44:34 -04:00
SDL support
This commit is contained 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
|
||||
|
||||
19
conf.c
19
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");
|
||||
}
|
||||
|
||||
3
conf.h
3
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;
|
||||
|
||||
@@ -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 <signal.h> header file. */
|
||||
#undef HAVE_SIGNAL_H
|
||||
|
||||
|
||||
45
configure.in
45
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
|
||||
|
||||
16
event.c
16
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,
|
||||
|
||||
1
event.h
1
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 *);
|
||||
|
||||
@@ -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
|
||||
|
||||
28
motion.c
28
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);
|
||||
|
||||
Reference in New Issue
Block a user