diff options
author | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-04-15 10:33:59 +0200 |
---|---|---|
committer | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-04-15 12:00:03 +0200 |
commit | 9430b32f228071fca7f0c8f1bf98accd65e1979b (patch) | |
tree | ee8a178962a801072fd807883f998c319f8bafea | |
parent | 0a6e67492ef13a3981d937037ef12a172a6131fe (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.h | 2 | ||||
-rw-r--r-- | src/wfdevent.c | 60 |
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) { |