aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-09-03 13:29:49 +0200
committerMichael Niedermayer <michaelni@gmx.at>2014-09-03 13:30:24 +0200
commit33bf66af02fe07ad810bea792782388c34be5e66 (patch)
tree62bee5972ad5dae646149588cb373dd2914b15f3
parent34e80af860d6254250878d311a1aba183d0a5382 (diff)
parentbb3ead7e54fec205c595cfb8b1d8900d50d3d1cc (diff)
downloadffmpeg-33bf66af02fe07ad810bea792782388c34be5e66.tar.gz
Merge commit 'bb3ead7e54fec205c595cfb8b1d8900d50d3d1cc'
* commit 'bb3ead7e54fec205c595cfb8b1d8900d50d3d1cc': x11grab: Fallback to normal XImage if SHM is not supported Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavdevice/x11grab.c60
1 files changed, 34 insertions, 26 deletions
diff --git a/libavdevice/x11grab.c b/libavdevice/x11grab.c
index c2bb459fe7..6a0eb8dd38 100644
--- a/libavdevice/x11grab.c
+++ b/libavdevice/x11grab.c
@@ -143,6 +143,35 @@ static void x11grab_region_win_init(X11GrabContext *s)
x11grab_draw_region_win(s);
}
+static int setup_shm(AVFormatContext *s, Display *dpy, XImage **image)
+{
+ X11GrabContext *g = s->priv_data;
+ int scr = XDefaultScreen(dpy);
+ XImage *img = XShmCreateImage(dpy, DefaultVisual(dpy, scr),
+ DefaultDepth(dpy, scr), ZPixmap, NULL,
+ &g->shminfo, g->width, g->height);
+
+ g->shminfo.shmid = shmget(IPC_PRIVATE, img->bytes_per_line * img->height,
+ IPC_CREAT | 0777);
+
+ if (g->shminfo.shmid == -1) {
+ av_log(s, AV_LOG_ERROR, "Cannot get shared memory!\n");
+ return AVERROR(ENOMEM);
+ }
+
+ g->shminfo.shmaddr = img->data = shmat(g->shminfo.shmid, 0, 0);
+ g->shminfo.readOnly = False;
+
+ if (!XShmAttach(dpy, &g->shminfo)) {
+ av_log(s, AV_LOG_ERROR, "Failed to attach shared memory!\n");
+ /* needs some better error subroutine :) */
+ return AVERROR(EIO);
+ }
+
+ *image = img;
+ return 0;
+}
+
/**
* Initialize the x11 grab device demuxer (public device demuxer API).
*
@@ -226,33 +255,12 @@ static int x11grab_read_header(AVFormatContext *s1)
"shared memory extension %sfound\n", use_shm ? "" : "not ");
}
- if (use_shm) {
- int scr = XDefaultScreen(dpy);
- image = XShmCreateImage(dpy,
- DefaultVisual(dpy, scr),
- DefaultDepth(dpy, scr),
- ZPixmap,
- NULL,
- &x11grab->shminfo,
- x11grab->width, x11grab->height);
- x11grab->shminfo.shmid = shmget(IPC_PRIVATE,
- image->bytes_per_line * image->height,
- IPC_CREAT | 0777);
- if (x11grab->shminfo.shmid == -1) {
- av_log(s1, AV_LOG_ERROR, "Fatal: Can't get shared memory!\n");
- ret = AVERROR(ENOMEM);
- goto out;
- }
- x11grab->shminfo.shmaddr = image->data = shmat(x11grab->shminfo.shmid, 0, 0);
- x11grab->shminfo.readOnly = False;
+ if (use_shm && setup_shm(s1, dpy, &image) < 0) {
+ av_log(s1, AV_LOG_WARNING, "Falling back to XGetImage\n");
+ use_shm = 0;
+ }
- if (!XShmAttach(dpy, &x11grab->shminfo)) {
- av_log(s1, AV_LOG_ERROR, "Fatal: Failed to attach shared memory!\n");
- /* needs some better error subroutine :) */
- ret = AVERROR(EIO);
- goto out;
- }
- } else {
+ if (!use_shm) {
image = XGetImage(dpy, RootWindow(dpy, screen),
x_off, y_off,
x11grab->width, x11grab->height,