summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2011-04-15 10:33:59 +0200
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2011-04-15 12:00:03 +0200
commit9430b32f228071fca7f0c8f1bf98accd65e1979b (patch)
treeee8a178962a801072fd807883f998c319f8bafea
parent0a6e67492ef13a3981d937037ef12a172a6131fe (diff)
Add a WFD_EVENT_PIPELINE_BIND_TIME_EXT event attrib
To be fixed: - use WFDtime instead of WFDint for the time interval New entrypoint as WFDtime is incompatible with Get*Attribi
-rw-r--r--include/WF/wfdext.h2
-rw-r--r--src/wfdevent.c60
2 files changed, 47 insertions, 15 deletions
diff --git a/include/WF/wfdext.h b/include/WF/wfdext.h
index d6d8285..e52fd65 100644
--- a/include/WF/wfdext.h
+++ b/include/WF/wfdext.h
@@ -32,6 +32,8 @@ WFDint
wfdDeviceEventGetFD(WFDDevice device,
WFDEvent event);
+#define WFD_EVENT_PIPELINE_BIND_TIME_EXT 0x75C9
+
#ifdef __cplusplus
}
#endif
diff --git a/src/wfdevent.c b/src/wfdevent.c
index e0abf27..a1efa9a 100644
--- a/src/wfdevent.c
+++ b/src/wfdevent.c
@@ -26,6 +26,9 @@
#include <string.h>
#include <stdint.h>
+#include <WF/wfd.h>
+#include <WF/wfdext.h>
+
#include "wfdregistry.h"
#include "wfdevent.h"
#include "wfdport.h"
@@ -36,18 +39,26 @@
#include <sys/epoll.h>
#include <sys/eventfd.h>
+#include <sys/time.h>
#include <unistd.h>
#include <glib.h>
+
+struct bind_event {
+ WFDint pipeline_id;
+ WFDint time;
+};
+
struct wfd_event {
+ uint32_t start_time_msec;
int epoll_fd;
struct wfd_device *device;
/* source bind complete */
int drm_fd;
- WFDint pipeline_id;
+ struct bind_event bind;
/* port attach */
struct udev_monitor *udev_monitor;
@@ -101,11 +112,15 @@ wfd_create_event(struct wfd_device *device,
struct wfd_event *event;
int ret;
struct epoll_event ep;
+ struct timeval tv;
event = calloc(1, sizeof *event);
if (event == NULL)
return NULL;
+ gettimeofday(&tv, NULL);
+ event->start_time_msec = tv.tv_sec * 1e3 + tv.tv_usec / 1e3;
+
event->epoll_fd = epoll_create(2);
if (event->epoll_fd == -1) {
fprintf(stderr, "failed to crate epoll instance: %m\n");
@@ -175,7 +190,9 @@ wfd_event_get_attribi(struct wfd_device *device,
{
switch (attribute) {
case WFD_EVENT_PIPELINE_BIND_PIPELINE_ID:
- return event->pipeline_id;
+ return event->bind.pipeline_id;
+ case WFD_EVENT_PIPELINE_BIND_TIME_EXT:
+ return event->bind.time;
case WFD_EVENT_PORT_ATTACH_PORT_ID:
return event->attach_port_id;
case WFD_EVENT_PORT_ATTACH_STATE:
@@ -188,7 +205,7 @@ wfd_event_get_attribi(struct wfd_device *device,
}
-static int flip_pipeline_id;
+static struct bind_event global_bind_event;
struct wfd_event *global_event;
static void
@@ -196,20 +213,31 @@ page_flip_handler(int fd, unsigned int frame,
unsigned int sec, unsigned int usec, void *data)
{
struct wfd_pipeline *pipeline = data;
+ struct bind_event bind;
+
+ bind.pipeline_id = wfd_pipeline_get_id(pipeline);
+ bind.time = (sec * 1000 + usec / 1000) -
+ global_event->start_time_msec;
wfd_pipeline_destroy_pending_fb(pipeline);
- if (flip_pipeline_id == WFD_INVALID_PIPELINE_ID) {
- flip_pipeline_id = wfd_pipeline_get_id(pipeline);
+ if (global_bind_event.pipeline_id == WFD_INVALID_PIPELINE_ID) {
+ global_bind_event = bind;
} else {
/* queue up */
int64_t add = 1;
+ struct bind_event *queue_entry;
+
+ queue_entry = malloc(sizeof *queue_entry);
+ if (queue_entry) {
+ *queue_entry = bind;
- g_queue_push_tail(global_event->bind_event_queue,
- (gpointer)(uintptr_t)wfd_pipeline_get_id(pipeline));
+ g_queue_push_tail(global_event->bind_event_queue,
+ queue_entry);
- write(global_event->source_bind_event_queue_fd,
- &add, sizeof add);
+ write(global_event->source_bind_event_queue_fd,
+ &add, sizeof add);
+ }
}
}
@@ -259,11 +287,13 @@ wfd_event_wait(struct wfd_device *device,
if (ep.data.fd == event->source_bind_event_queue_fd) {
int64_t id;
- read(event->source_bind_event_queue_fd, &id, sizeof id);
+ struct bind_event *queue_entry;
- event->pipeline_id =
- (uintptr_t) g_queue_pop_head(event->bind_event_queue);
+ read(event->source_bind_event_queue_fd, &id, sizeof id);
+ queue_entry = g_queue_pop_head(event->bind_event_queue);
+ event->bind = *queue_entry;
+ free(queue_entry);
event_type = WFD_EVENT_PIPELINE_BIND_SOURCE_COMPLETE;
} else if (ep.data.fd == event->drm_fd) {
drmEventContext drm_evctx;
@@ -272,10 +302,10 @@ wfd_event_wait(struct wfd_device *device,
drm_evctx.version = DRM_EVENT_CONTEXT_VERSION;
drm_evctx.page_flip_handler = page_flip_handler;
- flip_pipeline_id = 0;
+ global_bind_event.pipeline_id = WFD_INVALID_PIPELINE_ID;
drmHandleEvent(event->drm_fd, &drm_evctx);
- if (flip_pipeline_id != 0) {
- event->pipeline_id = flip_pipeline_id;
+ if (global_bind_event.pipeline_id != WFD_INVALID_PIPELINE_ID) {
+ event->bind = global_bind_event;
event_type = WFD_EVENT_PIPELINE_BIND_SOURCE_COMPLETE;
}
} else if (ep.data.fd == event->udev_monitor_fd) {