diff --git a/channels/console_gui.c b/channels/console_gui.c index 903e4c4a3aca46e28bc5dad7966d59a9b3fafdb7..b8ae5998d5a1679ea63e69951258bf0f8cc6fc31 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 */ @@ -18,10 +40,6 @@ struct keypad_entry { enum kp_type type; }; -/* 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 */ @@ -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 f73fcf3c46168f257ab88828d2bbec20b309eb27..a1af9a4543fae95d66f674cfa3e46623d0ad7002 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 330e179ba2d74060ae72a81dc19c20f9147be1ec..d370679a84bd503c4d3440a90343702f38c70904 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" \