[FFmpeg-cvslog] lavd/xv: handle delete window message

Lukasz Marek git at videolan.org
Mon Jun 30 20:09:14 CEST 2014


ffmpeg | branch: master | Lukasz Marek <lukasz.m.luki2 at gmail.com> | Tue May 27 22:57:26 2014 +0200| [e5c806fd676ff7efbb683a7b3825dd16af3674f5] | committer: Michael Niedermayer

lavd/xv: handle delete window message

User may close X11 window by close button on tray.
FFmpeg leaves in graceless way.
This commit detects it and return EPIPE error.

Signed-off-by: Lukasz Marek <lukasz.m.luki2 at gmail.com>
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e5c806fd676ff7efbb683a7b3825dd16af3674f5
---

 libavdevice/xv.c |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/libavdevice/xv.c b/libavdevice/xv.c
index d1f8907..71857e6 100644
--- a/libavdevice/xv.c
+++ b/libavdevice/xv.c
@@ -58,6 +58,7 @@ typedef struct {
     int image_width, image_height;
     XShmSegmentInfo yuv_shminfo;
     int xv_port;
+    Atom wm_delete_message;
 } XVContext;
 
 typedef struct XVTagFormatMap
@@ -156,6 +157,8 @@ static int xv_write_header(AVFormatContext *s)
             }
         }
         XStoreName(xv->display, xv->window, xv->window_title);
+        xv->wm_delete_message = XInternAtom(xv->display, "WM_DELETE_WINDOW", False);
+        XSetWMProtocols(xv->display, xv->window, &xv->wm_delete_message, 1);
         XMapWindow(xv->display, xv->window);
     } else
         xv->window = xv->window_id;
@@ -297,6 +300,19 @@ static int write_picture(AVFormatContext *s, AVPicture *pict)
         img->data + img->offsets[1],
         img->data + img->offsets[2]
     };
+
+    /* Check messages. Window might get closed. */
+    if (!xv->window_id) {
+        XEvent event;
+        while (XPending(xv->display)) {
+            XNextEvent(xv->display, &event);
+            if (event.type == ClientMessage && event.xclient.data.l[0] == xv->wm_delete_message)
+                av_log(xv, AV_LOG_DEBUG, "Window close event.\n");
+                return AVERROR(EPIPE);
+            }
+        }
+    }
+
     av_image_copy(data, img->pitches, (const uint8_t **)pict->data, pict->linesize,
                   xv->image_format, img->width, img->height);
     return xv_repaint(s);



More information about the ffmpeg-cvslog mailing list