From e79753606f20f314a6e5a52bd42adedb2fb1f651 Mon Sep 17 00:00:00 2001 From: James Courtier-Dutton Date: Sun, 6 Jan 2002 19:18:27 +0000 Subject: Menu button events now filtered based on PTS comparison. One must remember to put PTS values (different from VPTS) in SPU_SHOW events. CVS patchset: 1358 CVS date: 2002/01/06 19:18:27 --- src/libspudec/xine_decoder.c | 9 ++++++--- src/xine-engine/video_overlay.c | 42 ++++++++++++++++++++--------------------- 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; } -- cgit v1.2.3