aboutsummaryrefslogtreecommitdiffstats
path: root/channels/console_video.h
blob: f426a5463964244cbdbe7d51803d2f29256bad52 (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
/*
 * 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 */

/*
 * 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;
};

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);

/* 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 */
};

/*! \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);

#endif /* CONSOLE_VIDEO_H */
/* end of file */