Please find below a proposed patch for extending events to add a new type for
VideoProviders.
This is a first patch and I would welcome feedback as always.
I have not done a generic change for events as was suggested in a previous
thread. Thought I would submit a small change first! And see what people
thought.
The other reason is currently all implementation for video providers is
written by the video provider writer. There is no generic infrastructure.
Patch below:
diff -urN DirectFB-1.0.0.orig/include/directfb.h
DirectFB-1.0.0.new/include/directfb.h
--- DirectFB-1.0.0.orig/include/directfb.h 2007-03-14 08:33:48.000000000
+0000
+++ DirectFB-1.0.0.new/include/directfb.h 2007-03-29 15:36:22.000000000
+0100
@@ -3868,7 +3868,8 @@
DFEC_INPUT = 0x01, /* raw input event */
DFEC_WINDOW = 0x02, /* windowing event */
DFEC_USER = 0x03, /* custom event for the user of this
library */
- DFEC_UNIVERSAL = 0x04 /* universal event for custom usage with
variable size */
+ DFEC_UNIVERSAL = 0x04, /* universal event for custom usage with
variable size */
+ DFEC_VIDEOPROVIDER = 0x05 /* video provider event */
} DFBEventClass;
/*
@@ -4006,6 +4007,19 @@
} DFBWindowEventType;
/*
+ * Video Provider Event Types - can also be used as flags for event
filters.
+ */
+typedef enum {
+ DVPET_NONE = 0x00000000,
+ DVPET_STARTED = 0x00000001, /* The video provider has started
the playback */
+ DVPET_STOPPED = 0x00000002, /* The video provider has stopped
the playback */
+ DVPET_SPEEDCHANGE = 0x00000004, /* A speed change has occured
*/
+ DVPET_STREAMCHANGE = 0x00000008, /* A stream description change has
occured */
+ DVPET_FATALERROR = 0x00000010, /* A fatal error has occured:
restart must be done */
+ DVPET_ALL = 0x0000001F /* all event types */
+} DFBVideoProviderEventType;
+
+/*
* Event from the windowing system.
*/
typedef struct {
@@ -4059,6 +4073,15 @@
} DFBWindowEvent;
/*
+ * Event from the video provider
+ */
+typedef struct {
+ DFBEventClass clazz; /* clazz of event */
+
+ DFBVideoProviderEventType type; /* type of event */
+} DFBVideoProviderEvent;
+
+/*
* Event for usage by the user of this library.
*/
typedef struct {
@@ -4084,11 +4107,12 @@
* General container for a DirectFB Event.
*/
typedef union {
- DFBEventClass clazz; /* clazz of event */
- DFBInputEvent input; /* field for input events
*/
- DFBWindowEvent window; /* field for window
events */
- DFBUserEvent user; /* field for user-defined
events */
- DFBUniversalEvent universal; /* field for universal
events */
+ DFBEventClass clazz; /* clazz of event */
+ DFBInputEvent input; /* field for input
events */
+ DFBWindowEvent window; /* field for window
events */
+ DFBUserEvent user; /* field for
user-defined events */
+ DFBUniversalEvent universal; /* field for universal
events */
+ DFBVideoProviderEvent videoprovider; /* field for video
provider */
} DFBEvent;
#define DFB_EVENT(e) ((DFBEvent *) (e))
@@ -4103,6 +4127,7 @@
unsigned int DFEC_WINDOW; /* Number of window events. */
unsigned int DFEC_USER; /* Number of user events. */
unsigned int DFEC_UNIVERSAL; /* Number of universal events.
*/
+ unsigned int DFEC_VIDEOPROVIDER; /* Number of universal events.
*/
unsigned int DIET_KEYPRESS;
unsigned int DIET_KEYRELEASE;
@@ -4125,6 +4150,12 @@
unsigned int DWET_LEAVE;
unsigned int DWET_WHEEL;
unsigned int DWET_POSITION_SIZE;
+
+ unsigned int DVPET_STARTED;
+ unsigned int DVPET_STOPPED;
+ unsigned int DVPET_SPEEDCHANGE;
+ unsigned int DVPET_STREAMCHANGE;
+ unsigned int DVPET_FATALERROR;
} DFBEventBufferStats;
@@ -5298,6 +5329,55 @@
IDirectFBVideoProvider *thiz,
float *ret_level
);
+
+ /** Event buffers **/
+ /*
+ * Create an event buffer for this video provider and attach it.
+ */
+ DFBResult (*CreateEventBuffer) (
+ IDirectFBVideoProvider *thiz,
+ IDirectFBEventBuffer **ret_buffer
+ );
+
+ /*
+ * Attach an existing event buffer to this video provider.
+ *
+ * NOTE: Attaching multiple times generates multiple events.
+ */
+ DFBResult (*AttachEventBuffer) (
+ IDirectFBVideoProvider *thiz,
+ IDirectFBEventBuffer *buffer
+ );
+
+ /*
+ * Enable specific events to be sent from the video provider.
+ *
+ * The argument is a mask of events that will be set in the
+ * videoproviders's event mask. The default event mask is DVPET_ALL.
+ */
+ DFBResult (*EnableEvents) (
+ IDirectFBVideoProvider *thiz,
+ DFBVideoProviderEventType mask
+ );
+
+ /*
+ * Disable specific events from being sent from the video provider
+ *
+ * The argument is a mask of events that will be cleared in
+ * the video providers's event mask. The default event mask is
DWET_ALL.
+ */
+ DFBResult (*DisableEvents) (
+ IDirectFBVideoProvider *thiz,
+ DFBVideoProviderEventType mask
+ );
+
+ /*
+ * Detach an event buffer from this video provider.
+ */
+ DFBResult (*DetachEventBuffer) (
+ IDirectFBVideoProvider *thiz,
+ IDirectFBEventBuffer *buffer
+ );
)
/***********************
diff -urN DirectFB-1.0.0.orig/src/input/idirectfbinputbuffer.c
DirectFB-1.0.0.new/src/input/idirectfbinputbuffer.c
--- DirectFB-1.0.0.orig/src/input/idirectfbinputbuffer.c 2007-03-14
08:33:48.000000000 +0000
+++ DirectFB-1.0.0.new/src/input/idirectfbinputbuffer.c 2007-03-29
15:36:43.000000000 +0100
@@ -340,6 +340,10 @@
event->user = item->evt.user;
break;
+ case DFEC_VIDEOPROVIDER:
+ event->videoprovider = item->evt.videoprovider;
+ break;
+
case DFEC_UNIVERSAL:
direct_memcpy( event, &item->evt, item->evt.universal.size
);
break;
@@ -393,6 +397,10 @@
event->user = item->evt.user;
break;
+ case DFEC_VIDEOPROVIDER:
+ event->videoprovider = item->evt.videoprovider;
+ break;
+
case DFEC_UNIVERSAL:
direct_memcpy( event, &item->evt, item->evt.universal.size
);
break;
@@ -430,6 +438,7 @@
case DFEC_INPUT:
case DFEC_WINDOW:
case DFEC_USER:
+ case DFEC_VIDEOPROVIDER:
size = sizeof(EventBufferItem);
break;
@@ -461,6 +470,10 @@
item->evt.user = event->user;
break;
+ case DFEC_VIDEOPROVIDER:
+ item->evt.videoprovider = event->videoprovider;
+ break;
+
case DFEC_UNIVERSAL:
direct_memcpy( &item->evt, event, event->universal.size );
break;
@@ -938,6 +951,35 @@
stats->DFEC_USER += incdec;
break;
+ case DFEC_VIDEOPROVIDER:
+ stats->DFEC_VIDEOPROVIDER +=incdec;
+
+ switch (event->videoprovider.type) {
+ case DVPET_STARTED:
+ stats->DVPET_STARTED += incdec;
+ break;
+
+ case DVPET_STOPPED:
+ stats->DVPET_STOPPED += incdec;
+ break;
+
+ case DVPET_SPEEDCHANGE:
+ stats->DVPET_SPEEDCHANGE += incdec;
+ break;
+
+ case DVPET_STREAMCHANGE:
+ stats->DVPET_STREAMCHANGE += incdec;
+ break;
+
+ case DVPET_FATALERROR:
+ stats->DVPET_FATALERROR += incdec;
+ break;
+
+ default:
+ D_BUG( "unknown video provider event type
0x%08x\n", event->videoprovider.type );
+ }
+ break;
+
case DFEC_UNIVERSAL:
stats->DFEC_UNIVERSAL += incdec;
break;
diff -urN DirectFB-1.0.0.orig/src/media/idirectfbvideoprovider.c
DirectFB-1.0.0.new/src/media/idirectfbvideoprovider.c
--- DirectFB-1.0.0.orig/src/media/idirectfbvideoprovider.c 2007-03-14
08:33:48.000000000 +0000
+++ DirectFB-1.0.0.new/src/media/idirectfbvideoprovider.c 2007-03-29
15:44:57.000000000 +0100
@@ -203,6 +203,42 @@
return DFB_UNIMPLEMENTED;
}
+
+static DFBResult
+IDirectFBVideoProvider_CreateEventBuffer( IDirectFBVideoProvider *thiz,
+ IDirectFBEventBuffer **buffer
)
+{
+ return DFB_UNIMPLEMENTED;
+}
+
+static DFBResult
+IDirectFBVideoProvider_AttachEventBuffer( IDirectFBVideoProvider *thiz,
+ IDirectFBEventBuffer *buffer )
+{
+ return DFB_UNIMPLEMENTED;
+}
+
+static DFBResult
+IDirectFBVideoProvider_EnableEvents(IDirectFBVideoProvider *thiz,
+ DFBVideoProviderEventType mask
+{
+ return DFB_UNIMPLEMENTED;
+}
+
+static DFBResult
+IDirectFBVideoProvider_DisableEvents(IDirectFBVideoProvider *thiz,
+ DFBVideoProviderEventType mask
+{
+ return DFB_UNIMPLEMENTED;
+}
+
+static DFBResult
+IDirectFBVideoProvider_DetachEventBuffer( IDirectFBVideoProvider *thiz,
+ IDirectFBEventBuffer *buffer )
+{
+ return DFB_UNIMPLEMENTED;
+}
+
static void
IDirectFBVideoProvider_Construct( IDirectFBVideoProvider *thiz )
{
@@ -225,6 +261,11 @@
thiz->GetSpeed = IDirectFBVideoProvider_GetSpeed;
thiz->SetVolume = IDirectFBVideoProvider_SetVolume;
thiz->GetVolume = IDirectFBVideoProvider_GetVolume;
+ thiz->CreateEventBuffer =
IDirectFBVideoProvider_CreateEventBuffer;
+ thiz->AttachEventBuffer =
IDirectFBVideoProvider_AttachEventBuffer;
+ thiz->EnableEvents = IDirectFBVideoProvider_EnableEvents;
+ thiz->DisableEvents = IDirectFBVideoProvider_DisableEvents;
+ thiz->DetachEventBuffer =
IDirectFBVideoProvider_DetachEventBuffer;
}
Cheers
Dan
http://www.nabble.com/file/7526/video_provider_events.patch
video_provider_events.patch
--
View this message in context:
http://www.nabble.com/VideoProvider-Events-%28proposed-patch-for-review%29-tf3486827.html#a9735075
Sent from the DirectFB Dev mailing list archive at Nabble.com.
_______________________________________________
directfb-dev mailing list
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev