[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