aboutsummaryrefslogtreecommitdiffstats
path: root/channels/console_video.c
diff options
context:
space:
mode:
authorrizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b>2007-12-22 18:28:40 +0000
committerrizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b>2007-12-22 18:28:40 +0000
commit86307f549ad456117b63e4b7d35c2fe6751c32db (patch)
treec31dce4a21f66b05c0900c01dc78670a672d1b8d /channels/console_video.c
parentf5d88738f1cabc59a20285063be3d0d6e998c9bd (diff)
Build console_video support by linking in, as opposed to including,
console_video.c This will ease the task of splitting console_video.c into its components (V4L and X11 grabbers, various video codecs and packetizers, SDL), as well as ease future extensions (e.g. additional video sources, codecs and rendering engines). For the time being nothing changes for users: video support is off by default, and requires -DHAVE_VIDEO_CONSOLE on the command line to be included (if SDL and FFMPEG are available). git-svn-id: http://svn.digium.com/svn/asterisk/trunk@94615 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/console_video.c')
-rw-r--r--channels/console_video.c116
1 files changed, 70 insertions, 46 deletions
diff --git a/channels/console_video.c b/channels/console_video.c
index d59d3bb77..f35813e3c 100644
--- a/channels/console_video.c
+++ b/channels/console_video.c
@@ -20,6 +20,14 @@
//#define DROP_PACKETS 5 /* if set, drop this % of video packets */
//#define OLD_FFMPEG 1 /* set for old ffmpeg with no swscale */
+#include "asterisk.h"
+#include <sys/ioctl.h>
+#include <math.h> /* sqrt */
+#include "asterisk/cli.h"
+#include "asterisk/file.h"
+#include "asterisk/channel.h"
+
+#include "console_video.h"
/*
The code is structured as follows.
@@ -84,7 +92,40 @@ iax.conf too) the following:
* 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.
*/
-#if defined(HAVE_FFMPEG) && defined(HAVE_SDL)
+#if !defined(HAVE_VIDEO_CONSOLE) || !defined(HAVE_FFMPEG) || !defined(HAVE_SDL)
+/* stubs if required pieces are missing */
+int console_write_video(struct ast_channel *chan, struct ast_frame *f)
+{
+ return 0; /* writing video not supported */
+}
+
+int console_video_cli(struct video_desc *env, const char *var, int fd)
+{
+ return 1; /* nothing matched */
+}
+
+int console_video_config(struct video_desc **penv, const char *var, const char *val)
+{
+ return 1; /* no configuration */
+}
+
+void console_video_start(struct video_desc *env, struct ast_channel *owner)
+{
+ ast_log(LOG_WARNING, "console video support not present\n");
+}
+
+void console_video_uninit(struct video_desc *env)
+{
+}
+
+int console_video_formats = 0;
+
+#else /* defined(HAVE_FFMPEG) && defined(HAVE_SDL) */
+
+/*! The list of video formats we support. */
+int console_video_formats =
+ AST_FORMAT_H263_PLUS | AST_FORMAT_H263 |
+ AST_FORMAT_MP4_VIDEO | AST_FORMAT_H264 | AST_FORMAT_H261 ;
#ifdef HAVE_X11
#include <X11/Xlib.h> /* this should be conditional */
@@ -304,12 +345,6 @@ struct video_desc {
struct display_window win[WIN_MAX];
};
-/*! The list of video formats we support. */
-#define CONSOLE_FORMAT_VIDEO ( \
- AST_FORMAT_H263_PLUS | AST_FORMAT_H263 | \
- AST_FORMAT_MP4_VIDEO | \
- AST_FORMAT_H264 | AST_FORMAT_H261)
-
static AVPicture *fill_pict(struct fbuf_t *b, AVPicture *p);
static void fbuf_free(struct fbuf_t *b)
@@ -1867,7 +1902,7 @@ static void cleanup_sdl(struct video_desc *env)
* uses the chan lock, we need to unlock here. This is unsafe,
* and we should really use refcounts for the channels.
*/
-static void console_video_uninit(struct video_desc *env)
+void console_video_uninit(struct video_desc *env)
{
int i, t = 100; /* initial wait is shorter, than make it longer */
env->shutdown = 1;
@@ -2011,7 +2046,7 @@ static void show_frame(struct video_desc *env, int out)
SDL_UnlockYUVOverlay(bmp);
}
-static struct video_desc *get_video_desc(struct ast_channel *c);
+struct video_desc *get_video_desc(struct ast_channel *c);
/*
* This function is called (by asterisk) for each video packet
@@ -2023,7 +2058,8 @@ static struct video_desc *get_video_desc(struct ast_channel *c);
* - if the fragment is the last (RTP Marker) we decode it with decode_video()
* - after the decoding is completed we display the decoded frame with show_frame()
*/
-static int console_write_video(struct ast_channel *chan, struct ast_frame *f)
+int console_write_video(struct ast_channel *chan, struct ast_frame *f);
+int console_write_video(struct ast_channel *chan, struct ast_frame *f)
{
struct video_desc *env = get_video_desc(chan);
struct video_in_desc *v = &env->in;
@@ -2236,13 +2272,11 @@ static void append_char(char *str, int *str_pos, const char c)
/* accumulate digits, possibly call dial if in connected mode */
static void keypad_digit(struct video_desc *env, int digit)
{
- struct chan_oss_pvt *o = find_desc(oss_active);
-
- if (o->owner) { /* we have a call, send the digit */
+ if (env->owner) { /* we have a call, send the digit */
struct ast_frame f = { AST_FRAME_DTMF, 0 };
f.subclass = digit;
- ast_queue_frame(o->owner, &f);
+ ast_queue_frame(env->owner, &f);
} else { /* no call, accumulate digits */
append_char(env->gui.inbuf, &env->gui.inbuf_pos, digit);
}
@@ -2258,25 +2292,31 @@ static void keypad_send_command(struct video_desc *env, char *command)
}
/* function used to toggle on/off the status of some variables */
-static char *keypad_toggle(int index)
+static char *keypad_toggle(struct video_desc *env, int index)
{
- struct chan_oss_pvt *o = find_desc(oss_active);
ast_log(LOG_WARNING, "keypad_toggle(%i) called\n", index);
switch (index) {
- case KEY_MUTE:
- o->mute = !o->mute;
- break;
case KEY_SENDVIDEO:
- o->env->out.sendvideo = !o->env->out.sendvideo;
+ env->out.sendvideo = !env->out.sendvideo;
break;
- case KEY_AUTOANSWER:
+#ifdef notyet
+ case KEY_MUTE: {
+ struct chan_oss_pvt *o = find_desc(oss_active);
+ o->mute = !o->mute;
+ }
+ break;
+ case KEY_AUTOANSWER: {
+ struct chan_oss_pvt *o = find_desc(oss_active);
o->autoanswer = !o->autoanswer;
+ }
break;
+#endif
}
return NULL;
}
+char *console_do_answer(int fd);
/*
* Function called when the pick up button is pressed
* perform actions according the channel status:
@@ -2289,15 +2329,10 @@ static char *keypad_toggle(int index)
*/
static void keypad_pick_up(struct video_desc *env)
{
- struct chan_oss_pvt *o = find_desc(oss_active);
ast_log(LOG_WARNING, "keypad_pick_up called\n");
- if (o->owner) { /* someone is calling us, just answer */
- struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_ANSWER };
- o->hookstate = 1;
- o->cursound = -1;
- o->nosound = 0;
- ast_queue_frame(o->owner, &f);
+ if (env->owner) { /* someone is calling us, just answer */
+ console_do_answer(-1);
} else if (env->gui.inbuf_pos) { /* we have someone to call */
ast_cli_command(env->gui.outfd, env->gui.inbuf);
}
@@ -2404,7 +2439,7 @@ static void handle_button_event(struct video_desc *env, SDL_MouseButtonEvent but
case KEY_MUTE:
case KEY_AUTOANSWER:
case KEY_SENDVIDEO:
- keypad_toggle(index);
+ keypad_toggle(env, index);
break;
case KEY_LOCALVIDEO:
@@ -2822,8 +2857,7 @@ static int set_win(SDL_Surface *screen, struct display_window *win, int fmt,
* We do our best to progress even if some of the components are not
* available.
*/
-static void console_video_start(struct video_desc *env,
- struct ast_channel *owner)
+void console_video_start(struct video_desc *env, struct ast_channel *owner)
{
if (env == NULL) /* video not initialized */
return;
@@ -3187,21 +3221,11 @@ static int keypad_cfg_read(struct gui_info *gui, const char *val)
return 1;
}
-/* list of commands supported by the cli.
- * For write operation we use the commands in console_video_config(),
- * for reads we use console_video_cli(). XXX Names should be fixed.
- */
-#define CONSOLE_VIDEO_CMDS \
- "console {videodevice|videocodec|sendvideo" \
- "|video_size|bitrate|fps|qmin" \
- "|keypad|keypad_mask|keypad_entry" \
- "}"
-
/* extend ast_cli with video commands. Called by console_video_config */
-static int console_video_cli(struct video_desc *env, const char *var, int fd)
+int console_video_cli(struct video_desc *env, const char *var, int fd)
{
if (env == NULL)
- return 0; /* unrecognised */
+ return 1; /* unrecognised */
if (!strcasecmp(var, "videodevice")) {
ast_cli(fd, "videodevice is [%s]\n", env->out.videodevice);
@@ -3223,13 +3247,13 @@ static int console_video_cli(struct video_desc *env, const char *var, int fd)
} else if (!strcasecmp(var, "fps")) {
ast_cli(fd, "fps is [%d]\n", env->out.fps);
} else {
- return 0; /* unrecognised */
+ return 1; /* unrecognised */
}
- return 1; /* recognised */
+ return 0; /* recognised */
}
/*! parse config command for video support. */
-static int console_video_config(struct video_desc **penv,
+int console_video_config(struct video_desc **penv,
const char *var, const char *val)
{
struct video_desc *env;