aboutsummaryrefslogtreecommitdiffstats
path: root/channels/console_video.h
blob: f88e5fa1d845e7b5e4da9d6983db2f5c02aff649 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 * Asterisk -- An open source telephony toolkit.
 *
 * Copyright (C) 2007 Luigi Rizzo
 *
 * See http://www.asterisk.org for more information about
 * the Asterisk project. Please do not directly contact
 * any of the maintainers of this project for assistance;
 * the project provides a web site, mailing lists and IRC
 * channels for your use.
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License Version 2. See the LICENSE file
 * at the top of the source tree.
 */

/*
 * Common header for console video support
 *
 * $Revision$
 */

#ifndef CONSOLE_VIDEO_H
#define CONSOLE_VIDEO_H

#if !defined(HAVE_VIDEO_CONSOLE) || !defined(HAVE_FFMPEG)
#define CONSOLE_VIDEO_CMDS					\
		"console {device}"
#else

#include <ffmpeg/avcodec.h>
#ifndef OLD_FFMPEG
#include <ffmpeg/swscale.h>     /* requires a recent ffmpeg */
#endif

#define CONSOLE_VIDEO_CMDS			\
	"console {videodevice|videocodec"	\
	"|video_size|bitrate|fps|qmin"		\
	"|sendvideo|keypad"			\
	"|sdl_videodriver"			\
	"|device|startgui|stopgui"		\
	"}"

#endif	/* HAVE_VIDEO_CONSOLE and others */

#define	SRC_WIN_W	80	/* width of video thumbnails */
#define	SRC_WIN_H	60	/* height of video thumbnails */
/* we only support a limited number of video sources in the GUI,
 * because we need screen estate to switch between them.
 */
#define	MAX_VIDEO_SOURCES	9

/*
 * In many places we use buffers to store the raw frames (but not only),
 * so here is a structure to keep all the info. data = NULL means the
 * structure is not initialized, so the other fields are invalid.
 * size = 0 means the buffer is not malloc'ed so we don't have to free it.
 */
struct fbuf_t {		/* frame buffers, dynamically allocated */
	uint8_t	*data;	/* memory, malloced if size > 0, just reference
			 * otherwise */
	int	size;	/* total size in bytes */
	int	used;	/* space used so far */
	int	ebit;	/* bits to ignore at the end */
	int	x;	/* origin, if necessary */
	int	y;
	int	w;	/* size */ 
	int	h;
	int	pix_fmt;
	/* offsets and size of the copy in Picture-in-Picture mode */
	int	win_x;
	int	win_y;
	int	win_w;
	int	win_h;
};

void fbuf_free(struct fbuf_t *);

/* descriptor for a grabber */
struct grab_desc {
	const char *name;
	void *(*open)(const char *name, struct fbuf_t *geom, int fps);
	struct fbuf_t *(*read)(void *d);
	void (*move)(void *d, int dx, int dy);
	void *(*close)(void *d);
};

extern struct grab_desc *console_grabbers[];

struct video_desc;		/* opaque type for video support */
struct video_desc *get_video_desc(struct ast_channel *c);

/* linked by console_video.o */
int console_write_video(struct ast_channel *chan, struct ast_frame *f);
extern int console_video_formats;
int console_video_cli(struct video_desc *env, const char *var, int fd);
int console_video_config(struct video_desc **penv, const char *var, const char *val);
void console_video_uninit(struct video_desc *env);
void console_video_start(struct video_desc *env, struct ast_channel *owner);
int get_gui_startup(struct video_desc* env);

/* console_board.c */

/* Where do we send the keyboard/keypad output */
enum kb_output {
	KO_NONE,
	KO_INPUT,	/* the local input window */
	KO_DIALED,	/* the 'dialed number' window */
	KO_MESSAGE,	/* the 'message' window */
};

enum drag_window {	/* which window are we dragging */
	DRAG_NONE,
	DRAG_LOCAL,	/* local video */
	DRAG_REMOTE,	/* remote video */
	DRAG_DIALED,	/* dialed number */
	DRAG_INPUT,	/* input window */
	DRAG_MESSAGE,	/* message window */
	DRAG_PIP,	/* picture in picture */
};

/*! \brief support for drag actions */
struct drag_info {
	int		x_start;	/* last known mouse position */
	int		y_start;
	enum drag_window drag_window;
};
/*! \brief info related to the gui: button status, mouse coords, etc. */
struct board;
/* !\brief print a message on a board */
void move_message_board(struct board *b, int dy);
int print_message(struct board *b, const char *s);

/*! \brief return the whole text from a board */
const char *read_message(const struct board *b);

/*! \brief reset the board to blank */
int reset_board(struct board *b);

/*! \brief deallocates memory space for a board */
void delete_board(struct board *b);
#endif /* CONSOLE_VIDEO_H */
/* end of file */