summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libspudec/xine_decoder.c9
-rw-r--r--src/xine-engine/video_overlay.c42
2 files changed, 27 insertions, 24 deletions
diff --git a/src/libspudec/xine_decoder.c b/src/libspudec/xine_decoder.c
index d9a1dbef2..62fe6f3f7 100644
--- a/src/libspudec/xine_decoder.c
+++ b/src/libspudec/xine_decoder.c
@@ -19,7 +19,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine_decoder.c,v 1.52 2002/01/06 18:27:47 jcdutton Exp $
+ * $Id: xine_decoder.c,v 1.53 2002/01/06 19:18:27 jcdutton Exp $
*
* stuff needed to turn libspu into a xine decoder plugin
*/
@@ -250,6 +250,7 @@ static void spu_process (spudec_decoder_t *this, uint32_t stream_id) {
return;
}
this->event.object.handle = this->menu_handle;
+ this->event.object.pts = this->spu_stream_state[stream_id].pts;
/*******************************
if( this->spu_stream_state[stream_id].overlay_handle < 0 ) {
@@ -275,12 +276,12 @@ static void spu_process (spudec_decoder_t *this, uint32_t stream_id) {
}
this->event.event_type = this->state.visible;
-
/* event hide event must free the handle after use */
+/******************************
if( this->event.event_type == EVENT_HIDE_SPU ) {
this->spu_stream_state[stream_id].overlay_handle = -1;
}
-
+*******************************/
/*
printf("spu event %d handle: %d vpts: %d\n", this->event.event_type,
this->event.object.handle, this->event.vpts );
@@ -295,6 +296,7 @@ static void spu_process (spudec_decoder_t *this, uint32_t stream_id) {
return;
}
this->event.object.handle = this->menu_handle;
+ this->event.object.pts = this->menu_handle;
xine_fast_memcpy(this->event.object.overlay,
&this->overlay,
@@ -590,6 +592,7 @@ static void spudec_event_listener(void *this_gen, xine_event_t *event_gen) {
if (but->show) {
overlay_event->object.handle = this->menu_handle;
+ overlay_event->object.pts = but->pts;
overlay_event->object.overlay=overlay;
overlay_event->event_type = EVENT_MENU_BUTTON;
printf ("libspudec:xine_decoder.c:spudec_event_listener:buttonN = %u\n",
diff --git a/src/xine-engine/video_overlay.c b/src/xine-engine/video_overlay.c
index a69237139..466cd1ea5 100644
--- a/src/xine-engine/video_overlay.c
+++ b/src/xine-engine/video_overlay.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: video_overlay.c,v 1.10 2002/01/05 19:09:55 jcdutton Exp $
+ * $Id: video_overlay.c,v 1.11 2002/01/06 19:18:27 jcdutton Exp $
*
*/
@@ -275,6 +275,7 @@ static int32_t video_overlay_add_event(video_overlay_instance_t *this_gen, void
this->video_overlay_events[new_event].event->event_type=event->event_type;
this->video_overlay_events[new_event].event->vpts=event->vpts;
this->video_overlay_events[new_event].event->object.handle=event->object.handle;
+ this->video_overlay_events[new_event].event->object.pts=event->object.pts;
if ( this->video_overlay_events[new_event].event->object.overlay ) {
fprintf(stderr,"video_overlay: error: event->object.overlay was not freed!\n");
@@ -351,6 +352,8 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
}
this->video_overlay_objects[handle].overlay =
this->video_overlay_events[this_event].event->object.overlay;
+ this->video_overlay_objects[handle].pts =
+ this->video_overlay_events[this_event].event->object.pts;
this->video_overlay_events[this_event].event->object.overlay = NULL;
add_showing_handle( this, handle );
@@ -488,23 +491,12 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
#ifdef LOG_DEBUG
printf ("MENU BUTTON NOW\n");
#endif
- if (this->video_overlay_events[this_event].event->object.overlay != NULL) {
+ if ( (this->video_overlay_events[this_event].event->object.overlay != NULL) &&
+ (this->video_overlay_objects[handle].overlay) &&
+ (this->video_overlay_events[this_event].event->object.pts ==
+ this->video_overlay_objects[handle].pts) ) {
vo_overlay_t *overlay = this->video_overlay_objects[handle].overlay;
vo_overlay_t *event_overlay = this->video_overlay_events[this_event].event->object.overlay;
-
- if( !this->video_overlay_objects[handle].overlay ) {
- fprintf(stderr,"video_overlay: error: button event received and no overlay allocated.\n");
- if( this->video_overlay_events[this_event].event->object.overlay->rle ) {
- printf ("video_overlay: warning EVENT_MENU_BUTTON with rle data\n");
- free( this->video_overlay_events[this_event].event->object.overlay->rle );
- }
-
- /* The null test was done at the start of this case statement */
- free (this->video_overlay_events[this_event].event->object.overlay);
- this->video_overlay_events[this_event].event->object.overlay = NULL;
- break;
- }
-
this->video_overlay_objects[handle].handle = handle;
overlay->clip_top = event_overlay->clip_top;
overlay->clip_bottom = event_overlay->clip_bottom;
@@ -530,13 +522,21 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
overlay->trans[3] = event_overlay->trans[3];
}
add_showing_handle( this, handle );
+ }
+ if ( (this->video_overlay_events[this_event].event->object.pts !=
+ this->video_overlay_objects[handle].pts) ) {
+ printf ("MENU BUTTON DROPPED menu pts=%u spu pts=%u\n",
+ this->video_overlay_events[this_event].event->object.pts,
+ this->video_overlay_objects[handle].pts);
+ }
- if( this->video_overlay_events[this_event].event->object.overlay->rle ) {
- printf ("video_overlay: warning EVENT_MENU_BUTTON with rle data\n");
- free( this->video_overlay_events[this_event].event->object.overlay->rle );
- }
+ if( this->video_overlay_events[this_event].event->object.overlay->rle ) {
+ printf ("video_overlay: warning EVENT_MENU_BUTTON with rle data\n");
+ free( this->video_overlay_events[this_event].event->object.overlay->rle );
+ this->video_overlay_events[this_event].event->object.overlay->rle = NULL;
+ }
- /* The null test was done at the start of this case statement */
+ if (this->video_overlay_events[this_event].event->object.overlay != NULL) {
free (this->video_overlay_events[this_event].event->object.overlay);
this->video_overlay_events[this_event].event->object.overlay = NULL;
}