58#if defined(HAVE_VIDEO_CONSOLE)
75static void *grab_x11_close(
void *
desc);
80static void *grab_x11_open(
const char *
name,
struct fbuf_t *geom,
int fps)
84 struct grab_x11_desc *v;
88 if (strncasecmp(
name,
"X11", 3))
95 v->dpy = XOpenDisplay(
NULL);
104 screen_num = DefaultScreen(v->dpy);
105 v->screen_width = DisplayWidth(v->dpy, screen_num);
106 v->screen_height = DisplayHeight(v->dpy, screen_num);
108 v->image = im = XGetImage(v->dpy,
109 RootWindow(v->dpy, DefaultScreen(v->dpy)),
110 b->x,
b->y,
b->w,
b->h, AllPlanes, ZPixmap);
111 if (v->image ==
NULL) {
115 switch (im->bits_per_pixel) {
117 b->pix_fmt = PIX_FMT_RGBA32;
120 b->pix_fmt = (im->green_mask == 0x7e0) ? PIX_FMT_RGB565 : PIX_FMT_RGB555;
128 im->red_mask, im->green_mask, im->blue_mask);
131 b->data = (uint8_t *)im->data;
135 return grab_x11_close(v);
138static struct fbuf_t *grab_x11_read(
void *
desc)
141 struct grab_x11_desc *v =
desc;
145 RootWindow(v->dpy, DefaultScreen(v->dpy)),
146 b->x,
b->y,
b->w,
b->h, AllPlanes, ZPixmap, v->image, 0, 0);
148 b->data = (uint8_t *)v->image->data;
152static int boundary_checks(
int x,
int limit)
154 return (
x <= 0) ? 0 : (
x > limit ? limit :
x);
160static void grab_x11_move(
void *
desc,
int dx,
int dy)
162 struct grab_x11_desc *v =
desc;
164 v->b.x = boundary_checks(v->b.x + dx, v->screen_width - v->b.w);
165 v->b.y = boundary_checks(v->b.y + dy, v->screen_height - v->b.h);
169static void *grab_x11_close(
void *
desc)
171 struct grab_x11_desc *v =
desc;
174 XCloseDisplay(v->dpy);
183 .open = grab_x11_open,
184 .read = grab_x11_read,
185 .move = grab_x11_move,
186 .close = grab_x11_close,
190#ifdef HAVE_VIDEODEV_H
191#include <linux/videodev.h>
193struct grab_v4l1_desc {
202static void *grab_v4l1_open(
const char *dev,
struct fbuf_t *geom,
int fps)
204 struct video_window vw = { 0 };
205 struct video_picture vp;
207 struct grab_v4l1_desc *v;
211 if (strncmp(dev,
"/dev/", 5))
213 fd = open(dev, O_RDONLY | O_NONBLOCK);
237 vw.flags = fps << 16;
238 if (ioctl(fd, VIDIOCSWIN, &vw) == -1) {
240 dev, strerror(
errno));
243 if (ioctl(fd, VIDIOCGPICT, &vp) == -1) {
248 "contrast %d bright %d colour %d hue %d white %d palette %d\n",
249 vp.contrast, vp.brightness,
251 vp.whiteness, vp.palette);
256 b->pix_fmt = vp.palette;
257 vp.palette = VIDEO_PALETTE_YUV420P;
258 if (ioctl(v->fd, VIDIOCSPICT, &vp) == -1) {
262 b->pix_fmt = vp.palette;
267 b->size = (
b->w *
b->h * 3)/2;
269 dev,
b->w,
b->h,
b->size);
290static struct fbuf_t *grab_v4l1_read(
void *
desc)
292 struct grab_v4l1_desc *v =
desc;
295 int r, l =
b->size -
b->used;
296 r = read(v->fd,
b->data +
b->used, l);
311static void *grab_v4l1_close(
void *
desc)
313 struct grab_v4l1_desc *v =
desc;
323static struct grab_desc grab_v4l1_desc = {
325 .open = grab_v4l1_open,
326 .read = grab_v4l1_read,
327 .close = grab_v4l1_close,
341#ifdef HAVE_VIDEODEV_H
Asterisk main include file. File version handling, generic pbx functions.
#define ast_calloc(num, len)
A wrapper for calloc()
struct grab_desc * console_grabbers[]
void fbuf_free(struct fbuf_t *)
Generic File Format Support. Should be included by clients of the file handling routines....
int error(const char *format,...)
#define ast_fd_set_flags(fd, flags)
Set flags on the given file descriptor.