aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b>2007-12-27 00:21:02 +0000
committerrizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b>2007-12-27 00:21:02 +0000
commit3362e1caef747faab26ea586833ef61cfe0f012f (patch)
tree3d80310a33ac0e25d045106348b576cfe8fa2061
parent7a2d5539243e10474f40a0b8c6ba5c5a7821dada (diff)
Enable building the code even if SDL is not present (similarly,
SDL is also detected at runtime). Now we should be able to stream video even without a rendering device (useful for remote monitoring). git-svn-id: http://svn.digium.com/svn/asterisk/trunk@94822 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/console_gui.c32
-rw-r--r--channels/console_video.c17
-rw-r--r--channels/console_video.h12
3 files changed, 34 insertions, 27 deletions
diff --git a/channels/console_gui.c b/channels/console_gui.c
index 903e4c4a3..b8ae5998d 100644
--- a/channels/console_gui.c
+++ b/channels/console_gui.c
@@ -4,6 +4,7 @@
* $Revision$
*/
+
#include "asterisk.h"
#include "console_video.h"
#include "asterisk/lock.h"
@@ -11,6 +12,27 @@
#include "asterisk/utils.h" /* ast_calloc and ast_realloc */
#include <math.h> /* sqrt */
+/* we support 3 regions in the GUI */
+enum { WIN_LOCAL, WIN_REMOTE, WIN_KEYPAD, WIN_MAX };
+
+#ifndef HAVE_SDL
+/* stubs if we don't have any sdl */
+static void show_frame(struct video_desc *env, int out) {}
+static void sdl_setup(struct video_desc *env) {}
+static struct gui_info *cleanup_sdl(struct gui_info *gui) { return NULL; }
+static void eventhandler(struct video_desc *env, const char *caption) {}
+static int keypad_cfg_read(struct gui_info *gui, const char *val) { return 0; }
+
+#else /* HAVE_SDL, the real rendering code */
+
+#include <SDL/SDL.h>
+#ifdef HAVE_SDL_IMAGE
+#include <SDL/SDL_image.h> /* for loading images */
+#endif
+#ifdef HAVE_SDL_TTF
+#include <SDL/SDL_ttf.h> /* render text on sdl surfaces */
+#endif
+
enum kp_type { KP_NONE, KP_RECT, KP_CIRCLE };
struct keypad_entry {
int c; /* corresponding character */
@@ -21,10 +43,6 @@ struct keypad_entry {
/* our representation of a displayed window. SDL can only do one main
* window so we map everything within that one
*/
-enum { WIN_LOCAL, WIN_REMOTE, WIN_KEYPAD, WIN_MAX };
-/* our representation of a displayed window. SDL can only do one main
- * window so we map everything within that one
- */
struct display_window {
SDL_Overlay *bmp;
SDL_Rect rect; /* location of the window */
@@ -531,7 +549,7 @@ static void move_capture_source(struct video_desc *env, int x_final_drag, int y_
/*! \brief refresh the screen, and also grab a bunch of events.
*/
-static void eventhandler(struct video_desc *env)
+static void eventhandler(struct video_desc *env, const char *caption)
{
struct gui_info *gui = env->gui;
#define N_EVENTS 32
@@ -540,7 +558,8 @@ static void eventhandler(struct video_desc *env)
if (!gui)
return;
- // SDL_UpdateRects(gui->screen, 1, &gui->win[WIN_KEYPAD].rect);// XXX inefficient
+ if (caption)
+ SDL_WM_SetCaption(caption, NULL);
#define MY_EV (SDL_MOUSEBUTTONDOWN|SDL_KEYDOWN)
while ( (n = SDL_PeepEvents(ev, N_EVENTS, SDL_GETEVENT, SDL_ALLEVENTS)) > 0) {
@@ -959,3 +978,4 @@ static int keypad_cfg_read(struct gui_info *gui, const char *val)
// ast_log(LOG_WARNING, "now %d regions\n", gui->kp_used);
return 1;
}
+#endif /* HAVE_SDL */
diff --git a/channels/console_video.c b/channels/console_video.c
index f73fcf3c4..a1af9a454 100644
--- a/channels/console_video.c
+++ b/channels/console_video.c
@@ -88,10 +88,10 @@ iax.conf too) the following:
/*
* Codecs are absolutely necessary or we cannot do anything.
- * In principle SDL is optional too (used for rendering only, but we
- * could still source data withouth it), however at the moment it is required.
+ * SDL is optional (used for rendering only), so that we can still
+ * stream video withouth displaying it.
*/
-#if !defined(HAVE_VIDEO_CONSOLE) || !defined(HAVE_FFMPEG) || !defined(HAVE_SDL)
+#if !defined(HAVE_VIDEO_CONSOLE) || !defined(HAVE_FFMPEG)
/* stubs if required pieces are missing */
int console_write_video(struct ast_channel *chan, struct ast_frame *f)
{
@@ -1079,8 +1079,6 @@ static void *video_thread(void *arg)
}
}
sdl_setup(env);
- if (env->gui)
- SDL_UpdateRects(env->gui->screen, 1, &env->gui->win[WIN_KEYPAD].rect);// XXX inefficient
ast_mutex_init(&env->in.dec_in_lock);
if (!ast_strlen_zero(save_display))
setenv("DISPLAY", save_display, 1);
@@ -1097,16 +1095,15 @@ static void *video_thread(void *arg)
}
for (;;) {
- /* XXX 20 times/sec */
- struct timeval t = { 0, 50000 };
+ struct timeval t = { 0, 50000 }; /* XXX 20 times/sec */
struct ast_frame *p, *f;
struct video_in_desc *v = &env->in;
struct ast_channel *chan = env->owner;
int fd = chan->alertpipe[1];
+ char *caption = NULL, buf[160];
/* determine if video format changed */
if (count++ % 10 == 0) {
- char buf[160];
if (env->out.sendvideo)
sprintf(buf, "%s %s %dx%d @@ %dfps %dkbps",
env->out.videodevice, env->codec_name,
@@ -1114,14 +1111,14 @@ static void *video_thread(void *arg)
env->out.fps, env->out.bitrate/1000);
else
sprintf(buf, "hold");
- SDL_WM_SetCaption(buf, NULL);
+ caption = buf;
}
/* manage keypad events */
/* XXX here we should always check for events,
* otherwise the drag will not work */
if (env->gui)
- eventhandler(env);
+ eventhandler(env, caption);
/* sleep for a while */
ast_select(0, NULL, NULL, NULL, &t);
diff --git a/channels/console_video.h b/channels/console_video.h
index 330e179ba..d370679a8 100644
--- a/channels/console_video.h
+++ b/channels/console_video.h
@@ -23,7 +23,7 @@
#ifndef CONSOLE_VIDEO_H
#define CONSOLE_VIDEO_H
-#if !defined(HAVE_VIDEO_CONSOLE) || !defined(HAVE_FFMPEG) || !defined(HAVE_SDL)
+#if !defined(HAVE_VIDEO_CONSOLE) || !defined(HAVE_FFMPEG)
#define CONSOLE_VIDEO_CMDS \
"console {device}"
#else
@@ -37,16 +37,6 @@
#include <ffmpeg/swscale.h> /* requires a recent ffmpeg */
#endif
-#include <SDL/SDL.h>
-#ifdef HAVE_SDL_IMAGE
-#include <SDL/SDL_image.h> /* for loading images */
-#endif
-#ifdef HAVE_SDL_TTF
-#include <SDL/SDL_ttf.h> /* render text on sdl surfaces */
-#endif
-
-
-
#define CONSOLE_VIDEO_CMDS \
"console {videodevice|videocodec|sendvideo" \
"|video_size|bitrate|fps|qmin" \