[vlc-commits] vout: add legacy event thread helper outside core

Rémi Denis-Courmont git at videolan.org
Sun Aug 6 20:27:21 CEST 2017


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Aug  5 23:47:32 2017 +0300| [b24bd2c007b86a42dbf6e16c772622564f08eb02] | committer: Rémi Denis-Courmont

vout: add legacy event thread helper outside core

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

 modules/video_output/Makefile.am    |   4 ++
 modules/video_output/event_thread.c | 103 ++++++++++++++++++++++++++++++++++++
 modules/video_output/event_thread.h |  30 +++++++++++
 3 files changed, 137 insertions(+)

diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
index e25fc40a99..a6f4acfaff 100644
--- a/modules/video_output/Makefile.am
+++ b/modules/video_output/Makefile.am
@@ -454,3 +454,7 @@ vout_LTLIBRARIES += \
 	libvdummy_plugin.la \
 	libvmem_plugin.la \
 	libyuv_plugin.la
+
+libevent_thread_la_SOURCES = \
+	video_output/event_thread.c video_output/event_thread.h
+noinst_LTLIBRARIES += libevent_thread.la
diff --git a/modules/video_output/event_thread.c b/modules/video_output/event_thread.c
new file mode 100644
index 0000000000..817de309a8
--- /dev/null
+++ b/modules/video_output/event_thread.c
@@ -0,0 +1,103 @@
+/*****************************************************************************
+ * event.c: event thread for broken old video output display plugins
+ *****************************************************************************
+ * Copyright (C) 2009 Laurent Aimar
+ * $Id$
+ *
+ * Authors: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdnoreturn.h>
+#include <stdlib.h>
+#include <string.h>
+#include <vlc_common.h>
+#include <vlc_block.h>
+#include <vlc_vout_display.h>
+
+#include "event_thread.h"
+
+struct vout_display_event_thread {
+    vout_display_t *vd;
+    block_fifo_t *fifo;
+    vlc_thread_t thread;
+};
+
+noreturn static void *VoutDisplayEventKeyDispatch(void *data)
+{
+    vout_display_event_thread_t *vdet = data;
+    vout_display_t *vd = vdet->vd;
+    block_fifo_t *fifo = vdet->fifo;
+
+    for (;;) {
+        block_t *event = block_FifoGet(fifo);
+
+        int cancel = vlc_savecancel();
+        int key;
+
+        memcpy(&key, event->p_buffer, sizeof (key));
+        block_Release(event);
+        vout_display_SendEventKey(vd, key);
+        vlc_restorecancel(cancel);
+    }
+}
+
+void VoutDisplayEventKey(vout_display_event_thread_t *vdet, int key)
+{
+    if (unlikely(vdet == NULL))
+        return;
+
+    block_t *event = block_Alloc(sizeof (key));
+    if (likely(event != NULL)) {
+        memcpy(event->p_buffer, &key, sizeof (key));
+        block_FifoPut(vdet->fifo, event);
+    }
+}
+
+struct vout_display_event_thread *
+VoutDisplayEventCreateThread(vout_display_t *vd)
+{
+    vout_display_event_thread_t *vdet = malloc(sizeof (*vdet));
+    if (unlikely(vdet == NULL))
+        return NULL;
+
+    vdet->vd = vd;
+    vdet->fifo = block_FifoNew();
+    if (unlikely(vdet->fifo == NULL)) {
+        free(vdet);
+        return NULL;
+    }
+
+    if (vlc_clone(&vdet->thread, VoutDisplayEventKeyDispatch, vdet,
+                  VLC_THREAD_PRIORITY_LOW)) {
+        block_FifoRelease(vdet->fifo);
+        free(vdet);
+        return NULL;
+    }
+    return vdet;
+}
+
+void VoutDisplayEventKillThread(vout_display_event_thread_t *vdet)
+{
+    vlc_cancel(vdet->thread);
+    vlc_join(vdet->thread, NULL);
+    block_FifoRelease(vdet->fifo);
+    free(vdet);
+}
diff --git a/modules/video_output/event_thread.h b/modules/video_output/event_thread.h
new file mode 100644
index 0000000000..8dd9ff1b99
--- /dev/null
+++ b/modules/video_output/event_thread.h
@@ -0,0 +1,30 @@
+/*****************************************************************************
+ * event_thread.h: event thread for legacy video output display plugins
+ *****************************************************************************
+ * Copyright (C) 2009 Laurent Aimar
+ * $Id$
+ *
+ * Authors: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+typedef struct vout_display_event_thread vout_display_event_thread_t;
+
+void VoutDisplayEventKey(vout_display_event_thread_t *vdet, int key);
+struct vout_display_event_thread *
+VoutDisplayEventCreateThread(vout_display_t *) VLC_USED;
+void VoutDisplayEventKillThread(vout_display_event_thread_t *);
+



More information about the vlc-commits mailing list