Skip to content
Snippets Groups Projects
Commit bda73977 authored by Luigi Rizzo's avatar Luigi Rizzo
Browse files

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: https://origsvn.digium.com/svn/asterisk/trunk@94822 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent 4fe5e46c
No related branches found
No related tags found
No related merge requests found
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
* $Revision$ * $Revision$
*/ */
#include "asterisk.h" #include "asterisk.h"
#include "console_video.h" #include "console_video.h"
#include "asterisk/lock.h" #include "asterisk/lock.h"
...@@ -11,6 +12,27 @@ ...@@ -11,6 +12,27 @@
#include "asterisk/utils.h" /* ast_calloc and ast_realloc */ #include "asterisk/utils.h" /* ast_calloc and ast_realloc */
#include <math.h> /* sqrt */ #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 }; enum kp_type { KP_NONE, KP_RECT, KP_CIRCLE };
struct keypad_entry { struct keypad_entry {
int c; /* corresponding character */ int c; /* corresponding character */
...@@ -18,10 +40,6 @@ struct keypad_entry { ...@@ -18,10 +40,6 @@ struct keypad_entry {
enum kp_type type; 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 /* our representation of a displayed window. SDL can only do one main
* window so we map everything within that one * 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_ ...@@ -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. /*! \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; struct gui_info *gui = env->gui;
#define N_EVENTS 32 #define N_EVENTS 32
...@@ -540,7 +558,8 @@ static void eventhandler(struct video_desc *env) ...@@ -540,7 +558,8 @@ static void eventhandler(struct video_desc *env)
if (!gui) if (!gui)
return; 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) #define MY_EV (SDL_MOUSEBUTTONDOWN|SDL_KEYDOWN)
while ( (n = SDL_PeepEvents(ev, N_EVENTS, SDL_GETEVENT, SDL_ALLEVENTS)) > 0) { 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) ...@@ -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); // ast_log(LOG_WARNING, "now %d regions\n", gui->kp_used);
return 1; return 1;
} }
#endif /* HAVE_SDL */
...@@ -88,10 +88,10 @@ iax.conf too) the following: ...@@ -88,10 +88,10 @@ iax.conf too) the following:
/* /*
* Codecs are absolutely necessary or we cannot do anything. * Codecs are absolutely necessary or we cannot do anything.
* In principle SDL is optional too (used for rendering only, but we * SDL is optional (used for rendering only), so that we can still
* could still source data withouth it), however at the moment it is required. * 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 */ /* stubs if required pieces are missing */
int console_write_video(struct ast_channel *chan, struct ast_frame *f) int console_write_video(struct ast_channel *chan, struct ast_frame *f)
{ {
...@@ -1079,8 +1079,6 @@ static void *video_thread(void *arg) ...@@ -1079,8 +1079,6 @@ static void *video_thread(void *arg)
} }
} }
sdl_setup(env); 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); ast_mutex_init(&env->in.dec_in_lock);
if (!ast_strlen_zero(save_display)) if (!ast_strlen_zero(save_display))
setenv("DISPLAY", save_display, 1); setenv("DISPLAY", save_display, 1);
...@@ -1097,16 +1095,15 @@ static void *video_thread(void *arg) ...@@ -1097,16 +1095,15 @@ static void *video_thread(void *arg)
} }
for (;;) { for (;;) {
/* XXX 20 times/sec */ struct timeval t = { 0, 50000 }; /* XXX 20 times/sec */
struct timeval t = { 0, 50000 };
struct ast_frame *p, *f; struct ast_frame *p, *f;
struct video_in_desc *v = &env->in; struct video_in_desc *v = &env->in;
struct ast_channel *chan = env->owner; struct ast_channel *chan = env->owner;
int fd = chan->alertpipe[1]; int fd = chan->alertpipe[1];
char *caption = NULL, buf[160];
/* determine if video format changed */ /* determine if video format changed */
if (count++ % 10 == 0) { if (count++ % 10 == 0) {
char buf[160];
if (env->out.sendvideo) if (env->out.sendvideo)
sprintf(buf, "%s %s %dx%d @@ %dfps %dkbps", sprintf(buf, "%s %s %dx%d @@ %dfps %dkbps",
env->out.videodevice, env->codec_name, env->out.videodevice, env->codec_name,
...@@ -1114,14 +1111,14 @@ static void *video_thread(void *arg) ...@@ -1114,14 +1111,14 @@ static void *video_thread(void *arg)
env->out.fps, env->out.bitrate/1000); env->out.fps, env->out.bitrate/1000);
else else
sprintf(buf, "hold"); sprintf(buf, "hold");
SDL_WM_SetCaption(buf, NULL); caption = buf;
} }
/* manage keypad events */ /* manage keypad events */
/* XXX here we should always check for events, /* XXX here we should always check for events,
* otherwise the drag will not work */ * otherwise the drag will not work */
if (env->gui) if (env->gui)
eventhandler(env); eventhandler(env, caption);
/* sleep for a while */ /* sleep for a while */
ast_select(0, NULL, NULL, NULL, &t); ast_select(0, NULL, NULL, NULL, &t);
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#ifndef CONSOLE_VIDEO_H #ifndef CONSOLE_VIDEO_H
#define 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 \ #define CONSOLE_VIDEO_CMDS \
"console {device}" "console {device}"
#else #else
...@@ -37,16 +37,6 @@ ...@@ -37,16 +37,6 @@
#include <ffmpeg/swscale.h> /* requires a recent ffmpeg */ #include <ffmpeg/swscale.h> /* requires a recent ffmpeg */
#endif #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 \ #define CONSOLE_VIDEO_CMDS \
"console {videodevice|videocodec|sendvideo" \ "console {videodevice|videocodec|sendvideo" \
"|video_size|bitrate|fps|qmin" \ "|video_size|bitrate|fps|qmin" \
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment